情報処理 タイマの基礎 R8C タイマの基礎
情報処理 タイマの基礎 タイマの概要 ここでは、タイマの種類やできることの概要を 学びます
タイマで出来ること 一定の時間間隔を得る パルス信号の出力 パルス数のカウント パルス幅やパルス周期の測定 ・・・ など 一定時間間隔毎に割込みを発生させる パルス信号の出力 パルス数のカウント パルス幅やパルス周期の測定 ・・・ など
一定時間間隔を得る 時間 割込み クロックをもとに、一定時間間隔を得る まず、カウンタの値を任意の初期値(例 10)に設定 まず、カウンタの値を任意の初期値(例 10)に設定 クロックを利用してカウンタを1減らす(たとえば、20MHz(50ns))で1だけ減らす 同じことを繰り返し、カウンタがアンダーフローしたら(0からさらに1減らしたら) カウンタの値を初期値に戻す 割込み 以後、2→3を繰り返し
一定時間間隔を得る 時間 割込み クロックをもとに、一定時間間隔を得る まず、カウンタの値を任意の初期値(例 10)に設定 まず、カウンタの値を任意の初期値(例 10)に設定 クロックを利用してカウンタを1減らす(たとえば、20MHz(50ns))で1だけ減らす 同じことを繰り返し、カウンタがアンダーフローしたら(0からさらに1減らしたら) カウンタの値を初期値に戻す 割込み 以後、2→3を繰り返し
一定時間間隔を得る 時間 割込み クロックをもとに、一定時間間隔を得る まず、カウンタの値を任意の初期値(例 10)に設定 まず、カウンタの値を任意の初期値(例 10)に設定 クロックを利用してカウンタを1減らす(たとえば、20MHz(50ns))で1だけ減らす 同じことを繰り返し、カウンタがアンダーフローしたら(0からさらに1減らしたら) カウンタの値を初期値に戻す 割込み 以後、2→3を繰り返し
一定時間間隔を得る 時間 割込み クロックをもとに、一定時間間隔を得る まず、カウンタの値を任意の初期値(例 10)に設定 まず、カウンタの値を任意の初期値(例 10)に設定 クロックを利用してカウンタを1減らす(たとえば、20MHz(50ns))で1だけ減らす 同じことを繰り返し、カウンタがアンダーフローしたら(0からさらに1減らしたら) カウンタの値を初期値に戻す 割込み 以後、2→3を繰り返し
一定時間間隔を得る 時間 割込み クロックをもとに、一定時間間隔を得る まず、カウンタの値を任意の初期値(例 10)に設定 まず、カウンタの値を任意の初期値(例 10)に設定 クロックを利用してカウンタを1減らす(たとえば、20MHz(50ns))で1だけ減らす 同じことを繰り返し、カウンタがアンダーフローしたら(0からさらに1減らしたら) カウンタの値を初期値に戻す 割込み 以後、2→3を繰り返し この動作で、カウンタとはプログラム中の変数ではない(ソフトウェアで機能を実現しているのではない) 機能はハードウェアで実現されている(レジスタで初期値等を設定すれば自動的に一定時間間隔の割込みが発生する)
パルス信号を出力 時間 出力 割込みの代わりに、ある出力端子の電圧を反転させる機能をもたせれば パルス信号を出力できる
パルス信号を出力2 時間 出力 カウンタに設定できる初期値を2つ用意して交互に利用すれば (たとえば、High出力時間を決めるカウント値=2、 Low出力時間を決めるカウント値=10 など) パルス信号を出力できる
パルス数カウント 時間 パルス10回 割込み これまでは、カウンタは内部クロックを元に動作していた カウンタを、外部から入力されるパルスをもとに動作させたら? ↓ 外部からの一定数のパルスが入力される毎に割込み発生
パルス数カウント 時間 パルス10回 割込み これまでは、カウンタは内部クロックを元に動作していた カウンタを、外部から入力されるパルスをもとに動作させたら? ↓ 外部からの一定数のパルスが入力される毎に割込み発生
パルス数カウント 時間 割込み これまでは、カウンタは内部クロックを元に動作していた パルス10回 割込み これまでは、カウンタは内部クロックを元に動作していた カウンタを、外部から入力されるパルスをもとに動作させたら? ↓ 外部からの一定数のパルスが入力される毎に割込み発生
パルス数カウント 時間 割込み これまでは、カウンタは内部クロックを元に動作していた パルス10回 割込み これまでは、カウンタは内部クロックを元に動作していた カウンタを、外部から入力されるパルスをもとに動作させたら? ↓ 外部からの一定数のパルスが入力される毎に割込み発生
パルス数カウント 時間 割込み これまでは、カウンタは内部クロックを元に動作していた パルス10回 割込み これまでは、カウンタは内部クロックを元に動作していた カウンタを、外部から入力されるパルスをもとに動作させたら? ↓ 外部からの一定数のパルスが入力される毎に割込み発生
タイマで出来ること 一定の時間間隔を得る パルス信号の出力 パルス数のカウント パルス幅やパルス周期の測定 ・・・ など 一定時間間隔毎に割込みを発生させる パルス信号の出力 パルス数のカウント パルス幅やパルス周期の測定 ・・・ など
R8C/Tiny タイマの種類(p253) タイマX タイマZ タイマC 8ビット・プリスケーラ付き8ビット・タイマ パルス出力モード/パルス幅測定モード等がある タイマZ ワンショット発生モード等がある タイマC 16ビット・タイマ インプット・キャプチャ/アウトプット・コンペアモード等 がある
カウンタのカウント方法 プリスケーラ付き (タイマX 、 タイマZ)(P255 図21-1など) カウントソース f1:20MHz f8:(20/8)MHz fRING: f2:(20/2)MHz 8ビットプリスケーラ 初期値は0~255まで設定できる 8ビットカウンタ 初期値は0~255まで設定できる 例1) f1:20MHz 周期T=0.05μs プリスケーラ初期値 prex = 0 カウンタ初期値 tx = 0 初期化 prex=0 tx=0 1.プリスケーラダウンカウント 2.プリスケーラアンダーフロー 3.カウンタダウンカウント 4.カウンタアンダーフロー 5.イベント(割込みや出力反転等) タイマ周期 0.05μs×(prex+1)×(tx+1) =0.05μs (p259 式(21-1))
カウンタのカウント方法 プリスケーラ付き (タイマX 、 タイマZ)(P255 図21-1など) カウントソース f1:20MHz f8:(20/8)MHz fRING: f2:(20/2)MHz 8ビットプリスケーラ 初期値は0~255まで設定できる 8ビットカウンタ 初期値は0~255まで設定できる 例2) f8:2.5MHz 周期T=0.4μs プリスケーラ初期値 prex = 2 カウンタ初期値 tx = 1 初期化 prex=2 tx=1 1.プリスケーラダウンカウント 1.プリスケーラダウンカウント 1.プリスケーラダウンカウント 1.プリスケーラダウンカウント 1.プリスケーラダウンカウント 2.プリスケーラアンダーフロー 3.プリスケーラ初期化(prex=2) 3.カウンタダウンカウント 1.プリスケーラダウンカウント 2.プリスケーラアンダーフロー 3.プリスケーラ初期化(prex=2) 4.カウンタダウンカウント 5.カウンタアンダーフロー 6.カウンタ初期化(tx=1) 5.イベント タイマ周期 0.4μs×(prex+1)×(tx+1) =0.4μs×3×2 = 2.4μs (p259 式(21-1))
演習1: タイマXインターバル・タイマ・モードによるLED点滅 p257-260を読み、プログラムを作成・実行して動作を確認する プログラムは、リスト21-1~21-3(p260)およびset_MainCLK関数(p199)を基にして作成 する 割込み(可変ベクタテーブル)を利用するため、設定として、教科書p211「コンパイルオ プションを使う方法」(図19-7)を読み、-fMVTオプションを指定する タイマだけでは動作が速すぎるため、割込み処理関数が50回呼び出されるとLEDが反 転するようにプログラムされている(リスト21-3) シミュレータで実行の場合は、タイマX割込みをシミュレータで動作させるために、 [表示]-[CPU]-[I/Oタイミング設定] によって、I/Oタイミング設定ウインドウを開き、 [読み込み] によって、timerx.iosファイルを読み込む。(timerx.iosファイルは配布します) また、 [表示]-[グラフィック]-[GUI I/O] によって、GUI I/Oウインドウを開き、右クリック「読み込み」で、timer_x.pnlを読み込んで、 LEDをGUIで確認できるようにする。(timer_x.pnlは配布) その後、シミュレータを実行する。
シミュレーション図解 コンパイルしたプログラム をダウンロード シミュレータ GUI I/Oを作成し利用 表示 グラフィック デバッグ グラフィック GUI I/O timer_x.pnlファイル (このファイルは配布) デバッグ ダウンロード タイマなどのハードウエアの動作を 記述したスクリプトファイルを登録 表示 CPU I/Oタイミング設定 timerx.iosファイル(このファイルは配布)
演習2: タイマZインターバル・タイマ・モードによるLED点滅 p261-268を読み、プログラムを作成・実行して動 作を確認する 教科書では、LEDを3個利用しているが、授業用回路 には2個(p1_1, p1_2)しかないので、2個のLEDで動 作するようにプログラムを修正する。