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