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

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

タイマー4は、タイマー2と同じで8ビットタイマーカウンター(TMR4)と8ビットピリオドレジスター(PR4)から構成されています。それら2本のレジスターの値を常時比較しており、一致するとTMR4をリセットします。また、CCPと連携しPWM(Pulse Width Modulation)を行うことが出来ます。 TMR4の前段と後段には、最大16分周のプリスケラー、ポストスケラーが使用できます。ただし、入力は、システムクロックのみで、外部入力をカウントすることはできません。各レジスタの名称が異なるだけで動作はタイマー2と同じです。

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
TMR4 Timer4 Register
PR4 Timer4 Period Register
RCON IPEN SBOREN RI TO PD POR BOR
INTCON GIE/GIEH PEIE/GIEL TMR0IE INTIE RABIE TMR0IF INT0IF RABIF
PIR3 SSP2IF BCL2IF RC2IF TX2IF TMR4IF CTMUIF TMR3GIF RTCCIF
PIE3 SSP2IE BCL2IE RC2IE TX2IE TMR4IE CTMUIE TMR3GIE RTCCIE
IPR3 SSP2IP BCL2IP RC2IP TX2IP TMR4IP CTMUIP TMR3GIP RTCCIP
T4CON - T4OUTPS < 3 - 0 > TMR4ON T4CKPS < 1 - 0 >
レジスタ BIT 説明 1 0
RCON 7 IPEN 2レベルのインタラプト優先度 使用
INTCON 7 GIEH 高優先度インタラプトを使用許可 許可
6 GIEL 低優先度インタラプトを使用許可 許可
PIR3 3 TMR4IF タイマー4 オーバーフロー発生フラグ 発生 未発生
PIE3 3 TMR4IE タイマー4のインタラプト許可 許可
IPR3 3 TMR4IP タイマー4 インタラプト優先度
T4CON 6 T4OUTPS3 ポストスケラー分周比率 (規定値 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 T4OUTPS2 1 0
4 T4OUTPS1 1 0
3 T4OUTPS0 1 0
2 TMR4ON タイマー4 ON/OFF ON OFF
1 T4CKPS1 プリスケラー比率
   00=1:1 (既定)   01=1:4,   10=1:16
1 0
0 T4CKPS0 1 0

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

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

<回路図>

<プログラム>

//  File name: Timer4
//  Description: Timer example
//  Timer4のプリスケラでシステムクロック(4MHz/4)を1/4(250KHz)し、
//  PR4の値(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の接続されているポートを出力に設定
	T4CON = 0b01001101;      // Timer4 PS_1/4 POST_1/10
    PR4 = 249;               // Timer4 Period Register設定
    LATB = 0x03;                       // LED 2個を点灯
    while(1){                          // 繰り返しループ
       while(!PIR3bits.TMR4IF);       // Timer4 のタイムアップを待つ
        PIR3bits.TMR4IF = 0;           // Timer4 からのキャリーフラッグをクリア
        if(++count >= 50){             // キャリーを50回数える
            count = 0;
            LATB ^= 0x0F;              // LED 4個の出力を反転
        }
    }
}