I would allow for ±20% deviation in the start pulse. The NEC code has built-in error checking so grabbing the wrong code is not much of a problem.
Where are you doing your testing? Fluorescent lights can output a lot of noise in the 38kHz band that NEC used. Direct sunlight can also be a complication. Otherwise, IR tends to be mostly noise free so catching the start code is usually straightforward.
I would not use PulsIn. Here's some hastily modified and untested code that should work. Blame the forum software for the screwed up spacing/tabs, etc.Code:'=======================| GENERIC IR/RF RECEIVER |========================= 'GEN-RF-683.BAS 'PIC12F683 @4MHz uses MPASM '========================================================================== @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _FCMEN_OFF DEFINE OSC 4 DEFINE DEBUG_REG GPIO DEFINE DEBUG_BIT 2 DEFINE DEBUGIN_REG GPIO DEFINE DEBUG_IN 3 DEFINE DEBUG_MODE 1 DEFINE DEBUG_BAUD 9600 @Timer1=TMR1L Timer1 VAR WORD EXT TMR1ON VAR T1CON.0 'Timer1 ON/OFF control bit IR VAR byte[4] leadin var byte[2] period VAR byte i VAR byte bits VAR byte OSCCON =%01100001 '4MHz _INTRC_OSC_NOCLKOUT CMCON0 =%00000111 'disable comparators ANSEL =%00000001 'AN0=analog ADCON0.7 =1 'right justify ADC TRISIO =%00101011 'input=1,output=0 GPIO =%00101000 'high=1,low=0 INTCON =%00000000 'disable interrupts T1CON =%00110000 'TMR1 prescaler=8,tick=8µS init: RF[0]=0:RF[1]=0:RF[2]=0:RF[3]=0: While GPIO.1=1 'wait falling edge Wend 'falling edge TMR0=0:OPTION_REG=%10000101 'TMR0 prescaler=64 While GPIO.1=0 'wait rising edge Wend 'rising edge leadin[0]=TMR0:TMR0=0 If (leadin[0]<154) Then init '8500µS (154) If (leadin[0]>190) Then init '10500µS (190) While GPIO.1=1 'wait falling edge Wend 'falling edge leadin[1]=TMR0:TMR0=0 'clear TMR0 OPTION_REG=%10000011 'TMR0 prescaler=16 i=0 Repeat While GPIO.1=0 'wait rising edge If TMR0>186 Then break '3000µS Wend 'rising edge While GPIO.1=1 'wait falling edge If TMR0>186 Then break '3000µS Wend 'edge period=TMR0:TMR0=0 'reset TMR0 If (period<49) Then init If (period>93) Then '1500µS IR.0(i)=1 EndIf i=i+1 Until (i>31) break: If (i<32) Then init Debug hex2 i For i = 0 to 3 Debug hex2 IR[i] REV 8 Next TMR1ON=0:Timer1=0:TMR1ON=1 Debug 13,10 GoTo init End




Bookmarks