Confused:
That code is specific to the 18F2431, with features not found in the 16F683.
Take a look at the code here http://www.rentron.com/PicBasic/IR_Chips.htm by the same author for a better understanding of decoding IR remote signals.
Confused:
That code is specific to the 18F2431, with features not found in the 16F683.
Take a look at the code here http://www.rentron.com/PicBasic/IR_Chips.htm by the same author for a better understanding of decoding IR remote signals.
That is one way to do it but I need a simple way to read the Sony protocol. I liked the way this code works because it doesnt require any hardware peripherals. Please help me figure out why this isnt working.Code:pulse var Word x var byte signal var word ANSEL = %00000000 Start: Pulsin PORTC.3, 0, pulse if (pulse < 220) or (pulse > 260) then start signal = 0 x = 1 Loop: pulsin PORTC.3, 0, pulse if (pulse > 90) then ADD_X READ_IR: x = x * 2 if (x = 255) then start serout PORTC.2, 2, [#signal] goto loop ADD_X: signal = signal + x goto read_ir end
For one thing, I would take the SEROUT out of your loop: SEROUT takes a fair amount of time, and you will lose any IR pulses after the first while servicing the SEROUT.Save pulses to an array as you capture them, then SEROUT when done with capture.
Also, the tolerance on this:
might be a little tight to capture the 240msec AGC pulse at the start. See below.Code:if (pulse < 220) or (pulse > 260) then start
From the link I gave you:
is a good start. ABYTE and DBYTE together give you the 12 bit decoded command.Code:Decode: '// Shift right to remove bit RA.0 H_Add = (PORTA >> 1) & %00011111 '// AND with %00011111 to mask upper 3-bits '// RA.1 to RA.5 = 5-bit hardware address Decode2: PULSIN PORTA.7,0,PULSE_IN '// Read-in start pulse IF (PULSE_IN < 200) OR (PULSE_IN = 0) THEN '// Less than Start pulse, then keep looking Loops = 0 '// Reset Loops on idle or key release IF LM = 1 THEN Decode '// If mode = latching, don't change outputs. PORTB = 0 '// Mode = momentary. Key = released or idle GOTO Decode '// so clear outputs & return. ENDIF Verify: '// Read, Decode, then verify data FOR Index = 0 TO 12 '// Setup to read-in 13 pulses PULSIN PORTA.7,0,IR_PULSE[Index] '// Read 13 low-going pulses on RA.7 NEXT Index '// Loop x times DBYTE = $FF '// Start with all 1's and find each 0 FOR Index = 0 TO 7 '// Get 8 "data" bits IF IR_PULSE[Index] < 100 THEN DBYTE.0[Index]=0 '// Less than 1mS = 0 NEXT Index ABYTE = $FF '// Start with all 1's and find each 0 in pattern X=0 '// Initialize address bit index pointer to bit 0 FOR Index = 8 TO 12 '// Get 5 address bits from IR_PULSE bits 8-12 IF IR_PULSE[Index] < 100 THEN ABYTE.0[X]=0 X = X + 1 '// Increment address bit index pointer NEXT Index ABYTE = ABYTE & %00011111 '// Mask out upper 3-bits. Result = 5-bit address.
@ 4MHz, PULSIN has 10µs resolution.
If you need to capture 240msec, then you would have:
I did something similar and left PULSIN by side - I use TMR1 instead. Have a look to the "code" section here http://home.citycable.ch/flotulopex/...I_Frames_e.htmCode:if (pulse < 22) or (pulse > 26) then start
HTH
Roger
I dont think the timing is off becuase I used a portion of the first code to make shure the range of numbers was correct.
I think this was the code but I used 220 through 260 and the led would flash every time it detected the ACG pulse. So I dont think the values are incorrect. I just dont know how to excecute the program.Code:start: if (pulse < 220) or (pulse > 260) then start high GPIO.2 pause 100 low GPIO.2 goto start
I would really like to use this code below because I understand it, it's simple and I can do it all in software. If anyone can please tell me what is wrong with this code please let me know.
Code:pulse var Word x var byte signal var word ANSEL = %00000000 Start: Pulsin PORTC.3, 0, pulse if (pulse < 220) or (pulse > 260) then start signal = 0 x = 1 Loop: pulsin PORTC.3, 0, pulse if (pulse > 90) then ADD_X READ_IR: x = x * 2 if (x = 255) then start serout PORTC.2, 2, [#signal] goto loop ADD_X: signal = signal + x goto read_ir end
One Sony decoder chip comin up..
This should be easy to understand & modify for your PIC type. And you can easily change it to display buttons like channel-up, down, volume-up, down, etc..
This will print buttons #1 through #9. Buttons 0, channel, volume, etc will output the numeric values corresponding to buttons pressed.Code:DEFINE OSC 4 IR_PULSE VAR BYTE(12) ' IR data received INDEX VAR BYTE ' Index pointer DBYTE VAR BYTE ' IR data received Main: PULSIN PORTC.3,0,IR_PULSE '// Read-in start pulse IF (IR_PULSE < 200) OR (IR_PULSE = 0) THEN Main Verify: '// Read, Decode, then verify data FOR Index = 0 TO 11 '// Setup to read-in 12 pulses PULSIN PORTC.3,0,IR_PULSE[Index] '// Read 12 low-going pulses on RC.3 NEXT Index '// Loop x times DBYTE = $7F '// Start with all 1's and find each 0 FOR Index = 0 TO 6 '// Get 7 "data" bits IF IR_PULSE[Index] < 100 THEN DBYTE.0[Index]=0 '// Less than 1mS = 0 NEXT Index DBYTE = DBYTE + 1 '// Button code #1 = 0, Button #2 = 1, so add 1 '// for actual button pressed for display HSEROUT ["Button pressed was ",#DBYTE,13,10] GOTO Main END
I know you don't care about the device codes like TV, VCR, etc, but it's easier to keep in-synch if you read these in anyway.
Last edited by Bruce; - 15th May 2010 at 05:22.
Wow, Mr.Bruce, amazing job !!! I wonder if it's possible to create code (like this) for using with RC-10 infrared remote from Blaupunkt. I read something about remote with buttons here : http://dren.dk/lacetti-blaupunkt.html, but it' s more interesting to build one infrared remote. In the car that will make the difference... I read all topics on this forum about IR, and Yours web pages too, but my level of knowledges it's (verry) low...so, if it's possible, every help it's wellcome.
Bookmarks