2014-08-27 42 views
0

我最近試圖製作一個程序,使用timer0從255溢出到0,並轉到一個isr代碼,如果T0CKI引腳上的按鈕被按下一次就會變成一個LED,正如我從微芯片公司TIMER0數據表教程,但它不是在所有工作無論我試圖從代碼更改,寫在與XC8編譯MPLAB X IDE,這裏是代碼:PIC16f877a Timer0代碼不起作用

#include "config.h" 

void interrupt ISR(); 
void INIT(); 

void main(){ 
    INIT(); 
    while(1){ 
     if(PORTAbits.RA4 == 1){ 
      TMR0--; 
     } 
    } 

} 

void interrupt ISR(){ 

     if(INTCONbits.TMR0IF == 1 && INTCONbits.TMR0IE == 1){ 
      TMR0 = 255; 
      INTCONbits.TMR0IF = 0; 
      PORTDbits.RD0 = 1; 
     }else{ 
      PORTDbits.RD0 = 0; 
     } 

} 

void INIT(){ 
    INTCON = 0b11100000; 
    OPTION_REG = 0b11100111; 
    TRISDbits.TRISD0 = 0; 
    PORTDbits.RD0 = 0; 
    TRISAbits.TRISA4 = 1; 
    TMR0 = 255; 
} 

這是main.c中,我寫的所有代碼config.h就是我設置配置位的地方,使用Windows-> MPLAB配置位

在此先感謝所有反饋者,非常感謝

+0

您檢查TMR0IE。你在哪裏設置它? – 2014-08-28 10:02:18

+0

它是intcon寄存器中的位5設置爲1 -on- – user3674628 2014-08-28 14:03:16

回答

0

定時器硬件不檢查算術運算的結果。它只會在沒有內核干預的情況下溢出寄存器時(即定時器運行時溢出從255回到零)設置中斷標誌。當你這樣做:

TMR0--; 

它在覈心硬件本質上是實現

Read TMR0 memory location 
Add 1 
Write TMR0 memory location