tmr0 kesmesi ve delay fonksiyonu

Başlatan Andolor_2ml, 04 Aralık 2015, 21:17:01

Andolor_2ml

İyi günler. Anlayamadığım bir sorum var. tmr0 ile 1 sn aralıkları ile kesme meydana getirip bir değişkenin değerini arttırıyorum. ne zaman program içerisinde delay ile bir gecikme sağlasam, tmr0 kesmesi gerçekleşmiyor. Örenme amaçlı bir deneme yapıyordum. TMR0'ın değerlerini mikro c'nin kesme hesaplama programı ile yaptım.işlemci 18f46k22 4 mhz harici osilatör ile çalışıyorum.

Şöyle :

unsigned char m=0;
void InitTimer0(){
  T0CON         = 0x83;
  TMR0H         = 0x0B;
  TMR0L         = 0xDC;
  GIE_bit         = 1;
  TMR0IE_bit         = 1;
  INTCON.PEIE=1;
}

void Interrupt(){
  if (TMR0IF_bit){
    TMR0IF_bit = 0;
    TMR0H         = 0x0B;
    TMR0L         = 0xDC;
    m++;
    if (m == 3 )
    {
    PORTD.RD2 =1;
    }
    if (m == 6)
    {
    PORTD.RD2 = 0;
    m =0;
    }
 }
 }

void ayar(){
ADCON0  = 0x00;
CM1CON0 =0x00;
CM2CON0 =0x00;
TRISD = 0x00;
PORTD = 0;
TRISC = 0xff;
PORTC = 0;
}


void main() {
ayar();
InitTimer0();

 while(1){
     PORTD.RD1 = 1;
     Delay_ms(500);
     PORTD.RD1 = 0 ;
     Delay_ms(500);
   }
}


sadece tmr0 ile portu terslediğimde sorun yok ne zaman gecikme fonksiyonu kullansam çalışmıyor.

Andolor_2ml

Şöyle bir şey daha fark ettim. Normal bir led yakma uygulaması yapıyorum. bir port üzerinden de bir buton bağladım. delay ile gecikme olduğu zaman normal buton girişini de algılamıyor. Anlamadım gitti.,
void ayar(){
PEIE_bit = 1;
ADCON0  = 0x00;
CM1CON0 =0x00;
CM2CON0 =0x00;
TRISD = 0x00;
PORTD = 0;
TRISC = 0b11111111;
PORTC = 0;
}

void main() {
  ayar();
 while(1){
   RD3_bit = 1;
  Delay_100ms();
  RD3_bit =0;
  Delay_100ms();
 if (Button(&PORTC,0,1,1 ))
 {
 RD0_bit=1;
 }
 }
 }


İsis ile smulasyon yaptım aynı.Gerçek devre üzerinde de test ettim aynı. Ne olabilir ?

Andolor_2ml

Acemiliğimden atladığım bir şey olsa gerek "PORT" yerine "LAT" yazınca düzeldi. Tamamdır.