PIC16F887 Timer0计数溢出

时间:2013-11-16 15:11:14

标签: assembly pic microchip

我正在使用PIC16F887 44针演示板。

我正在尝试这样做

  1. 用户按下开关
  2. 计时器启动
  3. 如果在3秒内再次按下开关,则打开LED 0,否则打开LED 1
  4. 由于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永远不会溢出,并且由于某种原因永远不会调用中断例程。 有谁知道我做错了什么?

1 个答案:

答案 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标志,因此您的程序无法正常工作!