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 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

  2. #2
    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.

  3. #3
    Join Date
    Mar 2006
    Location
    China
    Posts
    266


    Did you find this post helpful? Yes | No

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

    Hi,

    Please post your HW schematic with component numbers and values. It will be much easier for all of us if we can see what and how you connect to the PIC. Do you have the pic on 5V and the reciver also on 5V.. or are you running a 5V receiver on 3V ?

    Step one must be to rule out HW and also make it possible for others to duplicate your setup for testing purposes.

    /me

  4. #4
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,122


    Did you find this post helpful? Yes | No

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

    Your Header variable is a word because the values you expect are beyond 0-255 range that a byte can accept.

    Keep in mind that Pulsin is clock dependant. The real clock your PIC is using, NOT the one you declare with DEFINE OSC line. At 4MHz it increment by a 10usec step. At 20MHz by a 2usec step.

    How do you know that values are not within the range?

    Do you have some kind of output check?

    Ioannis

  5. #5
    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!

    Thanks for your replies

    Jumper, I dont have a schematic to post but Im using an easypic3 board with a 18f4550 at 5v with the tsop 2438 reciver on the same 5v with the output pin connected to portc.0 (pdf datasheet attached).

    Ioannis, I realised as soon as I posted why it was a word var lol, I assume the valuse are not in the range as I am using the same xtal and code as bogdan's working code ?, as I said I am usless at math so I am taking bogdan's word that the value I should get at 4mhz is between 400 to 490.
    Attached Images Attached Images
    Reading the datasheet & understanding it are two different things.

  6. #6
    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!

    the code was for a samsung tv .... close, but not the same like the nec protocol

    SAMSUNG IR protocol:
    http://www.samsung.com/global/busine...000_090108.pdf (check "Figure 1. IR Signal")



    NEC IR protocol:
    http://www.mcselec.com/index.php?opt...=223&Itemid=57

    ... the leader/header for nec should be 9msec

    change the
    DEFINE PULSIN_MAX 990 (try with 10% deviation... 900*1.1)
    - - - - - - - - - - - - - - - - - - - - -
    IF (Header < 810) OR (Header > 990) THEN GOTO IRIN (again the -/+10% deviation)

  7. #7
    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!

    I've looked at the nec ir protocol but i'm non the wiser :-(

    Just if anyone is interested I have attached the actual code that came with my remote and reciver IC kit, it was written for the arduino and commented in japanese, I have translated the comments to english but I cant translate the code, if anyone wants to look at it it might reveal to someone more experienced what I need to do to get it to work maybe ?.
    Attached Files Attached Files
    Reading the datasheet & understanding it are two different things.

  8. #8
    Join Date
    Mar 2006
    Location
    China
    Posts
    266


    Did you find this post helpful? Yes | No

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

    Plan B:

    Use an other pic and set up the HPWM manually for 38 kHz. Then you connect an IR diode to the HPWM pin using a resistor to get aprox 20 mA in the led.

    Then in the code you make a simple main loop. Turn on the HWPM, delay 9 ms, and then turn off the HPWM, wait a while (i.e 5 ms) and then goto main again. Point this led towards the ir-receiver from a close distance and now you have a signal that you really know how it looks like. Then you put a shoebox upside down over both the receiver and the transmitter led so they get a nice dark space to be in.

    Have you ever thought about catching the IR signal using the CCP module or by using interupts and a timer?

    This way you can even build a text signal for the NEC protocol ... [startpulse] delay [bit0] delay etc..

    Which way to decode the signal is the best? Well it all depends what other things your pic will do. If it will only decode the IR signal you can just read the pin in a fast loop and increment a counter when it is LOW.

    Keep in mind that the receiver you are using is ACTIVE LOW.. so the pin will be high when there is no modulated IR light present.

  9. #9
    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!

    Quote Originally Posted by bogdan View Post
    Here's a more authoritative source for the NEC protocol...

  10. #10
    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!

    Thanks dhouston, but looking at more protocol descriptions is just giving me headache lol, I've been at it all week, I think I've actually looked at the description before when I was first googling the nec protocol.

    What I need is a simple working code example that I can then develop...

    If you or anyone can give me a code example for a 18f4550 at 4 or 20 mhz i would be extreemly gratefull..

    Thanks guys
    Last edited by Bonxy; - 28th August 2011 at 19:41.
    Reading the datasheet & understanding it are two different things.

  11. #11
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869


    Did you find this post helpful? Yes | No

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

    Quote Originally Posted by bogdan View Post
    the code was for a samsung tv .... close, but not the same like the nec protocol

    SAMSUNG IR protocol:
    http://www.samsung.com/global/busine...000_090108.pdf (check "Figure 1. IR Signal")



    NEC IR protocol:
    http://www.mcselec.com/index.php?opt...=223&Itemid=57

    ... the leader/header for nec should be 9msec

    change the
    DEFINE PULSIN_MAX 990 (try with 10% deviation... 900*1.1)
    - - - - - - - - - - - - - - - - - - - - -
    IF (Header < 810) OR (Header > 990) THEN GOTO IRIN (again the -/+10% deviation)
    Did you try this?
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  12. #12
    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!

    cncmachineguy

    Yes I did, i still did not get valuses to match, I got values in the range of 552 to 614 and everything in between.
    Reading the datasheet & understanding it are two different things.

  13. #13
    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!

    please let us now the model # of the remote

    (i will try to upload the codes into a universal remote and i will check the protocol later today)

  14. #14
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

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

    There are much better/faster ways to do this, but this should get you started with something that's fairly easy to understand.

    Assuming you have an NEC transmitter that outputs something like the top portion of the graphic below;

    Name:  NEC2.JPG
Views: 11449
Size:  33.3 KB



    This should return similar results to what's shown in the serial terminal window just above.
    Code:
    #CONFIG
      __config _XT_OSC & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
    #ENDCONFIG
     
    DEFINE OSC 4
     
    Leader VAR WORD     ' will be up to 900 for a 9mS leader pulse
    BtnVal VAR BYTE[32] ' holds 32 pulse results
    DByte1 VAR BYTE     ' address byte
    DByte2 VAR BYTE     ' inverse of address byte
    DByte3 VAR BYTE     ' command byte
    DByte4 VAR BYTE     ' inverse of command byte
    X      VAR BYTE     ' loop count
     
    Main: 
      PULSIN PORTB.0,0,Leader  ' leader pulse is ~9mS low-going
      IF Leader < 850 THEN Main
     
      FOR X = 0 TO 31          ' grab 32 incoming pulses
          PULSIN PORTB.0,1,BtnVal(X) ' now measuring high-going pulse widths
      NEXT X
     
      ' now we'll decode 4 bytes from 32 pulses
      FOR X = 0 TO 7               ' sort 1st 8 pulses
          IF BtnVal[X] > 150 THEN  ' > 150 x 10uS = > 1.5mS pulse period
             DByte1.0[X]=1
          ELSE
             DByte1.0[X]=0
          ENDIF
      NEXT X
     
      FOR X = 8 TO 15              ' sort 2nd 8 pulses, etc....
          IF BtnVal[X] > 150 THEN
             DByte2.0[X-8]=1
          ELSE
             DByte2.0[X-8]=0
          ENDIF
      NEXT X
     
      FOR X = 16 TO 23
          IF BtnVal[X] > 150 THEN
             DByte3.0[X-16]=1
          ELSE
             DByte3.0[X-16]=0
          ENDIF
      NEXT X
     
      FOR X = 24 TO 31
          IF BtnVal[X] > 150 THEN
             DByte4.0[X-24]=1
          ELSE
             DByte4.0[X-24]=0
          ENDIF
      NEXT X
     
      HSEROUT [BIN8 DByte1,13,10,BIN8 DByte2," Address",13,10,13,10]
      HSEROUT [BIN8 DByte3,13,10,BIN8 DByte4," Command",13,10,13,10]
      PAUSE 1000
      GOTO Main
    Last edited by Bruce; - 30th August 2011 at 00:10.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

Members who have read this thread : 1

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