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分周のプリスケラー、ポストスケラーが使用できます。ただし、入力は、システムクロックのみで、外部入力をカウントすることはできません。

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 タイマー2 ON/OFF ON OFF
1 T2CKPS1 プリスケラー比率
   00=1:1 (既定)   01=1:4,   10=1:16
1 0
0 T2CKPS0 1 0

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

PortB に接続されたLEDが点滅するプログラムを作成しました。 Timer2のプリスケラーでシステムクロック(4MHz/4)を1/4(250KHz)し、 PR2の値(249)でリセットを繰り返すと1KHzになリます。さらに、 ポストスケラーでで1/10にするため、 毎秒100回カウントアップします。このカウントアップを50回数えLEDを点滅させています。

<回路図>

<プログラム>

//  File name: Timer2
//  Description: Timer example
//  Timer2のプリスケラでシステムクロック(4MHz/4)を1/4(250KHz)し、
//  PR2の値(249)でリセットを繰り返すと1KHzになる、
//  ポストスケラでさらに1/10で、100Hzになる。
//  毎秒100回のカウントオーバーを50回ごとにLEDを点滅させる。
//  Notes:  4MHz内部クロック
//        LED RB0
//        LED RB1
//        LED RB2
//        LED RB3
//    Language: MPLAB xc8
//    Target: PIC18F26J50

#include <xc.h>
//
     #pragma config WDTEN = OFF, PLLDIV = 2, STVREN = ON, XINST = OFF
     #pragma config CPUDIV = OSC1, CP0 = OFF
     #pragma config OSC = INTOSC, T1DIG = OFF
     #pragma config LPT1OSC = OFF, FCMEN = OFF, IESO = OFF
     #pragma config WDTPS = 32768
     #pragma config DSWDTOSC = INTOSCREF, RTCOSC = T1OSCREF
     #pragma config DSBOREN = OFF, DSWDTEN = OFF, DSWDTPS = 8192
     #pragma config IOL1WAY = OFF, MSSP7B_EN = MSK7
     #pragma config WPFP = PAGE_1, WPEND = PAGE_0, WPCFG = OFF
     #pragma config WPDIS = OFF



void main(void){
    char count = 0;
    OSCCON = 0b01100010;     // 内部クロック4Mhz
    LATB = 0;                // PortCのすべてのビットを「0」
    TRISB = 0b11110000;      // LEDの接続されているポートを出力に設定
    T2CON = 0b1001101;       // Timer2 POST_1/10 PS_1/4
    PR2 = 249;               // Timer2 Period Register設定
    LATB = 0x03;                       // LED 2個を点灯
    while(1){                          // 繰り返しループ
       while(! PIR1bits.TMR2IF);       // Timer2 のタイムアップを待つ
        PIR1bits.TMR2IF = 0;           // Timer2 からのキャリーフラッグをクリア
        if(++count >= 50){             // キャリーを50回数える
            count = 0;
            LATB ^= 0x0F;              // LED 4個の出力を反転
        }
    }
}