H8マイコンで、シリアル(SCI)でHello Worldを出力するプログラムです。
HEWに付属のアセンブラでコンパイル可能です。
H8でシリアル通信を行うためには決められた手順(プロトコル)でレジスタを操作する必要があります。
プロトコルの詳細については,以下の記事を参考にしてください。
[読書メモ]12ステップで作る組込みOS自作入門: 2ndステップ シリアル通信
;------------------------------------------------------------------------ ; FILE : HelloWorld.src ; PROGRAM : シリアルポートにHello Worldする ; : プロトコルは"9600bps, 8bit, Parity:None, StopBit:1" ;------------------------------------------------------------------------ .cpu 300HN .export _main .section P,CODE,ALIGN=2 ; for H83694f PMR1 .equ H'FFE0 SMR .equ H'FFA8 BRR .equ H'FFA9 SCR3 .equ H'FFAA TDR .equ H'FFAB SSR .equ H'FFAC RDR .equ H'FFAD ;------------------------------------------------------ ; メイン処理 ;------------------------------------------------------ _main: ; シリアルコントローラの初期化 JSR @scr_init ; メッセージの送信 JSR @send_message loop: BRA loop rts ;------------------------------------------------------ ; メッセージをシリアルに送信する ;------------------------------------------------------ send_message: ; 出力メッセージの先頭アドレスをセット MOV.L #Msg, ER4 send_message_L1: ;送信可能になるまで待つ(このサブルーチンは結果をR5Lにセットしてくれる...) JSR @is_serial_send_enable CMP #0, R5L BNE main_L1 ; 1byte送信 MOV.B @ER4, R0L MOV.B R0L, @TDR ; "印字すべき文字=ER4の差し先" とする BCLR.B #H'7, @SSR ;TDREのフラグを落として(0:not empty)、送信要求する send_message_L2: JSR @is_serial_send_enable CMP #0, R5L BNE main_L2 ; 表示対象の文字を1文字進める INC.L #1, ER4 ; ヌル文字まで来てなければ繰り返し MOV.B @ER4, R0L CMP.B #H'00, R0L BNE main_L1 RTS ;------------------------------------------------------ ; シリアルの初期化 ;------------------------------------------------------ scr_init: BSET.B #1, @PMR1 ;シリアルモードを設定 MOV.B #H'00, R0L MOV.B R0L, @SCR3 MOV.B #H'00, R0L MOV.B R0L, @SMR ; All0で 8bit, N, 1になる MOV.B #D'64, R0L MOV.B R0L, @BRR ; 通信速度。20MHzの場合は64 (0x40) ; 通信速度をセット後は、一定期間スリープが必要 ; 余裕を見て0.1sec待っている MOV.L #D'250000, ER5 L1: DEC.L #1, ER5 NOP BNE L1 BSET.B #4, @SCR3 ; RxEnable BSET.B #5, @SCR3 ; TxEnable MOV.B #H'00, R0L MOV.B R0L, @SSR RTS ;------------------------------------------------------ ; シリアルに書き込み可能かチェック ;------------------------------------------------------ is_serial_send_enable: MOV.B @SSR, R0L AND.B #H'80, R0L ; 0x80: SSR.TDRE CMP #H'80, R0L BNE is_serial_send_enable_L1 ; bitが立ってなければジャンプ ; 1->EmptyなのでOK MOV.B #0, R5L BRA is_serial_send_enable_L2 is_serial_send_enable_L1: ; 0->NG MOV.B #1, R5L is_serial_send_enable_L2: RTS ;出力するメッセージ Msg: .sdataz "Hello world" .end |

12ステップで作る組込みOS自作入門
関連記事
コメントを残す