PIC16F1619の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
信号測定タイマー SMT
2020-12-02
目次

SMTの特徴

信号測定タイマー Signal Measurement Timer(SMT)は、高度なクロックとゲート制御ロジックを備えた24ビットカウンターであり、パルス幅、周波数、デューティサイクル、2つの信号のエッジ間の時間差などのさまざまなデジタル信号パラメーターを測定するように構成できます。

SMTの機能は次のとおりです。

*注意*
2つのSMTモジュールを実装しているデバイスは、SMTxは、SMT1およびSMT2に適用されます。

図29-1:SMTブロック図

1 SMTの動作

モジュールの中核は、複雑なデータ収集フロントエンドと組み合わされた24ビットカウンターSMTxTMRです。選択した動作モードに応じて、SMTは表29-1に要約されているさまざまな測定を実行できます。

1.1 クロックソース

SMTで使用できるクロックソースは次のとおりです。

SMTクロックソースは、SMTxCLKレジスタのCSEL <2:0>ビットを設定することによって選択されます。クロックソースは、SMTxCON0レジスタのPS <1:0>ビットを使用してプリスケールすることもできます。事前にスケーリングされたクロックソースは、カウンタとモジュールで使用される同期ロジックの両方をクロックするために使用されます。

1.2 周期一致割り込み

他のタイマーと同様に、SMTxTMRが「0」にロールオーバーすると、SMTは割り込みをトリガーします。これは、モードに関係なく、SMTxTMR = SMTxPR の場合に発生します。したがって、外部信号またはウィンドウに依存してタイマーをリセットするモードでは、適切な動作を行うには、SMTxPR を予想される信号またはウィンドウよりも長い周期に設定する必要があります。

2 基本的なタイマー機能レジスタ

SMTxTMR タイムベースと SMTxCPW / SMTxPR / SMTxCPR バッファレジスタを中心に機能を果たします。また、これらはソフトウェアから手動で更新できます。

2.1 タイムベース

SMTxTMRは、SMTの中心である24ビットカウンターです。これは、SMTの各モードで測定するための基本的なカウンター/タイマーとして使用されます。

SMTxSTATレジスタのRSTビットをセットすることにより、24'h00_0000の値にリセットできます。ソフトウェアへの書き込みとソフトウェアからの読み取りは可能ですが、24ビット同時にはアクセスできないため、SMTxTMRへの読み取りと書き込みは、GO = 0の場合にのみ行う必要があります。または、ソフトウェアにSMTxTMR読み取りの整合性を確保するための他の手段を講じる必要があります。

2.2 Pulse Width Latch レジスタ

SMTxCPWレジスタは、24ビットのSMT Pulse Width Latchです。このレジスターはは、現在のSMTモードによって決定される信号によってトリガーされ SMTxTMR の値をラッチします。

SMTxSTAT レジスタの CPWUP ビットをセットすることで、SMTxCPWレジスタを、SMTxTMR の現在値に更新することもできます。

2.3 Period Latch レジスタ

SMTxCPRレジスタは、24ビットのSMT Period Latch です。このレジスターはは、現在のSMTモードによって決定される信号によってトリガーされ SMTxTMR の値をラッチします。

SMTxSTATレジスタのCPRUPビットをセットすることにより、SMTxCPRレジスタを、SMTxTMR値の現在値に更新することもできます。

3 動作の停止

SMTxCON0レジスタのSTPビットを使用して、カウンタがロールオーバーするのを防ぐことができます。

停止が有効になっている場合、周期一致割り込みは、SMTxTMR がリセットされるまで(手動リセット、「2.1 タイムベース」のいずれかによって)、またはSMTxCON1レジスタのSMTxGOビットをクリアしてソフトウェアにSMTxTMR値を書き込むまで持続します。

4 極性制御

SMTの3つの入力信号に対して、ハイ/ポジティブエッジでアクティブとするか、またはロー/ネガティブエッジ信号でアクティブとするか決定する極性制御があります。

次のSMTxCON0レジスタビットで極性を制御します。

5 ステータス情報

SMTは、入力信号の極性を処理していない、ユーザーに入力ステータス情報を提供します。

5.1 ウィンドウステータス

ウィンドウステータスは、SMTxSTATレジスタのWSビットによって決定されます。このビットは、ウィンドウ測定、ゲートカウンター、およびゲートウィンドウ測定モードでのみ使用され、TS = 1の場合にのみ有効であり、非カウンターモードではシンクロナイザーの遅延によって時間的に遅延します。

5.2 シグナルステータス

シグナルステータスは、SMTxSTATレジスタのASビットによって決定されます。このビットは、ウィンドウ測定、飛行時間、キャプチャモードを除くすべてのモードで使用され、TS = 1の場合にのみ有効であり、非カウンタモードではシンクロナイザの遅延によって時間的に遅延します。

5.3 GOステータス

タイマーの実行ステータスは、SMTxSTATレジスタのTSビットによって決定され、非カウンタモードではシンクロナイザの遅延によって時間的に遅延します。

6 動作モード

動作モードは表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
6.1 TIMER モード

タイマーモードは、SMTxTMRが16/24ビットタイマーとして使用される最も単純な動作モードです。このモードでは、データ収集は行われません。SMTxGOビットがソフトウェアによってセットされている限り、タイマーはインクリメントします。SMTウィンドウまたはSMTシグナルイベントはSMTxGOビットに影響を与えません。すべてがSMTクロックソースに同期されます。タイマーで周期一致が発生すると(SMTxTMR = SMTxPR)、SMTxTMRがリセットされ、周期一致割り込みがトリップします。

6.2 GATED TIMER モード

ゲートタイマーモードは、SMTSIGx入力を使用して、SMTxTMRがインクリメントするかどうかを制御します。外部信号の立ち下がりエッジで、SMTxCPWレジスタはSMTxTMRの現在の値に更新されます。繰り返し取得と単一取得の両方の波形例を図29-4と図29-5に示します。

6.3 PERIOD AND DUTY-CYCLE モード

デューティサイクルモードでは、SMTx_signalのデューティサイクルまたは周期(極性に応じて)のいずれかをSMTクロックに対して取得できます。CPWレジスタは信号の立ち下がりエッジで更新され、CPRレジスタは信号の立ち上がりエッジで更新され、SMTxTMRは0x0001にリセットされます。さらに、SMTがシングルアクイジションモードの場合、SMTxGOビットは立ち上がりエッジでリセットされます。図29-6および図29-7を参照してください。

図29-6:周期とデューティサイクルの繰り返し取得モードのタイミング図

図29-7:周期とデューティサイクルの単一取得タイミング図

6.4 HIGH AND LOW 測定モード

このモードは、SMTクロックに対するSMTSIGxの高パルス時間と低パルス時間を測定します。SMTSIGx入力の立ち上がりエッジでSMTxTMRのインクリメントを開始し、次にSMTxCPWレジスタを値で更新し、立ち下がりエッジでSMTxTMRをリセットして、再びインクリメントを開始します。別の立ち上がりエッジを監視すると、SMTxCPRレジスタを現在の値で更新し、もう一度SMTxTMR値をリセットして、再びインクリメントを開始します。図29-8および図29-9を参照してください。

図29-8:HIGH AND LOW 測定モードの繰り返し取得タイミング図

図29-9:HIGH AND LOW 測定モードの単一取得タイミング図

6.5 WINDOWED 測定モード

このモードは、SMTのSMTWINx入力のウィンドウ周期を測定します。SMTWINx入力の立ち上がりエッジでタイマーのインクリメントを開始し、タイマーの値でSMTxCPRレジスタを更新し、2番目の立ち上がりエッジでタイマーをリセットします。図29-10および図29-11を参照してください。

図29-10:ウィンドウ測定モードの繰り返し取得タイミング図

図29-11:ウィンドウ測定モードの単一取得タイミング図

6.6 GATED WINDOW 測定モード

このモードは、既知の入力ウィンドウでの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シングルアクイジションタイミング図

6.7 TIME OF FLIGHT 測定モード

このモードは、SMTWINx入力の立ち上がりエッジとSMTx_signal入力の立ち上がりエッジの間の時間間隔を測定し、SMTWINx入力の立ち上がりエッジを監視するとタイマーのインクリメントを開始し、SMTxCPRレジスタを更新し、監視時にタイマーをリセットします。 SMTx_signal入力の立ち上がりエッジ。SMTx_signalの立ち上がりエッジがない2つのSMTWINx立ち上がりエッジが発生した場合、SMTxCPWレジスタをタイマーの現在の値で更新し、タイマー値をリセットします。図29-14および図29-15を参照してください。

図29-14:飛行モードの繰り返し取得タイミング図の時間

S

図29-15:飛行時間モードの単一取得タイミング図

6.8 CAPTURE モード

このモードは、SMTWINx入力の立ち上がりエッジまたは立ち下がりエッジに基づいてタイマー値をキャプチャし、割り込みをトリガーします。これは、CCPモジュールのキャプチャ機能を模倣しています。タイマーは、SMTxGOビットが設定されるとインクリメントを開始し、SMTWINxの各立ち上がりエッジでSMTxCPRレジスタの値を更新し、SMTWINxの各立ち下がりエッジでCPWレジスタの値を更新します。このモードでは、タイマーはハードウェアの状態によってリセットされることはなく、必要に応じてソフトウェアによってリセットする必要があります。図29-16および図29-17を参照してください。

図29-16:キャプチャモードの繰り返し取得のタイミング図

図29-17:

キャプチャモードの単一取得タイミング図

6.9 COUNTER モード

このモードは、SMTx_signal入力の各パルスでタイマーをインクリメントします。このモードはSMTクロックと非同期であり、タイムソースとしてSMTx_signalを使用します。SMTxCPWレジスタは、SMTxWIN入力の立ち下がりエッジで現在のSMTxTMR値で更新されます。図29-18を参照してください。

図29-18:カウンターモードのタイミング図

6.10 GATED COUNTER モード

このモードは、SMTxWIN入力によってゲートされたSMTx_signal入力のパルスをカウントします。SMTxWIN入力の立ち上がりエッジを確認するとタイマーのインクリメントを開始し、SMTxWIN入力の立ち下がりエッジでSMTxCPWレジスタを更新します。図29-19および図29-20を参照してください。

図29-19:ゲーテッドカウンターモードのリピート取得タイミング図

SMT

6.11 WINDOWED COUNTER モード

このモードは、SMTxWIN入力によって指定されたウィンドウ内で、SMTx_signal入力のパルスをカウントします。SMTxWIN入力の立ち上がりエッジを確認するとカウントを開始し、SMTxWIN入力の立ち下がりエッジでSMTxCPWレジスタを更新し、SMTxWIN入力の各立ち上がりエッジで最初のエッジを超えてSMTxCPRレジスタを更新します。図29-21および図29-22を参照してください。

図29-21:

ウィンドウドカウンターモードリピート取得タイミング図

図29-22:

WINDOWED COUNTERMODEシングルアクイジションタイミング図

7 割り込み

SMTは、次の3つの異なる条件下で割り込みをトリガーできます。

  • PWAcquisitionComplete
  • PRAcquisitionComplete
  • CounterPeriodMatch
  • 割り込みは、デバイスのPIRおよびPIEレジスタによって制御されます。

    7.1 PWおよびPR取得の中断

    SMTは、SMTモードに依存する状況であるSMTxCPWおよびSMTxCPRレジスタを更新するたびに割り込みをトリガーできます。これについては、各モードの特定のセクションで説明します。SMTxCPW割り込みは、レジスタPIR4およびPIE4のそれぞれSMTxPWAIFビットおよびSMTxPWAIEビットによって制御されます。SMTxCPR割り込みは、SMTxPRAIFビットとSMTxPRAIEビットによって制御されます。これらのビットもそれぞれレジスタPIR4とPIE4にあります。

    同期SMTモードでは、割り込みトリガーはSMTxCLKに同期されます。非同期モードでは、割り込みトリガーは非同期です。どちらのモードでも、トリガーされると、割り込みはCPUクロックに同期されます。

    7.2 カウンター周期の一致の中断

    セクション29.1.2「周期一致割り込み」で説明されているように、SMTはSMTxTMRでも割り込み、セクション29.3「停止動作」で説明されている周期一致制限機能とSMTxPRを一致させます。周期一致割り込みは、レジスタPIR4とPIE4にそれぞれあるSMTxIFとSMTxIEによって制御されます。

    8 レジスタ定義:SMT制御

    ここで示しているレジスターのビット名の多くは、いわゆる 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
    0110Time of flight
    ••••••0101Gated windowed measure
    10110100Windowed measure
    1010Windowed counter0011High and low time measurement
    1001Gated counter0010Period and Duty-Cycle Acquisition
    1000Counter0001Gated Timer
    0111Capture0000Timer
    CSEL<2:0>: SMT Clock Selection bits
    111Reserved
    110AT1_perclk
    101MFINTOSC
    100MFINTOSC/16
    011LFINTOSC
    010HFINTOSC 16 MHz
    001FOSC/4
    000FOSC
    WSEL<4:0>: SMT1 Window Selection bits
    11111
    Reserved
    10001Reserved 01000TMR6_postscaled
    •••••• 10000TMR0_overflow 00111TMR4_postscaled
    11000 01111TMR5_overflow 00110TMR2_postscaled
    10111MFINTOSC/16 01110TMR3_overflow 00101ZCD1_out
    10110AT1_perclk 01101TMR1_overflow 00100CCP2_out
    10101LFINTOSC 01100LC4_out 00011CCP1_out
    10100PWM4_out 01011LC3_out 00010C2OUT_sync
    10011PWM3_out 01010LC2_out 00001C1OUT_sync
    10010SMT2_match 01001LC1_out 00000SMTWINx pin
    SSEL<4:0>: SMT1 Signal Selection bits
    11111
    Reserved
    01111SMT2_match 00111LC1_out
    •••••• 01110Reserved 00110TMR6_postscaled
    10101 01101TMR5_overflow 00101TMR4_postscaled
    10100PWM4_out 01100TMR3_overflow 00100TMR2_postscaled
    10011PWM3_out 01011TMR1_overflow 00011ZCD1_out
    10010CCP2_out 01010LC4_out 00010C2OUT_sync
    10001CCP1_out 01001LC3_out 00001C1OUT_sync
    10000TMR0_overflow 01000LC2_out 00000SMTxSIG pin

    9 プログラム例

    プログラム例を示します。
    赤外線送信が終了するまで、赤外線センサーの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
    */