PIC16f877a Код таймера0 не работает

В последнее время я пытался создать программу, которая использует timer0 для переполнения с 255 до 0 и перехода к коду isr, который включит светодиод, если кнопка на выводе T0CKI была нажата один раз, как меня учили из учебника таблицы timer0 микрочипа, но он не работает Вообще, что бы я ни пытался изменить из кода, написанного в MPLAB X IDE, скомпилированного с XC8, вот код:

#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-> Configuration биты в MPLAB

заранее спасибо всем, кто очень ценит ответы


person user3674628    schedule 27.08.2014    source источник
comment
Вы проверяете TMR0IE. Где вы его устанавливаете?   -  person Marco van de Voort    schedule 28.08.2014
comment
это бит 5 в регистре intcon, установленный в 1 -on-   -  person user3674628    schedule 28.08.2014


Ответы (1)


Аппаратный таймер не проверяет результат арифметических операций. Он установит флаг прерывания только в том случае, если он переполняет регистр без вмешательства ядра (то есть, когда таймер работает и переполняется с 255 до нуля). Когда вы это сделаете:

TMR0--;

По сути, это реализовано в основном оборудовании, так как,

Read TMR0 memory location
Add 1
Write TMR0 memory location
person Mathieu L.    schedule 29.08.2014