2014-08-27 3 views
0

요즘은 timer0을 사용하여 255에서 0으로 오버플로하는 프로그램을 만들려고했는데 T0CKI 핀의 버튼을 한 번 누르면 마이크로 칩의 지시에 따라 LED가 켜지는 isr 코드로 이동합니다.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는 다음과 같습니다 XC8 컴파일 MPLAB X IDE로 작성 내가 코드에서 변경하려고 어떤 Timer0와 데이터 시트 튜토리얼하지만 전혀 작동하지 않는 경우는, 여기에 코드입니다 config.h는 MPLAB의 Windows-> Configuration 비트를 사용하여 구성 비트를 설정하는 곳입니다.

감사합니다. 모든 응답자에게 미리 감사드립니다.

+0

당신은 TMR0IE 확인합니다. 어디에서 설정합니까? –

+0

1로 설정된 intcon 레지스터의 비트 5입니다. – user3674628

답변

0

타이머 하드웨어는 산술 연산 결과를 확인하지 않습니다. 코어의 개입없이 레지스터가 오버 플로우 될 경우에만 인터럽트 플래그를 설정합니다 (예 : 타이머가 실행 중이고 255에서 0으로 오버 플로우). 당신이 할 경우 :

TMR0--; 

그것은 본질적으로 같은 핵심 하드웨어로 구현,

Read TMR0 memory location 
Add 1 
Write TMR0 memory location