NEC IR Protocol remote decoder, help me before I kill myself!


Closed Thread
Results 1 to 26 of 26

Hybrid View

  1. #1
    Join Date
    Dec 2004
    Location
    Scarborough UK
    Posts
    77

    Angry NEC IR Protocol remote decoder, help me before I kill myself!

    Hi Guys & Gals

    I'm going nuts

    I am trying to decode the NEC remote protocol and I've been at it for days, I cant even measure the 9ms start pulse!

    I have tried to use the pulsin command and I have also used a timer to measure the start pulse but no mater what method I use I get a different pulse width every time I press a remote button, even with the same button, even with different remotes, I just cant figure this out.

    IF YOU HAVE SOME NEC CODE PLEASE SHARE


    '-----------------------------------------------------------------------------
    'Defines for EasyPic3
    DEFINE LCD_DREG PORTB ' Define LCD registers and bits
    DEFINE LCD_DBIT 4
    DEFINE LCD_RSREG PORTB
    DEFINE LCD_RSBIT 2
    DEFINE LCD_EREG PORTB
    DEFINE LCD_EBIT 3

    DEFINE OSC 20

    include "lcddefs.bas" 'easy LCD
    INCLUDE "AllDigital.pbp" 'Set ALL ports to Digital i/o
    pause 400

    startpulse var byte
    main:

    startpulse = 0

    pulsin portc.0,0,startpulse
    if startpulse > 0 then

    lcdout cmd,clss, cmd,movtoB12, dec startpulse
    pause 1000
    endif

    GoTo main
    '--------------------------------------------------------------------------------------

    What am I doing wrong ?
    Reading the datasheet & understanding it are two different things.

  2. #2
    Join Date
    Dec 2005
    Posts
    1,073


    Did you find this post helpful? Yes | No

    Default Re: NEC IR Protocol remote decoder, help me before I kill myself!

    Search the Code Example forum - I posted examples (using RF) to send/receive it a few years back. X-10 uses it for their RF remotes.

    You can also find RF code here...

    The RF code uses slightly different timing (shorter start sequence) but you should be able to handle that. And IR is usually active low while RF is active high.

  3. #3
    Join Date
    Jan 2009
    Posts
    78


    Did you find this post helpful? Yes | No

    Default Re: NEC IR Protocol remote decoder, help me before I kill myself!

    i did this a while ago... samsung tv_volume_up=(latching) relay close.... tv_volume_down=(latching) relay open

    hope it helps

    Code:
    ;Configuration Bits  in the MICROCHIP / MPASM SUITE / P16F1933.INC file
    ;
    ;----- CONFIG1 Options --------------------------------------------------
    ;_FOSC_LP         EQU  H'FFF8'    ; LP Oscillator, Low-power crystal connected between OSC1 and OSC2 pins
    ;_FOSC_XT         EQU  H'FFF9'    ; XT Oscillator, Crystal/resonator connected between OSC1 and OSC2 pins
    ;_FOSC_HS         EQU  H'FFFA'    ; HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins
    ;_FOSC_EXTRC      EQU  H'FFFB'    ; EXTRC oscillator: External RC circuit connected to CLKIN pin
    ;_FOSC_INTOSC     EQU  H'FFFC'    ; INTOSC oscillator: I/O function on CLKIN pin
    ;_FOSC_ECL        EQU  H'FFFD'    ; ECL, External Clock, Low Power Mode (0-0.5 MHz): device clock supplied to CLKIN pin
    ;_FOSC_ECM        EQU  H'FFFE'    ; ECM, External Clock, Medium Power Mode (0.5-4 MHz): device clock supplied to CLKIN pin
    ;_FOSC_ECH        EQU  H'FFFF'    ; ECH, External Clock, High Power Mode (4-32 MHz): device clock supplied to CLKIN pin
    ;
    ;_WDTE_OFF        EQU  H'FFE7'    ; WDT disabled
    ;_WDTE_SWDTEN     EQU  H'FFEF'    ; WDT controlled by the SWDTEN bit in the WDTCON register
    ;_WDTE_NSLEEP     EQU  H'FFF7'    ; WDT enabled while running and disabled in Sleep
    ;_WDTE_ON         EQU  H'FFFF'    ; WDT enabled
    ;
    ;_PWRTE_ON        EQU  H'FFDF'    ; PWRT enabled
    ;_PWRTE_OFF       EQU  H'FFFF'    ; PWRT disabled
    ;
    ;_MCLRE_OFF       EQU  H'FFBF'    ; MCLR/VPP pin function is digital input
    ;_MCLRE_ON        EQU  H'FFFF'    ; MCLR/VPP pin function is MCLR
    ;
    ;_CP_ON           EQU  H'FF7F'    ; Program memory code protection is enabled
    ;_CP_OFF          EQU  H'FFFF'    ; Program memory code protection is disabled
    ;
    ;_CPD_ON          EQU  H'FEFF'    ; Data memory code protection is enabled
    ;_CPD_OFF         EQU  H'FFFF'    ; Data memory code protection is disabled
    ;
    ;_BOREN_OFF       EQU  H'F9FF'    ; Brown-out Reset disabled
    ;_BOREN_SBODEN    EQU  H'FBFF'    ; Brown-out Reset controlled by the SBOREN bit in the BORCON register
    ;_BOREN_NSLEEP    EQU  H'FDFF'    ; Brown-out Reset enabled while running and disabled in Sleep
    ;_BOREN_ON        EQU  H'FFFF'    ; Brown-out Reset enabled
    ;
    ;_CLKOUTEN_ON     EQU  H'F7FF'    ; CLKOUT function is enabled on the CLKOUT pin
    ;_CLKOUTEN_OFF    EQU  H'FFFF'    ; CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin
    ;
    ;_IESO_OFF        EQU  H'EFFF'    ; Internal/External Switchover mode is disabled
    ;_IESO_ON         EQU  H'FFFF'    ; Internal/External Switchover mode is enabled
    ;
    ;_FCMEN_OFF       EQU  H'DFFF'    ; Fail-Safe Clock Monitor is disabled
    ;_FCMEN_ON        EQU  H'FFFF'    ; Fail-Safe Clock Monitor is enabled
    ;
    ;;----- CONFIG2 Options --------------------------------------------------
    ;_WRT_ALL         EQU  H'FFFC'    ; 000h to 7FFh write protected, no addresses may be modified by EECON control
    ;_WRT_HALF        EQU  H'FFFD'    ; 000h to 3FFh write protected, 400h to 7FFh may be modified by EECON control
    ;_WRT_BOOT        EQU  H'FFFE'    ; 000h to 1FFh write protected, 200h to 7FFh may be modified by EECON control
    ;_WRT_OFF         EQU  H'FFFF'    ; Write protection off
    ;
    ;_PLLEN_OFF       EQU  H'FEFF'    ; 4x PLL disabled
    ;_PLLEN_ON        EQU  H'FFFF'    ; 4x PLL enabled
    ;
    ;_STVREN_OFF      EQU  H'FDFF'    ; Stack Overflow or Underflow will not cause a Reset
    ;_STVREN_ON       EQU  H'FFFF'    ; Stack Overflow or Underflow will cause a Reset
    ;
    ;_BORV_25         EQU  H'FBFF'    ; Brown-out Reset Voltage (VBOR) set to 2.5 V
    ;_BORV_19         EQU  H'FFFF'    ; Brown-out Reset Voltage (VBOR) set to 1.9 V
    ;
    ;_LVP_OFF         EQU  H'DFFF'    ; High-voltage on MCLR/VPP must be used for programming
    ;_LVP_ON          EQU  H'FFFF'    ; Low-voltage programming enabled
    ;
    ;
    ;
    ;
     
    @ __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF  & _FCMEN_OFF ;commented the line in the picbasic folder file="12F1822.inc"
    ;-------------------------------------------------------------------------------
    CLEAR                       ;Set all RAM registers to zero
    ;===============================================================================
    ;PORTS CONFIGURATION
    ;RA0            IR
    ;RA2, RA4       connection to relay
    ;RA5            LED
    OSCCON.1=0
    OSCCON.0=0                  ;When the SCS bits of the OSCCON register = 00,
                                ;the system clock source is determined by
                                ;configuration of the FOSC<2:0> bits in the
                                ;Configuration Word Register 1 (CONFIG1)
    OSCCON.6=1                  ;int osc freq 4MHz (IRCF bits)
    OSCCON.5=1                  ;int osc freq 4MHz (IRCF bits)
    OSCCON.4=0                  ;int osc freq 4MHz (IRCF bits)
    OSCCON.3=1                  ;int osc freq 4MHz (IRCF bits)
    ANSELA=0                    ;turn off the Analog to Digital converter,
                                ;needs to be disabled prior to use I/O on portA.0 to 5
    CM1CON0.7=0                 ;Comparators Off (CxON bit)
    FVRCON.7=0                  ;Fixed Voltage Reference is disabled (FVREN bit)
    DEFINE OSC 4                ;=4MHz
    DEFINE PULSIN_MAX 490  
    OPTION_REG.7=1              
    Header VAR WORD
    index VAR BYTE
    IR_pulse VAR BYTE[31]
    IR_data VAR BYTE[31]
    PORTA=0
    TRISA=%000001               ;PORTA.0 input for the IR
     
    IRIN:
    PULSIN PORTA.0,0,Header
    IF (Header<400) OR (Header>490) THEN GOTO IRIN
    FOR index=0 TO 31
        PULSIN PORTA.0,1,IR_pulse[index]
    NEXT    
    FOR index=0 TO 31
        WRITE index,IR_pulse[index]
        IF IR_pulse[index]<100 THEN 
            IR_pulse[index]=0
            ELSE
            IR_pulse[index]=1
        ENDIF      
    NEXT
     
    'Volume UP
    FOR index=0 TO 31
        LOOKUP Index,[1,1,1,0,   0,0,0,0,   1,1,1,0,   0,0,0,0,   1,1,1,0,   0,0,0,0,   0,0,0,1,   1,1,1,1],IR_data
        IF IR_pulse[index]<>IR_data then Volume_DOWN
    NEXT index
    PORTA.5=1                   ;turn ON the LED and operate (set) the relay
    PORTA.4=0
    PORTA.2=1
    PAUSE 2                     ;Relay Data sheet: 3 ms max. (mean value: approx. 2.0 ms)
    PORTA.2=0
    pause 1000                  ;protect the relay for overusage when they keep the vol up pressed
     
    'Volume DOWN
    Volume_DOWN:
    FOR index=0 TO 31
        LOOKUP Index,[1,1,1,0,   0,0,0,0,   1,1,1,0,   0,0,0,0,   1,1,0,1,   0,0,0,0,   0,0,1,0,   1,1,1,1],IR_data
        IF IR_pulse[index]<>IR_data then IRIN
    NEXT index
     
    PORTA.5=0                   ;turn OFF the LED and release (reset) the relay
    PORTA.2=0                          
    PORTA.4=1
    PAUSE 1                     ;Relay Data sheet: 2 ms max. (mean value: approx. 1.0 ms)
    PORTA.4=0
    pause 1000                  ;protect the relay for overusage when they keep the vol down pressed
    GOTO IRIN

  4. #4
    Join Date
    Dec 2004
    Location
    Scarborough UK
    Posts
    77


    Did you find this post helpful? Yes | No

    Default Re: NEC IR Protocol remote decoder, help me before I kill myself!

    Hi Guys, thanks for sharing your code with me, dhouston i did see your code before when I was trawling the net and the forum for a solution, and bogdan I like your lookup table for the Ir data, but I am beginning to think there is something wrong with my Ir receiver IC...
    As far as I understand it the 9ms start pulse should be totaly constant and the same every time any key is pressed, but the start pulse width is different every time I pres a key so I cant move on to making any decoding code until I figure out why the start pulse is different every time.
    I'm going to change the ir reciver for another one and will report back, thanks for helping me with this :-)
    Reading the datasheet & understanding it are two different things.

  5. #5
    Join Date
    Dec 2005
    Posts
    1,073


    Did you find this post helpful? Yes | No

    Default Re: NEC IR Protocol remote decoder, help me before I kill myself!

    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

  6. #6
    Join Date
    Dec 2004
    Location
    Scarborough UK
    Posts
    77


    Did you find this post helpful? Yes | No

    Default Re: NEC IR Protocol remote decoder, help me before I kill myself!

    Hi Guys

    Ok, I am totaly stumpped with this, I have tried to use a timer as suggested by dhouston & I have been trying the pulsin method as suggested by bogdan but I get the same problem, the start pulse is all over the place, it ranges from 0 to 255 etc, it seems random.
    I have changed the ir reciver to eliminate a fault there and I checked the output on my scope and it seems to show a correct pattern.

    God knows what I am doing wrong, I just wonder if it is down to the pic's i use 18f4550 & 18f14k50 ?, I have even changed the oscillator down to 4mhz to try and copy bogdan's pulsin code (shown below), also I dont know why the example uses a word var for the pulsin, am I missing something there ?.
    Maths is not my strong point so maybe I'm just reading things worong I dunno but I've been at this a week now and cant get the same start pulse 2 times in a row.

    Could someone check the code below and tell me why I dont get values in the range of 400 - 490 ?.


    'Defines for EasyPic3
    DEFINE LCD_DREG PORTB ' Define LCD registers and bits
    DEFINE LCD_DBIT 4
    DEFINE LCD_RSREG PORTB
    DEFINE LCD_RSBIT 2
    DEFINE LCD_EREG PORTB
    DEFINE LCD_EBIT 3
    INCLUDE "AllDigital.pbp" 'Set ALL ports to Digital i/o
    DEFINE OSC 4 ;=4MHz
    DEFINE PULSIN_MAX 490

    Header VAR WORD '<-- why is this a 'word' instead of a byte ?
    index VAR BYTE
    IR_pulse VAR BYTE[31]
    IR_data VAR BYTE[31]
    PORTC=0
    TRISC=%000001 ;PORTC.0 input for the IR



    'Note, device is a 18f4550

    IRIN:
    PULSIN PORTC.0,0,Header

    IF (Header < 400) OR (Header > 490) THEN GOTO IRIN '<-- problem, values I get are not between 400 to 490


    goto irin
    Reading the datasheet & understanding it are two different things.

  7. #7
    Join Date
    May 2016
    Posts
    1


    Did you find this post helpful? Yes | No

    Default Re: NEC IR Protocol remote decoder, help me before I kill myself!

    pls any one help me.....i want to take data from TSOP with nec protocol......and change duty cycle of pwm at ccp1 pin and increse and decrese brightness of led....i using 16f887........pls give me code.....

Members who have read this thread : 8

You do not have permission to view the list of names.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts