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

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
タイマー2

タイマー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)
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
1 0
0 T2CKPS0 1 0

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

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への出力を反転
                }
    }
}