A schematic of your IR LED circuitry is necessary so we can see whether you need to measure pulses or spaces. PulsIn measures spaces as well as pulses - you merely need to indicate the polarirty. There are some example circuits here...
A schematic of your IR LED circuitry is necessary so we can see whether you need to measure pulses or spaces. PulsIn measures spaces as well as pulses - you merely need to indicate the polarirty. There are some example circuits here...
Thanks for reply
IR LED circuitry is here.( please see attachment ).
I use this circuit and test Sony Protocol. LED is blink for any key and correct key code is accept in PC via RS232.
Here is code for Sony.
'start code for Sony Protocol --------------------------------------------------------------
'PIC 16F84A Sony SIRC Protocol
Include "Modedefs.Bas"
Define OSC 4 ' Set Xtal Frequency
Header var word
Body var word
i var byte
tmp var Byte
irButton var byte
irDevice var byte
irIN var PortA.2 'IR Input
ToCOM var PortB.4 'Serial Data to compute COM port [RS232]
'next time use both Sony and NEC Protocol in a PIC
'Same Key from different remote do different tasks
'eg Key 1 from Sony Remote ----> task1 in PC
' Key 1 from NEC Remote -----> task2 in PC
'SonyLED is blink for Sony and nec LED is blink for NEC Remote
SonyLED var PortB.2 'Green LED for Sony Remote keypress
necLED var PortB.3 'Red LED for NEC Remote keypress (Reserved)
TrisA = %00000100 ' Input RA2 only
TrisB = 0 ' Output All Port B
Start:
LOW SONYLED : LOW NECLED
IRBUTTON=255: IRDEVICE=255
'in Header is Sony 240
Pulsin irin,0,header ' Measure the header length.
if header > 270 or header < 200 then goto Start
'if correct header read body 12 bit
for i =0 to 11
pulsin irin,0,tmp ' Measure the body length.
if tmp >= 90 then
Body.0[i]=1 'in Sony Logic 1 is 120
else
Body.0[i]=0 'in Sony Logic 0 is 60
endif
next
IRBUTTON = Body & %01111111 'Mask 7 bit
IRDEVICE = (Body >>7) & %00011111 'Mask 5 bit
If IRDEVICE=255 then goto start
Serout ToCom ,N9600,[IRBUTTON] 'to PC COM - Port
if IRBUTTON >=0 and IRBUTTON < 255 then
high Sonyled
pause 300
low Sonyled
endif
pause 100
goto start
'end of code for Sony Protocol ------------------------------------------------------
I use this circuit again for NEC or CHINA DVD Remote Control.
' start code for NEC OR that DVD REMOTE -----------------------------
'PIC 16F84A NEC Protocol Protocol
Include "Modedefs.Bas"
Define OSC 4 ' Set Xtal Frequency
DEFINE PULSIN_MAX 968 '>968 RETURNS 0
Header var word
Body var word
i var byte
tmp var Byte
irButton var byte
irDevice var byte
irIN var PortA.2 'IR Input
ToCOM var PortB.4 'Serial Data to compute COM port [RS232]
'nec LED is blink for NEC Remote
necLED var PortB.3 'Red LED for NEC Remote keypress
TrisA = %00000100 ' Input RA2 only
TrisB = 0 ' Output All Port B
Start:
LOW NECLED
IRBUTTON=255: IRDEVICE=255
'in Header is NEC 900
Pulsin irin,0,header ' Measure the header length.
if header < 792 then goto Start
While irIN=0:Wend 'wait pulse
'if correct header read body 32 bit
for i =0 to 31
pulsin irin,0,tmp ' Measure the body length.
If ((tmp<40) Or (tmp>180)) Then start
if tmp >= 75 then
Body.0[i]=1
endif
next
IRBUTTON = Body & %11111111 'Mask 8 bit
IRDEVICE = (Body >>16) & %11111111 'Mask 8 bit
If IRDEVICE=255 then goto start
Serout ToCom ,N9600,[IRBUTTON] 'to PC COM - Port
if IRBUTTON >=0 and IRBUTTON < 255 then
high necLED
pause 300
low necLED
endif
pause 100
goto start
' end of code for NEC OR that DVD REMOTE ----------------------------
LED is blink for Both remote control. But Data in my PC software All keys are same number.
How can I fix it.
Thanks.
Moe
Last edited by komoe01; - 30th August 2009 at 12:02.
From your schematic it appears you are using an IR receiver. Which one?
IR receivers usually are active low while the code I supplied for the NEC protocol was for RF where the receiver is active high. Also, my code was meant to work with the RF transmitter code that accompanied it which used slightly different timing than the NEC IR protocol.
The EDN article is wrong about details of the NEC IR protocol. It is explained in this NEC datasheet.You will need to modify my RF code in order to receive/decode IR codes.I have not tested the above code (I don't have time to build a circuit with an IR receiver.) and you will need to convert it for your PIC and the pins you are using.Code:'12F629 @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF DEFINE PULSIN_MAX 1140 '>1140 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 IR VAR byte[4] pulse VAR byte i VAR byte stx VAR word 'start of transmission CMCON = 7 'comparators off Debug "IR NEC PROTOCOL" init: IR[0]=0:IR[1]=0:IR[2]=0:IR[3]=0:i=0 PulsIn GPIO.1, 0, stx If (stx<760) Then init 'debug #stx While GPIO.1=1:Wend 'wait space Repeat PulsIn GPIO.1, 1, pulse If (pulse>100) Then IR.0(i)=1 'set bit EndIf i=i+1 Until (i>31) For i = 0 To 3 Debug IHEX2(IR[i] REV 8) Next GoTo init End
Note also that my code does not deal with the NEC shortcut repeat code.
Last edited by dhouston; - 30th August 2009 at 12:55.
Change...to...Code:For i = 0 To 3 Debug IHEX2(IR[i] REV 8) NextThe bit order is already reversed as the bits are set by...Code:For i = 0 To 3 Debug IHEX2 IR[i] NextCode:RF.0(i)=1
Moe, you might want to read this article: Controlling the world from your armchair
Moe, Infrared remote control decoding maybe considered something of a black art, however, this tutorial will show you that its principals are quite straightforward, and easy to implement on a PIC microcontroler.
Thanks to BASIC’s shallow learning curve, software designs that used to take weeks can now be realised in a just few hours. This article presents software solutions in the PicBASIC Pro language.
You might want to read the article: Controlling the world from your armchair
The article is an extract from the book, EXPERIMENTING with the PICBASIC PRO COMPILER, written by Les Johnson.
The book is cuerrently out of publication, however we are considering publishing an online version as part of the new PIC BASIC portal that we are developing to support PIC BASIC Users.
dhouston,
When I change code, old result 0 turn to 255. All the keys press are same.
Header Logic 0 Logic 1 Logic 1 logic 0
2400 600 600 600 1200 600 1200 600 600
x a b c d e f g h i j
+------------------------+ +------+ +--------------+ +--------------+ +------+
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
---+ +------+ +------+ +------+ +------+ +------
x____________________________|_____________|______ _____________|___________________|_____________|
pulsin header 1st loop 2nd loop 3rd loop 4th loop
return width of length
-- code start -------------------------------
-- end of code -------------------------------Code:pulsin irIn , 0 , Header 'Line 1 for i =0 to 3 pulsin irin, 0 , tmp 'line 3 if tmp > 90 then body.0[i] = 1 'line 5 else body.0[i] = 0 'line 7 endif next
I think pulsin work as follow:
1. pulsin is timeout when no rising edge was found. return width is zero.
2. pulsin is time out when rising edge was found and then until falling edge. return the width length.
so pulsin in code run like that:
Line 1 : pulsin start measure (x) to end edge (b). Width is (a) to (b) so Header = 2400 (space (x) to (a) is not count.
Loop 0 (1st loop)
Line 3 : pulsin start measure (b) to end edge (d). Width is (c) to (d) so tmp = 600 (space (b) to (c) is not count.
Line 5 and 7: see the width lenght (not space) and decided logic 0
Loop 1 (2nd loop)
Line 3 : pulsin start measure (d) to end edge (f). Width is (e) to (f) so tmp = 1200 (space (d) to (e) is not count.
Line 5 and 7: see the width lenght (not space) and decide logic 1
Loop 2 (3rd loop)
Line 3 : pulsin start measure (f) to end edge (h). Width is (g) to (h) so tmp = 1200 (space (f) to (g) is not count.
Line 5 and 7: see the width lenght (not space) and decide logic 1
Loop 3 (4th loop)
Line 3 : pulsin start measure (h) to end edge (j). Width is (i) to (j) so tmp = 600 (space (h) to (i) is not count.
Line 5 and 7: see the width lenght (not space) and decide logic 0
PULSIN can only measure the width length.
When this code is used for NEC Protocol, all pulse are equal depending upon if statement (Logic 0 or 1)
Because In NEC, logic 1 or 0 is determined by space length. How can I measure space with pulsin.
lester
Thanks.
I already read Les Johnson's article and "Section 6: Experimenting with Remote Control" of that book. I already tested it. All are ok. But it's Sony IR Protocol (Pulse Width Modulation) that quite different from NEC IR Protocol (Pulse Distance Modulation).
I admire you and dhouston when I found your join date.
I start and learn picbasic at last week of July of this year. I search and collect PIC books (picbasic, C and Assembly) and article. I found about 60 books and articles. But I cannot find enough explanation for a command. eg. I want to know pulsin in detail. How pulsin work? examples relating pulsin. Pulsin in "PicBasic Pro Manual" is general. Picbasic is best language for me although I've little experience with C Language.
Moe
Last edited by komoe01; - 31st August 2009 at 13:27.
Bookmarks