Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Timer1 Input Alma

Başlatan agoero_22, 20 Şubat 2018, 09:49:04

agoero_22

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;}}
  }




RaMu


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}


Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

agoero_22

Yanıt için teşekkürler hocam fakat çalışmadı.

RaMu


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;}}
  }
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

agoero_22

Mantık hatası derken @RaMu hocam?

RaMu

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ı...
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

agoero_22

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.     

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html