2017年1月14日土曜日

TWE-LiteのInfra-Red Transmitter

 TWE-Liteには赤外線リモコン信号を送信するための機能が用意されているのですが、使用例を見たことが無いので、考え方をメモっておきます。

 副搬送波の周期とデューティー比、データビットを構成する微小ビットの長さ等、タイマーの設定に関係するパラメータは、bAHI_InfraredEnable()で設定します。
bool_t bAHI_InfraredEnable(
uint8 u8Prescale,
uint16 u16Hi,
uint16 u16Lo,
uint16 u16BitPeriodInCarrierPeriods,
bool_t bInvertOutput,
bool_t bInterruptEnable);
  • u8Prescale 赤外線送信で使うTIMER2の分周比を指定します。Users Guideの例では2(=1/4)を指定していますが、16MHzの16ビットタイマーのまま分周しなくても無理なく使えますので、0で良いと思います。
  • u16Hi 副搬送波1周期のうちの非アクティブ時間をタイマーのクロック数で指定します。
  • u16Lo 副搬送波の周期をタイマーのクロック数で指定します。
  • u16BitPeriodInCarrierPeriods データビットを構成する微小ビットの長さを、副搬送波の周期(CarrierPeriod)で割った個数で指定します。
  • bInvertOutput 出力のHi/Loを反転する場合にTRUEを指定します。
  • bInterruptEnable 送信完了割り込みを発生させる場合にTRUEを指定します。
bAHI_InfraredEnable()で設定できる構造は微小ビットまでで、データビットの1/0やリーダーコード等は全て、u16BitPeriodInCarrierPeriodsで指定した個数の副搬送波を単位とする微小ビットの1/0の集まりとして表現します。例えば、下の図に示したNEC方式における'0'データビットは、微小ビットでは'10'という2ビットのデータで表現します。

 赤外線コマンドの送信は、bAHI_InfraredStart()で行います。
bool_t bAHI_InfraredStart(
uint32 *pu32BufferAddress,
uint16 u16TransmissionLengthInBits);
  • pu32BufferAddress 微小ビットの連続で表現したフレーム構造をビッグエンディアンで指定します。
  • u16TransmissionLengthInBits pu32BufferAddressに含まれる有効な微小ビット数を指定します。
pu32BufferAddress の先頭はリーダーコードで始まります。NEC方式では、0xffff0000(の上位24ビット)になります。リーダーコードの後は、データビットの0/1をそれぞれ2進数の'10'および'1000'としてエンコードして、ストップビットの'1'を追加し、最後にフレーム間を'0'で埋めます。

 上の例は、我が家の日立製テレビの電源コマンドで、フォーマットはNEC方式、カスタマーコードは0x50,0xaf, コマンドデータは0x17です(リトルエンディアン)。これを、bAHI_InfraredStart()用にエンコードすると、パラメータは、
pu32BufferAddress = {0xffff00aa, 0x8a28888a, 0x28888a2a, 0xaa288880, 0x00000000, 0x00000000}
u16TransmissionLengthInBits = 192
 となります。
2進数表現にすると、ON/OFFの様子が視覚的にわかります。
 11111111111111110000000010101010
 10001010001010001000100010001010
 00101000100010001000101000101010
 10101010001010001000100010000000
 00000000000000000000000000000000
 00000000000000000000000000000000

 複数のフレームを送信する場合は、
  • pu32BufferAddress に複数のフレームをエンコードして一気に送信する。
  • vAHI_InfraredRegisterCallback()で送信完了ハンドラを指定し、ハンドラの中で次のフレーム送信を行う。
のいずれかの方法になると思います。送信完了ハンドラを使用する場合は、オーバーヘッドを考えてu16TransmissionLengthInBitsを若干減らしたほうが良いかもしれません。

参考資料

0 件のコメント:

コメントを投稿