P16F18313には、3本のタイマー•カウンターがあります。タイマー0には、多くの改良が加えられました。8ビットまたは16ビットのどちらにも設定でき、その入力信号も多岐に及びます。 また、プリスケーラ•ポストスケーラも強化されています。ここでは、内部クロックをカウントするタイマーとして使用し、タイマーがカウントアップする仕様について説明します。サンプルで作成したプログラムは、タイマー0がカウントアップするとLEDを点滅するものです。 主な改良点は以下の通り
8 bit モード
Timer 2 と同じ機能を持つプリセットカウンターとなった。TMR0Lがクロックをカウントし、常にTMR0Hと比較される。同じ値になるとTMR0Lがクリアされ count up 信号が出力される。
プリスケーラ拡張とポストスケーラの追加
プリスケーラの分周値が大幅に拡大し、1:1 から 1:16 のポストスケーラも追加された。
出力ラッチの追加
カウントアップごとに出力が反転する出力ラッチが追加された。出力はPPS機能でどの pin にも指定できる。
| Prescaler | 8bitモード | 16bitモード | ||||
|---|---|---|---|---|---|---|
| 31k | 1M | 32M | 31k | 1M | 32M | |
| 1:1 | 33mS | 1024uS | 32uS | 8.5秒 | 262mS | 8192uS |
| 1:4 | 132mS | 4096uS | 128uS | 33秒 | 1048mS | 33mS |
| 1:32 | 1秒 | 33mS | 1024uS | 4.5分 | 8.4秒 | 262mS |
| 1:256 | 8.5秒 | 262mS | 8192uS | 36分 | 67秒 | 2.1秒 |
| 1:2048 | 68秒 | 2.1秒 | 66mS | 4.8時間 | 8.9分 | 16.8秒 |
| 1:32768 | 18分 | 33.6秒 | 1秒 | 77時間 | 2.4時間 | 4.5分 |
| レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| INTCON | GIE | PEIE | - | - | - | - | - | INTEDG |
| PIR0 | - | - | TMR0IF | IOCIF | - | - | - | INTF |
| PIE0 | - | - | TMR0IE | IOCIE | - | - | - | INTE |
| TMR0L | Holding Register for TMR0L<7:0> | |||||||
| TMR0H | Holding Register for TMR0H<7:0> or TMR0<15:8> | |||||||
| T0CON0 | T0EN | - | T0OUT | T016BIT | T0OUTPS<3:0> | |||
| T0CON1 | T0CS<2:0> | T0ASYNC | T0CKPS<3:0> | |||||
| レジスタ | BIT | 名 | 説明 | 1 | 0 | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| INTCON | 7 | GIE | 全インタラプトの使用許可 | 許可 | 否 | ||||||||||||||
| PIR0 | 2 | TMR0IF | タイマー0 オーバーフロー発生フラグ | 発生 | 否 | ||||||||||||||
| PIE0 | 5 | TMR0IE | タイマー0 インタラプトを使用許可 | 許可 | 否 | ||||||||||||||
| T0CON0 | 7 | T0EN | タイマー0 ON/OFF選択 | ON | OFF | ||||||||||||||
| 5 | T0OUT | タイマー0 出力(read-only) | 1 | 0 | |||||||||||||||
| 4 | T016BIT | タイマー長の16/8bit選択 | 16bit | 8bit | |||||||||||||||
| 3 | T0OUTPS3 | ポストスケラー比率 0000=1:1(既定)
|
|||||||||||||||||
| 2 | T0OUTPS2 | ||||||||||||||||||
| 1 | T0OUTPS1 | ||||||||||||||||||
| 0 | T0OUTPS0 | ||||||||||||||||||
| T0CON1 | 7 | T0CS2 | 入力クロックF選択
|
||||||||||||||||
| 6 | T0CS1 | ||||||||||||||||||
| 5 | T0CS0 | ||||||||||||||||||
| 4 | T0ASYNC | 入力のシステムクロックとの同期 | 非同期 | 同期 | |||||||||||||||
| 3 | T0CKPS3 | プリスケラー比率 0000=1:1(既定)
|
|||||||||||||||||
| 2 | T0CKPS2 | ||||||||||||||||||
| 1 | T0CKPS1 | ||||||||||||||||||
| 0 | T0CKPS0 | ||||||||||||||||||
PortC に接続されたLEDが点灯するプログラムを作成しました。System ClockはConfigで内部1MHzに設定 RC0 は TMR0IF で反転 RC3 は PPSでTMR0を出力する。
プログラム
/*************************************
* File: Timer 0 sample
* System ClockはConfigで内部1MHzに設定
* RA0 は TMR0IF で反転
* RA5 は PPSでTMR0を出力
* PIC16F18313
* Created on 2020-06-14
**************************************/
#include <xc.h>
#pragma config FEXTOSC = OFF,RSTOSC = HFINT1 // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = OFF,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = OFF,CP = OFF,CPD = OFF
#define LED LATA0
void main(void) {
TRISA = 0b011110; // RA0,RA5を出力に設定
// --------------------------------------------
// Timer0 は、Fosc/4を16bitモードでカウント
// カウントアップ(262mS)でTMR0IFが「1」になる
// TMR0IFを常時モニタしLED(RC0)を反転
// また、PPS機能を使いTMR0出力をRC3に出力する
// --------------------------------------------
T0CON1 = 0b01000000; // Fosc/4 Sync PreS 1/1
T0CON0 = 0b10010000; // T0 ON 16bit Post 1/1
RA5PPS = 0b11100; // TMR0をRA5に出力
while(1){
if(TMR0IF){ // Timer0カウントアップを待つ
TMR0IF=0;
LED = !LED; // LEDを反転
}
}
}
入力クロック周波数とカウントアップ時間の関係