Can this IR Xmitter/Rcvr be improved?


Closed Thread
Results 1 to 2 of 2
  1. #1

    Default Can this IR Xmitter/Rcvr be improved?

    Hello Everyone. I made a simple IR transmitter & receiver. The receiver uses a low cost 38 KHZ IR receiver module that outputs the demodulated pulses without any external components. It is DIGIKEY P#: PNA4602M-ND. It works perfectly & I'm able to get 3 channels to work. The problem is that it is slow in responding. It uses the count command to determine which channel is being received. Sometimes you have to wait about a full second for the LED to light. It does the count routine 2 times to eliminate false triggering from room light. Can someone improve on this in a SIMPLE way? Possibly send serial data? I never sent serial data before - I don't have a clue on how to do this. Any help would be appreciated. I need about 10 different channels to respond immediately like a TV remote control. Here is the program for the transmitter & receiver:

    'INFRARED TRANSMITTER USING PIC12F629
    CMCON = 7 'comparators off
    trisio = %00000000 'sets ALL PORTS AS OUTPUTS
    GPIO = 0 'ALL LOW
    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
    LET X = 000

    START:
    High GPIO.4 'MULTIPLE HIGH & LOW COMMANDS SLOW SQUARE WAVE
    High GPIO.4 'GETTING 38KHZ WITH THIS SUBROUTINE
    High GPIO.4
    Low GPIO.4
    Low GPIO.4
    LET X= X + 001
    IF X > 33 Then IROFF 'this limits on time of square wave 100 = 3ms
    GoTo START ' works with 3 channels 100=CH1 66=CH2 33=CH3

    IROFF:
    LET X = 000
    Pause 5 'this is actual off time 20=CH1 10=CH2 5=CH3
    GoTo START

    'INFRARED RECEIVER USING PIC 12F629
    CMCON = 7 'comparators off
    trisio = %00001000 'GPIO INPUT FROM IR RCVR
    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

    START:
    Low GPIO.0 'LED OFF

    MEASURE:
    High GPIO.4 'ON RECEIVER
    Count GPIO.3, 100, X 'demodulated pulses fed to GPIO.3
    IF X >= 003 AND X <= 005 Then MEASURE1
    IF X >= 007 AND X <= 009 Then MEASURE2
    IF X >= 015 AND X <= 017 Then MEASURE3
    GoTo START
    'I added a 2nd count routine to eliminate false triggering

    MEASURE1:
    Pause 50
    Count GPIO.3, 100, X
    IF X >= 003 AND X <= 005 Then LEDON1
    GoTo MEASURE

    MEASURE2:
    Pause 50
    IF X >= 007 AND X <= 009 Then LEDON2
    GoTo MEASURE

    MEASURE3:
    Pause 50
    IF X >= 015 AND X <= 017 Then LEDON3
    GoTo MEASURE

    LEDON1:
    LET X= 0
    High GPIO.0 'LED ON
    Pause 1000 'LED ON 1 SECOND
    Low GPIO.0
    GoTo START

    LEDON2:
    LET X= 0
    High GPIO.0
    Pause 2000 'LED ON 2 SECONDS
    Low GPIO.0
    GoTo START

    LEDON3:
    LET X= 0
    High GPIO.0
    Pause 3000 'LED ON 3 SECONDS
    Low GPIO.0
    GoTo START

  2. #2


    Did you find this post helpful? Yes | No

    Default Did it

    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
    Last edited by peterdeco1; - 24th August 2005 at 19:18. Reason: typo

Similar Threads

  1. Replies: 17
    Last Post: - 12th April 2014, 02:17
  2. PIC16F877A pwm use for IR transmission
    By mcbeasleyjr in forum General
    Replies: 0
    Last Post: - 11th July 2009, 18:51
  3. Plz help in completing RC-5 IR remote lamp dimmer project
    By vu2iia in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 3rd April 2008, 08:44
  4. PIC10F200 Automated IR Light Switch
    By Bruce in forum Code Examples
    Replies: 7
    Last Post: - 3rd May 2007, 11:40
  5. how to get pic to pic communication
    By kinsiro in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 30th August 2005, 17:12

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts