;----------------------------------------------------------- ; ; [GPS test] step06 Jan. 2001 ; ;----------------------------------------------------------- ;##### 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 tstr .equ h'0fff60 tcr0 .equ h'0fff64 tier0 .equ h'0fff66 tsr0 .equ h'0fff67 gra0 .equ h'0fff6a P3_D .EQU H'0FFFC6 ;ポート3データレジスタ E_SIG .BEQU 5,P3_D ;イネーブル信号 RS .BEQU 4,P3_D ;RS信号 ;##### Vector Defines ##### .section vector,data,locate=h'000000 .data.l start .org h'000060 .data.l int_timer0 .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.b 8 timer2 .res.b 2 timer3 .res.b 4 flag .res.b 1 LCD_D .RES.B 1 ;LCDへのデータを入れるRAM LCD162 .RES.B 32 ;16文字2行分のデータをいれるRAM to_disp .res.b 32 rx_top .res.w 1 rx_end .res.w 1 tx_top .res.w 1 tx_end .res.w 1 pps_st .res.b 1 gps_rx .res.b 1 .org h'0ff400 rx_fifo .res.b 1024 .org h'0ff800 tx_fifo .res.b 1024 ;***** Constant Table Defines ***** .section rom,data,locate=h'001000 MOJI: .SDATA "SUAC GPS Robot " .SDATA " produced by Y.N" ;***** 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'00100011,r0l mov.b r0l,@tcr0 ; Timer0 init : 2MHz clock bclr #0,@tsr0 ; Clear IMFA bset #0,@tier0 ; timer INT set mov.w #1999,r0 ; 1msec INT mov.w r0,@gra0 mov.b #b'00000000,r0l mov.b r0l,@pbddr ; set : Port[B] all input mov.b #b'11111111,r0l mov.b r0l,@paddr ; set : Port[A] all output jsr @wait_500msec jsr @lcd_initialize jsr @wait_500msec jsr @wait_500msec mov.w #0,r5 mov.w r5,@rx_top mov.b #b'01110000,r0l ; tx/rx start ! mov.b r0l,@scr bset #0,@tstr ; timer start ! andc.b #b'01111111,ccr ; interrupt enable main_loop: ; jsr @timer_check ; jsr @tx_midi_check jsr @pps_check jmp @main_loop ;***** PPS 1sec Check ***** pps_check: mov.b @pbdr,r0l and.b #b'10000000,r0l mov.b @pps_st,r0h cmp.b r0h,r0l bne pps_change rts pps_change: mov.b r0l,@pps_st btst #7,r0l bne pps_event rts pps_event: mov.l #rx_fifo+27,er1 mov.l #to_disp,er2 _lp004: inc.l #1,er1 mov.b @er1,r0l cmp.b #h'47,r0l ; G bne _lp004 _lp005: inc.l #1,er1 mov.b @er1,r0l cmp.b #h'41,r0l ; A bne _lp005 inc.l #1,er1 mov.b #32,r3l _lp006: mov.b @er1,r0l mov.b r0l,@er2 inc.l #1,er1 inc.l #1,er2 dec.b r3l bne _lp006 MOV.L #LCD162,ER1 ;液晶表示RAMのアドレスをセット MOV.L #to_disp,ER2 ;初期文字データのアドレスをセット jsr @lcd_display mov.w #0,r5 mov.w r5,@rx_top rts ;***** SCI init / Rx Interrupt ***** sci0_init: mov.b #b'00000000,r0l mov.b r0l,@scr mov.b #b'00000000,r0l mov.b r0l,@smr mov.b #103,r0l ; 4800bps 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 bclr #6,@ssr mov.w @rx_top,r5 mov.w #0,e5 mov.b @rdr,r0l cmp.b #h'2c,r0l beq _pass mov.b r0l,@(rx_fifo,er5) mov.b r0l,@padr inc.w #1,r5 bclr #2,r5h mov.w r5,@rx_top _pass: pop.l er5 pop.w r0 rte tx_midi_check: mov.w @tx_top,r1 mov.w @tx_end,r6 cmp.w r1,r6 bne _tx_exist rts _tx_exist: btst #7,@ssr ; test TRDE bne _tx_seq rts _tx_seq: mov.w #0,e6 mov.b @(tx_fifo,er6),r0l mov.b r0l,@tdr bclr #7,@ssr ; Transmit ! inc.w #1,r6 bclr #2,r6h mov.w r6,@tx_end rts tx_fifo_set: mov.w @tx_top,r6 mov.w #0,e6 mov.b r0h,@(tx_fifo,er6) ; transmit data = [r0h] inc.w #1,r6 bclr #2,r6h mov.w r6,@tx_top rts ;***** Timer / Counter Routines ***** wait_500msec: mov.l #500,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 timer_check: mov.b @flag,r0l cmp.b #0,r0l bne _timer_event rts _timer_event: mov.b #0,r0l mov.b r0l,@flag rts int_timer0: push.w r0 mov.b #1,r0l mov.b r0l,@flag btst #0,@tsr0 bclr #0,@tsr0 ; Clear IMFA pop.w r0 rte ;##### LCD Subroutines from AKIZUKI ##### ;16文字2行表示 ; RAM (@LCD162)から32文字文のデータをセット後 ; LCDDSPをサブルーチンコールする init_display: MOV.L #LCD162,ER1 ;液晶表示RAMのアドレスをセット MOV.L #MOJI,ER2 ;初期文字データのアドレスをセット lcd_display: MOV.B #32,R0L _lcd_loop: MOV.B @ER2+,R0H ;初期文字データをレジスタにいれる MOV.B R0H,@ER1 ;レジスタ値を液晶表示RAMにいれる INC.L #1,ER1 DEC.B R0L ;文字数から1を引く BNE _lcd_loop ;文字数が0になるまでくりかえす JSR @LCDDSP RTS LCDDSP: PUSH.L ER0 PUSH.L ER1 MOV.B #B'00000010,R0L ;カーソルホーム MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT4 JSR @TIME00 ;4mSのWAIT MOV.B #16,R0L ;文字数のセット MOV.L #LCD162,ER1 ;液晶表示RAMのアドレスをセット LCDDSP1: MOV.B @ER1+,R0H ;文字データをレジスタにいれる MOV.B R0H,@LCD_D ;文字データをRAMにいれる BSET RS ;データなのでRSを1にする JSR @LCD_OUT4 ;サブルーチンコール BCLR RS ;RSを0にもどす DEC.B R0L ;文字数から1を引く BNE LCDDSP1 ;文字数が0になるまでくりかえす MOV.B #B'11000000,R0L ;カーソルを2行目にする MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT4 MOV.B #16,R0L ;文字数のセット MOV.L #LCD162 + 16,ER1 ;液晶表示RAMのアドレスをセット LCDDSP2: MOV.B @ER1+,R0H ;文字データをレジスタにいれる MOV.B R0H,@LCD_D ;文字データをRAMにいれる BSET RS ;データなのでRSを1にする JSR @LCD_OUT4 ;サブルーチンコール BCLR RS ;RSを0にもどす DEC.B R0L ;文字数から1を引く BNE LCDDSP2 ;文字数が0になるまでくりかえす POP.L ER1 POP.L ER0 RTS lcd_initialize: MOV.B #H'FF,R0L ;ポート3を出力に設定 MOV.B R0L,@H'0FFFC4 ;ポート3 JSR @TIME00 ;15mSのWAIT (4mS*4) JSR @TIME00 JSR @TIME00 JSR @TIME00 MOV.B #B'00100011,R0L ;LCDファンクションセット1 MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT8 JSR @TIME00 ;4mSのWAIT MOV.B #B'00100011,R0L ;LCDファンクションセット2 MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT8 JSR @TIME00 ;4mSのWAIT MOV.B #B'00100011,R0L ;LCDファンクションセット3 MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT8 JSR @TIME00 ;4mSのWAIT MOV.B #B'00100010,R0L ;ファンクションセット MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT8 JSR @TIME00 ;4mSのWAIT MOV.B #B'00101000,R0L ;ファンクションセット MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT4 JSR @TIME00 ;4mSのWAIT MOV.B #B'00001110,R0L ;表示ON MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT4 JSR @TIME00 ;4mSのWAIT MOV.B #B'00000110,R0L ;エントリーモード MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT4 JSR @TIME00 ;4mSのWAIT MOV.B #B'00000001,R0L ;表示クリア MOV.B R0L,@LCD_D BCLR RS JSR @LCD_OUT4 JSR @TIME00 ;4mSのWAIT jmp @init_display ;1文字のデータ表示または、コマンド ; RAM(@LCD_D)にデータをセット後、データの場合はRSを1にセット、 ; コマンドの場合はRSを0にセットしLCD_OUT 4/8 をサブルーチンコールする LCD_OUT4: PUSH.L ER0 ;レジスタ待避 BSET E_SIG ;液晶のE信号を1にする MOV.B @LCD_D,R0L ;データ(コマンド)をレジスタに入れる SHLR.B R0L ;4ビットモードなので上位4ビットを SHLR.B R0L ;下位に移動 SHLR.B R0L SHLR.B R0L AND.B #B'00001111,R0L ;データ線以外をマスクする MOV.B @P3_D,R0H ;RS信号の待避 AND.B #B'11110000,R0H ;RS信号、E信号以外をマスク OR.B R0H,R0L ;RS信号,E信号、データ(4ビット)を合成 MOV.B R0L,@P3_D ;合成したすべての信号を液晶に出力 JSR @TIME10 ;WAIT BCLR E_SIG ;液晶のE信号を0にする JSR @TIME10 ;WAIT BSET E_SIG ;液晶のE信号を1にする MOV.B @LCD_D,R0L ;データ(コマンド)をレジスタに入れる AND.B #B'00001111,R0L ;データ線下位4ビット以外をマスクする MOV.B @P3_D,R0H ;RS信号の待避 AND.B #B'11110000,R0H ;RS信号、E信号以外をマスク OR.B R0H,R0L ;RS信号,E信号、データ(4ビット)を合成 MOV.B R0L,@P3_D ;合成したすべての信号を液晶に出力 JSR @TIME10 ;WAIT BCLR E_SIG ;液晶のE信号を0にする JSR @TIME10 ;WAIT POP.L ER0 ;レジスタの復帰 RTS LCD_OUT8: PUSH.L ER0 ;レジスタ待避 BSET E_SIG ;液晶のE信号をセットする MOV.B @LCD_D,R0L ;データ(コマンド)をレジスタに入れる MOV.B R0L,@P3_D ;液晶にデータ(コマンド)を出力 JSR @TIME10 ;WAIT BCLR E_SIG ;液晶のE信号を0にする JSR @TIME10 ;WAIT POP.L ER0 ;レジスタの復帰 RTS TIME00: PUSH.L ER0 MOV.L #H'2000,ER0 TIME01: SUB.L #1,ER0 BNE TIME01 POP.L ER0 RTS TIME10: PUSH.L ER0 MOV.L #H'AA,ER0 ;450nS TIMER TIME11: SUB.L #1,ER0 BNE TIME11 POP.L ER0 RTS .end