A V R a g e


What's AVRage?

Atmel社のワンチップマイコンAVRに関するページです。読み方はふつうー「えーう゛いあーるえいじ」ですが、「あべれーじ」とか「油揚げ」と読む人もいるようです。

先週までのおはなし

AT90S1200-16 比較的珍しい16MHz版

Atmel AVRは8ビットRISC1チップマイコンで、数〜数十ビットの入出力ポート、内蔵クロック、タイマ割り込み、アナログコンパレータを備えています。もっとも基本的なタイプであるAT90S1200は300円以下で手に入るなど安価です。同様のものにMicrochip社のPICがありますが、AVRのインストラクションはPICのそれに比較して容易です。どのくらい容易かというと、まるで別の畑の人間であるWebmasterが1週間かからずになんとか動作するプログラムが書けた、ということを例として挙げれば十分でしょう。他にも、PICが1命令4クロックを使用するのに対し、AVRは1命令1クロック実行であり高速なことなどがPICに対するAVRの長所と言えるでしょう。
アセンブラ言語の解説や、便利なルーチンなどは他のページで解説されているものが多いので、それらは紹介するにとどめ、このページでは今後AVRを使ってつくったもの、およびその技術解説(というほどのことはできませんが)について記述していきたいと思います。


自動入力マウス

内部の図

最初に製作したのはLEDチカチカ基板ではなくこの自動入力マウスでした。ここでは、とにかく連射を目的とするのではなく、一定時間ごとにボタンをクリックするというヒトのよく行う(?)動作をシミュレートすることが目的となりました。
使用デバイスは最も安価なAT90S1200です。8ピンデバイスを使えばもう少し小さくつくれるのですが、クロック外付けであることやI/Oの本数が不足することから選定外となりました。この辺はプログラムを考え直せば製作可能であるかもしれません。セラロックも秋月電子で安く売っているので、これらのデバイスを用いるのもいいでしょう。
内蔵の約1MHzのクロックを分周して約20Hzとし、これをタイマ割り込みの一サイクルとしました。0.05秒に1回タイマ割り込みがかかることになります。この割り込み中に連射スピードに関するレジスタを一つデクリメントし、これがゼロになったときに左ボタンを1回クリックしたという信号を出力側から出す、というのが連射ルーチンです。
タイマ割り込みがかからないうちは、入力をそのまま出力にたれ流す式の無限ループプログラムになっています。オープンコレクタ出力であるとかなんとかで、あまり出力の立ち上がりなどは気にしなくていいらしいです。よくわかっていません。
入力に関しては、内部にプルアップ抵抗が内蔵されており、これは任意にON/OFFできるのですが、PS/2マウスにおいてはスイッチがアクティブHであるために、別途プルダウン抵抗をつけないと不安定になります。これがわからず出力が発振し続け苦労しました。

むしろ問題なのは、作者は実はアセンブラプログラムを書くのは今回が初めてであり、実際のところ高級言語のプログラミングも大学の教養の授業でちょっと行っただけという、サンデープログラマにも至らないようなレベルであり、たまに通信ソフトのマクロとか簡単なCGIプログラムは書きますが、今回のプログラム程度で結構悲鳴をあげていた、という事実があります。
そのため一応ここに完成品を展示するわけですが、ソースに関しては割り込みルーチンがメインルーチンの20倍近くもあり、わけのわからんプログラムになっています。お世辞にも見せられたものではないのですが、結局清書するっていうのは全部プログラム書き直すことに近いので妥協しました。
まあ生まれて初めてつくったまともなバイナリのプログラムなので、よしとしてください。
清書みたいなものは一応つくりかけの「3ボタンバージョン」で、ということで。


キーボードに関するもの

ただいま鋭意製作中。

買ってきたAT90S2313

現在PC-9800シリーズキーボードと、IBM-5576-A01キーボードと、上でつくった連射マウス2種類と、それ以前に使用していた普通のマウス2種類が置いてあって非常に邪魔です。どっちのキーボードもまあ使いやすいのですが、個人的にはOADGキーボードに慣れてしまいました。ちなみにAtmelの資料にPS/2キーボードとAVRのインタフェースを取る方法はちょっと書いてあります(ソースがCですが)。98もPCもキーボードと本体のやりとりはシリアル経由で、その資料もようやく手に入りました。あとはコーディングのみ・・・かな??
ちなみにトラ技のPICNIXというのに98のキーボードをPCに接続する、という記事がありましたが、とりあえずその辺も混ぜて考えてみたいと思います。該当記事ではPICには10MHzのオシレータを接続すること、となっていましたが、おそらくPICの4倍高速であるはずのAVRなら2.5MHz相当で動作するでしょう。手元には3.58MHzのセラロックしかなかったりします。
問題のコーディングですが、キーボード変換にはキーバッファが必要ということに気づきました。90S1200にはRAMが乗ってない(レジスタのみ)ので他のデバイスを対象として現在コーディング中です。90S1200は実はAVRの中ではかなり命令セットが少なく、スキャンコードから実際の文字コードへと変換する変換テーブルをプログラムROMの中に置くことが不可能、という致命的な欠点がありました。(プログラムROM中のアドレスを参照する命令がない)小さいテーブルならばEEPROMの中に置けばいいのですが、単純に考えても106キーボードでは106バイトのテーブルが必要になります。64バイトのEEPROMしかない1200では不可能でした。プログラムROMの中にどうやってテーブルを置くかがわからなくてここのところ悩んでいたのですが、このアクセスの仕方に関するアプリケーションノートがAtmelのサイトにあり、他のデバイスを用いることで問題は解決しました。現在ターゲットデバイスは90S2313となり、スキャンコードの翻訳テーブルを作成し、あとは拡張キーの処理を行って……

PS/2のキーボード処理は外部割り込みをキーボードからのクロックに同期させて割り込み処理すればなんとかなることは前述の通り。スキャンコードから文字への変換もテーブルを作成してなんとかなりそうです。PC-9800シリーズのキーコードへの変換もこのテーブルを細工してつくれば作成できるでしょう。9800シリーズへのキーコードの送信は19200bpsの調歩同期なのですが、これは90S2313に載っているハードウェアUARTを使えばなんとかなりそうです。
ただ問題は、ソフトウェアが大きくなりすぎて、もはや頭の中で構築する限界を突破してしまったことにあります。フローチャートをちゃんと書いて、アセンブラのマクロを最大限に活用しないと、完成にはほど遠そうです。大きな流れは上に書いた通りなのですが、実際はキーボードへの確認コードのやりとりや、その信号を送るにあたってのシーケンスがどうも資料には不十分な気がするといった感じで、サンデープログラマにはやや荷が重いのかもしれません。


第三段:キャラクタ表示LCDコントローラ

原稿作成中です。日立製キャラクタ液晶コントローラLSIのHD44780をコントロールしようという作戦で、ネット上にもいろいろなソースがありましたが、これがうまく動いたり動かなかったりしました。一応、いろいろなソースを自分なりに解釈しなおして表示できるものが作成できたので、近日中にレポートします。
現在のところ、AVR中のEEPROMに記述されたデータの内容を逐一表示するような仕様になっています。このLCDコントローラでは外字も使えるので、バーグラフみたいなものをつくりたいな、というささやかな目標をかかげています。
ちなみに普通の白・黒型の液晶はよく秋月とかに売ってますが、このネガティブ表示赤バックライトLCDは結構珍品と考えてるんですがいかがでしょうか。


AVR関係のリンク

AVRはPICと同様の扱いをされているところが結構多く、また国内のページでは後者のものの方が相当多いようです。AVR関係の情報を集めてみました。
どこかいいサイトを知っている、という方がいらっしゃいましたら、教えてください。
ちなみにAtmel社はノルウェーにあるようなので、なんとなく情報は欧州の方に豊富にあるような印象を受けました。フリーの開発環境についても、Atmel社製のAVRasmの他に、Gnu C CompilerのAVR版が少なくともあるようです。BASICやPASCALも存在はするようですが、よくわかりませんでした。
私見では、アセンブラレベルでもプログラミングはかなり易しい部類に入ると思っているのですが……


Last modified: Sun Nov 12 16:58:49 JST 2000