マイコン端子に入出力 3
前回はSFRの使い方について概観し、入出力が出来るようになったと仮定して、マイコン端子で入出力する(出来る)信号にはどのようなものがあるのか、私の経験から紹介したいと思います。
またしても SFR 頻出ですが、この記事では具体的なレジスタ名や値を扱わず、ぼんやり概観を試みます。
(具体例としては「PIC18F SFR設定」を参照してみてください。)
タイマー割り込み
その前にタイマー割り込みについて説明します。
信号を作る際に欠かせないのがイベントタイマーです。
ほとんどの信号の構成要素として、High/Lowと言った電圧の他に、タイミングや時間定数があります。この時間定数を作るのがイベントタイマーの役割です。
イベントタイマーはマイコンの内部で時間を測定します。正確には基準にする定周期信号(クロック)を数えるカウンターで、クロックとして何を選ぶかをSFRで選択し、1カウント相当の時間を決めます。
このタイマーは、例えば16bit のカウンターをインクリメント(+1)して数えます。
16bit カウンターは0から65535まで数えると、再び0に戻ります。
10本指で数える時に、10の次(11)は1と同じ指使いにするのに似ています。
この時に割り込みを発生させてマイコンの処理を中断し、予め準備した割り込み処理を行った後で元の処理を再開させることが出来ます。割り込みを有効にするかどうかもSFRで設定します。
割り込み処理の中でカウンターを初期化しますが、その値によって次の割り込みまでの時間を「予約」します。例えば65436(=65536−100)に設定すると100クロックカウント後に再び割り込みが発生します。
この場合、クロック周期を 1usec に設定していれば、100usec 後に割り込みが発生します。
イベントタイマーはタイトル画像のSFRに含まれます。
割り込みに伴うプログラムの実行制御機能は、シリーズ最初の記事に書いたようにタイトル図のAccの中に含まれるものとしています。
(かなり思い切った説明ではありますが・・・)
以下の説明では、このようにして作ったものをタイマー割り込みと書きます。
シリアル通信
ワンチップマイコンの機能を使って、UART、SPI、I2C、1Wire と言ったシリアル通信を行います。使用するにはボーレートなどSFRで設定する項目があります。(残念ながら初学者には難解な部類に入ります。)
マイコンの場合、1byteづつしか送信レジスタ(これもSFR)に送れないものが多く、送信完了割り込みやタイマー割り込みを受けて次々と送信レジスタに書き込んで送信するように割り込み処理を記述します。
受信については受信完了割り込みを受けて速やかに受信レジスタ(SFR)から読み出します。読み出す前に次の 1byte が着信してしまうとデータ欠落の原因になり得ます。
この点、PCやRaspberry Pi 等はOSに送受信バッファを備えていて、長いデータでも「これを送れ」と指示したり、「受信済の一行丸毎知らせ」と指示出来るので格段に楽です。
センサーや外付けメモリーの読み書き、PCとの間でコマンド/レスポンス送受信と言った用途に使います。
矩形波 PWM RCサーボ信号
タイマー割り込みによってHigh/Lowと交互に出力することで矩形波を作ることが出来ます。High期間とLow期間のタイマー設定値の組み合わせでデューティー比を変えることも出来ます。(実施例: PIC18F タイマー1個でRCサーボ信号x4)
設定すれば割り込み処理不要で、ハードウェアが自動で矩形波を送り続ける機能を持っているマイコンもあります。
PWMやRCサーボ、ブザーや超音波センサの駆動が実例です。
製品の他にも耐久試験などの実験用に信号を作ってモーターやソレノイドと言ったアクチュエーターを制御したり、測定対象のデジタル信号を観察したりと言った用途にも使います。
一定間隔で信号をサンプリングする場合はタイマー割り込みですが、測定対象のデジタル信号の変化に応じて素早く動作を変える場合は、測定対象のデジタル信号の変化によってマイコンに割り込みを発生させる場合もあります。
パラレルI/F
ステッピングモーターや小型のLCD、MUX(マルチプレクサ)の信号選択では複数のデジタル信号を一組にして(同時に)扱います。複数一組の信号は数値を表現することが多く、ポートの 0bit 目から必要数割り付けるとプログラミングが楽になります。(例: PA0~PA3)
ESP32やRaspberry Pi のGPIOは1本ずつ扱うので、複数の信号変化が非同期になるなど、アプリケーションによっては工夫あるいは妥協が必要になるかも知れません。
ADC DAC
アナログ信号を扱う場合は、A/Dコンバーター、D/Aコンバーターを使います。
ヴォリュームやアナログセンサからのデータ入力、音圧の測定や制御、電流出力制御などに使った経験があります。
多くの場合、アナログ信号にはオペアンプ等の外付け回路が必要です。
温度や電流電圧などのセンサーはI2Cなどシリアル通信でデータを取得出来るものの方が精度も高く、外付け部品も少なくて扱いやすいと思います。
信号周波数による限界
PIC18Fの私の経験では 40kHz 位から厳しくなると感じています。
40kHz付近で周波数を振って超音波センサを駆動し、周波数毎に(マイクで拾った)音圧の相対レベルを測定し、結果をPCに送信するツールを製作して活用しています。
矩形波を作るだけなら 100kHz も可能そうですが、作るだけと言うことはほとんどなくて、同時にシリアル通信でコマンド/レスポンスのやり取りをすると言った機能が必要な場合がほとんどです。
用途やマイコンの性能によって限界が違うと思いますが、マイコンで対応出来ない周波数や応答速度、タイミングの許容誤差の場合はFPGAやCPLDを検討することになりそうです。
(私の場合、どなたかにお願いせざるを得ないレベルです。)
以上、何らか参考になれば幸いです。
追伸
定番のタイマー割り込み
「おまけ」ですが、私の定番とも言えるタイマー割り込みについて紹介します。
マイコンのタイマーは数に限りがあり、PIC18F23K22の場合、8bit タイマーが3個、 16bit タイマーが4個です。
不足と感じた経験はありませんが・・・各々持ち味があって、数だけの問題ではありません。
私の場合、キースイッチやLEDインジケーター等のマン・マシン・インタフェース用に一つのタイマー(Timer0)を兼用しています。
「マン・マシンI/Fの様な低速で精度も要求されない用途」に複数のタイマーを使うのは、もったいないと思います。
余っているなら自由に使える一方、定番化することで無駄な試行錯誤を省き、個々の持ち味を生かした適材温存も重要だと考えています。
具体的には50msec タイマーを作って、さらに割り込みをカウントすることで、以下3つの用途に使っています。
1.操作釦のキースキャン 50msec (チャタリング防止を兼ねます)
2.LEDの点滅制御 100msec (0.1秒点灯0.7秒滅灯など)
3.汎用 1sec (長周期定間隔イベント 例:1秒間隔でステータス通知)
これってハードウェア寄りの話?
私自身はソフトの話をしているつもりでしたが、お寄せいただいたコメントから「この記事はハードウェア寄りの話だったんだ」と気付かされました。
コメントありがとうございます。
マイコン基板だけでシステムが完結する場合もありますが、マイコン用のソフトウェア(ファームウェア)はシステムの末端を制御するものが多く、ハードウェアに密着したものになります。
とりわけSFRはハードとソフトの接点と言えそうです。
それ故に初めは難解なものだと感じると思います。
一方で、無駄なく設計されたハードウェアを直接動かす仕組みなので、理解してしまえば他のワンチップマイコンも理解し易く、応用出来る知識になります。
このシリーズでも何度か書いていますが、初めは誰かが書いたソースを使わせてもらうなどして、まずはやりたいことを実現し、その後に少しづつSFR設定に馴染むのが良いように思います。
出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。