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
© Copyright 2024 ExpyDoc