Your approach is far too limited. Some protocols use PulseWidthModulation (PWM), some use PulsePositionModulation (PPM) and some use something entirely different. Also the number of bits in a code can vary from less than 20 to more than 100. Most, but not all, use an extended silence between repeat copies of the code.
My interest has been more with RF than IR but the approach is similar except that most RF receivers are active high while most IR receivers are active low.
Here's some code I use with RF. You'll need to modify it for IR. And it will capture only PWM & PPM codes - there are other protocols.
Code:
'============================RECEIVER============================
'PIC12F683 @ 8MHz <500 words
'Receives up to 44 bits of PDM/PWM RF with initial lead-in of 2-9mS
'outputs received codes via RS232 @ 9600bps on GPIO.4 (Pin 3)
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BOD_ON & _CP_OFF & _CPD_OFF
DEFINE OSC 8 '8 MHz oscillator
DEFINE ADC_BITS 8
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 25
DEFINE DEBUG_REG GPIO
DEFINE DEBUG_BIT 4 'GPIO.4 (Pin 3)
DEFINE DEBUGIN_BIT 3 'GPIO.3 (Pin 4)
DEFINE DEBUG_MODE 1 'Inverted logic
DEFINE DEBUG_BAUD 9600
Symbol Capture=PIR1.2 'CCP1 capture flag
Symbol PinChng=INTCON.0 'InterruptOnChange
Symbol RS232=GPIO.3 'GPIO.3 (Pin 2)
Symbol RS485=GPIO.0 'GPIO.0 (Pin 6)
RF VAR byte[6]
RS VAR byte[6]
cfg VAR byte[5]
ID VAR byte
pw VAR word
i VAR byte
bits VAR byte
bytes VAR byte
sof VAR word 'start of frame
minSOF VAR word 'minimum start pulse (1900-8500 ~1.9mS-8.5mS)
minBits VAR byte
adc VAR byte
id VAR byte
module VAR byte
addr VAR byte
rssi VAR word 'received signal strength indicator
DATA $01,$FE,$6C,$07,$0E,$01 'EEPROM module,id,minSOF (1900),minBits (14),adc
OSCCON = %01110001 'INT HF OSC 8MHz
WHILE OSCCON.3>0:WEND 'OSC startup timeout
WHILE OSCCON.2=0:WEND 'INT HF OSC stable
CMCON0 =%00000111 'comparators off
TRISIO =%00101110 'make GPIO.0,4 outputs
GPIO =%00000000 'make GPIO.0,4 LOW
ANSEL =%00000010 'make GPIO.1 analog
ADCON0.7=1 'right justify ADC result for 10-bit
IOC =%00001001 'IOC Pins enabled
INTCON =%00000000 'disable interrupts
READ 0,module
DEBUG DEC module,32
READ 1,id
DEBUG DEC id,32
READ 2,minSOF.LowByte
READ 3,minSOF.HighByte
DEBUG DEC minSOF,32
READ 4,minBits
DEBUG DEC minBits,32
READ 5,adc
DEBUG DEC adc,10,13
init: RF[0]=0:RF[1]=0:RF[2]=0:RF[3]=0:RF[4]=0:RF[5]=0
CCP1CON=%00000101:Capture=0 'capture rising edge
While !Capture 'wait for rising edge
Wend
TMR1H=0:TMR1L=0:T1CON=%00010000 'prescale=2, tick=1uS
ADCIN 1, rssi 'read pulse amplitude
CCP1CON=0:Capture=0 'capture falling edge
While !Capture 'wait for falling edge
Wend
sof.HighByte=CCPR1H:sof.LowByte=CCPR1L
If (sof<minSOF) Then init '<min so abort
If (sof>9600) Then init '>max so abort
ADCIN 1, i 'read space amplitude
If (i<rssi) Then
rssi=rssi-i
Else
rssi=i-rssi
EndIf
CCP1CON=%00000101 'capture rising edge
bits=0:Capture=0:INTCON.2=0
While !Capture 'wait for rising edge
Wend
Repeat
TMR1H=0:TMR1L=0:T1CON=%00010000 'prescale=2, tick=1uS
TMR0=100 'overflow 156*16=2496uS (100+156=256)
OPTION_REG=%10000100:Capture=0 'TMR0 prescale=16
While !Capture 'wait rising edge
If INTCON.2=1 Then break 'TMR0 overflow (GAP>2.5mS)
Wend
pw.HighByte=CCPR1H:pw.LowByte=CCPR1L
If (pw<850) Then init '<0.85mS so abort
If (pw>1300) Then '>1.3mS
RF.0(i)=1 'set bit
EndIf
i=i+1
Until (i>43)
break: If (bits<>20) Then
bits=i+1
EndIf
If (bits<minBits) Then init
bytes=(bits)/8
If ((bits)//8>0) Then
bytes=bytes+1
EndIf
Debug bits
For i = 0 to bytes
Debug ihex2 RF[i]
RS[i]=RF[i]
Next
DEBUG ihex2 (sof/40)
If (adc>0) Then
DEBUG ihex2 (rssi>>2)
EndIf
debug 13,10
GoTo init
End
A more generalized method that can capture any protocol uses a bit array and samples the input at 25-50µS intervals, setting a bit when the sample is high. This gives you an image of the code with the resolution depending on the sample rate.
You might find some of the links on my web page useful.
Bookmarks