18F14k50(タイマー1の設定)e-work - Education

manseok KimによるPixabayからの画像

タイマー1について

 リアルタイムクロックの設定ができます。リアルタイムクロックは、名前のとおり、電子デバイスで高精度の時計機能を使うことができます。また、低消費で動作も可能なため、置時計の自作を作成することも可能になります。
 個人的には、割り込みでよく利用するタイマーになります。

タイマー1の特徴

• 16 ビットのタイマまたはカウンタ動作をソフトウェアによって選択可能
• 読み書き可能な 8 ビットのレジスタ (TMR1H とTMR1L)
• 内部または外部のクロック源と Timer1 オシレータのオプションを選択可能
• オーバーフロー割り込み
• CCP 特殊イベントトリガによるリセット
• デバイスクロックのステータスフラグ (T1RUN)

T1CONレジスタ

RD16 16ビットを1回の動作か2回の動作にするかを設定する。
T1RUN メインのシステムクロックをTimer1から供給するかを設定します。
T1CKPS プリスケールを2ビットで設定する。1倍から8倍まで変更可能です。
T1OSCEN Timer1のオシレータを有効か無効に設定します。
T1SYNC 外部クロック同期させるかの設定をします。ただし、TMR1CSを内部クロックに設定した場合は、無効となります。
TMR1CS 外部クロックか内部クロックかを設定します。
TMR1ON Timer1をONかOFFに設定します。

PIR1レジスタ

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

計算方法

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

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

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

 今回は、16ビットを選択します。

16ビットは2の16乗で計算できるため、65536となる。オーバーフローするには、さきの65536回処理するとフラグが立ちます。

  1回の時間:8.33333e-8(秒)×65536 = 0.00546(秒) = 5.46(ミリ秒)

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



 

プログラム

 タイマーの動作のため、タイマー0から2まで、ほぼ同じプログラムになります。下記のリンク先より、他のタイマー設定も見てください。レジスタは、タイマーによって異なりますので設定に注意です。どの間隔で実行するかを計算して各レジスタを設定しましょう。
 データシートにも記載されていますが、「PIR1bits.TMR1IF = 0;」のビットはしっかりとソフトウェアでリセットする必要があります。忘れた場合は、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 設定 プリスケール1 内部クロック プリ1  内部 ON
//P113に詳細
//オーバーフロウ P72 PIR1 bit0 TMR1IFをチェック
    T1CON = 0b10000001;
    
    while(1){
        while(PIR1bits.TMR1IF == 1){
            PIR1bits.TMR1IF = 0;
            LATCbits.LC1 = !LATCbits.LC1;
        }    
    }
    return;
}

https://e-work-education.com/2022/03/21/timer0/

まとめ

 タイマーの機能は、マイコンで活用する場合に割り込みで利用することが多いです。今回は、高速のLED点滅(Lチカ)です。動作だけみると高速点灯のため「???」の状態になるかもしれませんが、基本構文を学習するには最適なプログラムだと思います。オシロスコープがあれば、時間の設定を変更しながら色々を学習へつなげていってください。

Follow me!

18F14k50(タイマー1の設定)e-work - Education” に対して1件のコメントがあります。

コメントを残す

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