Well here we go, and it even works - well there's no false positives, but some times it doesn't activate, but better then it was.
Code:
' Configure the FUSE options for the compiler
@ device pic16F628A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_on, cpd_off, pwrt_off, mclr_off
' Running a 4Mhz clock
DEFINE OSC 20
DEFINE PULSIN_MAX 3000
CMCON = 7
ALL_DIGITAL
' Setup the USART
DEFINE HSER_RCSTA 90h ' Receive register to receiver enabled
DEFINE HSER_TXSTA 20h ' Transmit register to transmitter enabled
DEFINE HSER_BAUD 9600 ' Set baud rate
RFIN VAR PORTB.7
INPUT RFIN
PBITS VAR BYTE[24] ' The bits we've read
RAW VAR WORD ' The raw pulsin value
ADDRESS VAR WORD ' Storage for the address
DBYTE VAR BYTE ' Storage for the data
LOOPDBYTE VAR BYTE
LOOPADDRESS VAR WORD
X VAR BYTE
Y VAR BYTE
GET_ADD:
ADDRESS = 0 : RAW = 0 : DBYTE = 0
GET_PULSE:
' Look for one huge low pulse
PULSIN RFIN, 0, RAW
' 2350 is about mean average
IF RAW < 2330 OR RAW > 2370 THEN GET_PULSE
' Read 16 address bits and 8 data bits
FOR X = 0 TO 23
PULSIN RFIN, 0, RAW
PBITS[x] = NCD RAW
NEXT X
ADDRESS = 65535 ' Maxmimum known ID
FOR X = 0 to 15
IF PBITS[x] > 7 THEN ADDRESS.0[X] = 0
NEXT X
DBYTE = 255 ' Maximum known data value
Y=0
FOR X = 16 TO 23
IF PBITS[X] > 7 THEN DBYTE.0[Y] = 0
Y = Y + 1
NEXT X
' If we've done a loop...
IF ADDRESS == LOOPADDRESS AND DBYTE == LOOPDBYTE THEN
SELECT CASE DBYTE
CASE 3
GOSUB subUp
CASE 12
GOSUB subStop
CASE 192
GOSUB subDown
END SELECT
LOOPDBYTE = 0
LOOPADDRESS = 0
ELSE
' Start a loop
LOOPDBYTE = DBYTE
LOOPADDRESS = ADDRESS
ENDIF
GOTO GET_ADD
END
subUp:
HSEROUT ["UP",10,13]
RETURN
subStop:
HSEROUT ["STOP", 10, 13]
RETURN
subDown:
HSEROUT ["DOWN",10,13]
RETURN
Any suggestible improvements? (btw, thanks for all the help so far
Bookmarks