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/)
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}
Yanıt için teşekkürler hocam fakat çalışmadı.
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;}}
}
Mantık hatası derken
@RaMu hocam?
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ı...
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.
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.