IR-CODES.DOC

(13 KB) Pobierz

From: PUTZGER@alf2.ngate.uni-regensburg.de (JUERGEN PUTZGER (TEL. 4218))
Subject: Decoding IR remote controls with 8052

                       DECODING IR REMOTE CONTROLS
                           by Juergen Putzger


The origin of this posting was the question what to do with an old TV. 
I suggested to use the infrared remote control as an input keyboard for a
microcontroller board and mentioned a piece of code I had written for
the 8052 microcontroller.  I was asked by some people to share my 
information about remote controls, so here it is:

There are at least two international standards which are used by remote 
controls to encode the commands, the RC5 and RECS 80 code. The RECS 80
code uses pulse length modulation. Each bit to be transmitted is encoded
by a high level of the duration T followed by a low level of duration 2T
representing a logical '0' or 3T representing a logical '1'.

  T 2T T 3T  T 2T
  _    _     _ 
 | |  | |   | |
_| |__| |___| |__
  0    1     0

Notice that a '1' takes more time to be transmitted than a '0'. The RC 5 
code
instead has a uniform duration of all bits. A transition in the middle of 
the
time interval assigned to each bit encodes the logical value. A '0' is 
encoded
by a high to low transition and a '1' by a low to high transition. 
Therefore
we need additional transitions at the beginning of each bit to set the 
proper 
start level if a series of equal bits is sent. We don't need this 
additional
transition if the next bit has a different value. This is also called a 
'biphase' code.

|1.Bit|2.Bit|3.Bit|4.Bit|             
 __    __       __    __
   |  |  |     |  |  |  
   |__|  |_____|  |__|  
   0     0     1     1

Instead of being fed direct into the IR emitter, most remote controls 
modulate
a 20-30 kHz carrier with this signal. A logic one is represented by a 
burst of 
oscillations.

______/\/\/\/\_______/\/\/\/\________
  0      1       0       1      0

The reason is, that you can use a filter tuned to the carrier frequency
to distinguish the signal from noise in the ambient light. Fluorescent 
lamps
are the main source of such noise. Photodiodes behind  an optical filter
which transmits infrared light but blocks visible light are used as 
detectors.
The signal from the photodiode is fed through a filter tuned to the 
carrier 
fequency and then amplified. The amplified signal is demodulated just 
like
the carrier is demodulated in any AM radio receiver.
 
     +
     |
    _|_  photodiode
    /_\                 demodulator
     |      |\                             
    _|_ ____| \_____| |__ __|\|___ ____            L and C form a 
   |   |    | /     | |  |  |/|   |    signal      circuit resonant
   |   /    |/          _|_       |    out         to the carrier
  ===  \    amplifier   /_\      ===
   |C  / L               |        |
   |___|_________________|________|____    
   

It can be a lot of pain to design a sensitive receiver that does'nt 
start to oscillate. It is also necessary to have some automatic gain
control to avoid overload of the amplifier at close distance to the
emitter. It is easier to use some integrated circuit that does
all of the job. The best i have ever seen (and used) is the SFH505A 
manufactured by SIEMENS (no, I don't work for this company). It looks 
like one of this three legged voltage regulators and uses a single 5V
supply. It incorporates an optical filter, the photodiode, a filter 
tuned to about 30 kHz , the amplifier with automatic gain control and
the demodulator.

If you don't know which code your remote control is transmitting you can 
identify it by viewing the output of your receiver with an oscilloscope.
The RECS 80 code uses high pulses of uniform length while the low pulses 
differ in length. If there are high and low pulses of two different 
lengths
it might be RC5 code. Note that your receiver may invert the levels.

How are commands like volume control or channel selction encoded? In the
case of the RC5 code there is an international standard. Every command is
encoded by 14 bits. The first two bits S are startbits to allow the 
receiver
to adjust the automatic gain control and to synchronize. Next a bit T 
follows, that toggles with every new keystroke. Next is the address A of 
the  device which shall respond to the command. At last the command 
itself 
follows.
  
  | S | S | T | A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 |


Some important addresses and commands:

Address:          Device:          Command:           
  0               TV1              0...9    Numbers 0...9 (channel 
select)
  1               TV2              12       Standby 
  5               VCR1             16       Master Volume + 
  6               VCR2             17       Master Volume - 
 17               Tuner            18       Brightness +
 18               Audio Tape       19       Brightness -
 20               CD Player        50       Fast rewind
                                   52       Fast run forward
                                   53       Play 
                                   54       Stop
                                   55       Recording


There are integrated decoder circuits which have inputs to select the 
device 
address and parallel outputs activated by the commands. Since this is 
comp.
robotics the devices you wish to control will have a microcontroller on 
board
which can do all the decoding. Here is an input routine I have written 
for 
the 8052 microcontroller family to receive RC5 codes. My cousin has 
written 
a similar routine for the RECS80 code which i will try to make available 
also.
Perhaps we can start a collection of such routines and archive them 
somewhere.


Juergen Putzger (still looking for that public domain 8052 
C-compiler....)


 ------------------------ source text begins here 
-------------------------


;  ---------==========----------==========---------=========---------
;         Interrupt Driven Receiving Routine for RC5 code
; written by Juergen Putzger (juergen.putzger@physik.uni-regensburg.de)
;  ---------==========----------==========---------=========---------

$MOD52

INPUT   EQU     P3.2    ; Port3,Bit2 is used as input. The demodulated 
signal 
                        ; with active low level is connected to this pin 
    
LF      EQU     0AH     ; Linefeed     
CR      EQU     0DH     ; Carriage return
SPC     EQU     20H     ; Space
RB0     EQU     000H    ; Select Register Bank 0
RB1     EQU     008H    ; Select Register Bank 1  ...poke to PSW to use



        DSEG            ; This is internal data memory
        ORG     20H     ; Bit adressable memory

FLAGS:  DS      1      
CONTROL BIT     FLAGS.0  ; toggles with every new keystroke
NEW     BIT     FLAGS.1  ; Bit set when a new command has been received 

COMMAND: DS     1       ; Received command byte
SUBAD:  DS      1       ; Device subaddress 
BUFFER: DS      30      ; Buffer to store length of transmitted pulses
STACK:  DS      1       ; Stack begins here               




        CSEG            ; Code begins here

;---------==========----------==========---------=========---------
;              PROCESSOR INTERRUPT AND RESET VECTORS
;---------==========----------==========---------=========---------

         ORG     00H    ; Reset
         JMP     MAIN
        
         ORG     0003H  ; External Interrupt0
         JMP     RECEIVE
         


;  ---------==========----------==========---------=========---------
;                            Output routines
;        Don$B4t(B forget to set up the serial port and Baud rate !    
        
;  ---------==========----------==========---------=========---------

N_OUT:  ADD     A,#30H  ;Convert BCD number to ASCII
C_OUT:  JNB     TI,$    ;Wait until transmission completed.
        CLR     TI      ;Clear interrupt flag.
        MOV     SBUF,A  ;Write out character to serial port.
        RET


BIN2BCD:                ;Convert 8 bit value in Acc to 3 digit BCD 
        MOV     B,#100          
        DIV     AB      
        CALL    N_OUT
        XCH     A,B
        MOV     B,#10
        DIV     AB
        CALL    N_OUT
        XCH     A,B
        CALL    N_OUT
        RET



;  ---------==========----------==========---------=========---------
;  Interrupt routine is entered by the first high to low transition
;  at Port3-Bit2. Stores the length of all pulses occuring at this
;  pin in buffer. Analyzes the timing of the startbits to calculate
;  a threshold between short and long pulses. This routine is 
;  independent of CPU speed. The device address and command are 
;  extracted from the bit stream. Two flags are set upon exit,
;  the control bit which toggles with every new keystroke and the 
;  NEW bit indicating that a new command has been received.    
;  ---------==========----------==========---------=========---------

RECEIVE:
         PUSH   PSW           ; save current registerset
         MOV    PSW,#RB1
         PUSH   ACC
         MOV    R0,#BUFFER
REC:     MOV    A,#0
REC0:    INC    A             ; Measure duration of low-level  
         NOP
         NOP                  ; Delay 
         NOP                 
         NOP
         JZ     TIMEOUT       ; End of transmission if duration exeeds 
256 counts
         JNB    INPUT,REC0 
         MOV    @R0,A
         INC    R0
         MOV    A,#0          
REC1:    INC    A             ; Measure duration of high-level
         NOP
         NOP                  ; Delay
         NOP
         NOP
         JZ     TIMEOUT       ; End of transmission
         JB     INPUT,REC1
         MOV    @R0,A
         INC    R0
         JMP    REC    
TIMEOUT:  
         MOV    A,BUFFER      ; calculate threshold between short and 
long pulses 
         INC    R0            ; length of first low-pulse
         ADD    A,BUFFER+1    ; plus...
Zgłoś jeśli naruszono regulamin