P16F18325のタイマー1は、16ビットのカウンターで、その入力は内部クロックか外部からの信号を選ぶことができます。 ここでは、内部クロックをカウントするタイマーとして使用し、タイマーがカウントアップする仕様について説明します。サンプルで作成したプログラムは、タイマー1がカウントアップするとLEDを点滅するものです。Timer1の機能が強化され、特に入力信号をOn/Off出来るゲート機能の強化が目立ちます。
*注意*
T1CKIピンとT1Gピンは、PPS機能を使用し任意のpinを指定することができます。
Prescalerl | T1OSC | Fosc | Fosc/4 | ||||
---|---|---|---|---|---|---|---|
32k | 31k | 1M | 32M | 31k | 1M | 32M | |
1:1 | 2 Sec | 2.1 S | 66mS | 2.0mS | 8.4 S | 262mS | 8.2mS |
1:2 | 4 Sec | 4.2 S | 131mS | 4.1mS | 16.8 S | 524mS | 8.2mS |
1:4 | 8 Sec | 8.4 S | 262mS | 8.2mS | 33.6 S | 1 S | 33mS |
1:8 | 16 Sec | 16.8 S | 524mS | 16mS | 67.1 S | 2.1 S | 66mS |
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
INTCON | GIE | PEIE | - | - | - | - | - | INTEDG |
PIE1 | TMR1GIE | ADIE | RCIE | TXIE | SSP1IE | BCL1IE | TMR2IE | TMR1IE |
PIR1 | TMR1GIF | ADIF | RCIF | TXIF | SSP1IF | BCL1IF | TMR2IF | TMR1IF |
T1CON | TMR1CS<1:0> | T1CKPS<1:0> | T1SOSC | nT1SYNC | - | TMR1ON | ||
T1GCON | TMR1GE | T1GPOL | T1GTM | T1GSPM | T1GGO_ nDONE |
T1GVAL | T1GSS<1:0> | |
T1CKIPPS | - | - | - | T1CKIPPS<4:0> | ||||
T1GPPS | - | - | - | T1GPPS<4:0> | ||||
TMR1H | TMR1 Count の上位 8 bit | |||||||
TMR1L | TMR1 Count の下位 8 bit |
レジスタ | BIT | 名 | 説明 | 1 | 0 |
---|---|---|---|---|---|
INTCON | 7 | GIE | 全インタラプトの使用許可 | 許可 | 否 |
6 | PEIE | 周辺機能インタラプトの使用許可 | 許可 | 否 | |
PIE1 | 7 | TMR1GIE | ゲート インタラプトを使用許可 | 許可 | 否 |
0 | TMR1IE | タイマー1 インタラプトを使用許可 | 許可 | 否 | |
PIR1 | 7 | TMR1GIF | ゲート インタラプト フラグ | 発生 | 未発生 |
0 | TMR1IF | タイマー1 オーバーフロー発生フラグ | 発生 | 未発生 | |
T1CON | 7 | TMR1CS1 | タイマー1 クロック選択 00=FOSC/4(既定) 01=FOSC, 10=T1CKI or T1OSC, 11=LFINTOSC |
1 | 0 |
6 | TMR1CS1 | 1 | 0 | ||
5 | T1CKPS1 | プリスケラー比率 00=1:1(既定) 01=1:2, 10=1:4, 11=1:8 |
1 | 0 | |
4 | T1CKPS2 | 1 | 0 | ||
3 | T1SOSC | タイマー1 発振器 | ON | OFF | |
2 | nT1SYNC | タイマー1 外部信号の内部クロック同期 | 非同期 | 同期 | |
0 | TMR1ON | タイマー1 ON/OFF | ON | OFF | |
T1GCON | 7 | TMR1GE | ゲート機能 ON/OFF(TMR1ON=0 のときは無効) | 有効 | 無効 |
6 | T1GPOL | ゲート極性 | 正論理 | 負論理 | |
5 | T1GTM | ゲート・トグルモード(立上りでトグルされる) | ON | OFF | |
4 | T1GSPM | シングル・パルスモード | ON | OFF | |
3 | T1GGO_ nDONE |
シングル・パルスモードのセットおよびモニタ | 待機 | 終了 | |
2 | T1GVAL | ゲートの状態を反映(Read Only) | 開 | 閉 | |
1 | T1GSS1 | ゲートの信号源 00 = 外部信号ピン (初期値) 01 = Timer0 10 = C1 11 = C2 |
1 | 0 | |
0 | T1GSS0 | 1 | 0 | ||
T1CKIPPS | - | T1CKIPPS | T1CKIのPin配置 (PPS指定を参照のこと) | RA3 | RA4 |
T1GPPS | - | T1GPPS | T1GのPin配置 (PPS指定を参照のこと) | RA3 | RA4 |
PortC - RC2 に接続されたLEDが点灯するプログラムを作成しました。 Gate機能は使用していません。
<回路図>
<プログラム>
/************************************* * File: Timer 1 sample * System ClockはConfigで内部1MHzに設定 * RC5 は TMR1IF で反転 * PIC16F18346 * Created on July 22, 2020, 2:37 PM **************************************/ #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 LATCbits.LATC5 void main(void) { TRISC5 = 0; // RC5を出力に設定 // -------------------------------------------- // Timer1 は、Fosc/4を16bitでカウント // カウントアップでTMR1IFが「1」になる // TMR0IFを常時モニタしLED(RC5)を反転 // また、Timer1 Gate機能は使用していない // -------------------------------------------- T1CON = 0b00000001; // Fosc/4 Sync PreS 1/1 T1GCON = 0; // ゲート機能は使用せず while(1){ if(TMR1IF){ // Timer1ウントアップを待つ TMR1IF=0; LED = !LED; // LEDを反転 } } }
同じ動作のアセンブラプログラムは、[こちら]