18F14k50(タイマー2の設定)E-Work Education

FelixMittermeierによるPixabayからの画像

タイマー2について

 タイマー2は、8ビットのカウントアップ型のタイマーになります。レジスタ(TMR2)へ数値を書き込めたりするほか、SPIモードのクロック源となります。8ビットは、0から255のため、ポリスケールの設定も用意されており、16倍まで対応可能なタイマーです。

タイマー2の特徴

 ・4ビットのポリスケーラがあり、8ビット(0から255)のカウンター値を増やすことができます。
 ・SPIモードのクロック源

T2CONレジスタ

・T2OUTPSレジスタは、ポストスケール値を設定(1から16)
・TMR2ONレジスタは、Timer2をONかOFFの設定
・T2CKPSレジスタは、1倍から16倍のプリスケール値を設定

PIR1レジスタ

 PIR1レジスタは、割り込み用のレジスタです。bit1の「TMR2IF」が、タイマー2のカウンターをオーバーフローすると「1」のフラグが立ちます。プログラムでは、このビットを確認することになります。ただし、ソフトウェア上でリセットする必要があるため、プログラムを書く際に注意してください。

計算方法

Pickit2を使って波形を表示したものです。
 では、計算していきます。初めに1命令の時間を計算します。

 1命令の時間:1÷12MHz=8.33333e-8(秒)

プリスケーラは、設定分命令されると1回動作するものです。ゆえに、
 
  プリスケーラを含む1命令の時間:8.33333e-8 × 1 = 8.33333e-8(秒)

 今回は、ポストスケール13、プリスケール1で設定します。

オーバーフローするには、さきの(256×13×1)回処理するとフラグが立ちます。

  1回の時間:8.33333e-8(秒)×(256×13×1)= 0.000277333(秒) = 277.3(マイクロ秒)

 下図は、動作させたときの波形になります。計算通り、278(マイクロ秒)となっています。オシロスコープで計測するともう少し細かく表示できると思いますが、個人ではなかなか購入できませんね(汗)

プログラム

 タイマー1とほとんど同じプログラムになります。マイコンのプログラムは、基本レジスタを書けるようにすれば、色々な機能を使えるようになります。

#include <xc.h>
#define _XTAL_FREQ 48000000

void main(void) {
//ポートセット 出力のみであれば、全て『0』を設定する
    TRISA = 0b00000000;          //LEDの接続されているポートを出力に設定
    TRISB = 0b00000000;          //LEDの接続されているポートを出力に設定
    TRISC = 0b00000000;          //LEDの接続されているポートを出力に設定
     
    LATA = 0;                    //PortAのすべてのビットを「0」
    LATB = 0;                    //PortBのすべてのビットを「0」
    LATC = 0;                    //PortCのすべてのビットを「0」 
//Timer1 設定 ポストスケール13 内部クロック プリ1  内部 ON
//P111に詳細 ポストスケールは、2進数の設定値+1になるので注意
//オーバーフロウ P72 PIR1 bit0 TMR1IFをチェック
    T2CON = 0b01100100;
    
    while(1){
        while(PIR1bits.TMR2IF == 1){
            PIR1bits.TMR2IF = 0;
            LATCbits.LC1 = !LATCbits.LC1;
        }    
    }
    return;
}
https://e-work-education.com/2022/03/26/timer1/

まとめ

 タイマー1とタイマー2の設定について記載しました。マイコンは、割り込み設定ができて初めて価値がでてきます。その過程に入る前にタイマーのレジスタの設定を学習する必要があります。タイマー毎に設定するレジスタが少し異なるので、間違いないようにメモしておくことをお勧めします。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です