PIC16F18346の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
タイマー1
2020-09-01

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

タイマー1のプログラム例

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を反転
        }
    }
}


同じ動作のアセンブラプログラムは、[こちら]