assembly - PIC16F887 Timer0计数溢出

标签 assembly pic microchip

我使用的是 PIC16F887 44 引脚演示板。

我正在尝试这样做

  1. 用户按下开关
  2. 计时器开始
  3. 如果在 3 秒内再次按下开关,则点亮 LED 0,否则点亮 LED 1

由于定时器0的预分频器设置为255,将在65536 μs后溢出,因此我需要计算它溢出的次数并检查是否达到该数量。 那将是 46 次。

这些是我的代码的相关摘录

movlw     B'10000111'         ; configure Prescaler on Timer0, max prescale (/256)
movwf     OPTION_REG          ; configure
MOVLW     B'10100000'         ; enable Timer 0 and global interrupts
MOVWF     INTCON

MainLoop:
BTFSS     PORTB,0             ; is the switch pressed (0)
GOTO      EndMainLoop         ; Lights up LED 0
MOVF      TimerCount, w                 
XORLW     .46                 ; Check whether XOR TimerCount with 46
BTFSS     STATUS,Z            ; returns a 0
GOTO      MainLoop
GOTO      State2              ; Lights up LED 1

TimerCount 在代码的中断部分增加,如下所示

org 4
ServiceTimer0:
 bcf       STATUS,RP0          ; Ensure ISR executes in Register Bank 0
 bcf       STATUS,RP1
 BCF       INTCON,T0IF         ; clear the interrupt flag.
 INCF      TimerCount,f        ; Increment TimerCount
 RETFIE                        ; Return from the interrupt

然而,Timer0 永远不会溢出,并且由于某种原因,中断例程永远不会被调用。 有谁知道我做错了什么?

最佳答案

它无法工作,因为你没有选择正确的内存库! 尝试...

movlw     B'10000001'         ; configure Prescaler on Timer0, max prescale (/256)
BANKSEL   OPTION_REG
movwf     OPTION_REG          ; configure
movlw     B'10100000'         ; enable Timer 0 and global interrupts
movwf     INTCON
BANKSEL   0
...

并且您的 ISR 不会保存和恢复状态标志,因此您的程序无法正常工作!

关于assembly - PIC16F887 Timer0计数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019971/

相关文章:

c - MPLab PORTFbits 没有名为 RF0 的成员

java - 是什么导致 Java 库在被 JRuby 调用时表现不同?

assembly - m80 宏汇编器 org 指令

c++ - 从函数结构成员获取函数地址

c - 了解 DelayMS 功能如何与 PIC18F 单片机配合使用

c - 我想了解 '__attribute__((space(dma)));'的语法

embedded - MPLAB X IDE v6.10,当我尝试加载我的项目并打开它时。它给出消息 "Loading"并且项目无法打开并且调试器被禁用

assembly - 不能在 NASM 中包含文件

c - 这个movl指令有必要吗?

embedded - 设置 RXIF 标志时未调用 PIC32 SPI ISR?