Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Timer 1 Kesmesine Girmeme Sorunu

Başlatan ovaliiismail, 03 Mart 2018, 21:16:42

ovaliiismail

#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NODEBUG,NOCPD

#use delay(clock=4000000)

#use fast_io(b)

#define use_portb_lcd TRUE

#include <lcd.c>

#byte portd=0x08

const int digit[]={1,2,3,0,4,5,6,0,7,8,9,0,0xF,0,0xF,0};

int i;

#INT_TIMER1
void timer1_kesmesi()
{
   set_timer1(65535);
   i=digit[portd >> 4];
   printf(lcd_putc,"\f%d",i);
   delay_ms(300);
}

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   
   set_tris_b(0x00);
   set_tris_c(0x01);
   set_tris_d(0xF0);
   
   output_b(0x00);
   
   lcd_init();
   
   setup_timer_1(T1_EXTERNAL_SYNC | T1_DIV_BY_1);
   set_timer1(65535);
   
   enable_interrupts(int_timer1);
   enable_interrupts(GLOBAL);
   
   while(1)
   {
      
   }
   
}


Arkadaşlar amacım keypad'den sayı alıp lcd'de yazdırmak.Kesme kullanmadığımda bir sorun olmuyor çalışıyor ama kesme kullandığımda ilk sayıya bastığımda göstermiyor ikinci de başlıyor göstermeye.Yardımcı olur musunuz?

selimkoc

https://elektrokod.wordpress.com/2014/05/14/4x4-keypad-tus-takimi-tasarimi/

PORTB'nin değişik kesmesini kullan. Yukarıdaki linkte yaptığım çalışma var. İnceleyiniz.

ovaliiismail

Teşekkür ederim.Peki timer1 kesmesinde niye böyle bir sorun yapıyor fikriniz var mı?

tekosis

timer1 içine girildiğinde bir register bitini set edin, main programda bu biti kontrol edin. eğer set olmuşsa kesme gelmiş demektir. bu biti bir if ile kontrol edip kesme oluştuğunu anladığınızda
  
i=digit[portd >> 4];   
printf(lcd_putc,"\f%d",i);   
delay_ms(300);

kodunu başka bir alt fonksiyonda veya main içinde çalıştırıp dener misiniz? Kesmelerin içinde delay, printf gibi fonksiyonları kullanmamaya gayret edin.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

ovaliiismail

#4
Teşekkür ederim hocam.Kontrol biti kullandım ve ilk basışta kesmeye girmiyor.Main de yazınca düzgün çalışıyor.

fide

Set_timer1(65535) neden kullandığını anlamadım.
Tuş algılama için ext int yada port change interrupt kullanılır. Hatta port change interrupt daha mantıklım Anladığım kadarıyla 4 butonun var. Tuşa basma süresini almak istersen başka.

Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com