mega48を動かしてみる
ATmega48が届きました(少し前のことです)。値段はまとめて買いましたので2313とあまり変わりません。IOポートが20あり(resetとXtalを使うとき)、 ROMも2313の2倍の4kBありますから余裕のある状態で使えると思います。DIPかQFPか、またまた悩んだのですが場所の取らない(苦労が多い)QFPになりました。 貼り付けた姿も小さくて愛嬌があります。スピードは大は小を兼ねると考えて20MHzにしました。
制作の予定はない(本当はアイデアがない)のでとりあえず火を入れてみようと−−真空管の気分が未だ抜けていない−−配線しました。電源周りを配線して、 ISPのコネクタをつけて、モニタ用の液晶コネクタを用意しました。チップに半田付けしたのは、MISO、MOSI、SCK、#RESETのISP関係と、液晶用のポートCで、 PC0〜PC3にdataを、PC4にR/Sを、PC5にENの6本です。
回路図はこれです
。
とりあえずISP関係がすんだところでライタをつなぎ
(いつもここで一息、様子を見ます)
、
avrsp.exe -r とたたきます。
Detected Device is ATmega48
Device Signature = 1E-92-05
----- と出ました。よしよし。
配線の数は少ないし、目視検査はしているし、テスタでショートのないことは確認していますが何となく緊張する瞬間です。
液晶のコネクタを配線して、次にクロック確認用のテスト端子をPD2から出しました。mega48は内蔵RC発振器は
8MHzだけ
です。mega8やTiy26Lのように選択 する事はできません。この8MHzもデフォルトでは8分周されて使われますから1MHzのクロックということになります。
クロックを確認するために次のプログラムを書きました。
for(;;){ //PD2をon,off
PORTD=4;
PORTD=0;
}
これをコンパイルすると4クロックで1周期(デューティ1/4)の矩形波が出ます。これを自作のカウンタで調べたところ252kHzと測定されました。 クロックを計算すると1.008MHzと言うことになります。この状態で5Vの消費電流は2.0mAです。
次に、
内蔵の8分周回路をOFFに
してみました。ライタからヒューズビットの書き換えで -fl11100010 を送ると分周回路がOFFになります(デフォルトでは 01100010です)。この状態でポートの周波数を測定すると2.07MHzでした。
クロックは8.28MHz
ということになります。なお、RCでの発信周波数は電源電圧や 気温によってかなり変動することをTiny26Lで経験していますから厳密な数値は意味がないと思います。8MHzでの消費電流は12.5mAになりました。
mega48は、内蔵のRCでは、1MHzか8MHzの選択しかありません。電池動作などで極端に消費電流を減らしたいときは1MHzにするとよいしょう。今は変更したから 8MHzにしておきます。
mega48にはクロックを直接IOポートに出す機能があるようです。ヒューズビットを書き換えるとPB0ポートが通常のIOでなく、クロック出力 専用になるようです。これを使えばプログラムでIOポートに出力する必要はないのですが、自作の周波数カウンタモドキは4MHzぐらいしか測れませんのでこれで よかろうと思っています。
LCD表示器
別項にも書きましたがLCD表示器(2×16)は少ないポートで多くの情報を表すことができます。LCDドライブの詳細は勉強が進んでいませんが、ドライバを含めて ブラックボックスで扱えれば便利だと思っています。そこで「ATTiny26Lで始めるAVRの基礎」の「
実験6 液晶表示器
」では、 ポートのピン番号0〜5は固定にして (0〜3:data 4:R/S 5:EN)Aポートを使うことにしていました。lcd.hとlcd.cをそのままコピーして、ここではCポートを使いますからlcd.hのPORTAを PORTCに変更し、またクロックが8MHzですからlcd.cのdelayを10000に増やします。もちろんmakefileにlcd.cを追加します。プログラムのあるフォルダに lcd.hとlcd.cを置きます。
結果は良好でした。これでLCD表示のコマンド(Cだから関数)が使えます。この様子ではデバイスが変わっても同様の変更だけで使えそうです。このドライバを 作ってくださった楠さんに感謝。
コンパイルの方法や、表示のための関数は「
実験6 液晶表示器
」を参考にしてください。
プログラム(というほどのものではないのですが)ここに置きます
。 関係のファイル
lcd.c
と
lcd.h
です。なお、サーバーが .h ファイルを通してくれないので lcd.txt に拡張子を変えています。
実行時には lcd.h に戻して
ください。
水晶発振子
内蔵のRC発振器は便利ですがクロックの安定性は不十分です。電源電圧や温度によってかなり大きく変わります。クロックの安定性が問題になるときは水晶に 限ります。以前に90S2313を使った
USB回路
をトレースしたとき、セラミック レゾネータの時は極めて不安定で、断片的にしか通信できませんでしたが水晶に変えると正常に通信できた経験があります。
そこで手持ちの12MHzの水晶(デジットでなぜか1個10円で出ていたもの)を使ってみることにしました。実験用の基板ですから変更時に取り外しやすいように 負荷容量22pFは接着剤で水晶に抱かせてあります。RC発振とするときは簡単に半田づけがはずせるようにしています。
プログラマを接続して、ヒューズビットを書き換えます。 -fl11100111 としました。8分周はしていません。これで水晶発振子によるクロック生成に変わりますが、 次に内蔵発振器に変えるときは水晶発振で動いている状態で書き換えねばなりません。先に水晶をはずしてしまうとISPでは変更が不可能になります。 (二階へ上がって、自分で梯子をはずすことはできますが、はずした梯子を自分で戻すことは....。)
この状態で上記と同様にクロック周波数を調べました。4分周の結果が 2.999984MHz と表示されました。クロックを計算すると 11.999936MHz ということになります。 誤差を入れても10
-5
程度と思います。 なお、消費電流は 12.5mA で8MHzの時と変わりませんでした。
ヒューズビットの設定(クロックに関して)
通常私が mega48 で使うクロックの元は概ね次のようなものと思います。
内蔵RC 1MHz(購入時のデフォルト)
内蔵RC 8MHz(8分周器off)
水晶(セラミック)発信子
外部クロック
-fl01100010 fの次は小文字のエル(lowの意)です。
-fl11100010
-fl11100111
-fl11100000
今回はここまでですが、次はこの基板に赤外線受信素子を付けて 赤外線リモコン(テレビのもの、ソニー製)の受信器に挑戦したいと思っています。
はじめのページへもどる