I have a strange behavior.
The signal I am supposed to get is:
Assuming the normal state is low, I drive the input pin low with an IR receiver-demodulator.
2400us low (=header), then for each of 16 bits I have a bit prefix which is a 600us pause then if the bit is = 1 there will be a 1200us low or if bit = 0, there will be 600us low.
The incoming IR signal triggers an int on RA4 and then I start pulsin-ing to get the data.
The sequence I get is something like:
127,261,136,251,140,137,137,136,136,247,261,136,24 7,0,0,0
0,1,0,1,0,0,0,0,0,1,1,0,1,?,?,?
There seems to be an offset somewhere. I don't seem to get the first bit.
Maybe it takes too much time to get to the routine that checks the pulse durations???
The data structure I am supposed to get is:
0,0,1,0,1,0,0,0,0,0,1,1,0,1,?,?
Here is my code, in the case someone has an idea:
Code:
'-------------------------------------------------------------------------------
'----- HEADER PULSE ------------------------------------------------------------
'-------------------------------------------------------------------------------
'based on pulsin routines from: http://rentron.com/PicBasic/IR_Chips.htm
PULSIN PORTA.4,0,pulse_in '// Read-in start pulse - in a word var!!
IF (pulse_in < 480) OR (pulse_in = 0) THEN '// Less than header, then keep looking
'GOTO bypass
ENDIF
'-------------------------------------------------------------------------------
'----- get 2 databytes ---------------------------------------------------------
'-------------------------------------------------------------------------------
'Maybe it is too late to get the header because pulsin may reacto to a high to low transition
'while we are ALREADY in the low state, so the header will be bypassed ????
FOR i = 0 to 15 'get a sequence of incoming 16 bits (WITHOUT their prefixes)
PULSIN PORTA.4,0,ir_pulse[i] '// Read 16 low-going pulses on RA.4
NEXT i '// Loop 16 times
' LCDOUT $fe,1,"hdr:",#pulse_in
' PAUSE 2000
'databyte = $FF '// Start with all 1's and find each 0
'we scan the second byte we stored from MSB to LSB
'FOR i = 8 TO 15 '// Get 8 "data" bits
FOR i = 0 TO 15 '// Get 8 "data" bits
LCDOUT $fe,1,#i,":",#ir_pulse[i]
PAUSE 2000
IF (ir_pulse[i] < 240) THEN '240*5us resolution at 8MHz = 1200 us
databyte.0(15-i) = 0 'clear the bit
ELSE
databyte.0(15-i) = 1
ENDIF
NEXT i
Bookmarks