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を反転 } } }
入力クロック周波数とカウントアップ時間の関係