This code wasn't interrupt-driven, because it didn't need to be
By changing "PhaseDelay" you can make it work for either 60 or
400 hz, or by using PULSIN, you can make it auto-sensing.
CheckACPhase:
HighTimer = 0
CheckPhaseA:
IF PhaseA = 0 THEN ' Voltage is present or else wouln't be low
WHILE PHASEA = 0:WEND
HighTimer = 0
GOTO CheckPhaseB
ENDIF
Pauseus PhaseDelay
HighTimer = HighTimer + 1
IF HighTimer => 10 THEN GOTO PhaseAError
GOTO CheckPhaseA
PhaseAError: ; No phase A - was never low in 930 uSec period
StatINfo.0 = 0 ; Can't check for proper phasing, so give error
HighTimer = 0
CheckPhaseB:
If PhaseB = 0 THEN
StatInfo.3 = 0 'Erase the error
HighTimer = 0
Goto CheckPhaseC
ENDIF
WaitForLowB:
Pauseus PhaseDelay
IF PhaseB = 0 THEN goto PhaseBError2
HighTimer = HighTimer + 1
IF HighTimer => 10 THEN GOTO PhaseBError1
GOTO WaitForLowB
PhaseBError1: ; No signal
StatINfo.1 = 0 ; Can't check for proper phasing, so give error
HighTimer = 0
GOTO CheckPhaseC
PhaseBError2: ; Signal, but wrong phase
HighTimer = 0
CheckPhaseC:
If PhaseC = 0 THEN
Goto DunPhaseCheck
ENDIF
Pauseus PhaseDelay
HighTimer = HighTimer + 1
IF HighTimer => 10 THEN GOTO PhaseCError
GOTO CheckPhaseC
PhaseCError:
StatInfo.2 = 0
DunPhaseCheck:
IF Statinfo.0 = 0 or StatInfo.1 = 0 OR Statinfo.2 = 0 Then
StatInfo.3 = 1
ENDIF
RETURN
; When returned, Statinfo bit 3 = 0 = OUT OF PHASE
; bit 0 = 0 = PhaseA not present
; bit 1 = 0 = PhaseB not present
; bit 2 = 0 = PhaseC not present
; When any phase is not present, bit 3 is always SET.
Bookmarks