CCS C de buton kontrolü

mustfa.krs

Üye
Katılım
7 Mar 2014
Mesajlar
8
Puanları
1
İyi günler herkese, ben timer0 kesmesiyle butona basarak saniyeyi 10'ar 10'ar artmasını istiyorum. Ama benim yazdığım kodda butona basınca değişik sayıda artıyor. Delay gecikme komutu kullanılmayacak. Yardımcı olursanız sevinirim.
Kod:
#include <LCD.C>





#use fast_io(a)

#use fast_io(c)





unsigned int8 saniye,i=0;





#int_TIMER0

void  TIMER0_isr(void)

{

set_timer0(65457);





   if(input(PIN_A0))

 

  {saniye+=10; }

 

      if(input(pin_a4))

         {

           i++;

          

            if(i==saniye)

               {output_high(pin_c0);}

          

            if(i==(2*saniye))

               {output_low(pin_c0);i=0;}

         }

        

   clear_interrupt(INT_TIMER0);

}





void main()

{





   setup_adc_ports(NO_ANALOGS|VSS_VDD);

   setup_adc(ADC_OFF);

   setup_psp(PSP_DISABLED);

   setup_spi(SPI_SS_DISABLED);

   setup_wdt(WDT_OFF);

   setup_timer_0(RTCC_INTERNAL |RTCC_DIV_64);

   setup_timer_1(T1_DISABLED);

   setup_timer_2(T2_DISABLED,0,1);

   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);

   setup_comparator(NC_NC_NC_NC);

   setup_vref(FALSE);

   lcd_init();

   enable_interrupts(INT_TIMER0);

   enable_interrupts(GLOBAL);

   setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF);





   set_tris_a(0xff); set_tris_c(0x00); output_c(0x00);

   set_timer0(65457);

 

 

   while(true){ lcd_gotoxy(1,1);printf(lcd_putc,"%u",saniye);}

 

}
 
Moderatör tarafında düzenlendi:
Proteus çizimi
 

Ekli dosyalar

  • lcd_buton.rar
    13.7 KB · Görüntüleme: 6
65457 bu değeri timer0'a yükleyemezsin çünkü timer0 8 bitlik bir sayıcı max. 255 sayar.

kesme oluşma süresi = Tkx(Bölme oranı)x(256-timer0 değeri) senin frekansın 4mhz ve timer0 bölme oranın 64 şimdi bir hesap yapalım timer0'a 10 değeri yüklediğimiz varsayalım.

kesme süresi=10^6x(64)x(256-10)=15.7ms lik bir geçikme elde edersin bunu bir döngüye alarak 10sn elde etmen için.

10sn/15.7ms = 635 adet bir döngü yapman lazım ....

yani;
#int_TIMER0
void TIMER0_isr(void)
{
set_timer0(10);

i++;
if(i==635)
{
komutlar
}
i=0;

bu şekilde yapabilirsin

 
Cevabınız için teşekkürler. Bu 18F4550, timer0 16 bit. Bir de butona basınca 10 ekle diyorum ama sayı karışık gidiyor.
 

Forum istatistikleri

Konular
129,034
Mesajlar
922,695
Kullanıcılar
451,292
Son üye
grafon01

Yeni konular

Geri
Üst