RC5 pre 89Cxxxx
Lubomir Berky
berta
Středa Březen 17 11:41:50 CET 2004
Nejak se to nepovedlo, tak jinak:
; ---------==========----------==========---------=========---------
; 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 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
-----Původní zpráva-----
Od: Lubomir Berky <berta@email.cz>
Komu: Multiple recipients of list <hw-news@list.gin.cz>
Datum: 17. prosince 1999 18:57
Předmět: Re: RC5 pre 89Cxxxx
>Mam az ho najdu tak to majlnu primo do konf. ma to par radku. Nebo si ho
>najdi - Altavista vyhledej SFH506 - tak jsem k nemu prisel ja.
>--
>Lubomir Berky
>berta@email.cz
>berta@atlas.cz
>
>-----Původní zpráva-----
>Od: Slavomir Tomascik <tomascik_slavomir@vse.sk>
>Komu: Multiple recipients of list <hw-news@list.gin.cz>
>Datum: 17. prosince 1999 18:40
>Předmět: RC5 pre 89Cxxxx
>
>
>>Zdravim HW.
>>
>>Nemate niekto prosim implementovy protokol RC5 na IR ovladanie TV a in.,
>na
>>89Cxxxx?
>>
>>Vdaka Slavomir Tomascik
>>tomascik@vse.sk
>>
>
Další informace o konferenci Hw-list