Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

16F877 TIMER1 Sorusu

Başlatan Sdttn, 10 Eylül 2012, 18:42:47

Sdttn

Bir sayaç için timer1'i kullanmak istiyorum ancak sorunlarım var,

Aşağıdaki kodu denemek için yazdım RB0 kesmesinde RB2 1sn boyunca lojik 1 çıkış veriyor bu çıkış aynı zamanda timer pinine bağlı.
Sayaç 0 dan itibaren 1'e ulaşması için üç kez kesme oluşması gerekiyor ardından her bir sayım için 2 kez kesme oluşması yetiyor.
Anlayamadığım neden 0'dan başlayınca 3 kez kesme gerekti sayacın 1 olması için?
Birde bu timer1'i tek tek sayacak şekilde ayarlayamazmıyız?
Sayımını yapacağım palsin frekansı 0,02-0,1 hz civarında. Yazacağım programı meşgul etmemek için donanımsal sayaç kullanmak istedim.

#include <main.h>
#include <flex_lcd.c>
#int_ext
void kesme(){
disable_interrupts(INT_EXT);
disable_interrupts(GLOBAL);
output_b(0x00);
output_b(0x02);
delay_ms(1000);
output_b(0x00);
 enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

}

void main()
{
ext_int_edge(H_TO_L);
set_tris_b(0x01);
set_tris_c(0x01);
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_2);
   setup_adc_ports(NO_ANALOGS);
      
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
int x;
lcd_init();  
set_timer1(0);
lcd_putc("\fMerhaba\n"); 
while(1){

x=get_timer1();

lcd_gotoxy(1,2);
printf(lcd_putc,"sayac=%d",x); 

}
}

a_a_sezen

ccs c kullanmıyorum ama kesme genel bir kullanım olduğundan anlamak ve konuyu dağıtmayacağı için @Sdtt nin affına sığınarak soruyorum.
1-Timer interrupts kullanımı böyle her kesmede delay_ms(x) gibi mi yapılıyor?
2-Yukarıdaki kodda kesme gerçekleşme süresi + delay_ms kadar bir gecikme mi sağlanıyor?
Ben 2. şekilde kavramıştım. Yanlışım varsa düzelteyim.

Güce ve Geleceğe Güvenle...

Sdttn

Timer kesmesi yok bu kodda sadece RB0 dış kesmesi var.
Timer'ı button ile saydırıyordum ancak hatalı sayıyordu, ben de kesme ile daha temiz bir pals oluşturmak istedim o kadar. Kesme fonksiyonunda iken RB2 pini bir saniye boyunca 1 oluyor bu pin timer pinine bağlı.

Timer kesmesinde timer her dolduğunda (kaç bitlik timer olduğuna bağlı) kesme oluşur. Bu kodda timer kesmesi yok.

Dış kesme fonksiyonu:
#int_ext
void kesme(){
disable_interrupts(INT_EXT);
disable_interrupts(GLOBAL);
output_b(0x00);
output_b(0x02);
delay_ms(1000);
output_b(0x00);
 enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

}


a_a_sezen

Sorununuzun içeriğine bakarak kodunuzdaki kesmeyi timer ile ilişkilendirmiştim.
ccs c bilmediğime verin.
Yeni yeni pic çalıştığım için tereddüte düşmüştüm.
Teşekkürler..
Güce ve Geleceğe Güvenle...

Sdttn

Yok mu sorumu evaplayacak?

eistain_54

#5
---
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

FEHMİ_ASM

   Hocam T1CON prescaler değerini kontrol edin. Sanırım T1CKPS1 =  1 durumundan kaynaklanıyor.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !