ジャンル不定の日記です。

ATmega644pでUSBaspを作ろうと考えているのだが・・・

中華AVRプログラマがニセUSBaspだったんで、ATmega644pでUSBaspを作ろうと考えているのだが、情報まとめ。

USBaspを書き込む際にAVRのヒューズというのもプログラムと別に書き込む必要があるようなのだが、
USBasp標準のATmega8用で、
ヒューズ上位バイト: 0xC9=0b11001001
ヒューズ下位バイト: 0xEF=0b11101111
となっている。

ATmega8の初期値は、
ヒューズ上位バイト: 0b11011001
ヒューズ下位バイト: 0b11100001
となっているらしい。

データシートを見ると、
CKOPT: 1→0
CKSEL3-0: 0001→1111
に変えているぽい。

CKSEL3-0の値によってクロック元が変わるようで、
クロック種別CKSEL3-0
外部発振子1111-1010
外部発振子(低周波)1001
外部RC発振1000-0101
内蔵RC発振0100-0001
外部信号0000
とのこと。

CKOPTの意味はクロック種別により変わる。
元の設定は0001で内蔵RC発振の範囲だが、内蔵RCで1MHzの設定らしい。内蔵RCの場合はCKOPTは常に1。
1111は外部発振子の範囲だが、CKOPTとCKSEL3-1の組み合わせにより周波数範囲が変わり、CKOPTが0でCKSEL3-1が111の組み合わせは1.0MHzから上限なしの設定らしい。
外部発振子の際のCKSEL0は、SUT1,0との組み合わせで起動時間遅延設定となるらしい。


ATmega644で使おうとしているわけだが、ATmega644の初期値は、
ヒューズ上位バイト: 0b10011001
ヒューズ下位バイト: 0b01100010

CKOPTは無く、CKSEL3-0はATmega8と同じく下位バイトの下位4bit。
ATmega8と同じでCKSEL3-0の値でクロック元が決まるが、範囲がちょっと違う。
クロック種別CKSEL3-0
外部発振子(低電力)1111-1000
外部発振子(全振幅)0111-0110
外部発振子(低周波)0101-0100
128kHz内部発振0011
内蔵RC発振0010
外部信号0000
予約0001
とのこと。

初期値は内蔵RCで、内蔵RCの範囲が一つしか無く最大の8MHzになるようなのだが、
ヒューズ下位バイト最上位ビットのCKDIV8が初期値の0だとCLKPR(クロック前置分周レジスタ)を設定することで分周することが出来るらしい。
CKDIV8が0にされるとCLKPRは0011の8分にリセットされ、初期値もそうで出荷時のクロックは8MHzが8分されて1MHzらしい。
CKDIV8が1にされるとCLKPRは0000になるとのこと。
この機能使うと最高周波数以上の発振子を使うことも出来るぽいようなことが書かれてる。

外部発振子は低電力モードと全振幅モードがあるが、低電力だとノイズの影響を受けやすいらしい。
全振幅モードの場合のCKSEL0は、ATmega8と同じくSUT1,0との組み合わせで起動時間遅延。
全振幅モードのCKSEL3-1は011固定で0.1-20MHzとのこと。
全振幅にした方が無難かな?


というわけなので、元のATmega8用のヒューズが周波数関連しか設定されてないので、ATmega644用にするにはヒューズ上位バイトはそのままで下位バイトを、
CKDIV8 0→1
CKSEL3-0 0010→0111
下位バイト全体 0b01100010→0b01100010
にすれば良さ気かな?


USBaspの配布ファイル内にはバイナリが入ってるが、ATmega8用とATmega88用で別のバイナリが用意されてるので、
コンパイルもしないとダメぽい。
コード内にもターゲットデバイスを設定するような箇所があるのを確認したが、ターゲットデバイスの設定以外は変更しないで良さ気かな?

USBaspの回路はUSBtinyと同じ感じになっているが、V-USBみたいにツェナーダイオードじゃなくて2連順方向ダイオードで平気かな?
マイコン自体は5V動作させたほうが良いのかな?


ってな感じ。
V-USB派生のAVR-CDCは内部発振8MHzのATtiny45でクリスタル無しで動作するらしいが、クリスタルなし化は難しいだろうしクリスタル届いてから試す。