2015年4月13日月曜日

ATMega328Pを外部クリスタルで動かす

外部クリスタルを使うにはヒューズビットを書き換えるのでドキドキだ
しくじると動かなくなるし(^q^;;;;

fusecalc(http://www.engbedded.com/fusecalc)を使ったが
よくわからないパラメーターが多くて悩ましい

最初、何の気なしに「Ext.Clock」を指定していたが、これは
外部クリスタルではなく外部クロック、つまり外部でクロックを生成して入力しないといけない

危ないところだった(^q^;

その他にも「Low-Freq」とか「Ext. Crystal OSC: ...」とかどれを選べばいいのかいろいろ調べた

結局、16MHzの外部クリスタルを使うには「Ext. Full-swing Crystal」というのがよさそうなので
これを指定することにした
Low:0xF7 High:0xD9 Extend:0xFF
プログラマーにはavrdudeとavrdude-GUI(千秋ゼミ版)を使っているのでこのまま書き込んだが


赤線で囲んだところがFuseの設定

avrdude-GUIのFuseの設定はhFuseとlFuseの並びが逆(?)であった(^q^;

まちがえて
Low:0xD9 High:0xF7 Extend:0xFF
という設定で書き込んでしまった(^q^;;;;

この設定だと「Ext. Crystal Osc.: Frequency 0.4-0.9MHz」になるようで(上記のfusecalcで変換)
動かなくなってしまった(@@;

0.4-0.9MHzのクリスタルかセラロックを使えば復活できるかな?

少し考えてFuseのLowとHigh並びが逆なのに気が付いて別のATMega328Pに書き込みなおしたらちゃんと動いてくれた(^q^/

FuseにCKOUTというbitがあってここを「0」に設定するとCLK0(ATMega328Pだと14PIN)からクロックを出力できるようなので
hFuse: D9h
lFuse: B7h
eFuse: 07h
に設定してCLK0の出力をオシロで見てみた


きっちり16MHz出ている(^q^/

気を取り直して9V電池+78L05で5Vの電源でLチカさせてみた


電池をかなりヘタっているものに交換したが
9V電池: 4.50V(LED点灯時)~4.86V(LED消灯時)
5V出力: 3.11V~3.48V
というダメダメ状態でもLEDはちゃんと点滅している

あとはI2C LCDのレベルシフトの実験をして終わりかなと思ったが・・・

出力波形を矩形波は0V(GND)~VCCではなくて0V~VCC/2(仮想GND)~VCCにした方がいいんではと迷い中

インパルス関数やステップ関数は0V(GND)~VCCの方がいいのかな

う~ん