ストップウォッチのヒント1 ストップウォッチのヒント2

USBマイコン応用■その4
2009/5/27
ストップウォッチのヒント1

セグメント表示
while(1) {
IOA = 0x10;
// Seg0 Display
1ms IOD = seg[timer1]; // 8 Segment Display
delay_ms_us(1, 0); // Delay 1ms
IOA = 0x20;
// Seg1 Display
1ms IOD = seg[timer10]; // 8 Segment Display
delay_ms_us(1, 0); // Delay 1ms
スイッチの処理
2ms
ストップウォッチ(timer1, timer10)のカウントアップ
}
(C)Takumi NAKANO, ICE, TNCT
ストップウォッチのヒント2

スイッチの処理
if ((IOB & 0x10) == 0) {
for (…) {
}
}
全体の処理(セグメント表示)が止まってしまう!
変数をセットしてすぐに終了する
if ((IOB & 0x10) == 0)
if ((IOB & 0x20) == 0)
if ((IOB & 0x40) == 0)
// Start
// Stop
// Clear
(C)Takumi NAKANO, ICE, TNCT
情報工学科 仲野 巧
1
USBマイコン応用■その4
2009/5/27
ストップウォッチのヒント3

ストップウィッチのカウントアップ
if (mode) {
for (…) {
}
}
全体の処理(セグメント表示)が止まってしまう!
カウントアップしてすぐに終了する
if (++n >= 50) { // 100ms
n = 0;
if (++timer1 > 9) { // Timer 0.1sec
timer1 = 0;
:
(C)Takumi NAKANO, ICE, TNCT
割り込み処理とは?

中断して登録した割り込み処理を実行
void timer0 (void) interrupt 1 using 1 {
timer_tick++;
// Increment Variable
if (timer_tick >= 1600) { // 100ms
最短処理 :
割り込み処理ルーチン
}
main()
{
while(1) {
通常処理 セグメント表示
タイマー割り込み発生
}
}
(C)Takumi NAKANO, ICE, TNCT
情報工学科 仲野 巧
2
USBマイコン応用■その4
2009/5/27
タイマー割り込み

タイマー0の設定
// Setup the Timer 0 Interrupt
TH0 = (unsigned char) PERIOD; // Set Timer
Period
TL0 = (unsigned char) PERIOD;
TMOD = TMOD | 0x02;
// Select Mode 2
TR0 = 1;
// Start Timer 0
ET0 = 1;
// Enable Timer 0 Interrupt
EA = 1;
// Global Interrupt Enable
ただし
タイマー割り込み周期
#define PERIOD -250
// 250/4 us Interrupt Period
(C)Takumi NAKANO, ICE, TNCT
課題6

9.9秒までのストップウォッチを作成



割り込みルーチンの作成
割り込みの登録などの初期化
メインルーチンの改良

表示を割り込み処理で行う
main()
{
while(1) {
}
}
各自,デバッグを行うこと
(C)Takumi NAKANO, ICE, TNCT
情報工学科 仲野 巧
3
USBマイコン応用■その4
2009/5/27
悪いプログラム1

for文の変数を変える
for (i = 0; i < 10; i++) {
:
i = …;
:
}




無限ループ
ループ回数が違ってくる
表示が止まってしまう
スイッチが有効にならない
(C)Takumi NAKANO, ICE, TNCT
悪いプログラム2

条件を制限する
if (i == 9)
if (j == 9)



9以上でも条件が成立するように書く
内部変数に判りやすい名前を使う
初期化を行う
if (timer1 >= 9)
timer1 = 0;
if (timer10 >= 9)
timer10 = 0;
(C)Takumi NAKANO, ICE, TNCT
情報工学科 仲野 巧
4
USBマイコン応用■その4
2009/5/27
悪いプログラム3

同じ記述を何回も書く
while(1) {
セグメント表示
if (…) {
セグメント表示
}
}


表示の問題があると切り分けができない
プログラムに無駄がある
(C)Takumi NAKANO, ICE, TNCT
プログラムの構造

時間を考慮した無限ループ
while(1) {
IOA = 0x10;
// Seg0 Display
1ms IOD = seg[timer1]; // 8 Segment Display
delay_ms_us(1, 0); // Delay 1ms
IOA = 0x20;
// Seg1 Display
1ms IOD = seg[timer10]; // 8 Segment Display
delay_ms_us(1, 0); // Delay 1ms
スイッチの処理
2ms
ストップウォッチ(timer1, timer10)のカウントアップ
}
割り込み処理に表示を移動して簡潔にする
(C)Takumi NAKANO, ICE, TNCT
情報工学科 仲野 巧
5
USBマイコン応用■その4
2009/5/27
課題7

多機能のタイマー,時計を設計する
市販の機能を参考にして設計する
 ドキュメントを提出



仕様,アルゴリズム,プログラムを解説する
プログラムも別途,提出する(動作確認用)
評価基準

多機能の方が良い
mainプログラムが判りやすい(短い)方が良い

機能をまとめアルゴリズム(動作)を単純化する

(C)Takumi NAKANO, ICE, TNCT
割り込み処理の注意

最短で割り込み処理を実行
void timer0 (void) interrupt 1 using 1 {
timer_tick++;
// Increment Variable
if (timer_tick >= 1600) { // 100ms
最短処理 :
割り込み処理ルーチン
}
delay_ms_us(…)
tone(…)
遅延を利用するのは禁止
(C)Takumi NAKANO, ICE, TNCT
情報工学科 仲野 巧
6
USBマイコン応用■その4
2009/5/27
ラップタイム計測 課題8
99.9秒までのラップタイムを計測
仕様


スタート前



スタート


4秒前から音とLEDで表示
0秒で計測可能
スイッチがON(PSW0=0)で計測開始
ストップ

スイッチがON(PSW1=0)で計測終了
(C)Takumi NAKANO, ICE, TNCT
情報工学科 仲野 巧
7