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.
Any suggestible improvements? (btw, thanks for all the help so farCode:' 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




Bookmarks