AVRも最近は種類が増えてきて、秋葉界隈でもtinyシリーズやmegaシリーズが見られるようになってきました。最近の動向としては、megaシリーズをgccを使って開発するのがトレンドになっているようです。また、tinyシリーズを初めとする小規模な8ピンデバイスの入手性も良くなってきました。
mega103 + gccという組み合わせで紹介しているサイトが既に多いので、ここでは逆に tinyシリーズを取り上げてみましょう。8ピンデバイスはちょっとしたオモチャに最適なので、アイディア次第で結構遊べそうです。
現在までに発表されている8ピンデバイスを次の表に示します。機能のダブるいくつかは既に廃品種になったりしていますが、通常の用途なら色で示す2種類だけで十分といえます。コアアーキテクチャはtinyからmegaまでAVRシリーズ全てで共通なので、プログラムは他のAVRデバイスと全く同じです。ただ、8ピンデバイス特有の注意点もあるので、その辺はしっかり押さえておかないとハマります。続いてこれらを使用した応用例をご紹介しましょう。
| デバイス | 内蔵 OSC | Program Flash (word) | Data SRAM (byte) | Data EEPROM (byte) | PIO | タイマ | PWM | Comp | 10bit ADC | BOD | 備考 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ATtiny11 | 1MHz | 512 | - | - | 6 | 8bit x1 | - | 1 | - | - | ISP機能が無いので、パラレルライタが必須。 非常に安価(\50)。 |
| ATtiny12 | 1.2MHz | 512 | - | 64 | 6 | 8bit x1 | - | 1 | - | ○ | 8pin AVRの中では平均的で使い勝手が良い。 1.8V動作が可能。 |
| ATtiny15 | 1.6MHz | 512 | - | 64 | 6 | 8bit x2 | 1 | 1 | 4 | ○ | ADC(10bit/4ch/差動アンプ付き)を内蔵、 充電制御等に最適。 |
| AT90S2323 | - | 1K | 128 | 128 | 3 | 8bit x1 | - | - | - | - | 有効な足が3本しか無い、外付け発振子が 必要など、使い勝手が悪い。 |
| AT90S2343 | 1MHz | 1K | 128 | 128 | 5 | 8bit x1 | - | - | - | - | 2323に内蔵OSCを追加したもの。 128byteのRAMを生かした応用に。 |
| ATtiny13 | 9.6MHz 128kHz | 512 | 64 | 64 | 6 | 8bit x1 | 2 | 1 | 4 | ○ | tiny11/12の後継版。 ADCとわずかなRAMが追加された。 |
| ATtiny25/45/85 | 8MHz | 1K/2K/4K | 128/256/512 | 128/256/512 | 6 | 8bit x2 | 3 | 1 | 4 | ○ | tiny15の後継版。 メモリの大容量化と周辺の拡張。 |
tiny11/12/15ではリセットピンの内蔵プルアップ抵抗が無いので、必要に応じて外部プルアップ等でレベル固定する必要がある。
ISP機能とリセットピンのI/O割り当ては両立できない。RSTDISBLビットを書き換えるとISP機能が停止してしまうので、ISP動作でヒューズビットの操作をするときはうっかりミスに注意すること。リセットピンをI/Oとして使用するには、高電圧シリアルモードに対応したライタ(STK500など)が必須になる。
tiny12/15でリセットピンを出力ポートとして使う場合、出力ドライバの上アームが無い(つまりN-chオープンドレイン)ので注意が必要である。
tinyAVRの一部デバイスではISP機能が無いものがある。これらを使用するには、高電圧シリアルモードに対応したライタ(STK500など)が必須になる。
これは8pinデバイスに限ったことではないが、クロックソースを外部に設定したら、以降適切にクロックが供給されていないとISP機能は動作しない。ISP動作でヒューズビットの操作をするときは十分注意すること。工場出荷時は内蔵クロックが選択されている。
tiny12を使ってLEDを光らせる実験です。それだけです(笑)。…と、終わってしまっては身も蓋もないので、LEDフラッシャーの回路の動作を簡単に説明しておきます。
電源はリチウム電池(CR2032)1個で、LEDには超高輝度タイプを2個使います。この種のLEDに十分な電流を流すには3.5V程度の順方向電圧が必要ですが、電池1個ではちょっと足りません。3.0Vでも点灯はしますが、フラッシャーとしては光度が足りないですし、電池寿命近く(2.5V程度)になると全然光りません。そこで、チャージポンプで電圧の不足を補うようにしています。動作は、45〜90秒毎(ランダム)にそれぞれのLEDをフラッシュさせるというだけです。電池寿命は、CR2032を使用した場合、1ヶ月以上になります。
チャージポンプの動作原理は右の図に示すように、(a)コンデンサを電源と並列にして充電、その後、電源と直列に切り替えて(b)LEDに和の電圧を加える、といった感じです。実際によく使われているチャージポンプは、一般的にフライングキャパシタ(コンデンサの両極を切り替える)で構成されます。また、LEDのフラッシュに特化したLM3909というICがあって、これを使ったオモチャの製作記事が10数年前のホビー誌で盛んに取り上げられていました。
ってことで、余りにも稚拙な応用例でずっこけてしまった方もいると思うので、続いて少しマシな応用例も紹介しておきます(^^;。
センサを大量に使うシステムでは、配線コストがバカになりません。そのため、配線の手間を抑えるためいろいろな工夫がされます。ごく一般的なものとしては、配線をバス結線化して、測定値をデジタル信号で伝送するというものです。さらには給電線と信号線を共用にして1対のより線だけで接続されたりもします。各センサはマイコンを内蔵したインテリジェント回路ですが、センサ部のコストアップより省配線のメリットが大きい場合が多々あるのです。
8ピンのマイコンは、センサ部に内蔵するような用途には最適といえます。例として8ピンAVRを使った超音波センサを取り上げてみましょう。構成は右の図のような感じです。この例では、電源、デジタル信号、アナログ信号を時分割多重しています。センサ部でアナログ信号を処理してデジタル信号で伝送する方がよいのですが、超音波センサの信号処理回路は、VCAや検波器、パルスカウンタなどで構成され安くはないので、信号処理はホスト側で一括処理としています。そのため、センサ信号はプリアンプを通しただけのアナログ信号のままバスに乗せています。
右のIMGにバス上の信号波形を示します。アイドル中は電源が供給されています。計測するときは、20bitのコマンド(センサID、送出パルス数、ゲート時間、BCC等)を送ったあと、バスをハイインピーダンスにしてセンサから帰ってくる受信信号を処理します。
センサIDは、内蔵EEPROMに記憶されます。センサIDで指定されたセンサ部は、指定されたパルス数送信して、指定されたゲート時間だけプリアンプ出力をバスに乗せます。IDの違うセンサは、ゲート時間だけお休みです。この間、センサ部はコンデンサに保持されている電源で動作します。
ホスト側での信号処理については、あらゆる条件下で安定して動作させる必要があるなどノウハウの塊なので、ここでは伏せておきましょう。
ラジオデパート1Fのマルカ電機にて、RGB3素子入ったフルカラーLEDが\1.4k也。何となく買ったはいいけど、使い道がない。ジャンク箱の肥やしにしておくのも勿体ないので、基板に組んで光らせてみました。で、結局ジャンク箱は肥えていく...(笑)。
これもtiny12を使ってフルカラーLEDを光らせる実験です。それだけです(笑)。…と、終わってしまっては身も蓋もないので、動作を簡単に説明しておきます。回路図に示すとおり、回路はとても簡単です。I/OにLEDを直結しているだけで、回路上は何の工夫もありません。PB0..PB2にフルカラーLEDの各素子を接続しますが、ポートが余るのでPB3/PB4は交互にフラッシュするようにしました。かなりにぎやかです(^^;。
フルカラーLEDは、店頭デモのように色相をグルグル回してみることにしました。フルカラーLEDの明るさを、左の図のようなシーケンスで変化させると色相が回転します。各色の中間値はPWMによって実現しています。
最後にプログラムコードを載せておきます。OSCCALの値はプログラムメモリの最終バイトから取っているので、ライタのオプションでOSCCALの値が書き込まれるようにしておく必要があります。または、直接プログラムコードに記述するかします。少し書き換えれば1200などに簡単に移植できると思います。
久しぶりに8ピンAVRに新プロセスのチップ「tiny13」が登場しました。A-Dコンバータを持っていることから、tiny15の後継かと思いましたが、それにしては機能が貧弱と思っていたところ、tiny15の後継としてtiny25/45/85という強力なチップが出ました。つまりtiny13はtiny11/12の後継ということらしいです。
クロック源として内蔵オシレータの9.6MHz/128KHzまたは外部クロックが選択できます。分周回路もあるので、きめ細かなクロック設定が可能です。外部発振回路は無く振動子は使えないので、20MHz動作させるには外部オシレータしか選択肢がありません。つまり20MHz版をフルスピードで動作させることはまず無いということです。シングルチップで使う(ほとんどそうだと思う)なら、1.8Vまで動作できる10MHz版の方がその特性を生かせるということになります。購入する場合は、迷わず10MHz版(tiny13V)を選びましょう。
tiny13には64バイトのRAMが追加されています。これによりスタックが使用できてC言語での開発が可能になっています。テスト回路の8ピンコネクタのうち1-6ピンはISPコネクタと同じ配列になっているので、ISPケーブルがそのまま使えます。COMポート接続ISPケーブルでプログラムを書き込んで通信ソフトを起動(N81,38.4kbps)すると、簡単なモニタが起動します。たった50行程度のコードでもメモリのほとんどを使ってしまいました。ROMが512WにRAMが64Bという貧弱なものなので、単に「Cが使えます」といった程度のようです。このクラスはアセンブラで組んだ方が実用的でしょう。テスト回路 | テストプログラム
