AVR

Last-modified: 2014-04-03 (木) 01:50:30

MPU 単体

アマチュア的には ATMega48/88/168/328 シリーズの一択だろう。narrow DIP または QFP で省スペース。

追記。

ほんとに単機能でよい場合、省スペース且つ安価な 8pin DIP ATTiny13A(\50) もあり。(2014年3月)

評価ボード

MPU単体ならばやっぱり秋月が安い!

ライタ

COM接続

安価に作れるが最近では COM ポートが使えるPCはほぼ無い。 (^^;

USB接続

完成品

キット

FT232を使ったもの

ヒューズビット

工場出荷時の設定では、クロックは内蔵RC発振器が有効で、8MHzが原クロック。それを8分周して 1MHz がシステムクロックとして有効になっている。

処理速度が遅くてよいならば、消費電力が少なくて遅いクロックも悪くない。

しかし、PCとUART通信をしようとすると問題になってくる。クロックが低いとボーレートの誤差が大きくなり、通信エラーが多発するのだ。

なので、外付けクロック無しで内蔵RCクロックを分周しない設定にして、システムクロックを 8MHzにする。

ヒューズビットを書き換えることによってできるのだが、注意が必要!!

ヒューズビットを間違えて書き換えると、ISPできなくなってしまうからだ。昔、これで何個ものAVRを使用不能にしてしまった経験がある。。。

なので、慎重に。

便利なページを発見。

Arduino

アセンブラとマシン語

AVRでIOレジスタを読み書きする命令は IN,OUTだった。

IN - I/Oレジスタを汎用レジスタに取得 (Load an I/O Location to Register)
I/O空間のI/Oレジスタ(ポート、タイマなど)値をレジスタ ファイルの汎用レジスタ(Rd)に取得します。
Rd ← I/O(A)
書式	 	 オペランド	 プログラム カウンタ
IN	 Rd,A	 d=0~31, A=0~63	 PC ← PC + 1
機械語 (16ビット)
1 0 1 1   0 A5 A4 d4   d3 d2 d1 d0   A3 A2 A1 A0
ステータス レジスタ (SREG) 変更無し
命令語(ワード)数	 1 (2バイト)
実行周期数	 1
例:
	 IN	 R25,$16 ; ポートBを読み込み (注:本注釈は$16がポートBのデバイスの場合です。)
	 CPI	 R25,4	 ; ポートB=4か検査
	 BREQ    EXIT    ; ポートB=4(Z=1)で分岐
EXIT:   NOP	         ; 処理なし(ポートB=4での分岐先)

LEDを点灯させるには、OUT 命令でPDCR(ポートディレクションコントロールレジスタ)と
PDR(ポートデータレジスタ)を書き込めばよい。

OUT - 汎用レジスタからI/Oレジスタに設定 (Store Register to I/O Location)
レジスタ ファイルの汎用レジスタ(Rr)の内容でI/O空間のI/Oレジスタ(ポート、タイマなど)値を設定します。
I/O(A) ← Rr
書式	 	 オペランド	 プログラム カウンタ
OUT	 A,Rr	 r=0~31, A=0~63	 PC ← PC + 1
機械語 (16ビット)
ステータス レジスタ (SREG)
命令語(ワード)数	 1 (2バイト)
実行周期数	 1
例:
	 CLR	 R16	 ; R16に$00を設定
	 SER	 R17	 ; R17に$FFを設定
	 OUT	 $18,R16	 ; ポートBに$00を出力 (注:本注釈は$18がポートBのデバイスの場合です。)
	 NOP	 	 ; 待機(無操作)
	 OUT	 $18,R17	 ; ポートBに$FFを出力

あとは時間稼ぎの busy_wait を入れればよい。比較命令とジャンプ命令のはず。

GNU assembler(GAS)

AVRASM