Hello Everyone. I made the improvements needed for multichannel operation and "instant on" I needed for my IR project. I'm posting it here if anyone is interested in IR remote control. I read documentation on how remote controls work and shortened the routine a bit (5 bit code instead of 8 bit). I know the code can be reduced even further by not repeating the commands 5 times for a 5 bit code but the program is still suprisingly short. The transmitter generates code bits which are LOW pulses in the IR receiver module that are either 1 or 2MS long by turning ON for this amount of time. The pulses received are made a 0 or 1. They are put into a variable from right to left. In this code I'm generating the number "23", transmitter pulses in MS are 2,2,2,1,2. Receiver variable will then be 1,0,1,1,1 = 23. Each operation begins with a 3MS start pulse to sync the receiver with the transmitter. The transmitter is running on 3V and the range is longer than my house. Here is the code. So far it works perfectly without any false activations using different "channels" (I call this channel 23). Any suggestions will be appreciated.
********IR Transmitter using 12F629*********
CMCON = 7 'comparators off
trisio = %11111111 'ALL INPUTS - HIGH & LOW COMMANDS CONVERT THEM TO OUTPUTS
DEFINE OSCCAL_1K 1 ' Set OSCCAL for 1K device
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_ON, BOD_ON, PWRT_ON, PROTECT_ON
X VAR BYTE
STARTBIT:
High GPIO.4 'GETTING 38KHZ WITH THIS SUBROUTINE
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X = X + 001
IF X < 99 Then STARTBIT '99 GIVES 3MS START PULSE
GoSub SEPARATETHEBITS
FIRSTCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 66 Then FIRSTCODEBIT '2MS CODEBIT
GoSub SEPARATETHEBITS
SECONDCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 66 Then SECONDCODEBIT '2MS CODEBIT
GoSub SEPARATETHEBITS
THIRDCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 66 Then THIRDCODEBIT '2MS CODEBIT
GoSub SEPARATETHEBITS
FORTHCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 33 Then FORTHCODEBIT '1MS CODEBIT
GoSub SEPARATETHEBITS
FIFTHCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 66 Then FIFTHCODEBIT '2MS CODEBIT
GoSub SEPARATETHEBITS
GoTo STARTBIT
SEPARATETHEBITS:
Pause 2
LET X = 0
Return
******************IR RECEIVER USING 12F629***************
CMCON = 7 'comparators off
trisio = %00001000 'RA3 INPUT FROM IR RCVR
GPIO = 0 'ALL OUTPUTS LOW
DEFINE OSCCAL_1K 1 ' Set OSCCAL for 1K device
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_ON, BOD_ON, PWRT_ON, PROTECT_ON
CODELENGTH VAR BYTE 'BYTE VARIABLE OK - LESS THAN 8 PULSES MEASURED
CODE VAR BYTE 'BYTE VARIABLE OK - LESS THAN 8 CODE BITS
X VAR BYTE
Clear 'RESET VARIABLES TO 0
High GPIO.4 'ON IR RECEIVER MODULE ATTACHED TO GP4
Pause 100 'SETTLE DOWN BOTH PIC & IR RECEIVER
STARTPULSE:
PulsIn GPIO.3,0,CODELENGTH 'MEASURE LOW PULSE (IR LED ON TIME)
IF CODELENGTH <200 Then STARTPULSE 'LOOKING FOR 3MS PULSE
IF CODELENGTH >400 Then STARTPULSE
CODEPULSES:
PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit0 = 1 '2MS PULSE IS 1
IF CODELENGTH < 150 Then LET CODE.bit0 = 0 '1MS PULSE IS 0
PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit1 = 1
IF CODELENGTH < 150 Then LET CODE.bit1 = 0
PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit2 = 1
IF CODELENGTH < 150 Then LET CODE.bit2 = 0
PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit3 = 1
IF CODELENGTH < 150 Then LET CODE.bit3 = 0
PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit4 = 1
IF CODELENGTH < 150 Then LET CODE.bit4 = 0
IF CODE = 23 Then LEDON
Clear
GoTo STARTPULSE
LEDON:
High GPIO.0 'LED ON
Pause 500
Low GPIO.0
GoTo STARTPULSE
Bookmarks