18F14k50(タイマー2の設定)E-Work Education
タイマー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;
}
まとめ
タイマー1とタイマー2の設定について記載しました。マイコンは、割り込み設定ができて初めて価値がでてきます。その過程に入る前にタイマーのレジスタの設定を学習する必要があります。タイマー毎に設定するレジスタが少し異なるので、間違いないようにメモしておくことをお勧めします。