I modified henriks code an tested it with my simulation , works fine
Code:
'****************************************************************
'* Name : deMODULATOR.BAS *
'* Author : richard's modified version of henriks *
'* Notice : 2016 *
'* : All Rights Reserved *
'* Date : 10/10/2016 *
'* Version : 1.0 *
'* Notes : decodes missing pulse encoded data stream A.5 *
'* : 16F1825 *
'****************************************************************
#CONFIG
__config _CONFIG1, _FOSC_INTOSC & _CP_OFF & _WDTE_ON & _PWRTE_ON & _MCLRE_ON & _CLKOUTEN_OFF
__config _CONFIG2, _PLLEN_ON & _LVP_OFF
#ENDCONFIG
OSCCON=$70
DEFINE OSC 32
' PIC 16F1825
TRISA = %111110 ' Make somepins Input
trisc = %111100 ;Make some pins Input
ANSELA=0
ANSELC=0
led var latc.0 ;DEBUG
led2 var latc.1 ;DEBUG
demod var porta.5 ;demod in
X VAR byte
darta VAR byte[4]
counter var word
dm_state VAR byte
lata.0=1 ;DEBUG
clear
led=0
DEFINE DEBUG_REG PORTA
DEFINE DEBUG_BIT 0
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 0
pause 2000
Debug "Start",13 ,10
DEFINE PULSIN_MAX 9000
Code:
HighTime VAR WORD
LowTime VAR WORD
WaitForStartBit:
GOSUB MeasureLow
IF (LowTime < 9500) OR (LowTime > 11000) THEN WaitForStartBit ' 9.5-10.5ms qualifies
led2=1
GOSUB MeasureHigh
IF (HighTime < 1500) OR (HighTime > 2500) THEN WaitForStartBit ' 1.5-2.5ms qualifies
led2=0
NextLevel:
For x = 0 to 31
GOSUB MeasureLow
IF LowTime < 1000 then
darta .0[x] = 0
else
darta .0[x] = 1
endif
NEXT
led=1
Debug 13 ,10 ,bin8 darta[3],bin8 darta[2],bin8 darta[1],bin8 darta[0] ;DEBUG
Pause 1000
led=0
Goto WaitForStartBit
MeasureLow:
LowTime = 0
While demod = 1 : WEND ' Wait for low level
While demod = 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
While demod = 0 : WEND ' Wait for low
While demod = 1 ' Measure high level
HighTime = HighTime + 100 ' Resolution is 100us, change if needed
PauseUS 92 ' Tweal to calibrate, depends on actual loop time
WEND
RETURN
Bookmarks