Hi all

I have a 4MHz PIC16F88 with a button, a serial LCD and a LED. Eventually, the LED will be the LCD backlight on a timer after the user has pressed a button. This is just for testing things at the moment, but I am being driven NUTS trying to figure out what is wrong.

TIMER1 is enabled, and counts up. When an overflow is reached, it toggles the LED. The button is used for a menu system. Everything is interrupt driven and works nicely, except for one issue:

It appears that pressing the button starts/stops TIMER1 !

Since I can't see anything in the code that is responsible for this, I think it may be something nasty with how Picbasic handles interupts or uses the timer for SLEEP or PAUSE.

If anyone has ANY ideas or pointers for debugging this, it would be greatly appreciated.

Best regards
Richard

Code snipet below:
Code:
    disable interrupt
    timer var word
    timer = 0

    gosub LCD_Startup
    gosub Startup_Display                      ' Splash screen
    gosub StartupTimer                          ' Timer1 should startup from here 
    on interrupt Goto Keyhandler
    enable interrupt
      
waitforkey:
    pauseus 10                       ' will use sleep/low power mode later
    goto waitforkey
    disable interrupt
    end
' ******************************
KeyHandler:
    if PIR1.0 then TimerTimeout    
    if Button_menu = 1 then MenuButton_Down
    ' something else happened ?
    reSUME
MenuButton_Down:
    while button_menu = 1
        NAP 3
    Wend
    pause 50                              ' debouce - do not remove 
    INTCON.0 = 0                        ' clear mismatch
    if menu = 0 then Setmenu1
    if menu = 1 then Setmenu2
    RESUME
' ******************************
StartupTimer:
    T1CON = %00110000   ' Timer1 1:8 prescale. 
    TMR1H = 0           ' Clear time counts before Timer1 re-start
    TMR1L = 0           ' Clear time counts before Timer1 re-start
    PIR1.0 = 0           ' Clear over-flow flag before enable
    T1CON.0 = 1        ' Turn Timer1 on
    PIE1.0 = 1           ' Enable Timer1 interupt
    return
    
TimerTimeout:
    gosub DOubleLineMode
    gosub MoveToLineTwo    
    shiftout LCD_SerialIn, LCD_Clock, mode, ["Timer Incr ", timer+48]
    pause 250    
    timer = timer + 1
    if timer > 9 then  ' granularity is 65msec * scaler
        if LCD_Backlight then
            LCD_Backlight = 0
        else
            lcd_backlight = 1
        endif 
        timer = 0
    endif
    gosub StartupTimer
    RESUME