単体で動くシステムやプログラムはそれはそれで面白いのですが、他のシステムなどの通信して連携して動くシステムやプログラムは、応用範囲が広がると共に、作っていてもわくわくしますよね。
PIC-DEV-690RLには、DSUB9のメスコネクタにRS232Cの信号が接続されています。PCとは、両端にDSUB9のメスとオスのコネクタが付いたストレートケーブルで接続できます。
ここでは、PIC-DEV-690RLに搭載されているRS232Cインターフェースを利用して、PCなどから送られてきた文字をエコーバックする簡単なスケッチを紹介します。
このスケッチは、以下のボードでもそのまま動きます。(MPLABプロジェクトのデバイス設定や、ボードを指定するマクロ定義などはそれぞれに合わせた変更が必要です)
#include "picsys16.h" void setup() { pinMode(LED1, OUTPUT) ; pinMode(LED2, OUTPUT) ; Serial_begin(9600) ; // RS232Cを9600ボーでオープン } void loop() { int c ; if (Serial_available()) { // RS232Cの受信データがあるか? c = Serial_getc() ; // 1文字取得 while (Serial_busy()) // RS232Cの送信は可能か? ; Serial_putc(c) ; // 1文字送信 if (c == '\r') { // 文字がキャリッジリーターンの場合 while (Serial_busy()) ; Serial_putc('\n') ; // 追加で改行文字も送る } digitalWrite(LED2, !digitalRead(LED2)) ; // 1文字の処理ごとに点滅 } digitalWrite(LED1, ((int)millis()) & 0x200) ; // ハートビート }
PIC-DEV-690RLを評価ボードとして、PIC16F690のプログラム例を紹介します。
このページのプログラムはPIC-DEV-690RLでもPIC-DEV-690Rでもそのまま動きます。
単体で動くシステムやプログラムはそれはそれで面白いのですが、他のシステムなどの通信して連携して動くシステムやプログラムは、応用範囲が広がると共に、作っていてもわくわくしますよね。ここでは、PICのUSARTを利用したPCとの通信処理プログラムを紹介します。
PIC-DEV-690RLには、PCと同様に、DSUB9のメスコネクタにRS232Cの信号が接続されています。PCとは、両端にDSUB9のメスとオスのコネクタが付いたストレートケーブルで接続できます。
PCの入力をエコーバックするプログラム
このプログラムでは、19.2Kのボーレートで、PCと通信が出来ます。ボーレートの設定は、OpenUSARTの2つ目の引数の25という値で行っています。クロックが8MHzに設定されているときに、ボーレートの指定値として25を設定すると、19.2Kのボーレートを得ることが出来ます。MCUのクロックと希望するボーレートからOpenUSARTで指定する値の関係は、PIC16F690のデータシートに式や表が示されています。
上記のプログラムでは、2重のforループの内側の最初の部分で、DataRdyUSART()によってUSARTにデータが受信されているかどうかを確認しています。この方式では、データが得られるまで他の処理は一切出来ないことになり、MCUの性能がもったいなかったり、他の処理が出来ないということで機能的な問題が生じたりします。ここでは、データがまだ受信されていない場合には単にそれを待つのではなく、他の処理を行ってMCUの性能をうまく利用する簡単な方法を示します。
アイドル時のLED点灯処理を追加
プログラムの変更は簡単なものです。DataRdyUSART()をwhileループで延々と繰り返し、データが到着するまで「執念」で待っていたところを、一回確認してデータが届いていなければさっさとあきらめ、他の仕事をして、その後にまだデータの到着を確認するというものです。
変更を加えたプログラムでは、if文でデータの受信を確認し、なければelse節に追加されたSWとLEDの処理を行うというものです。プログラムをこのように変更すると、データをただ待ち続けるのではなく、データがなければ他の処理で有効に時間を活用することが出来るようになります。
while文による徹底的な条件確認待ちは、データを送信する場合にもBusyUSART()を利用して行われています。ここも原理的には時間待ちの問題が生じるのですが、現実にはそれなりの速度でデータを送出できるため、待ち時間による問題が致命的にはなりません。
このような処理方式では、データが届いていない場合に実行する処理が重いものだと、データの到着に迅速に対応することが出来なくなり、受信データを取りこぼすようになる可能性が生じるので、その点に関する注意は必要です。
上記のプログラムと同等の機能を、ライブラリを使わず、SFRを直接操作した例を以下に示します。
SFRを直接操作したプログラム(初期化等)
init_io()の処理は、LESSON1.1に示した初期化処理を関数化したもので、内蔵発信器と入出力ポートの初期化を行っています。init_usart()は、USARTの初期化処理を行うもので、SPBRGにはボーレートを指定するための値を設定します。TXSTAには、送信機能に関する設定を、RCSTAには受信に関する設定を行います。
SFRを直接操作したプログラム(main関数)