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自作入門
関連記事
コメントを残す