Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: agoero_22 - 20 Şubat 2018, 09:49:04

Başlık: Timer1 Input Alma
Gönderen: agoero_22 - 20 Şubat 2018, 09:49:04
Hocalarım merhaba, benim bir sorunum var timer 1 kesmesinde aynı anda adc ile değer okuyup yazdırmam ve başka bir input alıp led yakmam isteniyor. adc çalışıyor fakat butondan input alamıyorum. 5 kesme sonunda başka bir ledi toggle yapıyorum o da çalışıyor ama bir türlü input alamadım. şimdiden teşekkür ederim.
#include <16F877A.h>
#device ADC=10
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT, NODEBUG, NOCPD
#use delay(clock=4000000)
#use fast_io(c)
#use fast_io(e)
#use fast_io(b)
#use fast_io(a)
#define use_portb_lcd TRUE
#include<lcd.c>
int i=0;
unsigned long int bilgi;
float sicaklik;
#int_timer1
void timer1_kesme ()
{
set_timer1(50000);
  i++;
}
   
void main()

   setup_psp(PSP_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   lcd_init();   
   set_tris_b(0x00);
   set_tris_e(0x01);
   set_tris_a(0x01);
   set_tris_c(0x00);
   output_b(0);
   output_c(0);
 
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(50000);
   setup_ADC(adc_clock_div_32);
   setup_ADC_ports(ALL_ANALOG);
   enable_interrupts(INT_timer1);
   enable_interrupts(GLOBAL);
   while(1)
  {
 
   if (i%2==0)
   {if(input(pin_a0)) // burayı çalıştıramadım! 
   { output_high(PIN_c0); delay_ms(100);}
   set_adc_channel(5);
   delay_us(20);
   bilgi=read_adc();
   sicaklik=10*((0.0048*bilgi)-2.5);
   printf(lcd_putc,"\f Sicaklik \n %f'C",sicaklik);
   } output_low(PIN_c0);
  if(i==10)
  {output_toggle(pin_c1);
  i=0;}}
  }


(https://s14.postimg.cc/jt2b8cnd9/Ekran_Al_nt_s.png) (https://postimg.cc/image/jt2b8cnd9/)
Başlık: Ynt: Timer1 Input Alma
Gönderen: RaMu - 20 Şubat 2018, 15:09:56

Kesme içinde şöyle bir ekleme:

int1 buton_durum;
if(input(pin_a0)) buton_durum = TRUE



Ana döngüde

   {if(input(pin_a0)) // burayı çalıştıramadım! 
   { output_high(PIN_c0); delay_ms(100);}

yerine

   {if(input(buton_durum)) // burayı çalıştıramadım! 
   { output_high(PIN_c0); delay_ms(100); buton_durum = FALSE}


Başlık: Ynt: Timer1 Input Alma
Gönderen: agoero_22 - 20 Şubat 2018, 15:34:33
Yanıt için teşekkürler hocam fakat çalışmadı.
Başlık: Ynt: Timer1 Input Alma
Gönderen: RaMu - 21 Şubat 2018, 12:59:17

Yinede mantık hatası var.

#int_timer1
void timer1_kesme ()
{
set_timer1(50);  //kesmeye daha sık girilsin


int1 buton_durum;
if(input(pin_a0)) buton_durum = TRUE;


k++;




if(k>1000)
  { i++;
    k = 0;
  }
}












   while(1)
  {
 
   {if(input(buton_durum)) // burayı çalıştıramadım! 
   { output_high(PIN_c0); delay_ms(100); buton_durum = FALSE}


   if (i%2==0)
   set_adc_channel(5);
   delay_us(20);
   bilgi=read_adc();
   sicaklik=10*((0.0048*bilgi)-2.5);
   printf(lcd_putc,"\f Sicaklik \n %f'C",sicaklik);
   } output_low(PIN_c0);
  if(i==10)
  {output_toggle(pin_c1);
  i=0;}}
  }
Başlık: Ynt: Timer1 Input Alma
Gönderen: agoero_22 - 21 Şubat 2018, 13:47:45
Mantık hatası derken @RaMu hocam?
Başlık: Ynt: Timer1 Input Alma
Gönderen: RaMu - 21 Şubat 2018, 15:57:10
Akış şeması çıkarırsan gözükür.


ADC nin ne kadar zamanda bir okunacağı,
okunup ne kadar zamanda bir lcd de güncelleneceği-gösterileceği,
buton ile led yakılınca ne zaman söneceği.
delay_ms fonksiyonunun kulanılma amacı - kullanılmadan yapılmalı...
Başlık: Ynt: Timer1 Input Alma
Gönderen: agoero_22 - 21 Şubat 2018, 16:24:36
Her iki saniyede hem adc ile değer okuyup yazdırmam hem de butondan input kontrol etmem gerekiyor.
Eğer input varsa led yanacak 1saniye sonra sönecek,
input yoksa led yanmayacak.  Her 10 saniyede ise başka bir ledi toggle yapacak.
Delay ı koymamın sebebi acaba led anlık mı yanıyor diye kontrol etmek.
adc ile değer okuyabiliyorum ve lcd sürekli güncelleniyor. Sürenin şu an için önemi yok, kafama takılan durum input alamamam.     
Başlık: Ynt: Timer1 Input Alma
Gönderen: RaMu - 21 Şubat 2018, 19:15:28
Yahu en zor hata en kolay olanıdır,
bende yine düştüm bu hataya,
ilk bakışta görememişim;
pinA0 pininin ne özellikleri var ve
programda ne olarak kurulmuş,
datasheet bölüm 4) I/O PORTS
4-1) PORTA and TRISA kısmında
zaten not içindede özellikle belirtmiş vede
temel bilgilerden biri.