Timer0 hesabı [Çözüldü]

Başlatan baran123, 19 Nisan 2015, 17:37:44

baran123

Bir türlü çözemedim sanırım hesaplamada problem var.

Şöyle kurdum.
void MCU_Init()
{
   setup_comparator(NC_NC_NC_NC);
   port_b_pullups(0x0F);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   setup_vref(FALSE);
   
   setup_timer_0(T0_INTERNAL | T0_DIV_64 | T0_8_BIT);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16, 124, 1);
   
   set_timer0(240);
   
   enable_interrupts(INT_TIMER0); 
   enable_interrupts(GLOBAL); 

   set_tris_a(0x00);
   set_tris_b(0xFF);
   set_tris_c(0x00);
   set_tris_d(0x00);
   set_tris_e(0x00);
   
   output_a(0x00);
   output_b(0xFF);
   output_c(0x00);
   output_d(0x00);
   output_e(0x00);

   lcd_init();
}


4mhz kristal takılı
#include <16F877A.h>
#device ADC=10
#fuses XT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT
#use DELAY(CRYSTAL=4MHz, CLOCK=4MHz)


Daha sonra kesmede counter saydırdım.Amaç 250 ms lik led toggle
static unsigned int8 tren_state = 0;
static unsigned int8 Counter = 0;

#int_timer0
void Timer0_Interrupt(void) 
{ 
   disable_interrupts(INT_TIMER0);
   
   if(Counter == 250)
   {
      output_toggle(pin_a0);
      counter = 0;
   }
   else
      Counter++;
      
   enable_interrupts(INT_TIMER0);
}


Ama oluşan kesme 3 saniye falan.Bayağı bir hata var gibi ?

RaMu

Hesaplamayı yapmadım ama
bir defa init de set_timer0(240);
ile timer0 a başlangıç değeri verilmiş,
sanki her timer0 kesmesinden sonra
tekrar 240 dan başlayıp sayacak şekilde bir
yapı mantık kullanmak istenmiş yani
kesmeye her girdiğinde
set_timer0(240);
diyerek timer0 ı tekrar bu değerle başlatman gerek,
program mantığın böyle sanırım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

baran123

Tamamdır oldu.Kesme fonksiyonunda timer değerini tekrar yüklemek gerekiyormuş.Teşekkür ederim.

DaRt

#3
Hocam; timer0 8 bit (256) set ve div 64 olarak set edilmiş yani 256*64=16384 komutta bir kesme oluşur. her komut 1us olduğundan (4 mhz osilatör) ~16ms de bir kesme oluşur. her kesmede counter arttırılıp counter 250 olduğunda pin a0 terslenir programa göre yani 16*250=4,096 sn yapar buda. Dolayısı ile a0 4 sn yüksek 4 sn düşük olur. Sorun yok gibi. istenen 250msde bir terslenmesi ise counter 250 değil 15 değerine ayarlanmalı.

edit: sorun çözülmüş ama yine de dursun kenarda.

edit2: timer_set(240) komutuna dikkat etmemişim. kafa neredeyse artık.