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