18F26J50には、5本のタイマーがあります。タイマー1は、独自のクロック発信器を持つ16ビットタイマーです。タイマー1のクロック発信器に時計用水晶(クリスタル)を接続することで高精度のデジタルクロックが作成できます。さらに、今までのPICから、タイマーをON/OFFするGate機能が大幅に強化されています。外部からの入力、Timer0、Timer2からの信号でタイマーの動作をON/OFFすることが可能になりました。まず、内部クロックをカウントする16ビットタイマーとして使用し、タイマーがカウントアップするとインタラプトが発生する仕様について説明します。
*注意*
T1Gピンは、Peripheral Pin Select (PPS)機能でプログラムで、物理的に接続するピンを指定します。
*注意*
Timer1 の全16ビットを一括して読み出すために、下位バイトを読み出すタイミングで上位バイトの値を読み出しTMR1H(バッファ)に保存します。これによって、Timer1 の全16 ビットの値を同時に取得することができます。書き込みは、まず、TMR1H のバッファレジスタに上位バイトに書き込む値を保存した後で、TMR1L への書き込みが実行されると、TMR1H の内容によって上位バイトも更新されます。これによって、Timer1 の全16 ビットを同時に更新できますす。
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
TMR1L | TMR1 Count の下位 8 bit | |||||||
TMR1H | TMR1 Count の上位 8 bit | |||||||
RCON | IPEN | SBOREN | — | RI | TO | PD | POR | BOR |
INTCON | GIE/GIEH | PEIE/GIEL | TMR0IE | INTIE | RABIE | TMR0IF | INT0IF | RABIF |
PIR1 | - | ADIF | RCIF | TXIF | SSP1IF | CCP1IF | TMR2IF | TMR1IF |
PIE1 | - | ADIE | RCIE | TXIE | SSP1IE | CCP1IE | TMR2IE | TMR1IE |
IPR1 | — | ADIP | RCIP | TXIP | SSPIP | CCP1IP | TMR2IP | TMR1IP |
T1CON | TMR1CS1 | TMR1CS0 | T1CKPS1 | T1CKPS0 | T1OSCEN | T1SYNC | RD16 | TMR1ON |
T1GCON | TMR1GE | T1GPOL | T1GTM | T1GSPM | T1GGO/ T1DONE |
T1GVAL | T1GSS1 | T1GSS0 |
TCLKCON | T1RUN | T3CCP2 | T3CCP1 |
レジスタ | BIT | 名 | 説明 | 1 | 0 |
---|---|---|---|---|---|
RCON | 7 | IPEN | 2レベルのインタラプト優先度 | 使用 | 不 |
INTCON | 7 | GIEH | 高優先度インタラプトを使用許可 | 許可 | 不 |
6 | GIEL | 低優先度インタラプトを使用許可 | 許可 | 不 | |
PIR1 | 0 | TMR1IF | タイマー1 オーバーフロー発生フラグ | 発生 | |
PIE1 | 0 | TMR1IE | タイマー1 インタラプトを使用許可 | 許可 | 不 |
IPR1 | 0 | TMR1IP | タイマー1 インタラプト優先度 | 高 | 低 |
T1CON | 7 | TMR1CS | タイマー1 クロック選択 10 = T1OSCまたは T1CKI pin 01 = FOSC 00 = FOSC/4 |
||
6 | TMR1CS | ||||
5 | T1CKPS1 | プリスケラー分周比率 11=1:8, 10=1:4, 01=1:2, 00=1:1 |
|||
4 | T1CKPS0 | ||||
3 | T1OSCEN | タイマー1 入力およびT1OSC制御 (注1) | ON | OFF | |
2 | T1SYNC | タイマー1 外部信号の内部クロック同期 | 非同期 | 同期 | |
1 | RD16 | タイマー1 16Bit読書きモード | ON | OFF | |
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/ T1DONE |
シングル・パルスモードの状態 | 待機 | 終了 | |
2 | T1GVAL | ゲートの状態を反映(Read Only) | 開 | 閉 | |
1 | T1GSS1 | ゲートの信号源 00 = 外部信号ピン 01 = Timer0 10 = Timer2 |
|||
0 | T1GSS0 | ||||
TCLKCON | 4 | T1RUN | タイマー1 クロック源 (Read Only) | OSC | 他 |
1 | T3CCP2 | ECCP信号源 10 = ECCP1 、ECCP2 ともにTimer3/Timer4 01 = ECCP1は Timer1/Timer2、 ECCP2はTimer3/ Timer4 00 = ECCP1、 ECCP2ともに Timer1 / Timer2 |
|||
0 | T3CCP1 |
クロック周波数とタイムアップ間隔
Prescaler | T1OSC | Fosc/4 | ||
---|---|---|---|---|
32.768k | 31k | 4M | 48M | |
1:1 | 2 Sec | 8.4 S | 66mS | 5.5mS |
1:2 | 4 Sec | 16.8 S | 131mS | 10.9mS |
1:4 | 8 Sec | 33.6 S | 262mS | 21.8mS |
1:8 | 16 Sec | 67.1 S | 524mS | 43.7mS |
T1OSCEN と TMR1CS 関係
T1OSCEN | TMR1CS<1:0> | |
---|---|---|
10 | 0x | |
1 | T1OSCに電源を供給し、 T1OSCからの信号をカウント |
T1OSCに電源を供給 |
0 | T1OSCをOFFにし、 T1CKIからの信号をカウント |
T1OSCをOFF |
PPortC - RC0 に接続されたLEDが点滅するプログラムを作成しました。 Timer1で内部クロック(4MHz)をカウントし、262mSecでカウントアップする毎にLEDを点滅します。
<回路図>
<プログラム>
// File name: Timer1 // Description: Timer1 example // Timer1で内部クロック(4MHz)をカウントし、 // カウントオーバーでLEDを点滅させる。 // Notes: 4MHz内部クロック // SW RA5 // 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){ OSCCON = 0b01100010; // 内部クロック4Mhz LATB = 0; // PortCのすべてのビットを「0」 TRISB = 0b11110000; // LEDの接続されているポートを出力に設定 T1CON = 0b00100011; // Timer1 // FOSC/4 PS_1/4 OSC1_OFF SYNC_ON 6BIT_RW T1GCON = 0; // ゲート機能を無効 LATB = 0x03; // LED 2個を点灯 while(1){ // 繰り返しループ while(!PIR1bits.TMR1IF); // Timer 1 のタイムアップを待つ PIR1bits.TMR1IF = 0; // キャリーフラッグをクリア LATB ^= 0x0F; // LED 4個の出力を反転 } }