The two small example programs that follow show how to send two data bytes (+ two error check bytes) using the NEC protocol. X-10 has used this protocol for about 20 years with their RF remotes and (with a slight alteration) wireless security sensors. Variations of it are used by many other wireless security devices from various manufacturers. As long as you have adequate received signal strength it is extremely reliable for transferring small amounts of data.
NOTE: I adapted these quickly from some apps I've used for several years with the PIC12F629. I have not tested the abbreviated examples.
Here's the transmitter example.
Code:
'-----PIC12F629-----
' Sends 2 bytes + their bitwise complements using a variation of the NEC IR protocol
' repeats every 15 seconds
' I've used this (and seen it used in commercial RF products) using 12-48 bits
' with lead-in pulses from 2.5-9.5mS and lead-in spaces from 2.5-4.5mS
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON & _CP_OFF & _CPD_OFF
RF VAR byte[4]
Copies VAR byte 'RF copies
c VAR byte 'loop index (RF copies)
b VAR byte 'loop index (RF[b])
i VAR byte 'bit index
wb VAR byte 'work byte
CMCON = 7
Copies = 4
'Put data in RF[0] & RF[2]
SendRF: RF[0]=80:RF[1]=~RF[0]:RF[2]=66:RF[3]=~RF[2]
Low 4
For c=1 To Copies
PulsOut 4, 880 '8.8mS lead-in pulse
PauseUs 4400 '4.4mS space
For b=0 To 3
wb=RF[b]
For i=0 To 7 'LSB first
PulsOut 4, 50 '0.5mS pulse
If wb.0=1 Then
PauseUs 1500 '1.5mS space
Else
PauseUs 500 '0.5mS space
EndIf
wb=wb>>1
Next
Next
PulsOut 4, 50 '0.5mS pulse
Pause 40: '40mS GAP
Next
Sleep 15 '15 SEC DELAY
GoTo SendRF
End
Here's the receiver example.
Code:
'-----PIC12F629-----
'Receives 32 bits of NEC protocol
'RF with initial lead-in of 8.8mS
'sends codes via RS232 @ 9600bps on GPIO.2
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON & _CP_OFF & _CPD_OFF
DEFINE PULSIN_MAX 968 '>968 RETURNS 0
DEFINE DEBUG_REG GPIO
DEFINE DEBUG_BIT 2 'GPIO.2
DEFINE DEBUG_MODE 1 'Inverted
DEFINE DEBUG_BAUD 9600
DEFINE OSCCAL_1K 1
RF VAR byte[4]
space VAR byte
i VAR byte
bits VAR byte
stx VAR word 'start of transmission
CMCON = 7 'comparators off
init: RF[0]=0:RF[1]=0:RF[2]=0:RF[3]=0
bits=0:i=0
PulsIn GPIO.1, 1, stx
If (stx<792) Then init
While GPIO.1=0:Wend 'wait pulse
Repeat
PulsIn GPIO.1, 0, space
If (space<40) Or (space>175) Then init
If (space>75) Then
RF.0(i)=1 'set bit
EndIf
i=i+1
Until (i>31)
If RF[0]+RF[1]<>&HFF Then init
If RF[2]+RF[3]<>&HFF Then init
For i = 0 to 3
Debug (RF[i] REV 8)
Next
GoTo init
End
I have used these with inexpensive RF modules made by Wen Shing in Taiwan. The same modules (or clones thereof) are available from several sources worldwide. I've listed some sources here...I've explained the NEC protocol (as it applies to X-10's use of it) and provided a link to a NEC datasheet here...If you do not have an oscilloscope, you can record the received signal (pin 2 of receiver) with a soundcard using the simple setup I show here...and then view it with a Wave editor.
Bookmarks