AVR 事始め (2009.2.1)



 昨年の年末に秋葉原に立ち寄った際にAVRのチップを仕入れてきました。実は、いつも情報交換させていただいているJA4LAOさんの「怒涛の自作」を目の当たりにして、なんで、あんなに早く製作できるのかと不思議に思っていました。特にAVRを使った「制御モノ」の製作スピードには舌を巻いておりました。それでAVRには興味を持ったのですが、昔使っていたPICとそんなに大差は無かろう・・・とたかをくくっていたのですが、自分でPIC BASIC COMPILERをいじっていたころを思い出すと、プログラム/でバックにおいてけっこう面倒なことが多く、よほど根性をいれないと、プログラムを完遂できない感じでした。

 数年前から、AVRが「使いやすいし価格も安い」と人気化していたのは知っていたのですが、PICからわざわざ移行することもあるまいと、「ずぼら」を決め込んでいました。もっとも、この手のコントローラは当時製作中のTRXの中で、PIC16F877という、I/Oの数多い石をDDS-PLLの制御に使っていて、まさに悪戦苦闘していましたから、AVRに浮気する余裕なぞはまったくなかったのです。ところが、今回、余裕ができて遊んでみたら、AVRのよさというか、本当はBASCOMと呼ばれるAVR用BASIC COMPILER のできのよさに舌を巻いてしまったのです。時代に取り残されたなぁ と本当に感じてしまいました。

 ということで、AVRをいじることに決定はしたのですが、ICはATmega88なんていうチップを買ってきても、それを使うための情報がありません(笑)。こんなときは当然ネットで探すわけですが、いろいろ見ているうちに、BASCOMというコンパイラがデモ版は無償で、なおかつ使いやすそうだということがわかってきました。また、AVRへのプログラム書き込みはチップを最終基板にマウントした状態でできる(ISP)こともわかりました。こりゃ便利そうだ。PICもできるのでしょうが、いままで、そのあたりの情報に疎く、PICの場合、秋月のライターで書き込んでは、基板のソケット(ゼロプレッシャーソケットを多用)に挿入して動作/デバッグをしていたのですから、このことひとつ取ってもAVRは魅力的です。

 ということで、まずはISP書き込み器の製作を始めました。これは、最初、USBタイプにするか、パラレルポート利用タイプにするか迷いましたが、ここは構成の単純で3ステートバッファ一個ですむSTK200タイプにしました。抵抗4本でも最低限書き込みはできるようですが、ケーブル延長制限(70cmくらい?)と、ISPのためのAVRのポートを独占してしまうようなので、STK200相当にしました。3ステートバッファが入っているので、書き込み後はこのバッファはAVRと分離されるので、ISPポートもプログラム書き込み後は入出力ポートとして使えるというのは大きな利点です。




バラックのISP書き込み器

 実は、大笑いな話があります。STK200タイプと呼ばれるPCのパラレルポートを利用したインターフェースは簡単な構成が魅力ですが、当然のことながらPC側にレガシーなプリンタポートが必要です。いまどき、プリンターはUSBが常識ですが、5-6年前までのプリンタはDSUB25ピンのパラレルポートから接続しするものも残っていました。ノートPCからこのポートが消えたのはだいぶ前でしたが、デスクトップPC、特に、自作のCPUボードには、まだまだついていると思っていました。昨年の6月にPCを新調しましたが、私的には当然このパラレルポートがついていると思っていました。実際、このインターフェースを作って、さあ、接続だ と、PCの裏面を見ると、そんなコネクタどこにも見当たりません。唖然です、はい。

 とっくにパラレルプリンタポートは無くなっていたわけですが、このままでは引き下がるわけには行きません。だって、パラレルポートを使うアプリケーションが三つ四つあるからです。というわけで、パラレルポートアダプタなるものを安く仕入れてインストールしました。これだけでは、BASCOMは動きませんから、下図のようにアドレスを変更してやればOKです。これで、パラレルポートアダプタが有る限り、STK200タイプISP書き込みができることになります。




パラレルポートアダプタの例 
販売先 URL




BASCOMの設定
Option-Programmerを開き、LPTアドレスをプリンターポートから変更

 次はAVRの載る基板ですが、実は、最初、どこまで実験するか分からなかったので(PICと大差なければ、途中で実験を中止することも考えていていた)、最小構成にしてみました。ATmega88一個とLCDディスプレイ用コネクタ、のこりのI/Oコネクタと一個のLEDだけを実装した最小基板にしました。クリスタルさえも実装せず、チップ内臓発振器で済ませています。いかにも「いつでも撤退可能」という風情ですね。



作った実験基板

左のコネクタがISP端子
上のコネクタは10キーボードとDDSインターフェース用
右はLCD(16*2)


まずは、これで、BASCOMに慣れる観点からLED点滅プログラムを作ります。これはPICの時もやった、一つの儀式のようなものですね。ただし、これではすぐに飽きるので、なにかペリフェラルをつなぎたくなります。ということで、まずは、LCDとテンキーをつけてみました。これが下の図です。AD9951の基板もありますが。




AD9951DDSの制御風景



実験回路(ATmega88-20、KBD,LCD-Display)

 BASCOMで感心したところを書いておきます。まずは、LCD表示ですが、なんとDouble指定した変数 Freqなるものを表示させるには、
   

で終わりです。これで、もし変数が10進で「12345678」ならそのまま表示ですから便利ですね。キャラクタも、バイナリでもなんでもござれということで、まずは、感心その一です。

 次はキーボード入力です。4*4マトリクスの結線をして、たとえば PORTDを入力指定、Config Kbd=PORTD としてDebounce指定をしておけば、

   

のように Getkbd()なる命令でチャタリングキャンセルして、押したキーに応じた0から15までの数値が得られます。きわめて簡単に数値入力のインターフェースができます。

 極め付きは下のShiftout命令でしょう。これは、データ出力のサブルーチンですが、AD9951をコントロールする場合、まずはリセット後、40ビットの制御信号を送り(ここでは省略)、そのあとで、5バイトの周波数指定データを送ります。下の命令でShiftoutとは、データ出力ポート、クロックポート、送るデータ、MSB/LSBfirst、送るビット数のそれぞれを指定すると、一命令で完了してしまいます。

    

 実際はCont9951_2なる、以降が周波数データだよという指定命令のあとに4バイトの周波数データを送って、ストローブ信号(PortB.1)で確定することで、周波数指定が完了します。驚いたのは、Freqという変数はDouble指定しているので、通常の算術演算がダブル精度で可能です。そいつをそのままFtwとしてバイナリーで32ビット自動で送出してくれるのですから楽ですねぇ。このあたり、この命令が無くて、自分で組んでいくと、結構なライン数を消費します。

 もしかしたら以上のような話は「常識中の常識」で、なんら感動しないものかもしれませんが、PICのBASIC COMPILERじゃまったく望むべくもなかったので(もっともバージョンアップを全くしなかったので、もしかしたらPICもよくなっているかもしれない)、6年もすると便利になるものだと、感心しきりです。これで、今後はなにか「制御モノ」を作る必要が生じたら、躊躇無くAVRで行くことになるでしょう。PICとPIC BASIC COMPILERはお払い箱ということです。ただ、この選択はPIC Vs AVRというチップの差ではなく、できのいい開発環境であるBASCOMが手放せなくなったということです。チップに関してはPICだろうがAVRだろうが、大した差はなく、こだわる理由はないと思っています。

 一応、AD9851DDS とAD9951DDSの両方をコントロールするプログラムができたので、ここでAVR遊びは中断して、中断中だったDSPお遊びに移行していくつもりです。


<モジュールつくり> 【2010.6.20】

 8B-TRXのリペアから開放されて、次に着手しようと思ったのは、PLLの外部局発です。こいつは、今までPLLをたくさんいじってきているので、簡単にアップできると思っていたのですが、ちょっと寄り道の虫が騒ぎ始めました。というのは、ふっと思い出すと、いままで、パラレル入力型のPLLを掘り出しては作っていたのですが、もう、そんな時代じゃないので、シリアル入力のPLL それもアナデバとかの「高性能」型PLLを自在に操れるようになっていないとまずいだろうと・・・・・・

 このためにはちょっと考え込まないといけません。いろいろなことを考慮して進めなければならないのですが、まずはPLLのコントローラが必要になります。また、どうせレファレンスは微小ステップで変えないといけないのだからDDSのコントロールも必須です。ということで、これらのモジュールを作り始めました。




20ピンAVR(Attiny2313)とDDS(AD9850)

 前回、Atmega-88でキーボードセンスとLCD表示とそれに基づくDDSコントロールまで作ってありました。用途によっては、キーボード、表示も要らず、単に周波数のアップ&ダウンができればいいというケースもあります。今回はそんな用途にロータリーエンコーダのセンシングルーチンを作ってみました。

 上図のAVRはAttiny2313(クロックは内蔵1MHz)で赤緑LEDで回転方向が分かります。一回転は20パルスなので、外部クロックで処理速度をアップしなくても大丈夫みたいです。DDSは当初これを使っていましたが、AD9850がたくさん余っていたので簡単にマウントしてみました。こいつはそのうちセットであるものに組み込みを考えています。

 といって、新しいこと何も無く、坦々と出来てしまいました。PLLを構成するパーツというかソフトも含めたモジュールを揃えていくのが主眼ですので、以上終わりです(笑)。これって単なる作業日誌かな?(大笑)。


<ATtiny13小型制御モジュール> 【2001.6.18】

 以前に、ATtiny2313でリニアアンプの電源シーケンサーを作ったときに8ピンAVRで作ろうかと思ったのですが、結局手元にあった2313で作ってしまいました。3ビット分しか制御するI/Oが無いので、勿体無いとは思いましたが、肝心の値段はかえって8ピンAVRより安いくらいでしたので、収容場所が許せば、こちらのほうがお得です。

 今回は、狭いエリアに収容することを前提に8ピンAVRを使ってみることにしました。これで、8ピン、20ピン、28ピンのAVRに触れることになります。あとは40ピンですが、よほど大きなシステムに挑まない限り、手が伸びることはないかも知れません。

 さーて、肝心のブツの写真ですが、以下のようなものです。



ATtiny13のモジュール

 ISP端子と3端子レギュレータと8ピンAVRとI/O端子のスペースだけしかないので、超小型とまでは行きませんが、まぁ、小さくは作れますね。これでも5ビット(PB0〜PB4)が使えますので、制御器としての用途はかなり広いと思います。TRXの電源シーケンサーなんかうってつけの用途です。



回路図(というほどのものでもない)

 上の図は回路図です。今回の用途には3ビットで十分なので引き出し信号としては3本で済ませてあります。ISPに使っている信号線も、ISPでプログラミング後はトライステートになりますので、使用可能です。PLLの3線式インターフェース(上図のI/O)に使おうと思っています。今回は一ピン分だけ、ISPと共用してみることにしました。のこり2ピンの計5ビットが制御端子として使えます。

 以上、備忘録として置いておきます。どおってことは無いのですが・・・・・・・(笑)。