I don't know if this is what you had in mind,
but it could be a possibility for your Timeout wishes.
With the extra features of the 12F635, you should be able to to create a WDT based timeout for the SERIN or other command(s).
Starting with the WDT turned off, and DEFINE NO_CLRWDT 1
And this un-tested code ... (don't have a 12F635)
Code:
DEFINE OSC 4 ' OSCCON defaults to 4MHz on reset
DEFINE NO_CLRWDT 1 ' stop kicking the DOG
ASM
CFG = _INTRC_OSC_NOCLKOUT ; Oscillator
CFG=CFG& _WDT_OFF ; Watch Dog Timer <-- Very Important
CFG=CFG& _PWRTE_ON ; Power-on Timer
CFG=CFG& _MCLRE_OFF ; Master Clear Reset
CFG=CFG& _BOD_OFF ; Brown-out Detect
CFG=CFG& _IESO_OFF ; Internal External Switchover
CFG=CFG& _FCMEN_ON ; Fail-Safe Clock Monitor
CFG=CFG& _WUREN_OFF ; Wake-up and Reset
CFG=CFG& _CP_OFF ; Code Protect
CFG=CFG& _CPD_OFF ; EEPROM Data Protect
__CONFIG CFG
ENDASM
INCLUDE "modedefs.bas"
'----[Pin Definations]------------------------------------------------------
LED1 VAR GPIO.0
LED2 VAR GPIO.1
ToTx VAR GPIO.2
ToRx VAR GPIO.3
Monitor VAR GPIO.4
;----[Variables/Aliases]----------------------------------------------------
TOaddr VAR WORD BANK0 SYSTEM
code VAR BYTE
WDTO VAR STATUS.4 ; WatchDog Timer Timeout bit
SWDTEN VAR WDTCON.0 ; Software WDT Enable
BAUD CON N2400
'----[Initialize]-----------------------------------------------------------
Init:
IF !WDTO THEN ; If the WDT timed out
TOGGLE LED2
ASM
movf TOaddr + 1, W ; Goto Timeout Address
movwf PCLATH
movf TOaddr, W
movwf PCL
ENDASM
ELSE ; Power-on, or other Reset
CMCON0 = 7
GPIO=0
OPTION_REG = %00000111
WDA.4=1 : WPUDA.4=1
WDTCON = %00010110 ; 1:65536, WDT off
ENDIF
;----[Main Program Loop]----------------------------------------------------
Main:
TOGGLE LED1
ASM
movlw LOW(_TimeOut1) ; Set the Timeout jump Address
movwf TOaddr
movlw HIGH(_TimeOut1)
movwf TOaddr + 1
CLRWDT ; kick the DOG first
ENDASM
SWDTEN = 1 ' enable the WDT
Serin ToRx, BAUD,["pp3"],code
SWDTEN = 0 ' disable the WDT
SELECT CASE code ' CHECK VALUES FOR THE RECEIVED CODE
CASE 0 ' Null code, no action
CASE 1
; do code 1
CASE ELSE ' Unknown Code
; don't know the code. Ignore or Warn
END SELECT
GOTO Main
TimeOut1: ' Timeout occured
SWDTEN = 0 ' disable the WTD
; notify user of timeout
; or do timeout cleanup
GOTO Main
Prior to starting a SERIN command, it saves an address to the Timeout1 Label and starts the WDT.
If the WDT times out during the SERIN command, the processor will RESET.
At the top of the program, it checks to see if the reset was from power-up, or the WDT. If it was from the WDT, it was a Timeout, so it jumps to the timeout label that was saved prior to starting the SERIN command.
All previous Stack levels are discarded. So the label that it jumps to MUST be in the Main loop.
Timeout period can be adjusted by changing the WDTCON prescaler.
Food for thought while drinking Champaigne.
Happy New Year!
Bookmarks