我正在使用PIC16F887 44针演示板。
我正在尝试这样做
由于Timer1的预分频器设置为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永远不会溢出,并且由于某种原因永远不会调用中断例程。 有谁知道我做错了什么?
答案 0 :(得分:2)
它无法正常工作,因为你没有选择合适的内存库! 尝试...
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不会保存和恢复STATUS标志,因此您的程序无法正常工作!