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

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

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

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
 1:64 2.1 S 16.4mS 1.37mS
レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INTCON GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
PIE1 TMR1GIE ADIE RCIE TXIE SSP1IE - TMR2IE TMR1IE
PIR1 TMR1GIF ADIF RCIF TXIF SSP1IF - 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 name: Timer2
//  Description: Timer2 example
//  Timer2のプリスケラでシステムクロック(4MHz/4)を1/4(250KHz)し、
//  PR2の値(249)でリセットを繰り返すと1KHzになる、
//  ポストスケラでさらに1/10で、100Hzになる。
//  毎秒100回のカウントオーバーを50回ごとにLEDを点滅させる。
//  Notes: 4MHz内部クロック
//    LED:      RC2
//    Language: MPLABX XC8
//    Target:   PIC16F1459
// -------------------------------------------------------------------------

#include <xc.h>
#define  LED   LATC2

#pragma config FOSC  = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP  = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO  = OFF, FCMEN = OFF
#pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x
#pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF

void main(void){
    char count =0;
    OSCCON = 0b00110110;      // 内部クロック4Mhz
    LATC   = 0;
    TRISC  = 0b11111011;      // 入出力設定

    T2CON  = 0b01001101;      // Timer 2 設定(10mSecごと)
                              // PS_1/4, Post 1/10
    PR2 = 249;                // Period Register設定 1/250
    while(1){                 // 繰り返しループ
       while(! TMR2IF);       // Timer2 のタイムアップを待つ
        TMR2IF = 0;           // キャリーフラッグをクリア
        if(++count >= 50){    // キャリーを50回数える
            count = 0;
            LED = ! LED;      // 500mSで点滅
        }
    }
}