The problem still occurs and I seem unable to predict when.
Sometimes, execution seems to go directly to NOTCLR.
I attached the full program (slightly earlier version) to my prior post.
The only changes have been in MAIN, PLAY, NOTCLR, and TIMER, shown below.
Can someone point out where I'm going wrong?
Code:
MAIN: IF TRIGR=1 THEN ' Selects "playback"
PAUSE 9 ' Pause ~10 milliseconds for debounce
GOSUB PLAY
ENDIF
IF MFLAG=0 AND KEYCHK=1 THEN ' If mode selection prohibits continuous
GOSUB NOTCLR ' switch closure, Await switch opening
ENDIF
IF CONTROL=0 THEN ' Selects "record"
PAUSE 9 ' Pause ~10 milliseconds for debounce
GOSUB RECORD
ENDIF
IF ACTIVE=0 THEN ' Manual override when idle
PAUSE 9 ' Pause ~10 milliseconds for debounce
GOSUB MANUAL
ENDIF
GOTO MAIN
-----
PLAY: CYCLE=0 : FLASH=8 : FLASH2=5 ' Status LED indicates "playback"
CLOCK=0 ' Reset the clock for read
PLOOP: IF FRAME=248 THEN GOTO PLEXIT ' If top of data is reached, exit
READ FRAME,STATE ' Read the frame from data memory
IF STATE=$FF THEN GOTO PLEXIT ' If end-of-data marker is read, exit
IF STATE=1 THEN ' For state 1,
RELAY=1 : ALED=1 ' turn the relay and activity LED on,
ENDIF ' otherwise,
IF STATE=0 THEN ' for state 0,
RELAY=0 : ALED=0 ' turn the relay and activity LED off
ENDIF
GOTO PLOOP ' Repeat until an exit condition occurs
PLEXIT: CYCLE=0 : FLASH=16 : FLASH2=9 ' Status LED indicates "idle"
RETURN
-----
NOTCLR: CYCLE=0 : FLASH=2 : FLASH2=2 ' Status LED indicates "attention!"
WHILE KEYCHK=1 OR TRIGR=1 ' While the trigger input is active,
WEND ' further execution is prevented
PAUSE 9 ' Pause ~10 milliseconds
CYCLE=0 : FLASH=16 : FLASH2=9 ' Return to the idle state
RETURN
For some reason, this won't allow me to include TIMER in the above without dropping statements, so I'll do that one this messy way. Note: FRAME above is the low byte of ADDRS below.
TIMER: CYCLE=CYCLE+1
IF CYCLE<FLASH2 THEN
SLED=1
ELSE
SLED=0
ENDIF
IF CYCLE>FLASH THEN CYCLE=0
ADDRS=CLOCK>>1
CLOCK=CLOCK+1
IF TRIGR=1 THEN
KEYCHK=1
ELSE
KEYCHK=0
ENDIF
@ INT_RETURN
Bookmarks