信号測定タイマー Signal Measurement Timer(SMT)は、高度なクロックとゲート制御ロジックを備えた24ビットカウンターであり、パルス幅、周波数、デューティサイクル、2つの信号のエッジ間の時間差などのさまざまなデジタル信号パラメーターを測定するように構成できます。
SMTの機能は次のとおりです。
*注意*
2つのSMTモジュールを実装しているデバイスは、SMTxは、SMT1およびSMT2に適用されます。
図29-1:SMTブロック図
モジュールの中核は、複雑なデータ収集フロントエンドと組み合わされた24ビットカウンターSMTxTMRです。選択した動作モードに応じて、SMTは表29-1に要約されているさまざまな測定を実行できます。
SMTで使用できるクロックソースは次のとおりです。
SMTクロックソースは、SMTxCLKレジスタのCSEL <2:0>ビットを設定することによって選択されます。クロックソースは、SMTxCON0レジスタのPS <1:0>ビットを使用してプリスケールすることもできます。事前にスケーリングされたクロックソースは、カウンタとモジュールで使用される同期ロジックの両方をクロックするために使用されます。
他のタイマーと同様に、SMTxTMRが「0」にロールオーバーすると、SMTは割り込みをトリガーします。これは、モードに関係なく、SMTxTMR = SMTxPR の場合に発生します。したがって、外部信号またはウィンドウに依存してタイマーをリセットするモードでは、適切な動作を行うには、SMTxPR を予想される信号またはウィンドウよりも長い周期に設定する必要があります。
SMTxTMR タイムベースと SMTxCPW / SMTxPR / SMTxCPR バッファレジスタを中心に機能を果たします。また、これらはソフトウェアから手動で更新できます。
SMTxTMRは、SMTの中心である24ビットカウンターです。これは、SMTの各モードで測定するための基本的なカウンター/タイマーとして使用されます。
SMTxSTATレジスタのRSTビットをセットすることにより、24'h00_0000の値にリセットできます。ソフトウェアへの書き込みとソフトウェアからの読み取りは可能ですが、24ビット同時にはアクセスできないため、SMTxTMRへの読み取りと書き込みは、GO = 0の場合にのみ行う必要があります。または、ソフトウェアにSMTxTMR読み取りの整合性を確保するための他の手段を講じる必要があります。
SMTxCPWレジスタは、24ビットのSMT Pulse Width Latchです。このレジスターはは、現在のSMTモードによって決定される信号によってトリガーされ SMTxTMR の値をラッチします。
SMTxSTAT レジスタの CPWUP ビットをセットすることで、SMTxCPWレジスタを、SMTxTMR の現在値に更新することもできます。
SMTxCPRレジスタは、24ビットのSMT Period Latch です。このレジスターはは、現在のSMTモードによって決定される信号によってトリガーされ SMTxTMR の値をラッチします。
SMTxSTATレジスタのCPRUPビットをセットすることにより、SMTxCPRレジスタを、SMTxTMR値の現在値に更新することもできます。
SMTxCON0レジスタのSTPビットを使用して、カウンタがロールオーバーするのを防ぐことができます。
停止が有効になっている場合、周期一致割り込みは、SMTxTMR がリセットされるまで(手動リセット、「2.1 タイムベース」のいずれかによって)、またはSMTxCON1レジスタのSMTxGOビットをクリアしてソフトウェアにSMTxTMR値を書き込むまで持続します。
SMTの3つの入力信号に対して、ハイ/ポジティブエッジでアクティブとするか、またはロー/ネガティブエッジ信号でアクティブとするか決定する極性制御があります。
次のSMTxCON0レジスタビットで極性を制御します。
SMTは、入力信号の極性を処理していない、ユーザーに入力ステータス情報を提供します。
ウィンドウステータスは、SMTxSTATレジスタのWSビットによって決定されます。このビットは、ウィンドウ測定、ゲートカウンター、およびゲートウィンドウ測定モードでのみ使用され、TS = 1の場合にのみ有効であり、非カウンターモードではシンクロナイザーの遅延によって時間的に遅延します。
シグナルステータスは、SMTxSTATレジスタのASビットによって決定されます。このビットは、ウィンドウ測定、飛行時間、キャプチャモードを除くすべてのモードで使用され、TS = 1の場合にのみ有効であり、非カウンタモードではシンクロナイザの遅延によって時間的に遅延します。
タイマーの実行ステータスは、SMTxSTATレジスタのTSビットによって決定され、非カウンタモードではシンクロナイザの遅延によって時間的に遅延します。
動作モードは表29-1にまとめられています。次のセクションでは、詳細な説明、モードの使用方法の例を示します。すべての波形は WPOL/SPOL/CPOL = 0を想定しています。WPOL/ SPOL/CPOL = 1の場合、すべてのSMTSIGx、SMTWINx、およびSMTクロック信号の極性は示されているものと反対になります。
すべてのモードで、REPEATビットは収集を繰り返すか単一にするかを制御します。REPEAT = 0(シングルアクイジションモード)の場合、タイマーはインクリメントを停止し、アクイジションの完了時にSMTxGOビットがリセットされます。それ以外の場合、タイマーは継続し、ソフトウェアでタイマーが停止するまで、継続的な取得で前の取得を上書きできます。
表29-1:動作モード
MODE | 動作モード | 同期動作 |
---|---|---|
0000 | Timer | Yes |
0001 | Gated Timer | Yes |
0010 | Period and Duty Cycle Acquisition | Yes |
0011 | High and Low Time Measurement | Yes |
0100 | Windowed Measurement | Yes |
0101 | Gated Windowed Measurement | Yes |
0110 | Time of Flight | Yes |
0111 | Capture | Yes |
1000 | Counter | No |
1001 | Gated Counter | No |
1010 | Windowed Counter | No |
1011 - 1111 |
タイマーモードは、SMTxTMRが16/24ビットタイマーとして使用される最も単純な動作モードです。このモードでは、データ収集は行われません。SMTxGOビットがソフトウェアによってセットされている限り、タイマーはインクリメントします。SMTウィンドウまたはSMTシグナルイベントはSMTxGOビットに影響を与えません。すべてがSMTクロックソースに同期されます。タイマーで周期一致が発生すると(SMTxTMR = SMTxPR)、SMTxTMRがリセットされ、周期一致割り込みがトリップします。
ゲートタイマーモードは、SMTSIGx入力を使用して、SMTxTMRがインクリメントするかどうかを制御します。外部信号の立ち下がりエッジで、SMTxCPWレジスタはSMTxTMRの現在の値に更新されます。繰り返し取得と単一取得の両方の波形例を図29-4と図29-5に示します。
デューティサイクルモードでは、SMTx_signalのデューティサイクルまたは周期(極性に応じて)のいずれかをSMTクロックに対して取得できます。CPWレジスタは信号の立ち下がりエッジで更新され、CPRレジスタは信号の立ち上がりエッジで更新され、SMTxTMRは0x0001にリセットされます。さらに、SMTがシングルアクイジションモードの場合、SMTxGOビットは立ち上がりエッジでリセットされます。図29-6および図29-7を参照してください。
図29-6:周期とデューティサイクルの繰り返し取得モードのタイミング図
図29-7:周期とデューティサイクルの単一取得タイミング図
このモードは、SMTクロックに対するSMTSIGxの高パルス時間と低パルス時間を測定します。SMTSIGx入力の立ち上がりエッジでSMTxTMRのインクリメントを開始し、次にSMTxCPWレジスタを値で更新し、立ち下がりエッジでSMTxTMRをリセットして、再びインクリメントを開始します。別の立ち上がりエッジを監視すると、SMTxCPRレジスタを現在の値で更新し、もう一度SMTxTMR値をリセットして、再びインクリメントを開始します。図29-8および図29-9を参照してください。
図29-8:HIGH AND LOW 測定モードの繰り返し取得タイミング図
図29-9:HIGH AND LOW 測定モードの単一取得タイミング図
このモードは、SMTのSMTWINx入力のウィンドウ周期を測定します。SMTWINx入力の立ち上がりエッジでタイマーのインクリメントを開始し、タイマーの値でSMTxCPRレジスタを更新し、2番目の立ち上がりエッジでタイマーをリセットします。図29-10および図29-11を参照してください。
図29-10:ウィンドウ測定モードの繰り返し取得タイミング図
図29-11:ウィンドウ測定モードの単一取得タイミング図
このモードは、既知の入力ウィンドウでのSMTx_signal入力のデューティサイクルを測定します。これは、SMTx_signal入力がハイのときにクロック信号の各パルスでタイマーをインクリメントし、SMTxCPRレジスタを更新し、最初の後にSMTWINx入力のすべての立ち上がりエッジでタイマーをリセットすることによって行われます。図29-12および図29-13を参照してください。
図29-12:
GATED WINDOWED MEASURE MODE REPEAT ACQUISITION TIMEING DIAGRAM
*****ページ410
図29-13:
GATED WINDOWED MEASUREMODEシングルアクイジションタイミング図
このモードは、SMTWINx入力の立ち上がりエッジとSMTx_signal入力の立ち上がりエッジの間の時間間隔を測定し、SMTWINx入力の立ち上がりエッジを監視するとタイマーのインクリメントを開始し、SMTxCPRレジスタを更新し、監視時にタイマーをリセットします。 SMTx_signal入力の立ち上がりエッジ。SMTx_signalの立ち上がりエッジがない2つのSMTWINx立ち上がりエッジが発生した場合、SMTxCPWレジスタをタイマーの現在の値で更新し、タイマー値をリセットします。図29-14および図29-15を参照してください。
図29-14:飛行モードの繰り返し取得タイミング図の時間
S
図29-15:飛行時間モードの単一取得タイミング図
このモードは、SMTWINx入力の立ち上がりエッジまたは立ち下がりエッジに基づいてタイマー値をキャプチャし、割り込みをトリガーします。これは、CCPモジュールのキャプチャ機能を模倣しています。タイマーは、SMTxGOビットが設定されるとインクリメントを開始し、SMTWINxの各立ち上がりエッジでSMTxCPRレジスタの値を更新し、SMTWINxの各立ち下がりエッジでCPWレジスタの値を更新します。このモードでは、タイマーはハードウェアの状態によってリセットされることはなく、必要に応じてソフトウェアによってリセットする必要があります。図29-16および図29-17を参照してください。
図29-16:キャプチャモードの繰り返し取得のタイミング図
図29-17:
キャプチャモードの単一取得タイミング図
このモードは、SMTx_signal入力の各パルスでタイマーをインクリメントします。このモードはSMTクロックと非同期であり、タイムソースとしてSMTx_signalを使用します。SMTxCPWレジスタは、SMTxWIN入力の立ち下がりエッジで現在のSMTxTMR値で更新されます。図29-18を参照してください。
図29-18:カウンターモードのタイミング図
このモードは、SMTxWIN入力によってゲートされたSMTx_signal入力のパルスをカウントします。SMTxWIN入力の立ち上がりエッジを確認するとタイマーのインクリメントを開始し、SMTxWIN入力の立ち下がりエッジでSMTxCPWレジスタを更新します。図29-19および図29-20を参照してください。
図29-19:ゲーテッドカウンターモードのリピート取得タイミング図
SMT
このモードは、SMTxWIN入力によって指定されたウィンドウ内で、SMTx_signal入力のパルスをカウントします。SMTxWIN入力の立ち上がりエッジを確認するとカウントを開始し、SMTxWIN入力の立ち下がりエッジでSMTxCPWレジスタを更新し、SMTxWIN入力の各立ち上がりエッジで最初のエッジを超えてSMTxCPRレジスタを更新します。図29-21および図29-22を参照してください。
図29-21:
ウィンドウドカウンターモードリピート取得タイミング図
図29-22:
WINDOWED COUNTERMODEシングルアクイジションタイミング図
SMTは、次の3つの異なる条件下で割り込みをトリガーできます。
割り込みは、デバイスのPIRおよびPIEレジスタによって制御されます。
SMTは、SMTモードに依存する状況であるSMTxCPWおよびSMTxCPRレジスタを更新するたびに割り込みをトリガーできます。これについては、各モードの特定のセクションで説明します。SMTxCPW割り込みは、レジスタPIR4およびPIE4のそれぞれSMTxPWAIFビットおよびSMTxPWAIEビットによって制御されます。SMTxCPR割り込みは、SMTxPRAIFビットとSMTxPRAIEビットによって制御されます。これらのビットもそれぞれレジスタPIR4とPIE4にあります。
同期SMTモードでは、割り込みトリガーはSMTxCLKに同期されます。非同期モードでは、割り込みトリガーは非同期です。どちらのモードでも、トリガーされると、割り込みはCPUクロックに同期されます。
セクション29.1.2「周期一致割り込み」で説明されているように、SMTはSMTxTMRでも割り込み、セクション29.3「停止動作」で説明されている周期一致制限機能とSMTxPRを一致させます。周期一致割り込みは、レジスタPIR4とPIE4にそれぞれあるSMTxIFとSMTxIEによって制御されます。
ここで示しているレジスターのビット名の多くは、いわゆる Short Bit Name です。
Bit Name Prefix |
SMT1 |
SMT2 |
プログラミングでこれらのビットを指定するためには、レジスター名も指定する必要があります。例えば、SMT1CON0レジスターの ENビットをセットするには、SMT1CON0bits.EN = 1 と指定します。
第2の指定方法として、Short Bit Name に、Bit Name Prefix を付けるとレジスター名を省略することができます。例えば、SMTxCON0レジスターの ENビットは。SMT1EN = 1 と指定します。
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
PIE4 | SCANIE | CRCIE | SMT2PWAIE | SMT2PRAIE | SMT2IE | SMT1PWAIE | SMT1PRAIE | SMT1IE |
PIR4 | SCANIF | CRCIF | SMT2PWAIF | SMT2PRAIF | SMT2IF | SMT1PWAIF | SMT1PRAIF | SMT1IF |
SMTxCON0 | EN | — | STP | WPOL | SPOL | CPOL | SMTxPS<1:0> | |
SMTxCON1 | SMTxGO | REPEAT | — | — | MODE<3:0> | |||
SMTxSTAT | CPRUP | CPWUP | RST | — | — | TS | WS | AS |
SMTxSIG | — | — | — | SSEL<4:0> | ||||
SMTxWIN | — | — | — | WSEL<4:0> | ||||
SMTxCLK | — | — | — | — | — | CSEL<2:0> |
レジスタ | bit 23 - - - - - - - 16 | bit 15 - - - - - - - 8 | bit 7 - - - - - - - 0 |
---|---|---|---|
SMTxCPR | SMTxCPRU | SMTxCPRH | SMTxCPRL |
SMTxCPW | SMTxCPWU | SMTxCPWH | SMTxCPWL |
SMTxPR | SMTxPRU | SMTxPRH | SMTxPRL |
SMTxTMR | SMTxTMRU | SMTxTMRH | SMTxTMRL |
レジスタ | BIT | 名 | 説明 | 1 | 0 |
---|---|---|---|---|---|
SMTxCON0 | 7 | EN | SMTイネーブルビット | 有効 | 無効 |
5 | STP | SMTカウンター停止イネーブルビット | PRで停止 | リセット | |
4 | WPOL | SMTxWIN入力極性制御ビット | 正論理 | 負論理 | |
3 | SPOL | SMTxSIG入力極性制御ビット | 正論理 | 負論理 | |
2 | CPOL | SMTxクロック入力極性制御ビット | 立下り | 立上り | |
1 | SMTxPS1 | SMTプリスケラー選択ビット 00=1:1(初期値)01=1:2 10=1:4 11=1:8 |
|||
0 | SMTxPS0 | ||||
SMTxCON1 | 7 | SMTxGO | SMTGOデータ収集ビット | 有効 | 無効 |
6 | REPEAT | SMT連続収集イネーブルビット | 連続 | 単発 | |
<3:0> | MODE | 下表参照 | |||
SMTxSTAT | 7 | CPRUP | SMT手動期間バッファ更新要求ビット | 要求 | 完了 |
6 | CPWUP | SMT手動パルス幅バッファ更新要求ビット | 要求 | 完了 | |
5 | RST | SMT手動タイマーリセット要求ビット | 要求 | 完了 | |
2 | TS | SMTGO値ステータスビット | 動作 | 停止 | |
1 | WS | SSMTxWIN値ステータスビット | 開 | 閉 | |
0 | AS | SMT_signal値ステータスビット | 動作 | 停止 | |
SMTxSIG | <4:0> | SSEL | 下表参照 | ||
SMTxWIN | <4:0> | WSEL | 下表参照 | ||
SMTxCLK | <2:0> | CSEL | 下表参照 |
MODE<3:0> SMT Operation Mode Select bits | |||
---|---|---|---|
1111 | Reserved | 0110 | Time of flight |
•••••• | 0101 | Gated windowed measure | |
1011 | 0100 | Windowed measure | |
1010 | Windowed counter | 0011 | High and low time measurement |
1001 | Gated counter | 0010 | Period and Duty-Cycle Acquisition |
1000 | Counter | 0001 | Gated Timer |
0111 | Capture | 0000 | Timer |
CSEL<2:0>: SMT Clock Selection bits | |
---|---|
111 | Reserved |
110 | AT1_perclk |
101 | MFINTOSC |
100 | MFINTOSC/16 |
011 | LFINTOSC |
010 | HFINTOSC 16 MHz |
001 | FOSC/4 |
000 | FOSC |
WSEL<4:0>: SMT1 Window Selection bits | |||||
---|---|---|---|---|---|
11111 | Reserved |
10001 | Reserved | 01000 | TMR6_postscaled |
•••••• | 10000 | TMR0_overflow | 00111 | TMR4_postscaled | |
11000 | 01111 | TMR5_overflow | 00110 | TMR2_postscaled | |
10111 | MFINTOSC/16 | 01110 | TMR3_overflow | 00101 | ZCD1_out |
10110 | AT1_perclk | 01101 | TMR1_overflow | 00100 | CCP2_out |
10101 | LFINTOSC | 01100 | LC4_out | 00011 | CCP1_out |
10100 | PWM4_out | 01011 | LC3_out | 00010 | C2OUT_sync |
10011 | PWM3_out | 01010 | LC2_out | 00001 | C1OUT_sync |
10010 | SMT2_match | 01001 | LC1_out | 00000 | SMTWINx pin |
SSEL<4:0>: SMT1 Signal Selection bits | |||||
---|---|---|---|---|---|
11111 | Reserved |
01111 | SMT2_match | 00111 | LC1_out |
•••••• | 01110 | Reserved | 00110 | TMR6_postscaled | |
10101 | 01101 | TMR5_overflow | 00101 | TMR4_postscaled | |
10100 | PWM4_out | 01100 | TMR3_overflow | 00100 | TMR2_postscaled |
10011 | PWM3_out | 01011 | TMR1_overflow | 00011 | ZCD1_out |
10010 | CCP2_out | 01010 | LC4_out | 00010 | C2OUT_sync |
10001 | CCP1_out | 01001 | LC3_out | 00001 | C1OUT_sync |
10000 | TMR0_overflow | 01000 | LC2_out | 00000 | SMTxSIG pin |
プログラム例を示します。
赤外線送信が終了するまで、赤外線センサーのSpace信号(赤外線を送っていない時間)を SMT1で計測します。Spaceが 50msを超えると送信が終了したと判断し、最後の4バイト分だけを取得し、Keyコードと比較し該当のLEDを点灯させます。
/************************************************* NECタイプの赤外線リモコン受信 Device : PIC16F1619 on Curiosity XC8 Version : 2.20 ***************************************************/ #include <xc.h> #include <stdint.h> #define _XTAL_FREQ 4000000 // CONFIG #pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF #pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON #pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = OFF #pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON #pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC /********************************************************* Main application *********************************************************/ void main(void) { uint16_t ircode = 0; OSCCON = 0b01101000; // PLL disabled; 4MHz_HF; FOSC; LATA = 0; // LED 消灯 LATC = 0; // TRISA = 0b11011001; // LED接続Pinは出力 TRISC = 0b11011111; // ANSC7 = 0; // センサーPinはデジタル入力 SMT1CON0 = 0x08; // SIG極性 low; Prescaler 1:1; SMT1CON1 = 0x43; // Repeat; High and Low: SMT1GO = Off SMT1STAT = 0x00; // SMT1CLK = 0x01; // Clock FOSC/4; SMT1WIN = 0x00; // WIN in SMTWINx SMT1SIG = 0x00; // SEL in SMTxSIG SMT1PR = 50000; // SMT1SIGPPS = 0x17; // RC7 -> SMT1SIG SMT1CON0bits.EN = 1; // システム ON while (1) { SMT1PRAIF = 0; SMT1IF = 0; SMT1CON1bits.SMT1GO = 1; // データ収集開始 while(1) // ビット毎の繰り返し { if(SMT1PRAIF){ // Space終了なら SMT1PRAIF = 0; // Space長さを検査し ircode <<= 1; // 短ければ「0」 if(SMT1CPR > 1000)ircode += 1; // 長ければ「1」 } if(SMT1IF){ // 50mS以上継続なら SMT1IF = 0; // データ終了 break; } } SMT1CON1bits.SMT1GO = 0; // データ収集終了 switch (ircode){ // 受信コードによりLED制御 case 0xC084: LATA5 ^= 1; break; // Key 1 LED4 反転 case 0xC044: LATA1 ^= 1; break; // Key 2 LED5 反転 case 0xC0C4: LATA2 ^= 1; break; // Key 3 LED6 反転 case 0xC024: LATC5 ^= 1; break; // Key 4 LED7 反転 default: LATA = 0; LATC = 0; break; // 他のKey 全消灯 } } } /** End of File */