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


Results 1 to 26 of 26

Threaded View

  1. #18
    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: 11494
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