Decoding an incoming infrared signal: need advice
Here is the stuff:
I'm using PIC16F684 (as usual) and I connected a Vishay TSOP4840 IR receiver-demodulator.
It has 3 leads: GND, VSS and DATA.
The data lead connects to RA0 of my pic. RA0 is set as input and has its WPU enabled so when the receiver gets 40KHz IR signal at 940 nm (and amplified it) it brings RA0 low.
Well.
Now I have to write a routine that will decode the signal.
Signal is a PWM signal (40KHz, 30% duty cycle).
The data encoding is:
Header: High 2400us.
Data: 8 bits, sent from MSB to LSB, decoded from MSB to LSB.
Each byte is prefixed with a 600us no-pulse pause (the 'spacer'). If a bit is set, there is a 1200us pulse, if bit is cleared, there is a 600us pulse.
The routine I would like to use is:
-----------------------------------------------
WHEN INT OCCURS:
(inside my int handler, once i've cleared port latch mismatch anr reset int flag)
Code:
databyte = %00000000
'wait for the header pulse to end and check if duration is about 2400us+/-100us
j = 0
WHILE (porta.0 == 0)
PAUSEUS 20
j = j + 1
WEND
IF (( j < 115) || (j > 125)) then abort 'wrong pulse duration
FOR i = 0 to 7
j = 0
WHILE (porta.0 == 1) 'wait until the bit prefix (600us no-pulse) ends
PAUSEUS 20
j = j + 1
WEND
IF ((j < 25) || (j > 35)) then abort 'wrong no-pulse duration, we want it to be 600us+/-100us
j = 0
WHILE (porta.0 == 0)
PAUSEUS 20
j = j + 1
WEND
IF ((j > 25) && (j < 35)) THEN
databyte.0(i) = 0
GOTO bypass
ENDIF
IF ((j > 55) && (j < 65)) THEN
databyte.0(i) = 1
GOTO bypass
ENDIF
GOTO abort 'wrong pulse duration
bypass:
NEXT i
abort:
------------------------
I'm afraid this code is pretty heavy and I don't like the lack of accuracy in the timing that force me to use stupid code like:
IF ((j < 25) || (j > 35)) then abort
Is there a faster and more accurate way to decode my signal?
THANKS A LOT for any help or advice.
regards
charles
Decoding routine for IR encoded signal
No guys,
I can't change my hardware.
BRUCE:
"From the bit timing you indicate, I would guess this is a Sony IR transmitter? PULSIN should
be all you need to decode this type. It's one of the easiest around to encode & decode."
It is a VISHAY TSOP4840 receiver (see mouser for the datasheet) and the emiter is a VISHAY TSAL6100 led. I'm using pic's PWM output to encode and I need to decode on the other side but do it quickly and acurately. I'm not using pulsin, I'm polling the input pin, what's wrong with that?
IR receiver - carrier freq importance
Hello,
I'm making a small TV remote based on a 12F683.
It is not finished yet but I have a question about how important the carrier's frequency is.
I've made some test with my SONY TV at different carrier frequs, but I couldn't notice any difference in the operatin distance between the TV and the remote (it works over 8 meters). Maybe my TV is very "sensible" to any IR remote signal and this is not a trustfull test.
As different suppliers use different IR-Receivers with different specifications especially the carrier frequency (mainly between 36 and 40kHz), I'd like to know much importance is to give to this parameter.
Since the remote is going to "learn" from different remotes (= different brands = different carrier freq), I think best to adjust this freq accordingly.
Using mister_e's PicMultiCalc program, I've noticed that I can almost generate the frequency range in a 0,5kHz resolution (36 / 36,5 / 37 / 37,5 / etc).
Does anyone know if it is worth (or mandatory) to have a higher precision?
If yes, can I achieve this with a PIC easely or should I go for an external pulse-generator (or any other system)?