'=============================TRANSMITTER========================== '-----PIC12F629 using MPASM----- ' Sends 2 bytes + their bitwise complements using a variation of the NEC IR protocol ' repeats every 15 seconds @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_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] & complement in RF[1] & RF[3] SendRF: RF[0]=80:RF[1]=~RF[0]:RF[2]=66:RF[3]=~RF[2] Low GPIO.2 For c=1 To Copies PulsOut GPIO.2, 880 '8.8mS lead-in pulse PauseUs 4400 '4.4mS space 'Use SerOut here instead of For:Next loops For b=0 To 3 wb=RF[b] For i=0 To 7 'LSB first PulsOut GPIO.2, 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 'omit next line if using SerOut PulsOut GPIO.2, 50 '0.5mS pulse Pause 40: '40mS GAP Next Pause 15000 '15 SEC DELAY GoTo SendRF End '==============================RECEIVER============================ '-----PIC12F629 using MPASM----- 'USE PIC12F675 if you need to measure linear output (e.g. to tune) 'Receives 32 bits of NEC protocol RF with initial lead-in of 8.8mS 'outputs received codes as hex string via RS232 @ 9600bps on GPIO.2 @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_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 stx VAR word 'start of transmission CMCON = 7 'comparators off Debug "RF NEC PROTOCOL",10,13 init: RF[0]=0:RF[1]=0:RF[2]=0:RF[3]=0:i=0 PulsIn GPIO.1, 1, stx If (stx<792) Then init 'too short or > PULSIN_MAX While GPIO.1=0:Wend 'wait pulse Repeat PulsIn GPIO.1, 0, space If ((space<40) Or (space>180)) Then init If (space>75) Then RF.0(i)=1 'set bit EndIf i=i+1 Until (i>31) 'next two lines are optional - depends on tx codes If (RF[0]+RF[1]<$FF) Then init 'corrupt so discard If (RF[2]+RF[3]<$FF) Then init 'corrupt so discard For i=0 To 3 Debug IHEX2 RF[i] Next Debug 10,13 GoTo init End '============================SEROUT2=TRANSMITTER========================== '-----PIC12F629 using MPASM----- @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF CMCON = 7 SendRF: Low GPIO.2 PulsOut GPIO.2, 500 '5mS lead-in pulse PauseUs 4400 '2.5mS space SerOut2 GPIO.2,396,["HELLO",10] Pause 15000 '15 SEC DELAY GoTo SendRF End '=========================SERIN2=RECEIVER============================ '-----PIC12F629 using MPASM----- @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_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 msg VAR byte[5] stx VAR word 'start of transmission CMCON = 7 'comparators off GetRF: PulsIn GPIO.1, 1, stx If (stx<450) Then GetRF SerIn2 GPIO.1,T2400,STR msg\5\10 Debug STR msg\5,10,13 GoTo GetRF End