« XI-IV再び(48) | トップページ | XI-IV再び(49) »

2010年4月 4日 (日)

AVR実験室(13)

【4 プログラム本体】
(2)起動メッセージの表示
ldi Work_Main,39 ;length of message
まず、起動メッセージの長さ(39バイト)を設定しています。

ldi ZH,HIGH(MSG)
ldi ZL,LOW(MSG)
次に、メッセージ(定数)の保存してあるアドレスをZレジスタペア(データ所在のインデックスになり、「lpm (レジスタ),Z+」という命令でZレジスタペアの示すROM上の番地のデータをレジスタに読み込みます。)に設定しています。

;rotate left
;because ROM address is 2nd times
clc
rol ZL
rol ZH
AVRマイコンでは命令が原則16ビット長のため、フラッシュROMに保存されている命令はは16ビット長で読み込まれるのに対して、保存されているデータ(定数)はレジスタが8ビット長のため、8ビットずつ読み込まれます。そのため、アセンブラのラベルで取得されるROMアドレスは、最下位の1ビットが省略されたものとなっているようです。これを8ビットごとの実アドレスに変換するため、左シフト(2倍)しています。

START_MSG:
lpm Data_Chrout,Z+ ;use lpm to read from ROM
rcall CHR_OUT
dec Work_Main
brne START_MSG
Zレジスタペアで示されたROMアドレスから、メッセージ長分のデータを読み出し、次のRS-232Cへの文字出力サブルーチン(CHR_OUT)へ出力データを渡しています。メッセージ長分「brne START_MSG」という命令と「START_MSG:」というラベルの間をループします。サブルーチンへの出力データの受け渡しは、「Data_Chrout」と名称定義したレジスタを介して行われます

(3)RS-232Cへの文字出力サブルーチン
CHR_OUT:
;data send through RS-232C, Data to send is set in 'CHR_OUT' resistor
lds Work_Chrout,UCSR0A
sbrs Work_Chrout,UDRE0 ;wait until UDRE0 is set
rjmp CHR_OUT
;
sts UDR0,Data_Chrout ;set data to send
ret
UCSR0AというIOレジスタのUDRE0というビットが「1」になるまで、すなわちRS-232C出力が可能の状態となるまで待ってから、出力すべきデータ(メインプログラムから「Data_Chrout」レジスタを介して渡されたもの)を出力IOレジスタであるUDR0にセットします。

【5 定数】
MSG:
.db "RS-232C test program by JI1IZR Start.",0x0D,0x0A,0x00
スタートメッセージとして出力したいデータを定数として「.db」に続けて記述しています。文字列は"(ダブルクォーテーション)で囲って記述します。16進数は「0x」に続けてアスキーコードで記述します。このプログラム例の「0x0D」は改行、「0x0A」は1行送りを表します。

【3 割込みベクタテーブル】(追加)
rjmp CHR_IN ;USART RX Complete
RS-232Cにパソコンから受信データを取得したときに、割込み処理「CHR_IN」を実行するよう割込みベクタテーブルを定義しています。

【4 プログラム本体】
(4)RS-232Cデータ受信完了割込み処理
CHR_IN:
lds Data_Chrin,UDR0
mov Data_Chrout,Data_Chrin
rcall CHR_OUT
reti
RS-232Cで受信したデータを「Data_Chrin」と名称定義したレジスタに取得し、「Data_Chrout」と名称定義したレジスタに移してから、RS-232Cへの文字出力サブルーチンに渡し、パソコンにエコーバックしています。

(5)主処理
;permit interrupt
sei

MAIN:
rjmp MAIN
主処理プログラムでは、起動メッセージ出力後は処理すべきことがないため、割込み許可後、無限ループしています。

3月7日のプログラムの概要は、以上のとおりです。次回は、プログラムの中で使用されている命令を説明したいと思います。

|

« XI-IV再び(48) | トップページ | XI-IV再び(49) »

ワンチップマイコン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: AVR実験室(13):

« XI-IV再び(48) | トップページ | XI-IV再び(49) »