;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. ; ---------==========----------==========---------=========--------- ; 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 ; DonB4t 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 length of first high-pulse CLR C RRC A ; divided by two MOV R1,A CLR C RRC A ; plus half of the time ADD A,R1 MOV R5,A ; yields threshold MOV R0,#BUFFER MOV R1,#1 ; initial value MOV R2,#13 ; Number of bits to decode DECODE: MOV A,@R0 INC R0 CLR C SUBB A,R5 ; compare length with threshold MOV A,#0 CPL C ; short=1 RLC A JNZ NOSKIP INC R0 ; if short skip over next pulse NOSKIP: XRL A,R1 ; new bit is calculated by XOR with previous bit MOV R1,A ; Store new bit RRC A MOV A,R3 ; Store new Bit in R3/R4 by rotating RLC A MOV R3,A MOV A,R4 RLC A MOV R4,A DJNZ R2,DECODE MOV A,R3 ANL A,#00111111B ; extract command from R3 MOV COMMAND,A MOV A,R3 RLC A ; do some rotating to extract XCH A,R4 RLC A ;device address XCH A,R4 RLC A XCH A,R4 RLC A CLR CONTROL JNB ACC.5,TZ ; Check control bit SETB CONTROL TZ: ANL A,#00011111B ; mask device address MOV SUBAD,A POP ACC ; Restore old registerset POP PSW SETB NEW ; Set flag to indicate the new command RETI ; ---------==========----------==========---------=========--------- ; Main routine. Program execution starts here. Don't forget to add ; code to initialize the serial port and Baud rate if your monitor ; program doesn't do that for you. The Main loop waits until a command ; has been received. Then the control bit, subaddress and command byte ; are printed separated by spaces. Leading zeroes are not suppressed. ; When a standby command (12) has been received, the main loop is ; terminated and the program returns to the monitor. ; ---------==========----------==========---------=========--------- MAIN: MOV TCON,#00H ; MAKE SURE TIMERS ARE SHUT DOWN. MOV PSW,#RB0 ; Select register bank 0 MOV SP,STACK SETB EX0 ; Enable external Interrupt0 CLR IT0 ; triggered by a high to low transition SETB EA CLR NEW LOOP: JNB NEW,LOOP ; Wait until a command has been received MOV A,#CR CALL C_OUT ; Ouput carriage return and linefeed MOV A,#LF CALL C_OUT MOV A,FLAGS ANL A,#00000001B CALL BIN2BCD ; Output control Bit MOV A,#SPC CALL C_OUT MOV A,SUBAD CALL BIN2BCD ; Output subaddress MOV A,#SPC CALL C_OUT MOV A,COMMAND CALL BIN2BCD ; Output command MOV A,COMMAND CLR C SUBB A,#0CH ; compare for standby command CLR NEW JNZ LOOP ; go on receiving CLR EX0 ; stop receiving CLR EA ; and JMP 8000H ; return to monitor which has its entry point at 8000H END