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

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
タイマー2/4/6モジュール
2020-12-21

P16F18325には、3本のタイマーがあります。タイマー2は、8ビットタイマーカウンター(TMR2)と8ビットピリオドレジスター(PR2)から構成されています。それら2本のレジスターの値を常時比較しており、一致するとTMR2をリセットします。また、CCPと連携しPWM(Pulse Width Modulation)を行うことが特徴です。TMR2の前段と後段には、最大64分周のプリスケラー、最大16分周のポストスケラーが使用できます。下右表に書くプリスケラー設定値に対するTMR2 Outputの周期を示します。入力は、システムクロック(Fosc/4)のみで、外部入力をカウントすることはできません。

PS Fosc/4
31k 1M 32M
 1:1 33mS 1024μS 32μS
 1:4 131mS 4.1mS 128μS
 1:16 524mS 16.4mS 512μS
 1:64 2.1 S 66mS 2048uS

Timer2/4/6モジュールは、次の機能を組み込んだ8ビットタイマーです。

*注意*
複数のタイマーモジュールを備えたデバイスでは、使用されるレジスタ名に細心の注意を払うことが非常に重要です。モジュールの頭字語の後に配置された番号は、個別のモジュールを区別するために使用されます。たとえば、T2CONとT4CONは、2つの完全に異なるタイマーモジュールの同じ動作面を制御します。


このセクション全体を通して、任意の動作モードでのTimer2モジュールへの一般的な参照は、Timerxモジュールにも同様に適用可能であると解釈される場合があります。レジスタ名、モジュール信号、I / Oピン、およびビット名は、必要に応じて、一般的な指定子「x」を使用して、特定のモジュールを区別するための数字の使用を示すことができます。

1 Timer2の動作

Timer2モジュールへのクロック入力はシステム命令クロック(FOSC /4)です。

クロック入力の4ビットカウンタ/プリスケーラにより、直接入力、4分周および16分周のプリスケールオプションが可能です。これらのオプションは、T2CONレジスタのプリスケーラ制御ビットT2CKPS <1:0>によって選択されます。TMR2の値は、各クロックサイクルでPeriodレジスタPR2の値と比較されます。2つの値が一致すると、コンパレータはタイマー出力として一致信号を生成します。この信号はまた、次のサイクルでTMR2の値を00hにリセットし、出力カウンター/ポストスケーラーを駆動します(セクション27.2「Timer2割り込み」を参照)。

レジスタの初期化

TMR2およびPR2レジスタは、どちらも直接読み取りおよび書き込みが可能です。TMR2レジスタはデバイスのリセット時にクリアされますが、PR2レジスタはFFhに初期化されます。プリスケーラとポストスケーラの両方のカウンタは、次のイベントでクリアされます。

*注意* T2CONが書き込まれるとき、TMR2はクリアされません。

2 Timer2割り込み

Timer2は、オプションのデバイス割り込みを生成することもできます。Timer2出力信号(TMR2とPR2の一致)は、4ビットカウンター/ポストスケーラーの入力を提供します。このカウンタは、PIR1レジスタのTMR2IFにラッチされるTMR2一致割り込みフラグを生成します。割り込みは、PIE1レジスタのTMR2一致割り込みイネーブルビットTMR2IEをセットすることによって有効になります。

T2CONレジスタのポストスケーラ制御ビットT2OUTPS <3:0>を使用して、16のポストスケールオプション(1:1から1:16まで)の範囲を選択できます。

3 タイマー2出力

TMR2のスケーリングされていない出力は、主にCCPモジュールで使用でき、PWMモードでの動作のタイムベースとして使用されます。

Timer2は、SPIモードで動作するMSSPxモジュールのシフトクロックソースとしてオプションで使用できます。追加情報は、セクション29.0「マスター同期シリアルポート(MSSPx)モジュール」に記載されています。

4 スリープ中のTimer2の動作

プロセッサがスリープモードのときは、Timer2タイマーを操作できません。プロセッサがスリープモードになっている間、TMR2およびPR2レジスタの内容は変更されません。

5 レジスター定義

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INTCON GIE PEIE - - - - - INTEDG
PIE1 TMR1GIE ADIE RCIE TXIE SSP1IE BCL1IE TMR2IE TMR1IE
PIR1 TMR1GIF ADIF RCIF TXIF SSP1IF BCF1IF TMR2IF TMR1IF
T2CON - T2OUTPS<3:0> TMR2ON T2CKPS<1:0>
TMR2 TMR2 Count
PR2 Timer2 の Period Register
レジスタ BIT 説明 1 0
INTCON 7 GIE 全インタラプトの使用許可 許可
6 PEIE 周辺機能インタラプトの使用許可 許可
PIE1 1 TMR2IE タイマー2のインタラプト許可 許可
PIR1 1 TMR2IF タイマー2 オーバーフロー発生フラグ 発生 未発生
T2CON 6 T2OUTPS3 ポストスケラー分周比率 (規定値 0000)
0000=1:10011=1:4 1101=1:14
0001=1:20100=1:5•• 中略 ••1110=1:15
0010=1:30101=1:6 1111=1:16
1 0
5 T2OUTPS2 1 0
4 T2OUTPS1 1 0
3 T2OUTPS0 1 0
2 TMR2ON タイマー1 ON/OFF ON OFF
1 T2CKPS1 プリスケラー比率 00=1:1 (既定)
    01=1:4,   10=1:16,  11=1:64
1 0
0 T2CKPS0 1 0

タイマー2のプログラム例

PortC - RC2 に接続されたLEDが点灯するプログラムを作成しました。
<回路図>

<プログラム>

/*************************************
 * File: Timer 2 sample
 * System ClockはConfigで内部1MHzに設定
 * RC0 は TMR2IF で反転
 * PIC16F18325
 * Created on July 22, 2017, 2:37 PM
 **************************************/

#include <xc.h>

#pragma config FEXTOSC = OFF,RSTOSC = HFINT1  // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = OFF,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = OFF,CP = OFF,CPD = OFF

#define LED LATCbits.LATC0

void main(void) {

    TRISC = 0b111110;       // RC0を出力に設定

    // --------------------------------------------
    // Timer2 は、Fosc/4を
    // PreScalerで 1/64 8bit(1/256)でカウント
    // さらに、PostScalerで 1/2してTMR2IFが「1」になる
    // TMR2IFを常時モニタしLED(RC0)を131mSごとに反転
    // --------------------------------------------
    T2CON  = 0b00001111;     // Timer2 Post1/2 Pre1/64設定
    PR2    = 0xFF;           // Timer2 Period Register設定
    while(1){
        if(TMR2IF){         // Timer1ウントアップを待つ
            TMR2IF=0;
            LED = !LED;     // LEDを反転
        }
    }
}