timer-counter için yardım

Başlatan ranadilara, 28 Mart 2008, 18:11:35

ranadilara

merhaba;

Hareket eden cisimleri sayan bir program üzerinde çalışıyorum. Bunun için 16F877'nin timer0'ını counter timer1'ini timer olarak kullanacağım. Timer1 5 saniye çalıştırılıp bu süre içerisinde RA4 pinindeki 1'den 0'a düşüşleri timer 0 sayacak. Timer 1 16 bitlik olduğundan en fazla 0,5 saniye sayabilmekte.for döngüsü kullanarak timer 1'in 5 saniyeye kadar saymasını sağlayabilir miyim?

örneğin;
                for(i=0;i<10;i++)
      {
      setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
      set_timer1(0);

      enable_interrupts(INT_timer1);
      enable_interrupts(GLOBAL);

      }
şeklinde bir kod yazdım ancak çalıştıramadım.

Assembly'de taşma bayrağını sıfırlayarak timerıbir döngü içerisinde istediğimiz süre kadar çalıştırabiliyorduk.Bunu CCS'de nasıl yapabiliriz?

Ayrıca; timer0'ı durdurmadan get_timer0() komutunu kullanarak timerın saydığı değeri alabilmemiz mümkün mü?

teşekkürler...

aliveli

#include <18F877.H>
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay (clock=4000000)
int i=0;
#int_timer1
void timer1_isr(void)
{
i++;
}

//==================================
void main()
{
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); 
set_timer1(0); 

enable_interrupts(INT_timer1); 
enable_interrupts(GLOBAL); 

while(1){
if(i==10)
{disable_interrupts(INT_timer1);i=0;}
}
}

ranadilara

merhaba :oops:
timerlarla ilgili bir projem var.Yukardaki sorunu hallettim fakat şimdi de 5 saniye içinde bo pinindeki 1den 0a düşüş sayısını hesaplamak ve belirli bir değerden büyükse bir LED yaktırmak istiyorum.Aşağıdaki kodu yazdım ancak program if(i<=10) döngüsünden çıkmıyor.Herhalde hep i=0 olarak algılıyor.Bu sorunu halletmek için ne yapabilirim?
teşekkürler

#include <16F877.H>
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay (clock=4000000)
#int_timer1

int sayi1=0;
int i=0;

void timer1_kesme()
{
 i++;
}


void main()
{

set_tris_b(0x01);

setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(GLOBAL);
enable_interrupts(INT_timer1);
set_timer1(0);

while(1)

{
if(i<=10)
{

if(input(pin_b0))

{delay_ms(15);

if(!(input(pin_b0)))
   {sayi1++;}
}

}

if(i>=10)
{
disable_interrupts(INT_timer1);
i=0;
set_timer1(0);}

if(sayi1>=3)
{output_high(pin_c1);}



}

}