第3章 システム・クロック切り替えの応用
5.3 リモコン受信
5.3.2 PWM出力とフリーランニングによるリモコン受信
⑥ パルス幅計測中のタイム・アウト
パルス幅計測中に16ビット・タイマ/イベント・カウンタのOVF0をメイン・プログラムでテストし,2回 検出したときはタイム・アウトとしデータは無効とします。
また,この例では16ビット・タイマ/イベント・カウンタをPWM出力モードで動作させていますので,5.2 PWM出力のプログラムをリンクすることにより,リモコン受信とPWM出力を同時に行うことができます。
(1)パッケージの説明
<パブリック宣言シンボル>
TIM̲PRO :タイマ・オーバフロー処理のサブルーチン名称 RMDATA :リモコン受信データを格納
RPT :リピート有効期間判断フラグ IPDTFG :有効データの有無判断フラグ RMDTOK :入力信号の有効の有無判断フラグ RMDTSET :入力信号の有無判断フラグ
OVSENS :INTP0処理タイマ・オーバフロー検出フラグ
<使用するレジスタ>
バンク0 :AX,BC,HL
<使用するRAM>
名 称 RPTCT RMENDCT SELMOD LD̲CT RMDATA TO̲CNT CR01̲NP CR01̲OP WORKP
用 途 リピート・コード有効時間カウンタ データ入力後の無入力時間カウンタ モード選択
リーダ信号検出カウンタ 有効データ格納エリア
タイマ・オーバフロー検出カウンタ 最新タイマ・カウント値格納エリア 前回タイマ・カウント値格納エリア 入力信号格納エリア
属 性 SADDR
SADDRP
バイト 1
2
4
<使用するフラグ>
名 称 IPDTFG RMDTOK RMDTSET RPT TO̲FLG OVSENS
用 途 有効データの有無
有効な入力信号の有無 入力信号の有無
リピート有効期間が経過したかどうかの判断 タイマ・オーバフローあり
INTP0処理でタイマ・オーバフロー検出
<ネスティング>
5レベル11バイト
<使用するハードウエア>
●16ビット・タイマ/イベント・カウンタ
●P00/TI00/INTP0
●P30/TO0
<初期設定>
●OSMS=#00000001B 発振モード選択レジスタ 分周回路を使用しない
●16ビット・タイマ/イベント・カウンタの設定
CRC0=#00000100B CR00, CR01の動作モード選択 TMC0=#00000010B PWM出力モード
TCL0=#00100000B PWM基本周期61.0μs TOC0=#00000011B ロウ・アクティブ出力
●PM30=0 P30出力モード
●SCS=#00000011B INTP0サンプリング・クロックfXX/26
●PPR0=0 INTP0高優先順位割り込み
●PMK0=0 INTP0割り込み許可
●カスタム・コードをCSTMに定義し,パブリック宣言
●RAMクリア
<起動方法>
●16ビット・タイマ/イベント・カウンタのOVF0をテストし,OVF0のセットのときは,サブルーチン TIM̲PROをコールしてください。
●リモコン信号のエッジ検出による割り込み要求で起動
(2)使 用 例
(3)SPDチャート
IF:入力信号あり TIM̲PRO
THEN
IF:有効データあり THEN
IF:リピート・コード無効時間 THEN
リピート・コード無効状態に設定 RPT,IPDTFG,RMDTOKクリア ELSE
IF:データ入力終了後(61.0μs×2以内)に入力なし THEN
有効データありに設定 RMDTOK,RMDTSETセット
リーダ・ロウ検出モードに設定 S̲M0SET ELSE
タイマ・オーバフローのチェック TO̲CHK
IF:リード・ロウ検出モード TO̲CHK
THEN
タイマ・オーバフローなしに設定 ELSE
タイマ・オーバフロー・カウント IF:タイマ・オーバフロー2回 THEN
リーダ・ロウ検出モードに設定 S̲M0SET
レジスタ・バンク0を選択 100μsウエイト WAIT CASE:SELMOD INTP0
OF:0
リーダ・ロウ検出モード RM̲STA リーダ・ロウ計測モード LEAD̲L リーダ・ハイ計測モード LEAD̲H
カスタム・コード/データ取り込みモード CDCODE リピート・コード検出モード REPCD
異常データ検出モード ENDCHK OF:1
OF:2 OF:3 OF:4 OF:5
タイマ・オーバフローのチェック TO̲CHK
IF:P00 = LOW RM̲STA
THEN
100μsウエイト WAIT IF:P00 = LOW THEN
キャプチャ・レジスタのデータをメモリに格納 リーダ・ロウ計測モード1を選択
INTP0立ち上がりエッジ検出モードに設定
IF:P00 = HIGH LEAD̲L
THEN
100μsウエイト WAIT IF:P00 = HIGH THEN
タイマ読み出し PW̲CT
IF:3 ms ≦ リーダ・ロウ ≦ 10 ms THEN
リーダ・ハイ検出モードを選択
INTP0立ち下がりエッジ検出モードに設定 リーダ・ロウ検出モードに設定 S̲M0SET ELSE
IF:P00 = LOW LEAD̲H
THEN
100μsウエイト WAIT IF:P00 = LOW THEN
タイマ読み出し PW̲CT IF:2 ms ≦ リーダ・ハイ ≦ 5 ms
THEN
カスタム・コード/データ取り込みモードを選択 データ格納用エリアのイニシャライズ
リピート検出モードを選択
INTP0立ち上がりエッジ検出モードに設定 ELSE
THEN
IF:リーダ・ハイ ≧ 3 ms
ELSE
リーダ・ロウ検出モードに設定 S̲M0SET
IF:P00 = LOW CDCODE
THEN
100μsウエイト WAIT IF:P00 = LOW THEN
IF:0.5 ms < 入力データ ≦ 2.5 ms THEN
IF:入力データ ≧ 1.8 ms THEN
CYセット ELSE
CYクリア
データ格納エリアにCYを格納 IF:データ入力32ビット終了 THEN
IF:カスタム・コード一致 THEN
IF:カスタム/データ・コードの反転データ一致 THEN
データ・コードを格納 入力データありの状態に設定
IPDTFGセット,RMDTSET,RPT,
RMDTOKクリア
異常データ検出モードに設定 S̲M5SET ELSE
リーダ・ロウ検出モードに設定 S̲M0SET ELSE
リーダ・ロウ検出モードに設定 S̲M0SET ELSE
リーダ・ロウ検出モードに設定 S̲M0SET
IF:P00 = HIGH REPCD
THEN
100μsウエイト WAIT IF:P00 = HIGH THEN
IF:有効データあり THEN
タイマ読み出し PW̲CT IF:リピート・コード ≦ 1 ms THEN
リピート・コード有効状態に設定 RPTセット
データ入力終了状態に設定
異常データ検出モードに設定 S̲M5SET ELSE
リーダ・ロウ検出モードに設定 S̲M0SET ELSE
異常データ検出モードに設定 S̲M5SET タイマ読み出し CR̲READ
IF:P00 = LOW ENDCHK
THEN
100μsウエイト WAIT IF:P00 = LOW THEN
入力信号を無効状態に設定 IPDTFG,RPTクリア
リーダ・ロウ検出モードに設定 S̲M0SET
リーダ・ロウ検出モードを選択 TO̲FLGクリア
INTP0立ち下がりエッジ検出モードに設定 S̲M0SET
異常データ検出モードを選択 リピート有効時間用のカウンタを設定 S̲M5SET
IF:エッジ検出処理後にOVF発生 PW̲CT
THEN
IF:OVF発生 < 割り込み受付処理時間以上(65クロック)
THEN
タイマ・オーバフローありに設定 キャプチャ・レジスタ値の取り込み キャプチャ・レジスタ値を前回の値から減算 IF:減算結果にボロー発生(CY = 1)
THEN
IF:タイマ・オーバフローあり(TO̲FLG = 1)
THEN ELSE
IF:タイマ・オーバフローあり(TO̲FLG = 1)
THEN
CYフラグ・クリア
CYフラグ・セット
キャプチャ・レジスタ値をメモリに格納
(4)プログラム・リスト