I would normally use Steve's solution above, but you won't be able to check button pushes in the
2.5 second COUNT command that way.
Let's hope I remember everything, and I'm assuming registers for 16F877A are the same for your chip.
Near the start of your program, after any defines:
Then straight after that:Code:Define INTHAND _Brake ' Tell PBP Where the code starts on an interrupt INTCON.4 = 1 'enable portb.0 interrupt intoccured var byte
Then this:Code:'**************************************************************** '* Name : ASM_INTS.PBP * '* Author : Darrel Taylor * '* Notice : Copyright (c) 2003 * '* Date : JAN 4, 2003 * '**************************************************************** wsave var byte $20 SYSTEM ' location for W if in bank0 ' --- IF any of these three lines cause an error ?? Simply Comment them out to fix the problem ---- wsave1 var byte $A0 SYSTEM ' location for W if in bank1 wsave2 var byte $120 SYSTEM ' location for W if in bank2 wsave3 var byte $1A0 SYSTEM ' location for W if in bank3 ' ------------------------------------------------------------------------------ ssave var byte BANK0 SYSTEM ' location for STATUS register psave var byte BANK0 SYSTEM ' location for PCLATH register fsave var byte BANK0 SYSTEM ' location for FSR register Asm INT_START macro IF (CODE_SIZE <= 2) movwf wsave ; copy W to wsave register swapf STATUS,W ; swap status reg to be saved into W clrf STATUS ; change to bank 0 regardless of current bank movwf ssave ; save status reg to a bank 0 register movf PCLATH,w ; move PCLATH reg to be saved into W reg movwf psave ; save PCLATH reg to a bank 0 register EndIF movf FSR,W ; move FSR reg to be saved into W reg movwf fsave ; save FSR reg to a bank 0 register endm EndAsm Asm INT_RETURN macro MOVF fsave,W ; Restore the FSR reg MOVWF FSR Movf psave,w ; Restore the PCLATH reg Movwf PCLATH swapf ssave,w ; Restore the STATUS reg movwf STATUS swapf wsave,f swapf wsave,w ; Restore W reg Retfie ; Exit the interrupt routine endm EndAsm
Now this would usually jump back to the point of execution it left from,Code:'*********************** ISR ***************************** Brake: @ INT_START ' R0save = R0 ; Save 2 PBP system vars that are used during R1save = R1 ; the interrupt ' IF INTCON.1 = 1 THEN 'handle portb.0 interrupt INTCON.1 = 0 'clear portb.0 interrupt flag goto overextint 'skip over timer interrupt handler ENDIF ' ' overextint: ' R1 = R1save ; Restore the PBP system vars R0 = R0save @ INT_RETURN ; Restore context and return from interrupt ' '*********************************************************
but you want to reset, and need not bother with resoring context,
so I'd create a routine that resets all vars and goes to the start of your program,
name it overextint: and delete the overextint label from this code.
If this works, thank Darrel, if it's broken, blame me!




Bookmarks