---
---
タイマー2は、8ビットタイマーカウンター(TMR2)と8ビットピリオドレジスター(PR2)から構成されています。それら2本のレジスターの値を常時比較しており、一致するとTMR2をリセットします。また、CCPと連携しPWM(Pulse Width Modulation)を行うことが特徴です。 TMR2の前段と後段には、最大16分周のプリスケラー、ポストスケラーが使用できます。ただし、入力は、システムクロックのみで、外部入力をカウントすることはできません。Timer2の使用例はCCPのPWM説明で示します。
PS | Fosc/4 | ||
---|---|---|---|
31k | 4M | 48M | |
1:1 | 33mS | 256μS | 21μS |
1:4 | 131mS | 1024μS | 85μS |
1:16 | 524mS | 4.1mS | 341μS |
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
TMR2 | Timer2 Register | |||||||
PR2 | Timer2 Period Register | |||||||
RCON | IPEN | SBOREN | — | RI | TO | PD | POR | BOR |
INTCON | GIE/GIEH | PEIE/GIEL | TMR0IE | INTIE | RABIE | TMR0IF | INT0IF | RABIF |
PIR1 | - | ADIF | RCIF | TXIF | SSP1IF | CCP1IF | TMR2IF | TMR1IF |
PIE1 | - | ADIE | RCIE | TXIE | SSP1IE | CCP1IE | TMR2IE | TMR1IE |
IPR1 | — | ADIP | RCIP | TXIP | SSPIP | CCP1IP | TMR2IP | TMR1IP |
T2CON | - | T2OUTPS < 3 - 0 > | TMR2ON | T2CKPS < 1 - 0 > |
レジスタ | BIT | 名 | 説明 | 1 | 0 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
RCON | 7 | IPEN | 2レベルのインタラプト優先度 | 使用 | 不 | ||||||||||||
INTCON | 7 | GIEH | 高優先度インタラプトを使用許可 | 許可 | 不 | ||||||||||||
6 | GIEL | 低優先度インタラプトを使用許可 | 許可 | 不 | |||||||||||||
PIE1 | 1 | TMR2IE | タイマー2のインタラプト許可 | 許可 | 否 | ||||||||||||
PIR1 | 1 | TMR2IF | タイマー2 オーバーフロー発生フラグ | 発生 | 未発生 | ||||||||||||
IPR1 | 1 | TMR2IP | タイマー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 |
1 | 0 | |||||||||||||
0 | T2CKPS0 | 1 | 0 |
PortC - RC0に接続されたLEDが順に点灯するプログラムを作成しました。 Timer2のプリスケラーでシステムクロック(4MHz/4)を1/4(250KHz)し、 PR2の値(249)でリセットを繰り返すと1KHzになリます。さらに、 ポストスケラーでで1/10にするため、 毎秒100回カウントアップします。このカウントアップを50回数えLEDを点滅させています。
<回路図>
<プログラム>
// File name: Timer2 // Description: Timer2 example // Timer2のプリスケラでシステムクロック(4MHz/4)を1/4(250KHz)し、 // PR2の値(249)でリセットを繰り返すと1KHzになる、 // ポストスケラでさらに1/10で、100Hzになる。 // 毎秒100回のカウントオーバーを50回ごとにLEDを点滅させる。 // Notes: 4MHz内部クロック // LED RC0 // Language: MPLAB XC8 // Target: PIC18F14K50 #include <XC.h> #define LED LATCbits.LATC0 #pragma config FOSC = IRC // 内部クロック #pragma config USBDIV = OFF, CPUDIV = NOCLKDIV #pragma config IESO = OFF, FCMEN = OFF, PLLEN = ON #pragma config BORV = 30, BOREN = OFF, PWRTEN = OFF #pragma config WDTPS = 32768, WDTEN = OFF #pragma config MCLRE = OFF, HFOFST = OFF, XINST = OFF #pragma config BBSIZ = OFF, LVP = OFF, STVREN = ON #pragma config CP1 = OFF, CP0 = OFF, CPD = OFF, CPB = OFF #pragma config WRT1 = OFF, WRT0 = OFF, WRTB = OFF, WRTC = OFF #pragma config EBTR1 = OFF, EBTR0 = OFF, EBTRB = OFF void main(void){ char count = 0; OSCCON = 0b01010010; // 内部クロック4Mhz TRISC = 0b11111110; // 入出力設定 T2CON = 0b01001101; // Timer 2 設定 // Post 1/10 Pre_1/4 PR2 = 249; // Timer2 Period Register設定 while(1){ //繰り返しループ while(! PIR1bits.TMR2IF); // Timer2 のタイムアップを待つ PIR1bits.TMR2IF = 0; // Timer2 からのキャリーフラッグをクリア if(++count >= 50){ // キャリーを50回数える count = 0; LED = ! LED; // LEDへの出力を反転 } } }