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

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

16F1455には、3本のタイマーがあります。タイマー1は、16ビットのカウンターで、その入力は内部クロックか外部からの信号を選ぶことができます。 ここでは、内部クロックをカウントするタイマーとして使用し、タイマーがカウントアップする仕様について説明します。サンプルで作成したプログラムは、タイマー1がカウントアップするとLEDを点滅するものです。Timer1の機能が強化され、特に入力信号をOn/Off出来るゲート機能の強化が目立ちます。

*注意*
T1Gピンは、APFCON の T1GSEL ビットを「1」にすることで、RA4からRA3に変更することができます。

Prescalerl T1OSC Fosc Fosc/4
32k 31k 4M 48M 31k 4M 48M
1:1 2 Sec 2.1 S 16mS 1.4mS 8.4 S 66mS 5.5mS
1:2 4 Sec 4.2 S 33mS 2.7mS 16.8 S 131mS 10.9mS
1:4 8 Sec 8.4 S 66mS 5.5mS 33.6 S 262mS 21.8mS
1:8 16 Sec 16.8 S 131mS 10.9mS 67.1 S 524mS 43.7mS
レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INTCON GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
PIE1 TMR1GIE ADIE RCIE TXIE SSP1IE CCP1IE TMR2IE TMR1IE
PIR1 TMR1GIF ADIF RCIF TXIF SSP1IF CCP1IF TMR2IF TMR1IF
APFCON RXDTSEL SDOSEL SSSEL T1GSEL TXCKSEL P1BSEL CCP1SEL
T1CON TMR1CS<1:0> T1CKPS<1:0> T1OSCEN nT1SYNC - TMR1ON
T1GCON TMR1GE T1GPOL T1GTM T1GSPM T1GGO_
nDONE
T1GVAL T1GSS<1:0>
TMR1H TMR1 Count の上位 8 bit
TMR1L TMR1 Count の下位 8 bit
レジスタ BIT 説明 1 0
INTCON 7 GIE 全インタラプトの使用許可 許可
6 PEIE 周辺機能インタラプトの使用許可 許可
PIE1 7 TMR1GIE ゲート インタラプトを使用許可 許可
1 TMR1IE タイマー1 インタラプトを使用許可 許可
PIR1 7 TMR1GIF ゲート インタラプト フラグ 発生 未発生
1 TMR1IF タイマー1 オーバーフロー発生フラグ 発生 未発生
APFCON 3 T1GSEL T1GのPin配置の指定 RA3 RA4
T1CON 7 TMR1CS1 タイマー1 クロック選択  00=FOSC/4(既定)
 01=FOSC, 10=T1CKI or T1OSC, 11=CPSOSC
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 T1OSCEN タイマー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

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

PortC - RC2 に接続されたLEDが点灯するプログラムを作成しました。 Gate機能は使用していません。

<プログラム>

//  File name: Timer1
//  Description: Timer1 example
//  Timer0で内部クロック(4MHz)をカウントし、
//  カウントオーバーでLEDを点滅させる。
//  Notes: 4MHz内部クロック
//    LED:      RC2
//    Language: MPLABX XC8
//    Target:   PIC16F1455

#include <xc.h>

#define LED LATC2

#pragma config FOSC  = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP  = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO  = OFF, FCMEN = OFF
#pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x
#pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF

void main(void){
    OSCCON = 0b00110100;      // 内部クロック4Mhz
    LATC   = 0;
    TRISC  = 0b11111011;      // 入出力設定
    T1CON  = 0b00100001;      // Timer 1 設定(262mSecごと)
                              // 内部クロック(FOSC/4)をカウント
                              // PS_1/4
    T1GCON = 0b00000000;      // Timer 1 Gate設定(使用せず)

    while(1){                 // 繰り返しループ (132mSecごと)
        while(! TMR1IF);      // Timer 1 のタイムアップを待つ
        TMR1IF = 0;           // キャリーフラッグをクリア
        LED = ! LED;          // LEDへの出力を反転
    }
}