Attiny2313(以下2313)マイコンはRISKマイコンすなわち、1命令を1クロックサイクルで実行するということになっている。そのためカウンタ(和演算)は1/2クロックまでできるはずであるが、余裕をみて1/4クロックとすることにする。クロックは12.8MHzのクリスタルが安価で手に入りやすい。2313の20MHz版では20MHzを超えても動作するであろうが。

2313単体での計測上限周波数を3MHzと規定したので、実測したい周波数をプリスケーラを使って分周することにする。プリスケーラは専用LSIではなく安価な汎用ロジック74HVC4040、12ステージのバイナリカウンタを使う。これにより2から4096まで適当な2進の分周がとれるし、上限周波数は200MHzをこえる。実測周波数は上限は180MHzもあれば十分なので180/3で64分周とする。分周数が10進数に関係なくてもソフト側で補正してしまうのがマイコンの良いところ。

2313には2個のタイマー、カウンターが組み込まれている。このうち1個の8ビットカウンターでクロックを分周する。12.8MHz/256=50KHz すなわち0.00002秒を基準ゲートタイム、すなわちこのゲートが開いている時間のパルスをカウントして表示することになる。ゲートタイムが短ければ精度は悪くなるし、長いとマッタリしてしまう。目の残像や見た感じから50Hz 0.02秒くらいが限度か。結論として基準ゲートタイムを1066倍に伸ばしている。

2個目のカウンターでパルスカウントする。ゲートタイム中のパルスをかぞえる16ビットのカウンターで65536、元の計測周波数にすると209MHzまでカウントできる。ソフト内ではオーバーフローしても良いように処理してあるので、他の分周を選んでもカウントミスは起こらない。

さて帳尻あわせ。プリスケーラの分周を64、ゲートタイムを0.02133秒 46.875Hzにすると表示データを実測周波数に合わせるためには64×46.875=3000をかければ良い。実質的にはKHzまでのデータで良いので補正値は3となる。小数点位置はLCDへのフォーマットで決められる。表示形式は○○○.○○○MHzで良いだろう。
ここで補正値を整数にしたのには意味がある。実数の掛け算になるとコンパイルしたときにプログラムの長さが長大になるだけでなくプログラムループの中での実数演算の時間がバカにならずカウント誤差が大きくなるため演算は極力整数で行いたい。基準ゲートタイムが1066と半端なのはそのためである。また、この1066を増減することでプログラムループによる誤差を修正せする。なんともアナログ的であるが。

ソフトを流れに沿って説明していこう。 program1 先ずはお約束の先頭のREM文、使ったマイコンの形式、クロック周波数、プリスケーラの分周比、カウンタ、タイマーの使い道、そして忘れずにヒューズビットの設定値をメモしておく。実際の動作には必要ないが、後々メンテするときには大いに役立つ。

次に変数の定義。表示データは数値変数のままLCDへ送っても表示するが、ここでは固定小数点で表示したいのであえて文字列とした。

次にポートの入出力とカウンタ、タイマーの設定。パルスカウントを担当するカウンタ、タイマー1の入力はDポート5番(9ピン)に決められている。

2つのカウンタ、タイマーは0またはオーバーフローで割り込みを発生するので割り込み処理先の設定を行う。

各割り込み、カウンタ、タイマーの許可、初期値の設定を行う。

LCDを初期化し、スタートメッセージ、カウンター、タイマーをスタートしメインループに入る。
program2 メインループではゲートタイムがタイムアップしたかを判断、タイムアップしていたらカウンタ、タイマー1のオーバーフロー処理と補正値の掛け算をして表示値を計算、文字列変換してLCDへ送る。
各変数を初期化してカウンタ、タイマーを再スタート。これだけ。

割り込み処理ではカウンタ、タイマー1のオーバーフロー回数を計測、そしてゲートタイムのカウンタ、タイマー0が0になったら1066から1づつ引き算をし0になったらフラグをたてカウンタ、タイマーをストップする。この状態でメインループに戻れば表示値の計算処理等が行われる。 以上コンパイルして書き込むと、メモリ70%くらいの使用量となった。応用としては局発のオフセットを行ったり、逓倍数を掛け合わせたりは非常にカンタン。
カウンター編へ GDMhard編へ
ホームページへ戻る 管理人室へ戻ります。