Okay, with PIC16F690 with int osc at 8MHz, with PULSIN I have a very long code execution time (about 1S) while it is vital that I have a code execution time of less than 100ms as it is supposed to read IR signals incoming every 100ms.
Code:
IF (a.0(0) == 0) THEN
FOR i = 0 to 15 'get a sequence of incoming 16 bits (WITHOUT their prefixes which are 600us pause)
PULSIN PORTA.0,0,ir_pulse[i] ' Read 16 low-going pulses on RA.0, see pbp manual
NEXT i
pin = 0 ' Loop 16 times, at 8MHz record in 5us resolution pulse duration in the word variables array
ENDIF
and
Code:
databyte = 0 'reset low byte and high byte of the word variable to %0000000000000000
FOR i = 0 TO 15 ' process all 16 "data" bits out of 16 bits collected
' LCDOUT $fe,1,#i,":",#ir_pulse[i]
' PAUSE 2000
IF ((ir_pulse[i] > 210) && (ir_pulse[i] < 275)) THEN '240*5us resolution at 8MHz = 1200 us (usual length of a zero is about 127 - 145 and 242 to 266 for a one)
databyte.0(15-i) = 1 'clear the bit
goto slip 'bypass
ENDIF
IF ((ir_pulse[i] > 105) && (ir_pulse[i] < 160)) THEN
databyte.0(15-i) = 0 'clear the bit
GOTO slip 'bypass
ENDIF
'ELSE: invalid data
'LCDOUT $fe,1,#i," != ",#ir_pulse[i]
'LCDOUT $fe,$c0,"Invalid"
'PAUSE 500
valid = 0
'PAUSE 3000
'GOTO hop_here 'bypass and abort if one of the 14 bits is off limits
slip:
NEXT i
I seem to be unable to use PULSIN the right way.
I've decided not to use PULSIN but use TIMER 1 to measure the pulse length.
I was expecting either 600 or 1200 us pulses but get pretty different values and I'm wondering why...
Code:
'the 2400US header that triggered the int when porta.0 went HIGH->LOW is in progress (LOW going pulse because TSOP4840 pulls the pin low when getting 40KHz mod pulse)
while (porta.0 == 0) : WEND 'while pin is low because of the incoming header LOW pulse
'0->1 (2400US header pulse ended)
'here the signal goes high and will stay high for 600us (spacer between header and first bit)
while (porta.0 == 1) : WEND
'1->0 (600US spacer between header and first bit ended because first bit is starting)
'timer1: max 65536 increments of minimum 0.5US at prescale of 1:1
T1CON = %00011100 '1:2 prescale for 1US increments, timer 1 is stopped
TMR1H = 0 'reset timer high byte
TMR1L = 0 'reset timer low byte
databyte = 0 'word var
'memo:
'recorded ranges for a 600 us pulse: 608-741
'recorded ranges for a 1200 us pulse: 1217-1346
'Get length for 16 bits (1200 or 600 us followed by 600 us spacer)
FOR i = 0 to 15
'Bit has started its LOW going pulse, either 1200 or 600 us long
T1CON.0 = 1 'start TMR1 with prescaler = 1:2, we will have 1US increments
WHILE (porta.0 == 0): WEND 'wait for bit pulse to end (while TMR2 is incremented every us)
'0->1 (spacer)
T1CON.0 = 0 'stop TMR2
pulse_length.highbyte = TMR1H
pulse_length.lowbyte = TMR1L
bit_pulse[i] = pulse_length
IF ((pulse_length > 600) && (pulse_length < 750)) THEN 'about 600 us, it is a '0'
databyte.0(15-i) = 0
GOTO next_bit
ENDIF
IF ((pulse_length > 1200) && (pulse_length < 1350)) THEN 'about 1200 us, it is a '1'
databyte.0(15-i) = 1
GOTO next_bit
ENDIF
'GOTO bad_bit
next_bit:
TMR1H = 0
TMR1L = 0
WHILE (porta.0 = 1) : WEND 'we don't measure length of the spacer
'1->0 the falling edge for the next byte
NEXT i
Where am I loosing all these precious clock cycles???
Bookmarks