【问题标题】:PIC16f877a Timer0 code not workingPIC16f877a Timer0 代码不工作
【发布时间】:2014-08-27 21:37:38
【问题描述】:

我最近尝试编写一个程序,使用 timer0 从 255 溢出到 0 并转到 isr 代码,如果按一次 T0CKI 引脚上的按钮,则会打开一个 LED,正如我从 microchip 的 timer0 数据表教程中学到的那样无论我试图从代码中更改什么,都无法正常工作,用 XC8 编译的 MPLAB X IDE 编写,这里是代码:

#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 中的配置位设置配置位的地方

提前感谢所有回复,非常感谢

【问题讨论】:

  • 您检查 TMR0IE。你在哪里设置的?
  • intcon 寄存器中的第 5 位设置为 1 -on-

标签: timer interrupt pic microchip mplab


【解决方案1】:

定时器硬件不检查算术运算的结果。只有在没有内核干预的情况下溢出寄存器(即当定时器运行并从 255 溢出回零时),它才会设置中断标志。当你这样做时:

TMR0--;

它本质上是在核心硬件中实现的,

Read TMR0 memory location
Add 1
Write TMR0 memory location

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多