Here's one idea:
Code:
HighTime VAR WORD
LowTime VAR WORD
BitArray VAR WORD [2]
LSB VAR BitArray.LowWord
MSB VAR BitArrat.HighWord
WaitForStartBit:
GOSUB MeasureLow
IF (LowTime < 9500) OR (LowTime > 10500) THEN WaitForStartBit ' 9.5-10.5ms qualifies
GOSUB MeasureHigh
IF (HighTime < 1500) OR (HighTime > 2500) THEN WaitForStartBit ' 1.5-2.5ms qualifies
NextLevel:
For i = 0 to 31
GOSUB MeasureLow
IF (LowTime > 400) AND (LowTime < 800) THEN BitArray.0[i] = 1 ' 500-700us qualifies as 1
IF (LowTime > 1700) AND (LowTime < 2320) THEN BitArray.0[i] = 0 ' 1800-2200us qualifies as 0
NEXT
LCDOUT $FE,$01, "HighWord", DEC MSB
LCDOUT $FE,$C0, "LowWord", DEC LCB
Pause 1000
Goto WaitForStartBit
MeasureLow:
LowTime = 0
While Signal = 1 : WEND ' Wait for low level
While Signal = 0 ' Measure low level
LowTime = LowTime + 100 ' Resolution is 100us, change if needed
PauseUS 92 ' Tweak to calibrate, depends on actual loop time
WEND
RETURN
MeasureHigh:
HighTime = 0
WhileSignal = 0 : WEND ' Wait for low
While Signal = 1 ' Measure high level
HighTime = HighTime + 1 ' Resolution is 100us, change if needed
PauseUS 92 ' Tweal to calibrate, depends on actual loop time
WEND
RETURN
I can't compile this let alone test it but it serves to show the genereal idea of a software only solution.
Bookmarks