ccs de Timer1 ile count (sayma işlemi)

Başlatan hamzabilgen, 24 Haziran 2005, 00:17:31

hamzabilgen

arkaşlar benim bitirme tezimde bir sorun ortaya cıktı. problem soyle;

ben programda bir gecikme turini yapmak istiyorum
18f452 de rb1 e sinyal geldiğinde interrupta hesaplanan değer kadar sayma yapacak
problem ise burada başlıyor. ben interruptta timeri 45000 e yüklüyorum ve normalde 65536 olduğunda taşma vermesi gerekiyor. ama benim programda interruptunu aktif yapar yapmaz kesme oluşuyor acaba TMR1IF mi default olarak 1 anlayamadım ben once hi-tech ile calışıyordum. orda bu registerler  kolay kontol ediliyodu. burada bulamadım

kod şöyle

#int_timer1
void tmr1_isr()

{
        output_bit( PIN_B7, 1);
   disable_interrupts(INT_TIMER1);
}

#int_ext1
void rb1_isr()
{
   set_timer1(45000);
   enable_interrupts(INT_TIMER1);
}

bu arada global interrupt 1
ben sadece ext1 interrupt geldiğinde timerin calışmasını ve timer kesmesi geldiğinde ise rb7 yi yakmasını istiyorum. bu kodu derlediğimde bekleme yapmadan kesme oluyo(osiloskopta bakıyorum bekleme olmuyo normalde 12,5 ms olması gerekiyor)

Erkan Gench

Öncelikle PicProje'ye hoş geldiniz.

Timer interruptunun kapalı olması timer'in çalışmasını ve int flag'inin set olması engellemiyor. Bundan dolayı siz int'i kapatsanızda pic başka işlerle uğraşırken timer overflow oluyor ve int'i açar açmaz int rutinine dallanıyor.

Yapmanız gereken int'i kapattığınızda timer'ı da disable etmek.

Aşağıdaki kod çalışıyor.

#int_timer1
void tmr1_isr()
{
   output_high( PIN_B7);
   setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
   disable_interrupts(INT_TIMER1);
}

#int_ext1
void ext1_isr()
{
   output_high( PIN_B6);   
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   set_timer1(45000);
   enable_interrupts(INT_TIMER1);
}

void main()
{   
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   
   enable_interrupts(INT_EXT1);
   disable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   while (1);   
}


ve sonuç olarak şu grafiği elde ediyoruz.



Gördüğünüz gibi int'in gelmesiyle rb7'nin bir olması arasında yaklaşık 80ms var (1Mhz kristal ile)

Lütfen kod gönderirken benim gibi code tag'leri içine alın (mesaj yazarken üstteki # işaretini kullanın)
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

hamzabilgen

hocam sagol şimdi gidip denerim olur inşallah