以前は、メインタイマーについていくつかの言葉がありました。
ボードには、外部パルス発生器(クロックDS1307)があります。 ジェネレーターは4 kHzの周波数に調整され、パルスはINT0レッグ(外部割り込み)に巻き付けられます。
この割り込みは、システムのメインタイマーとして使用されます。 どうやって? はい、とても簡単です:
unsigned int calc_delay; //
ISR(INT0_vect) {
if (calc_delay > 41) { // 10
calc_delay = 0;
dispatchTimer(); //
} else
calc_delay++;
}
* This source code was highlighted with Source Code Highlighter .
avr-gccのISRマクロは、割り込みハンドラーを記述しています。 この関数は、1秒間に4096回呼び出されます。 そして、タイマーマネージャーは10ミリ秒ごとに呼び出されます(小さなエラーが発生します)。
希望する人は、内蔵タイマーまたはタイマーの別の期間を使用できますが、この本質は変わりません。
また、ADC(キーボードポーリング)およびUART(コンピューターとの通信)割り込みも使用します。 ミニマリズムもあります-値をバッファに入れて続行します。 主な作業は、プログラムのメインサイクルで実行されます。
int main() {
init();
for (;;) {
dispatchMessage();
}
}
* This source code was highlighted with Source Code Highlighter .
コメントする必要さえないと思います。 はい、初期化手順には小さいながらも非常に重要なコードがあります。
//
setHandler(MSG_LCD_REFRESH, &refreshLCD);
setTimer(MSG_LCD_REFRESH, 0, 20);
setHandler(MSG_ADC_CYCLE, &readKey);
setHandler(MSG_KEY_REPEAT, &repeatKey);
setHandler(MSG_KEY_PRESS, &analyseKey);
setHandler(MSG_1W_TEMP, &owTemp);
setTimer(MSG_1W_TEMP, 1, 10);
* This source code was highlighted with Source Code Highlighter .
一言で言えば-ハンドラーを設定し、タイマーを設定します。 その後、システムはすでに動作しています-タイマーを監視し、イベントを作成します。 イベントは受信順に処理されます。 ハンドラー関数はアクションを実行し、タイマーを再度設定します(必要な場合)。
たとえば、これは、最も単純な画面再描画関数がどのように見えるかです:
unsigned char Disp[2][20]; //
unsigned char refreshLCD(msg_par par) {
lcd_gotoxy(0,0);
lcd_puts(Disp[0]); //
lcd_gotoxy(0,1);
lcd_puts(Disp[1]); //
setTimer(MSG_LCD_REFRESH, 0, 20);
return (0);
}
* This source code was highlighted with Source Code Highlighter .
画面が更新され、キーボードが分析され、センサーがポーリングされます。
次のセクションはユーザーインターフェイスです。