;----------------------------------------------------------- ; ; RFID reader : September 2008 ; ;----------------------------------------------------------- ;##### Port Defines ##### smr .equ h'0fffb0 brr .equ h'0fffb1 scr .equ h'0fffb2 tdr .equ h'0fffb3 ssr .equ h'0fffb4 rdr .equ h'0fffb5 paddr .equ h'0fffd1 padr .equ h'0fffd3 pbddr .equ h'0fffd4 pbdr .equ h'0fffd6 iprb .equ h'0ffff8 ;##### Vector Defines ##### .section vector,data,locate=h'000000 .data.l start .org h'0000d0 .data.l int_rx_error .data.l int_rx_full ;##### Work RAM Data Defines ##### .section ram,data,locate=h'0fef10 timer1 .res.w 1 timer2 .res.w 1 rx_top .res.w 1 rx_end .res.w 1 data .res.b 1 anti1 .res.b 1 anti2 .res.b 1 anti3 .res.b 1 anti4 .res.b 1 id .res.b 1 result .res.b 1 .org h'0ff400 rx_fifo .res.b 1024 ;***** Reset --> Initialize --> Main Loop ***** .section program,code,locate=h'002000 start: mov.l #h'0fff0f,er7 ; stack pointer set mov.l #h'0fef10,er2 mov.w #h'0fe0,r1 mov.b #0,r0l _ram_clear: mov.b r0l,@er2 inc.l #1,er2 dec.w #1,r1 bne _ram_clear jsr @sci0_init ; SCI initialize mov.b #b'11111111,r0l mov.b r0l,@paddr ; set : Port[A] all output mov.b r0l,@pbddr ; set : Port[B] all output mov.b #b'01110000,r0l ; tx/rx start ! mov.b r0l,@scr andc.b #b'01111111,ccr ; interrupt enable mov.b #0,r0l mov.b r0l,@result mov.b r0l,@padr jsr @wait_1000msec request: mov.b #0,r0l mov.b r0l,@pbdr ; monitor = 00000000 jsr @clr_rs232c jsr @clr_rs232c jsr @clr_rs232c jsr @clr_rs232c jsr @clr_rs232c mov.w #200,r1 mov.w r1,@timer2 jsr @wait_count mov.b #1,r0l mov.b r0l,@pbdr ; monitor = 00000001 mov.b #2,r0h jsr @tx_rs232c mov.b #1,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #32,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 80 jsr @rx_rs232c ; result mov.b r0h,@data jsr @rx_rs232c ; 3 mov.b @data,r0l cmp.b #0,r0l beq _request_out mov.b @result,r0l and.b #b'11110000,r0l mov.b r0l,@result mov.b r0l,@padr ; Result output low 4bits = 0 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _request_out: mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count anticol: mov.b #2,r0l mov.b r0l,@pbdr ; monitor = 00000010 mov.b #2,r0h jsr @tx_rs232c mov.b #1,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #34,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 6 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 82 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; param mov.b r0h,@anti1 jsr @rx_rs232c ; param mov.b r0h,@anti2 jsr @rx_rs232c ; param mov.b r0h,@anti3 jsr @rx_rs232c ; param mov.b r0h,@anti4 jsr @rx_rs232c ; 3 select: mov.b #4,r0l ; monitor = 00000100 mov.b r0l,@pbdr mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count mov.b #2,r0h jsr @tx_rs232c mov.b #5,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #35,r0h jsr @tx_rs232c mov.b @anti1,r0h jsr @tx_rs232c mov.b @anti2,r0h jsr @tx_rs232c mov.b @anti3,r0h jsr @tx_rs232c mov.b @anti4,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 3 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 83 jsr @rx_rs232c ; result mov.b r0h,@data jsr @rx_rs232c ; version jsr @rx_rs232c ; 3 mov.b @data,r0l cmp.b #0,r0l beq _select_out mov.b @result,r0l and.b #b'11110000,r0l mov.b r0l,@result mov.b r0l,@padr ; Result output low 4bits = 0 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _select_out: mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count authen: mov.b #8,r0l mov.b r0l,@pbdr ; monitor = 00001000 mov.b #2,r0h jsr @tx_rs232c mov.b #9,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #36,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #96,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c mov.w #150,r1 mov.w r1,@timer2 jsr @wait_count jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 84 jsr @rx_rs232c ; result mov.b r0h,@data jsr @rx_rs232c ; 3 mov.b #16,r0l mov.b r0l,@pbdr ; monitor = 00010000 mov.b @data,r0l cmp.b #0,r0l beq _authen_out mov.b @result,r0l and.b #b'11110000,r0l mov.b r0l,@result mov.b r0l,@padr ; Result output low 4bits = 0 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _authen_out: mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count readnum: mov.b #32,r0l mov.b r0l,@pbdr ; monitor = 00100000 mov.b #2,r0h jsr @tx_rs232c mov.b #2,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #48,r0h jsr @tx_rs232c mov.b #1,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 18 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 96 jsr @rx_rs232c ; result = data 1 mov.b r0h,@data jsr @rx_rs232c ; ID data ! mov.b r0h,@id jsr @rx_rs232c ; data 2 jsr @rx_rs232c ; data 3 jsr @rx_rs232c ; data 4 jsr @rx_rs232c ; data 5 jsr @rx_rs232c ; data 6 jsr @rx_rs232c ; data 7 jsr @rx_rs232c ; data 8 jsr @rx_rs232c ; data 9 jsr @rx_rs232c ; data 10 jsr @rx_rs232c ; data 11 jsr @rx_rs232c ; data 12 jsr @rx_rs232c ; data 13 jsr @rx_rs232c ; data 14 jsr @rx_rs232c ; data 15 jsr @rx_rs232c ; data 16 jsr @rx_rs232c ; 3 mov.b @data,r0l cmp.b #0,r0l beq _readnum_out mov.b @result,r0l and.b #b'11110000,r0l mov.b r0l,@result mov.b r0l,@padr ; Result output low 4bits = 0 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _readnum_out: mov.b @id,r0l and.b #b'00001111,r0l mov.b @result,r0h and.b #b'11110000,r0h or.b r0h,r0l mov.b r0l,@result mov.b r0l,@padr ; 1st RFID Number = low 4bits mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count halt: mov.b #64,r0l mov.b r0l,@pbdr ; monitor = 01000000 mov.b #2,r0h jsr @tx_rs232c mov.b #1,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #54,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 102 jsr @rx_rs232c ; result mov.b r0h,@data jsr @rx_rs232c ; 3 mov.b @data,r0l cmp.b #0,r0l beq request2 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request request2: mov.b #b'10000000,r0l mov.b r0l,@pbdr ; monitor = 10000000 jsr @clr_rs232c jsr @clr_rs232c jsr @clr_rs232c jsr @clr_rs232c jsr @clr_rs232c mov.w #200,r1 mov.w r1,@timer2 jsr @wait_count mov.b #2,r0h jsr @tx_rs232c mov.b #1,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #32,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 80 jsr @rx_rs232c ; result mov.b r0h,@data jsr @rx_rs232c ; 3 mov.b #b'10000001,r0l mov.b r0l,@pbdr ; monitor = 10000001 mov.b @data,r0l cmp.b #0,r0l beq _request_out2 mov.b @result,r0l and.b #b'00001111,r0l mov.b r0l,@result mov.b r0l,@padr ; Result output high 4bits = 0 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _request_out2: mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count anticol2: mov.b #b'10000010,r0l mov.b r0l,@pbdr ; monitor = 10000010 mov.b #2,r0h jsr @tx_rs232c mov.b #1,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #34,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 6 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 82 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; param mov.b r0h,@anti1 jsr @rx_rs232c ; param mov.b r0h,@anti2 jsr @rx_rs232c ; param mov.b r0h,@anti3 jsr @rx_rs232c ; param mov.b r0h,@anti4 jsr @rx_rs232c ; 3 select2: mov.b #b'10000100,r0l ; monitor = 10000100 mov.b r0l,@pbdr mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count mov.b #2,r0h jsr @tx_rs232c mov.b #5,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #35,r0h jsr @tx_rs232c mov.b @anti1,r0h jsr @tx_rs232c mov.b @anti2,r0h jsr @tx_rs232c mov.b @anti3,r0h jsr @tx_rs232c mov.b @anti4,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 3 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 83 jsr @rx_rs232c ; result mov.b r0h,@data jsr @rx_rs232c ; version jsr @rx_rs232c ; 3 mov.b @data,r0l cmp.b #0,r0l beq _select_out2 mov.b @result,r0l and.b #b'00001111,r0l mov.b r0l,@result mov.b r0l,@padr ; Result output high 4bits = 0 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _select_out2: mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count authen2: mov.b #b'10001000,r0l mov.b r0l,@pbdr ; monitor = 10001000 mov.b #2,r0h jsr @tx_rs232c mov.b #9,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #36,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #255,r0h jsr @tx_rs232c mov.b #96,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c mov.w #150,r1 mov.w r1,@timer2 jsr @wait_count jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 84 jsr @rx_rs232c ; result mov.b r0h,@data jsr @rx_rs232c ; 3 mov.b #b'10010000,r0l mov.b r0l,@pbdr ; monitor = 10010000 mov.b @data,r0l cmp.b #0,r0l beq _authen_out2 mov.b @result,r0l and.b #b'00001111,r0l mov.b r0l,@result mov.b r0l,@padr ; Result output high 4bits = 0 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _authen_out2: mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count readnum2: mov.b #b'10100000,r0l mov.b r0l,@pbdr ; monitor = 10100000 mov.b #2,r0h jsr @tx_rs232c mov.b #2,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #48,r0h jsr @tx_rs232c mov.b #1,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 18 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 96 jsr @rx_rs232c ; result = data 1 mov.b r0h,@data jsr @rx_rs232c ; ID data ! mov.b r0h,@id jsr @rx_rs232c ; data 2 jsr @rx_rs232c ; data 3 jsr @rx_rs232c ; data 4 jsr @rx_rs232c ; data 5 jsr @rx_rs232c ; data 6 jsr @rx_rs232c ; data 7 jsr @rx_rs232c ; data 8 jsr @rx_rs232c ; data 9 jsr @rx_rs232c ; data 10 jsr @rx_rs232c ; data 11 jsr @rx_rs232c ; data 12 jsr @rx_rs232c ; data 13 jsr @rx_rs232c ; data 14 jsr @rx_rs232c ; data 15 jsr @rx_rs232c ; data 16 jsr @rx_rs232c ; 3 mov.b @data,r0l cmp.b #0,r0l beq _readnum_out2 mov.b @result,r0l and.b #b'00001111,r0l mov.b r0l,@result mov.b r0l,@padr ; Result output high 4bits = 0 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _readnum_out2: mov.b @id,r1l and.b #b'00001111,r1l shll.b r1l shll.b r1l shll.b r1l shll.b r1l mov.b @result,r0l and.b #b'00001111,r0l or.b r1l,r0l mov.b r0l,@result mov.b r0l,@padr ; 2nd RFID Number = high 4bits mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count halt2: mov.b #b'11000000,r0l mov.b r0l,@pbdr ; monitor = 11000000 mov.b #2,r0h jsr @tx_rs232c mov.b #1,r0h jsr @tx_rs232c mov.b #0,r0h jsr @tx_rs232c mov.b #54,r0h jsr @tx_rs232c mov.b #3,r0h jsr @tx_rs232c jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 2 jsr @rx_rs232c ; 0 jsr @rx_rs232c ; 102 jsr @rx_rs232c ; result mov.b r0h,@data jsr @rx_rs232c ; 3 mov.b @data,r0l cmp.b #0,r0l beq _halt_out2 mov.w #50,r1 mov.w r1,@timer2 jsr @wait_count jmp @request _halt_out2: mov.w #100,r1 mov.w r1,@timer2 jsr @wait_count jmp @request loop_error: bra loop_error ;***** Common Sub-Routines ***** sci0_init: mov.b #b'00000000,r0l mov.b r0l,@scr mov.b #b'00000000,r0l mov.b r0l,@smr mov.b #51,r0l ; 9600 bps !! mov.b r0l,@brr mov.w #500,r0 _sci0_wait: dec.w #1,r0 bne _sci0_wait mov.b @ssr,r0l ; (dummy read) mov.b #0,r0l mov.b r0l,@ssr mov.b #b'00001000,r0l mov.b r0l,@iprb ; SCI0-int priority UP ! rts int_rx_error: bclr #5,@ssr bclr #4,@ssr rte int_rx_full: push.w r0 push.l er5 btst #6,@ssr bclr #6,@ssr mov.w @rx_top,r5 mov.w #0,e5 mov.b @rdr,r0l mov.b r0l,@(rx_fifo,er5) inc.w #1,r5 bclr #2,r5h mov.w r5,@rx_top pop.l er5 pop.w r0 rte tx_rs232c: btst #7,@ssr ; test TRDE bne _tx_seq bra tx_rs232c _tx_seq: mov.b r0h,@tdr bclr #7,@ssr ; transmit data = [r0h] rts wait_1000msec: mov.l #1000,er1 _wait_1: jsr @wait_1msec sub.l #1,er1 bne _wait_1 rts wait_1msec: mov.l #2048,er2 _wait_2: sub.l #1,er2 bne _wait_2 rts wait_count: mov.w @timer2,r1 _wait_3: jsr @wait_1msec sub.w #1,r1 bne _wait_3 rts rx_rs232c: jsr @timer_check mov.w @rx_top,r1 mov.w @rx_end,r5 cmp.w r1,r5 beq rx_rs232c mov.w #0,e5 mov.b @(rx_fifo,er5),r0h ; received data = [r0h] inc.w #1,r5 bclr #2,r5h mov.w r5,@rx_end rts clr_rs232c: mov.w @rx_top,r1 mov.w @rx_end,r5 cmp.w r1,r5 bne _read_rs232c rts _read_rs232c: mov.w #0,e5 mov.b @(rx_fifo,er5),r0h ; received data = [r0h] inc.w #1,r5 bclr #2,r5h mov.w r5,@rx_end rts timer_check: mov.w @timer1,r1 inc.w #1,r1 mov.w r1,@timer1 cmp.w #10000,r1 beq _timer00_1 rts _timer00_1: mov.w #0,r1 mov.w r1,@timer1 rts .end