---
---
タイマー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)
|
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 |
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個の出力を反転
}
}
}