« Sim City4で100万人都市を作成する | メイン | GroupSession4を試用 »

Atmel AVRによる組み込みプログラミング

Atmel AVR ATMEGA 168Aは、8ビットマイコンです。
今回は、はんだ付け+Atmel AVR Studio4.19で組み込みプログラムしてみました。

開発言語はCとアセンブリを使用できます。
Cの方が容易ですが、今回は復習を兼ねてアセンブリでループ処理を書きます。

以下は、ATmega168ボード上で、ディレイを発生させながらレジスタをインクリメントしつつLEDに表示するだけの動作テストの為に作成したプログラムです。


.include "m168def.inc"
.org 0x00 jmp reset ;orgコマンドはプログラム0x000番地に配置させる。resetラベルへジャンプする。
;各種リセット。

reset:
;スタックポインタに初期値を設定している。
ldi r16,low(ramend)
out spl,r16
ldi r16,high(ramend)
out sph,r16

ldi r16,0b11111111 ;2進数111111111 を、レジスタr16に書き込み。
out ddrb,r16 ;レジスタr16の内容を、ポートddrbにsetする。
;ビットが立っている番号のポートが出力モードになる。

;ldi r16,0b11110000 ;r16に2進数を入力
;out portb,r16 ;ビットが立っているLEDを表示させる。

;inc r16 ;レジスタr16をインクリメント
;out portb,r16 ;r16は10101011になっているはず...

;LED "PC"の点灯
ldi r16,0b11111111
out ddrc,r16
ldi r16,0b11110111
out portc,r16

;LED "PD"の点灯
ldi r17,0b11111111
out ddrd,r17
ldi r17,0b11110000
out portd,r17

main:
ldi r25,0b00000000 ;r25を初期化 1ずつ足していくレジスタ
ldi r24,0b00000001 ;r24を初期化

looping:
inc r25 ;r25をインクリメント
lsl r24 ;r24を左へ1ビットシフト

;cpi r24,0x10000000 ;10000000と比較
;breq br1 ;一致すればbr1へジャンプ

mov r20,r25 ;コピー
com r20 ;r25 bit反転
out portb,r20 ;(LED)PBを点灯させる

call delay1ms ;1msウェイトさせる

rjmp looping ;loopingへ相対ジャンプ

;rjmp main ;mainへ相対ジャンプ


br1:

;    10MHzで1msのディレイ
;-----------------------------------------------
;rcall delay1msで呼ばれたとして
;100000回命令を実行すると
;100000×0.1 us
;
; 命令に必要なクロック数?
; rcall ;3
delay1ms: push r16 ;2
in r16,sreg ;1
push r16 ;2
push r17 ;2
; 100000-10=99990
ldi r17,198 ;1
delay2: ldi r16,100 ;1
delay1: dec r16 ;1
nop ;何もしない
cpi r16,0 ;1
brne delay1 ;1/2
dec r17 ;1
cpi r17,0 ;1
brne delay2 ;1/2
; 999990-(100*5+4)*198=198
ldi r16,46 ;2
delay3: dec r16 ;1
cpi r16,0 ;1
brne delay3 ;1/2
; 198-46*4 = 14
nop
nop
nop
pop r17 ;2
pop r16 ;2
out sreg,r16 ;1
pop r16 ;2
ret ;4 ;呼び出し元へreturnする
; 11-11 = 0

; プログラム(1)


トラックバック

このエントリーのトラックバックURL:
http://www.ddhost.jp/mt/mt-tb.cgi/764

About

2013年07月21日 20:30に投稿されたエントリーのページです。

ひとつ前の投稿は「Sim City4で100万人都市を作成する」です。

次の投稿は「GroupSession4を試用」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。