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