世の中には多種類のボタン電池が売られていますが、SR927W、SR927SWなど微妙に型番が異なり、価格も異なるので、購入を躊躇することがあります。
まず、先頭の文字には、SR(酸化銀電池)、LR(アルカリボタン電池)、CR(リチウム電池)の3種類があり、その特徴は、
語尾の文字にはSWとWの2種類があり、(「文字無し」は水酸化カリウム溶液使用でWと同じ)
LEDライト付時計などでWを指定されている場合、SWを使うと正常に動作しなかったり、不具合を起こすことがある。逆にSW使用機器にWを使っても全く問題は無い。
更に詳しい情報は以下などを参照
・パナソニック
・マクセル
・プララ
赤外線リモコンの送信データを調べるため、PICを使ってリモコンコード解析器を作成した。リモコンのパルス幅の計測にはSMT (Signal Mesurement Timer)を使うことにした。SMT は、高度なクロックおよびゲーティングロジックを備えた24ビットカウンターで、パルス幅、周波数、デューティ サイクル、および 2つの信号のエッジ間の時間差など、さまざまなデジタル信号パラメーターを測定できる。SMT の機能は、@ 24ビットタイマー/カウンター、A 24 ビット測定キャプチャ レジスタ、B 24 ビット周期一致レジスタ、C 相対タイミング測定を含むマルチモード動作、D周期一致と取得完了で割り込む。
SMTの詳細は TB3129 (Microchip、日本語)を参照。。
SMTのブロックダイヤグラム |
赤外線受信モジュール (GP1UXC41QS) |
@ 24ビットタイマ・・・・・・・・・・・ | 単純な24ビットタイマー |
A ゲート付きタイマ・・・・・・・・・・ | ゲート信号がHighの期間のみカウント |
B 周期/デユーティサイクル計測・・・・ | Highパルス幅と周期を計測 |
C HIGH/LOW時間計測・・・・・・・・ | Highパルス幅とLowパルス幅の計測 |
D ウィンドウ付き計測・・・・・・・・・ | 窓信号の周期を計測 |
E ゲートおよびウィンドウ付き計測・・・ | 窓信号の周期間、他の信号のHigh時間をカウント |
F Tim of Flight・・・・・・・・・・・・ | 2つの入力の立上りエッジ間の時間をカウント |
G 24ビットキャプチャー・・・・・・・・ | 立上りと立下がりの間の差を計測 |
H 24ビットカウンタ・・・・・・・・・・ | 単純な24ビットカウンタ |
I ゲーツ付きカウンタ・・・・・・・・・ | ゲート信号がActive間、他のパルス数をカウント |
J ウィンドウ付きカウンタ・・・・・・・ | 窓信号がActive間、他のパルス数をカウント |
今回は、HIGHパルスとLOWパルスの両方のパルス幅を測定したいので、「HIGH/LOW時間計測モード」を使用することにした。
HIGH/LOW時間計測モードは、入力信号の立ち上がりエッジで SMTxTMR のインクリメントを開始し、その値で SMTxCPWレジスタを更新し、立ち下がりエッジで SMTxTMRをリセットして、再びインクリメントを開始する。別の立ち上がりエッジを観測すると、SMTxCPRレジスタを現在の値で更新し、SMTxTMR値をもう一度リセットして、再びインクリメントを開始する。
HIGH/LOW時間計測モード |
解析器のプログラム作成には「はじめてのPIC」さんを参考(というより、ほぼそのまま)にさせていただいた。MCCの設定、プログラムの詳細などはオリジナルを参照のこと。なお、パソコン(windows10)端末にはテラターム(9,600bps)を用いた。
なお、オリジナルからの追加・変更点は、
【注意・問題点】
赤外線コードデータは当初32ビット変数を用いたが、何故か32ビット変数のシフトが正しく機能せず、メモリも少ないことから、8ビット単位で求めることにした。
値が0の1バイト(ird)と、LSBのみが1のシフトバイト(sbt)を準備し、赤外線データビットが’1’ならirdにsbtを加算し、その後sbtを左に1ビットシフトし、同じように赤外線データの8ビット分を取り込むと、1バイトの16進データとしてパソコンに送信し、これを繰り返している。
IOデータのリモコンコードは、カスタマコードの2バイト、データコードの2バイトのフレームを送信し、続けて43ms後に、更に次のフレームデータを送り、併せて16ビットのデータとしている。
<ボタン’3’を押したとき>
80H、E8H、84H、7BH, − 80H、E8H、30H、CFH (フレームの4バイト目は3バイト目のビット反転データ)
【プログラム(abc855_main.c)】 赤字はオリジナル(初めてのPIC)に追加・変更したところ。
|
★★★リコモンコードで「前チャンネル」が抜けていました
※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。