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