Key words:ATMEL,AVR,Micro Controller,MPU,BASCOM-AVR,ATmega,ATtiny,ATmega8,ATmega48,ATmega88,ATmega168,Fuse Bits,Fusebits
■このページの目的
これから積極的に使いたいAVRマイコンとして、ATmega168を共同購入してみました.高機能・高性能なチップなのですが、あいにくネットをサーチしても使用例が殆ど見つかりません.そこでテスト用ボードの設計を通じて、うまい使い方を考えてみることにします.同時にISPに使う端子の設計条件なども探ります.さらに、最新のATmega/ATtinyシリーズのAVRマイコンでは必須のヒューズ・ビット(Fuse Bits)についても触れます.
■関連のページ
AVRマイコン入門と活用・応用編には、以下のページがあります.
- 入門編(1):イントロ編/Part-1 :Introduction
- 入門編(2):超簡単・ハードの基礎/Part-2:Hardware Fundamentals
- 入門編(3):初プログラミング/Part-3 :BASCOM-AVR Fundamentals and My First Program.
- 入門編(4):ATtiny2313への乗換えかた: How to transfer from AT90S2313 to ATtiny2313.
- 活用編(1):ATmega168を使ったテストボードの製作(いま見ているページ)
- 活用編(2):AT90S2313を使った周波数カウンタ: The AVR Frequency Counter,Real simple !
- 実用編(1):ATtiny2313を使ったラジオ・カウンタ: The Simple Digital Readout for your Radio.
■定番AVR ATmegaマイコン
AVRマイコンは初期のAT90Sシリーズから、現在ではATmegaシリーズ、ATtinyシリーズへと移行しています.BASCOM-AVRにチップを定義したファイルが用意されていれば新チップへの移行も簡単なようです.いずれもプログラムメモリ(作ったプログラムを書込むメモリ)はFlashメモリで、書込み方法に変更はありません.従って、どのAVRマイコンを使うのかは目的により内蔵機能やポート数で選択すればよいわけです.選択肢はたいへん多いのですが、できたら同じチップを継続的に使うのが良いはずです.ノウハウが蓄積でき、使用実績があれば活用もしやくすなります.チップの乗換えも容易なのですが、ポート割付やピン配置は異なるので、テストの結果がそのまま実機でも使えたら便利です. 『これからの定番AVRは何か?』についてAVRマイコンファンの皆さんに聞いてみました.意見を集約すると、ATmega8/48/88/168シリーズの人気が高いようでした.これらはピン配置・機能はどれもほぼ同じで、メモリ容量の違いだけです.BASCOM-AVRを使い始めて、高級言語コンパイラでは実際に消費されるメモリ量が見積もりにくいように感じています.メモリは常に多めにあると安心できる感じなのです.メモリがぎりぎりだと、どうしてもトリッキーなプログラムにならざるを得ません.それでは後の変更修正や再利用がたいへんやりにくくなってしまいます.むしろわかり易いプログラムを書くようにしたいものです.そのようなわけで、シリーズ中メモリ容量最大のATmega168(16KByte)を定番に選ぶことにしました.では、メモリが多いと高価かと言えば、ATmega48(4KByte)と比べて20%も違わないくらいです.それに20%高価だと言ってもDigi-Keyで纏め買いした単価は約340円(諸経費込み)でした.仕事の量産品ではありませんから、勿体無いなどと思わず気軽に使うに限ります.趣味とは言え、数10円ケチって余裕のないメモリに無理やり詰め込む作業をするのはナンセンスと言うものでしょう.貴重な時間はもっと重要な研究テーマに注ぐべきです.
■テストボードの必要性
イントロ編にも書きましたが、テストボードなど作らず、いきなり応用回路を作っても良でしょう.最後は実際に使う回路でテストしなくてはなりません.それならテスト回路など不要だという考えもあります.しかし、新しい構想でプログラム開発を始める時に、テストボードがあればとても重宝します.実機のハードウエアが完成する前にプログラムの検討ができるからです.プログラムの都合でハードを変更することさえあります.従って事前にプログラムの検討が進められる環境はぜひ用意しておきたいのです.定番チップも決まってきたので、今後の応用を考えてATmega168を使ったテストボードを設計しました.
■ATmega8/48/88/168シリーズ
この4種類は基本的にメモリ容量を除いて同じと考えて良いでしょう.とくにBASCOM-AVRで使うには違いは感じません.ATmega48/88/168は最初に登場したATmega8よりかなり機能拡張されていますが、ピン配置を含めて基本的な機能は完全にコンパチ(互換)です.ATmega8の評判が良かったので、それをベースにバリエーションを増やしたのでしょう.ここでは使い易い28ピンのデュアル・インライン・パッケージ品を例に機能を見ることにします.
ATmega8/48/88/168シリーズの特徴は・・(抜粋)
- I/Oポート:標準的に使えるのは、ポートB.0〜B.5、ポートC.0〜C.5、ポートD.0〜D7の20本
- プリグラムメモリ容量:mega8=8KB、mega48=4KB、mega88=8KB、mega168=16KB
- RAM:mega8=1KB、mega48=512B、mega88=1KB、mega168=1KB
- EEPROM:mega8=512B、mega48=256B、mega88=515B、mega168=512B
- クロック:mega8のみmax16MHz、他はmax20MHz.低電圧Lバージョンは半分(8MHz or 10MHz)になる
- タイマ・カウンタ:Timer0(8bit)、Timer1(16bit)、PWM用Timer2(8bit)の3本
- A/Dコンバータ:ADC 0〜ADC 5の6本
- 割込み:INT 0、INT 1の2本
- シリアルコミュニケーション:UART内蔵.SPI、ハードウエアI2Cインターフェースあり
- その他:内蔵クロック1MHz(8MHzに切換え可).内蔵クロック使用時にはポートB.6、B.7が増える.
非常に高機能でとても書ききれませんが、主要なところは以上です.詳細はそれぞれ仕様書を参照して下さい.
●ATmega8/48/88/168のポート
ポートの配置を纏めてみました.いちばん内側に書いてあるのは購入時の状態です.その外側に書いてあるのは切換え可能な機能です.但し、全部は書ききれないので主要な機能のみにしました.いちばん外側にに書いてあるのが、ISP(In-System Programming)に使うピンです.これらISP用のピンについては特別な配慮が必要です.詳細はあとの方に纏めました.これらのピンの機能が生かしやすいようなテストボードを設計することにします.
■ATmega168テストボード
テストボードはATmega168だけでなく、ATmega8、48、88にも共通に使えます.ピン数に余裕がないので、うまく使わないと汎用性のない基板になります.回路例がBestとは言えませんが、なるべく機能が活かしやすいように考えました.
最低限必要な条件は:
そのほか、外付け水晶、I2Cインターフェース、ロータリエンコーダ、A/Dコンバータへの配慮などは必要に応じ追加します.回路はそのような考えで設計しました.これでなくてはならない部分は殆どないので、お好みに応じてカスタマイズすればよいのです.- ISPでプログラムを書き込めること.
最初からシンプルなISP(In-System Programming)で開発することが前提です.だからこれは必須です.- デバッグ用LCD表示器が付いていること.
なくても何とかなるのですが、デバックだけでなく、アウトプット・デバイスとして扱いが簡単なのでとても便利です.- パソコンインターフェース用にRS-232Cがあること.
・・・くらいでしょう.いたってシンプルです.
今のところRS-232Cの使用実績はないのですがBASCOM-AVRのプログラム例では頻繁に使っています.
●ISPへの配慮について
ISP(In-System Pfrogramming)には4本のピンを使います.これらのピンは普通のポートとしても使えますが、プログラムを書込むときに支障がないように注意が必要です.特にリセット端子は重要です.このピンがきちんと制御できないとうまく書込めないからです.特にATmega168(8/48/88でも同じ)ではヒューズビット(後に説明)を書換えてPortB.6(ピン1)にすることができるのですが、ポートとして使う設定にしてはいけません.これを活かすようにしておかないと以後ISP書込みができなくなってしまいます.MISO、MOSI、SCK端子はいずれもポートBと兼用ですが、以下の注意を払っておけば普通のポートと同じように使って良いでしょう.
書込み時に上記の条件が守れるようにしておけば、普通のポートのように他の用途に使用しても大丈夫です.C-MOS-ICの入力端子や、10KΩ以上の抵抗を持ったドライバ・トランジスタのベースなどは問題ありません.書込み時にOFFが確実なトランジスタのコレクタや、通常OFFになるプッシュスイッチなども良いです.Tri-State出力のICも書込み時にフローティングが確実なら大丈夫でしょう.プルアップ抵抗を付けるなら10KΩ以上にします.こうした考慮をすれば良く、そうでなくても限られているポートをISPのために占有させる必要はありません.テストボードでもLCDモジュールの接続と兼用して少ないポートを有効に使うようにしています.
- 書込むときに信号の衝突がないようにする.(図参照)
ISP用のピンにONになったままのスイッチや他のICの出力端子などを付けないようにします.あるいは、書込み時に配線を切り離せるようにします.- 論理振幅に影響するような負荷を付けない.(図参照)
たとえば、リレーの巻線、低抵抗、トランジスタのベースなど電流がたくさん流れて論理振幅が下がってしまうような負荷はいけません.
●テストボードの実際
実際に製作したのは、写真のようなものです.これは、いきなり実機のテストを兼ねているので、テストボードの形態にはしませんでした.しかし、肝心の部分、(1)ISP書込み、(2)LCD表示器の部分は回路図どおりに製作して、テストしてあります.テストボードの回路を踏襲し、少しでもプログラム開発の煩雑さを緩和するためです.これがこれからATmega168を使うときの標準回路になるからです.また、外付け水晶発振のテストも行ないました.IC2インターフェース、ロータリエンコーダ、A/Dコンバータの部分はポート割付けの問題なので、テストは後回しでも良いでしょう.
■BASCOM-AVRの初期設定
使用チップを変更したら、BASCOM-AVRの再設定が必要です.また、LCD表示器、クロック周波数、ISP(In-System Programming)の設定も変更があれば再設定が必要です.そのほか、I2Cインターフェースも使用予定なので、それも含めて初期設定します.
●チップ定義ファイルの選択
まず、図のようにChip、Compilerと進みます.これは入門編に書いた操作と同じです.
次に、mega168を意味する、『m168def.dat』を選択します.これで使うチップがmega168になりました.テストボードはmega8/48/88にも使えますが、定義ファイルは適宜選択します.
●クロックの設定
クロックの周波数欄にHz単位でインプットします.但し、内部クロック分周器にも関係するので、実際に動作する周波数をセットする必要があります.内部クロック分周器についての説明は、あとの方にあるヒューズビットの項にあります.なお、ここで使った外部水晶は27MHzなので、『27000000』とインプットしました.例によってオーバークロックなのですが、これで正常に動作します.(推奨する訳ではありません)12.8MHzなら『12800000』とします.また、内部クロックを初期値のまま使うのでしたら、1MHzなので『1000000』です. ボーレートはRS-232Cを使う予定があればそのスピードに合わせます.使う予定がなければ適当で良いでしょう.
●ISP、I2Cの設定
ISPで使うMOSI、MISO、SCK、RESETの信号がチップの何番ピンかを設定します.図はATmega168(=ATmega8/48/88も同じ)の例ですが、他のチップを使うならデータシートを良く確認しておきます.なお、SSピン(スレーブセレクト)は、ここで使用する書込みケーブルにはありません.念のためチップのSSピンに割当てましたが必須ではないはずです.I2Cバスの詳細は、別のページで予定しています.ATmega168にはハードウエアとしてI2C用のピンが用意されています.しかし、BASCOM-AVRでI2Cを使う際には、ソフトウエア制御になるようです.従ってハードウエアに依存しないはずですが、念のためマニュアルを見てI2Cに指定されたピンを割り付けてみました.
●LCD表示器の設定
LCD表示器はプログラム開発に必須とも言えます.ポートが丸々8本あるチップならわかり易いピンの割付もできますが、mega168のポートは細切れです.検討した結果がテストボードの配置です.具体的には、LCD表示器のDB6、DB7はポートBの6番と7番に割り振りたいのですが、そうすると外付けクロックが使えません.結局、おのおのポートBの0番と1番を使うことにしました.それに従い、図のように設定しておきます.LCDのピン接続は、ユーザーが自由にできる部分です.従って、テストボードの例にとらわれることなく、都合で変更して結構です.変更したらそれに合わせておきます.
以上でBASCOM-AVRの初期設定は終わりです.端折った部分は、入門編・Part3も参照して下さい.
■ヒューズビット
ヒューズビットは一部のAT90Sシリーズにもあった機能でした.しかし、ATmega/ATtinyシリーズを使うなら理解は必須のようです.ATmega/ATtinyシリーズは、AT90Sシリーズより多くの機能を内蔵しています.しかしピン数には制限があって全ての機能を同時には使えません.選択可能な機能はユーザーが使うときに決めます.これは、BASCOM-AVRのConfigコマンドとは異なり、チップ内部のハードウエアに密着した部分の設定です.プログラムからは変更できません.それを設定するのがヒューズビットの書換えという訳です.
良く行なう例としては、クロックの設定があります.AT90S2313では外付け発振器か水晶(セラロック)が不可欠でした.しかし、ATmega/ATtinyシリーズはクロック発振器を内蔵しているものがほとんどです.ATmega168もそうです.購入したままだと内部発振器の約1MHzで動作します.外付けクロックは不要で、用途によってはそれで十分です。外付けがいらなのはたいへん便利で、ポートも多く使えます.しかし、もっと高速に動作させたいときもあれば、クロックの精度・安定度が欲しいこともあるでしょう.こうしたハードウエア的な部分はプログラムからは変更できません.ヒューズビットを書換えることで初めて可能になる部分です.また、内蔵クロックのままでもクロック分周器(8分周)をDisableすれば高速動作(約8MHz)にできるのです.ユーザーの様々なニーズに応じ、内蔵するハードウエアを変更可能にしている重要な機能です.ヒューズビットの扱い方を知らないと、十分機能を活かせません.
ヒューズビットは、一種のROMのようなものです.ヒューズと言う名前なので、一回限りかと言えばそうではありません.元に戻したり、更に別な設定に変更することができます.但し、プログラムの書換えにはまったく影響されません.改めてヒューズビットの書換え操作をしない限りずっとそのままになります.従って、プログラムを書き換えてチップを再利用するときには以前の設定がそのまま有効なので注意が必要です.書換えはBASCOM-AVRと書込みケーブルで簡単にできます.幾つか注意が必要ですが、難しいものではありません.クロック関係の設定以外にも多くの機能があります.どんな機能があるのかは、AVRマイコンのデータシートに詳しく書いてあります.チップによって個々に内容は違うので一度は目を通しておくべきです.(ハードに依存する部分なのでわかりにくいのですが・・・)
■ヒューズビットの書換え
ここではATmega168を具体例としてヒューズビットの設定手順を纏めました.設定する内容は外付け水晶振動子をクロックにして、内部クロック分周器をDisableし、フルスピードで動作させるというものです.書換えにはBASCOM-AVRとプログラム書込み用のケーブルを使います.(書込み用ケーブルについては、Part・1:イントロ編を参照のこと)
●重要:ここでは内部発振器から外付け水晶にクロックを切換えます.もし外付けの水晶が付いていなければ、書換えるとその瞬間クロックがなくなってしまいます.そうなるとチップはもはやまったく反応しなくなります.当然、内部クロックに戻すのもできません.これは、チップが壊れた訳ではないのですが、そのままでは二進も三進も行かなくなってしまうので十分な注意が必要です.万一やってしまったら・・・下記の『気付け薬』の項を見てください.
1・ハードウエアのセットアップ
テストボードにプログラム書込み用ケーブルを接続します.ボードに通電し、プログラムを書込む時と同じ状態にしておきます.
2・書換え内容の設定
次に、Programメニューを選び、Manual Programを選択します.
3・Fuse bitの操作
Fuse bitと言うタブをクリックし、Fuse Bitsの設定画面に切換えます.
4・外付けクロックの設定
クロック設定のメニューから図のように選択します.これでクロックは外付けの水晶になります.なお、セラミック振動子(セラロック)を使う場合や、外部のクロック・ジェネレータから与える場合は別の設定になります.その場合のCKSEL3〜0の設定と、SUT(Startup Time)の設定方法はATmega168(8/48/88)のマニュアルを参照してください.初期値(内部の自励発振器をクロックにする)に戻すなら、CKSEL3〜0は0010、SUTは10です.また外部クロックを使う場合には、CKSEL3〜0は0000、SUTは10にします.
5・内部クロック分周器のオフ
初期状態では内部クロック分周器(1/8)が有効です.そのままだと水晶周波数の1/8の周波数がクロックになります.これをDisable(無効に)して水晶のそのままの周波数で動作するように設定します.逆に、外付け水晶の8分の1をクロックし使いたい、あるいは外付けクロック・ジェネレータから与えた周波数の8分の1にしたいなら、DIV8=Enable(=0)(有効)にします.なお、初期値はDIV8=Enable(=0)(有効)になっています.(即ち、クロックの初期値は、約8MHzで発振する内部の自励発振器を使っており、それを8分の1にした約1MHzがMPUのクロックになって動作します)
6・書換え
図のようにWriteボタンを押すことで書換えられます.以上でヒューズビットの設定ができました.これでmega168は外付けした水晶の表示周波数で動作することになります.難しくはなかったと思いますが如何でしょう?
■気付け薬(?!)
前にも書いたようにヒューズビットの書き換えはプログラムの書込みとは無関係です.意図的に書換えない限り前の設定が保持されています.従ってチップを再利用するときには注意が必要です.もし外部クロック/外部水晶の状態になっていれば、一旦は必ず外から与える必要があります.これはプログラムの実行上必要なだけでなく、クロックがなければプログラムの書込みも、ヒューズビットの書換えもできないからです.内部クロックに戻すにも一旦は外からクロックを与えなくてはなりません.内部クロックの状態から外部に書換えるときも注意してください.もし書換えたとき、外付け水晶や外部クロックがないと、それをした瞬間にチップが応答しなくなります.もちろんもとには帰れません.クロックがないと気を失ったような状態になるわけです.そんなときには写真(準備中)のような応急クロックが便利です.気付け薬のように応急クロックを与えてやれば息を吹き返します.Hi Hi 水晶のアクティビティが低くて発振できないときや、外部クロックの振幅が足らないときにも応急クロックで対処できます.クロック関係のヒューズビットを操作していてチップが反応しなくなっても、壊れた訳ではないので慌てないでください.応急クロックはAVRマイコンのXtal-1と言う端子(ATmega8/48/88/168では9番ピン)とGNDに接続します.応急クロックの周波数は1〜5MHzくらいが適当でしょう.L=0V、H=5Vの論理振幅を確認しておき、事前にテストしておけば万一の時にも安心です.
■またもやオーバークロック
殆どの応用では内蔵クロックの1MHz(初期値)か、8MHzで十分な用途も多いでしょう.クロック周波数が高いと消費電流も増えます.電池を電源にするならなるべく低い周波数が良いのです.しかし処理能力を上げる必要があるなら、クロックを上げるしかありません.ノイマン式コンピュータは逐次プログラムどおりの処理を進めるしかないので、早く処理させるには、処理の刻みになるクロック間隔を狭める、即ち周波数を上げるしかないからです.megaシリーズになって、クロック上限も大幅にアップしています. ATmega168も保証上限は20MHzです.HF帯のクロックで動作しますが、無線機組込用ではクロックがHAMバンドに入るのは最悪です.実際の上限周波数はどの程度にあるのか気になったので、スペックオーバーを承知で試してみました.外部発振器から与える方法もありますが、水晶を外付けする方法で試しました.手持ちの基本波水晶から周波数が一番高かった27MHzを見付けました.(オーバートーンはそのままの回路ではダメ)35%のオーバーですが、まったく問題なく動作しています.RISCマイコンのAVRは、この状態で27MIPSとなるのだから結構なスピードでしょう.もちろん、クロック速度だけで処理能力が決まるわけではありません.多分、一番影響するのはプログラムのアルゴリズムに違いないです.凡人は冗長で出来の悪いプログラムしか書けないので、高速クロックで不味さをカバーすると言う作戦でしょうか.Hi Hi
■テストプログラム
例によってLEDチカチカとLCD表示の簡単なものです.配線が終ったら、旨く書込みができ、間違いなく動作するか簡単なプログラムで確認しておきます.プログラムは入門編・Part3で説明したのと殆ど同じものです.
シミュレータもプログラムのデバックには欠かせない機能でしょう.この際扱い方を良く習得しておくと良いです.LCD表示器を使う設定にしておけば、もちろんシミュレータのLCD画面にも文字が表示されます.これで遊んでみるだけもなかなか楽しいかも知れません.(笑)
■エピローグ
応用編に進む前に、定番AVRマイコンと言う事で、ATmega168を試食してみた.AT90S2313でもかなりの事ができるように感じたが、いずれ消え去る運命だ.そこで、これから暫く付きあうハズの新型チップを試してみたわけだ.新型チップではヒューズビットの扱いは必須のように思った。例の『魚型ロボット』の本には何も書かれていないので初心者は迷ってしまった.しかし、BASCOM-AVRを使って容易に書換えできることがわかった. プログラミングの面からは、BASCOM-AVRで書いていると新型チップに有難味はあまり感じられない.しかし、マニュアルに見る新型チップの豊富な機能には驚かされる.様々なニーズに応えようとしたATMEL社のパワーには感心する.それらの機能を活かせるようにBASCOM-AVRを拡張して行くMCS Electronics社も大変だろう.やはりツールの発展があってこそ新型チップも活きてくるに違いない.
ところで、AT90S2313からATmega168に乗換えたときの印象はあまり良くなかった.多機能なのは良いが、わかりにくいように感じたからだ.AT90S2313がシンプルだったから特にそう感じたのかも知れない.それにしても細切れなポートには不満を感じる.8ビット丸々使えるポートは1つしかない.しかもそこにはCounter/Timerの入力や割込みピンも共存している.これではバイト単位の入出力には不便だ.AT90S2313のメモリ増大版でも出してくれたほうが有難いとさえ思ってしまったくらいだった.
しかし、使い始めたらすぐに慣れてしまった.むしろ、限られたポートをやり繰りするより、良い方法があることに気付いた.高機能・高性能だからといって、なんでもMPUの周りで処理する必要はない.むしろAVRマイコンをシステムの中核として使い、もしポートやピンが足りなければ、外付けで補えば良い.I2Cバスを使った分散型システムの必要性を感じ始めた.分散型システムなどと言うと難しそうだが、BASCOM-AVRにはI2Cのコマンドが準備されている.だからそれほどの苦労はないはずだ.・・・と言うことで、いずれ、I2Cバスとそのテストを扱う予定にしている.
さっそくマイコン式周波数カウンタで応用編に進むにはこちらで.
マイコン式周波数カウンタの実用編、ラジオカウンタに進むにはこちらで.
(c)2006 Takahiro KATO All rights are reserved.
Not for republication in any form without written permission.