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

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

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(既定)
0001=1:2 0100=1:5 0111=1:8 1010=1:111 1101=1:14
0010=1:3 0101=1:6 0100=1:9 1011=1:12 1110=1:15
0011=1:4 0110=1:7 1001=1:10 1100=1:13 1111=1:16
2 T0OUTPS2
1 T0OUTPS1
0 T0OUTPS0
T0CON1 7 T0CS2 入力クロックF選択
000=T0CKIPPS(正) 010=FOSC/4 100=LFINTOSC 110=SOSC
001=T0CKIPPS(負) 011=HFINTOSC 101=Reserved 111=CLC1
6 T0CS1
5 T0CS0
4 T0ASYNC 入力のシステムクロックとの同期 非同期 同期
3 T0CKPS3 プリスケラー比率 0000=1:1(既定)
0001=1:2 0100=1:16 0111=1:128 1010=1:1024 1101=1:8192
0010=1:4 0101=1:32 1000=1:256 1011=1:2048 1110=1:16384
0011=1:8 0110=1:64 1001=1:512 1100=1:4096 1111=1:32768
2 T0CKPS2
1 T0CKPS1
0 T0CKPS0

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

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