レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

内部クロックで動作させられないATmega328Pをなんとかする

2019年11月15日 | 電子工作

秋月電子に行くたびに、ついつい購入してしまうのがATmega328Pです。



ブートローダーすら書き込まれていない生のAVRです。1個230円です。
これまでこのAVRに8MHzや16MHzのクリスタルをつなげて外部クロックで動作させていました。でもATmega328Pには内部にRC発振回路があり、外部に水晶振動子をつなげなくても動作します。クロックの精度は低くなりますが、内部クロックの方が回路が簡単になりブレッドボードでも手軽に扱えるようになります。
でも、なぜ今まで内部クロックを使わなかったのかと言うと、こちらからダウンロードできる内部クロック用の定義ファイル breadboard-1-6-x.zipを使ってArduinoIDEからブートローダーを書き込むことが出来なかったからです。

上記サイト以外にもネットには内部クロックでの動作に関する情報がたくさんありますが、そもそもブートローダーが書き込めない状態なのでスケッチも同様に書き込むことが出来ません。外部にクリスタルをつないだ状態なら問題なく使用できますのでAVRは正常なはずです。

内部クロック8MHzとして書き込んだ時のエラーを見ると、ヒューズビットに問題があるような感じでした。そこでヒューズビットの値について調べてみると内部クロックで使用する時の値は、

Low  0xE2
High 0xDE
Ext  0xFD

となるようでしたが、手元にあるATmega328Pは、

Low  0xFF
High 0xDE
Ext  0xFD

となっていました。もしかするとLowの値を書き換えれば内部クロックで動作するかもしれません。

ヒューズビットの書き換えについては、以前ヒューズリセッターの回路をブレッドボードで組んだことがありました。しかしこの時の回路はすでにばらしてしまったので、再度組み直す必要があります。でも配線が多いので、またブレッドボードで組み直すのはちょっと嫌でした。
内部クロックはあきらめて外部クロックにするかヒューズリセッター回路を組み直すかで迷ったのですが、いずれまたATmega328Pを購入するはずですし、そうなるとヒューズビット書き換えが必要になる事もあるでしょうから回路を作り直すことにしました。でも毎回ブレッドボードで組み直すのは面倒なので、きちんと基板に配線してしまいます。

前回同様、こちらのサイトの回路図を元に配線していきます。前回はArduino Pro Miniで構築したのですが、今回はATmega328Pを使ってみます。ATmega328PでATmega328Pのヒューズをリセットするということですね。リセッターのATmega328Pは外部クロック16MHzで動かします。
回路図のピン番号はリセッター側がArduinoのピン番号になっていてAVRのピン番号と異なるので、間違えないように回路図をチェックしながら慎重に部品を半田付けしていきました。配線がショートしないように怪しそうなところはテスターで確認しながら作業しました。

かなり面倒でしたが、なんとか組み上がったのがこちらです。



この回路は操作のためにPCとシリアル接続する必要があるので、TXDとRXDと電源を写真下部にある4Pのピンソケットに出力しました。ここに以前に作成したRS-232Cレベルコンバーターをつないで、PCとシリアル接続します。
右にある3Pのピンソケットは5Vと12Vの電源をつなぐ為のものです。たまたま、今は使わないATAPIハードディスク→USB変換ケーブルのACアダプターに、5V12V両方の出力回路がつながっていたので利用することにしました。
写真上部の6Pのピンソケットはリセッター側のATmega328Pのスケッチを書き込む為のものです。スケッチは上記サイトの物をそのまま使用します。

出来上がったヒューズリセッターでいきなりヒューズ書き換えするのは怖いので、動作確認のために必要な線をピンソケットにつなぎPCのシリアルターミナルを立ち上げたら、空いているICソケットにATmega328Pを入れずに5V12VのACアダプターをつないでみました。ドキドキしながらシリアルターミナルを見ていると、無事ヒューズリセッターの操作画面が表示されました。

..............................
EZ HV Fuse
 for ATmega328P

Type D and Enter Key to Detect a chip.

とりあえず大丈夫そうなので、ACアダプターをはずしたらICソケットにATmega328Pを入れます。再度ACアダプターをつないで操作画面が表示されるのを確認したら、画面の指示に従ってDキーを押します。

Signature:1E950F
Chip=ATmega328P

Target Chip:ATmega328P
D:Detect Chip.
W:Write default value to fuse bytes. (l:FF h:DE e:FD )
R:Read fuse bytes.
C:Chip erase.
S:read Signature bytes.
L: H: E: input fuse value and write it.
K: input locK bits value and write it.

Type Command and Enter.
>

きちんとAVRが認識されていてホッとしました。Rコマンドでヒューズの値を表示してみると、

Low  Fuse Bits:FF
High Fuse Bits:DE
Ext  Fuse Bits:FD
Lock Bits:FF

となっていました。ここでLコマンドを入力してヒューズを書き換えます。

Type Command and Enter.
>l
Input Low  Fuse Bits value
>e2
Low  Fuse Bits will be written E2. Are you sure? (Y/N)
>y
Now writeing Fuse!
Finish!

Rコマンドで値を表示してみると、

>r
Low  Fuse Bits:E2
High Fuse Bits:DE
Ext  Fuse Bits:FD
Lock Bits:FF

無事書き換えることが出来ました。

書き換えたATmega328Pをブレッドボードに載せ替えて、内部クロック8MHzでブートローダーを書き込んでみると正しく書き込めました。確認のためHD44780互換LCDをつないで、表示テストのために作ったスケッチ書き込むと正常に動作しました。



これでATmega328Pを手軽に利用できるようになりました。このArduinoのサイトによるとリセットピンのプルアップ抵抗もいらないとのことです。(写真はLeonardoによるICSP書き込みの為に一応付けています)

ちなみにこのLCDは秋月電子で300円でワゴン売りされていたものです。安いので衝動買いしてきました。大きくて画面が見やすいので気に入っています。もう一つぐらい買っておいてもよかったかも。このLCDについては後でまた詳しく書きたいと思います。



最新の画像もっと見る

コメントを投稿