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」を使用して、特定のモジュールを区別するための数字の使用を示すことができます。
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はクリアされません。
Timer2は、オプションのデバイス割り込みを生成することもできます。Timer2出力信号(TMR2とPR2の一致)は、4ビットカウンター/ポストスケーラーの入力を提供します。このカウンタは、PIR1レジスタのTMR2IFにラッチされるTMR2一致割り込みフラグを生成します。割り込みは、PIE1レジスタのTMR2一致割り込みイネーブルビットTMR2IEをセットすることによって有効になります。
T2CONレジスタのポストスケーラ制御ビットT2OUTPS <3:0>を使用して、16のポストスケールオプション(1:1から1:16まで)の範囲を選択できます。
TMR2のスケーリングされていない出力は、主にCCPモジュールで使用でき、PWMモードでの動作のタイムベースとして使用されます。
Timer2は、SPIモードで動作するMSSPxモジュールのシフトクロックソースとしてオプションで使用できます。追加情報は、セクション29.0「マスター同期シリアルポート(MSSPx)モジュール」に記載されています。
プロセッサがスリープモードのときは、Timer2タイマーを操作できません。プロセッサがスリープモードになっている間、TMR2およびPR2レジスタの内容は変更されません。
| レジスタ | 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)
|
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 |
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を反転
}
}
}