18F14k50(タイマー0の設定)e-work - E-Work Education
タイマー0について
18F14K50は、タイマーが4つあります。タイマー0からタイマー3です。今回は、タイマー0の設定について記載していきます。機能が一部異なるだけで基本的に動作は
タイマー0の特徴
下記の特徴があります。設定することで下記の仕様を利用することができます。T0CON レジスタで設定することが可能です。
• 8/16 ビットモードのタイマまたはカウンタ動作をソフトウェアによって選択可能
• 読み書き可能なレジスタ
• 選択可能なクロック源 ( 内部または外部 )
• 専用の 8 ビット ソフトウェア プログラマブルプリスケーラ
T0CON レジスタ
各ビットの説明は、下記のとおりです。データシートは、101ページに記載してあります。PIC18F14K50は、8ビットマイコンのため16ビットを扱えるといっても、8ビットをずつ2つに分けて制御しています。24Fシリーズから16ビットになるため、下図のような工夫をして16ビットの動作をしています。
TMR0ON: Timer0 ON/OFF 制御ビット
T08BIT: Timer0 8 ビット /16 ビット制御ビット
T0CS: Timer0 クロック源選択ビット
T0SE: Timer0 ソースエッジ選択ビット
PSA: Timer0 プリスケーラ割り当てビット
T0PS<2:0>: Timer0 プリスケーラ選択ビット
INTCONレジスタ
INTCON は、各種割り込みの許可、優先度、フラグビットを格納する読み書き可能なレジスタです。タイマー0では、bit2である「TMR0IF」のフラグを確認するプログラムとなります。
計算方法
1命令の計算方法
<条件>48MHz 16ビット 内部クロック LOW→High プリスケールON プリスケーラ4
PICマイコンは、4クロックで1命令になります。したがって、48÷4=12MHzのスピードで動作していることになります。
1命令の時間:1÷12MHz=8.33333e-8(秒)
プリスケーラは、設定分命令されると1回動作するものです。ゆえに、
プリスケーラを含む1命令の時間:8.33333e-8 × 4 = 3.33333e-7(秒)
16ビットは2の16乗で計算できるため、65536となる。オーバーフローするには、さきの65536回処理するとフラグが立ちます。
1回の時間:3.33333e-7(秒)×65536 = 0.02184(秒) = 21.84(ミリ秒)
下図は、動作させたときの波形になります。計算通り、21.84(ミリ秒)となっています。
プログラム
#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」
//Timer0 設定 TimerON 16ビット 内部クロック LOW→High プリスケールON ぷり4
//P101に詳細
//P69にINTCONレジスタ オーバーフローするとbit2が1になる
//65536 833us
T0CON = 0b10000001;
while(1){
while(INTCONbits.TMR0IF == 1){
INTCONbits.TMR0IF = 0;
LATCbits.LC1 = !LATCbits.LC1;
}
}
return;
}
まとめ
タイマーの機能は、マイコンで活用する場合に割り込みで利用することが多いです。今回は、高速のLED点滅(Lチカ)です。動作だけみると高速点灯のため「???」の状態になるかもしれませんが、基本構文を学習するには最適なプログラムだと思います。オシロスコープがあれば、時間を変更しながら色々を学習へつなげていってください。
“18F14k50(タイマー0の設定)e-work - E-Work Education” に対して1件のコメントがあります。