Darkside(リンクエラー修正しました)

2018年11月03日の記事

2018年11月3日(土) 20:01

シリアル通信

 まずは、サブPICを完成させよう。

 サブPICは、キー状態(+バッテリー電圧)をメインPICにシリアル通信で伝送するだけの役割である。これにより、ゲームパッドの数多いキーすべてを、ラジコンで使用することが可能となる。シリアル通信とは、多ビットの情報を1ビット情報の繰り返しで通信すること。それには「繰り返しタイミング」と「送信開始タイミング」の2つの情報が必要なる。
 例えば10個のデジタルキーの状態だと、1個の状態1ビットを10回繰り返して送信する。その1ビットごとの区切りが分からなければ、受信側で再生できない。また、どれが先頭のデーターであるか分からなければ再生できないのも当然だ。キー状態は通常、毎秒数十回という頻度で読み取る。各回の読み取りで、先頭のデーターを認識せねばならない。

 こうしてオーソドックスなシリアル通信では、「ビット区切り」「先頭通知」「データー本体」という3本の信号線が必要になる。これがSPIだ。
 ただ、信号線は貴重なリソースであり、本数を減らすことには大きな意義がある。「ビット区切り」はまだしも、「先頭通知」だけのために独立した1本の信号線を使用するのは、いかにももったいない。そこで、信号の仕様を工夫し、「ビット区切り」と「先頭通知」を区別できるようにしたうえで、信号線1本だけで両方を通知できるようにしたのが、I2CやUSARTということになる。
 これらは2本の信号線だけで通信可能だが、代償として信号仕様が複雑化する。そのため、SPIに比べると低速になる。また、送受信の両方をソフトで行うのは難しく、マイコン内蔵ペリフェラルに頼らざるを得ない。PICではソフトウェアI2Cが効果を発揮しているが、あくまでマスター側だけだ。

 SPIならば送受信の両方をソフトで実装することが容易であり、するとピンアサインを自由に割り当てできる。PIC内蔵ペリフェラルのピン割り当てで悩む必要が無い。内蔵ペリフェラルの設定や仕様を調べる必要も無い。
 今回サブPICからメインPICにキー状態をシリアル通信するのも、ソフトウェアSPIで行う。

 ただ、メインPICはともかく送信側のサブPICは、ピン状態変化割り込みを使用するのが簡単そうだ。工夫して割り込み使用を回避するつもりだったが、USARTのRXを割り込みで行うことが想定以上に簡単かつ鮮やかに成功したので、やる気が出た。

 サブPICは、ひたすらキーの状態を読む。統合されているキーはアナログ値を元にキーを分離し、分離後のキー状態をメモリーに格納する。そして、ひたすら無限ループで繰り返す。
 一方でサブPICのSPI配線には状態変化割り込みを設定し、「ビット区切り」信号の立ち上がりで割り込みが発生するようにする。そのハンドラ中で、「メモリーに格納されている最新のキー状態」を1ビット送信する。「先頭通知」信号の立ち上がりで発生した割り込みで、「次に送信するビット」を先頭にリセットする。

 キーの状態を完全分離して認識することは、正常にできた。16個並んだ0が、対応するキー操作によって的確に1に変わるのを確認すると楽しい。大量のキー入力が使えるラジコン送信機の完成が近付いている。
 だが、メインPICで受信すると1ビットずれている。

written by higashino [バトルタンク改造Tiger1] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL
Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4