Arduino-UNO 割り込み処理のミスあれこれ:計時処理
皆さんのスケッチを見ていて、どうしても一言いたくって・・・
「割り込み禁止での排他制御」、重要です。
■誤表示の可能性
タイマー割り込みで時計処理していて、読み出し時に
割り込み禁止していないので、桁上がりタイミングと
表示処理が重なると誤表示の可能性があります。
・Arduinoでタイマー割り込み:Lightning Brains
▲スケッチ
// 経過時刻表示
void loop() {
char buf[18]; // 表示バッファ
sprintf(buf, "%02d:%02d:%02d.%03d", hh, mm, ss, ms);
setCursor(2, 1);
sendText(buf, strlen(buf));
}
※時刻データ「hh, mm, ss, ms」は1msのタイマー割り込みで
カウントアップ。
▲状況
sprintfで4つの時刻データ(int値)を文字列に変換しています。
※「hh, mm, ss, ms」の読み出しはどのタイミングで
行われるか、どの順番でされるのか分かりません。
「hh, mm, ss, ms」の順だと仮定して、
「23:59:59.999」の時に「時と分」まで読み出したとすると、
文字列bufには「23:59」が入ります。
この直後にタイマー割り込みが入って1ms桁がカウントアップ
したら時刻データは「00:00:00.000」になります。
すると、「時分」に続く時刻データ「ss,ms」の読み出しは
「00.000」となってしまい、文字列bufは
「23:59:00.000」となり、ミス表示が出現します。
しかし、loop()処理だからすぐに次の表示が行われるので、
このミスには気が付きにくいでしょう。
表示が「チラ」と変化するだけですから。
▲対策
割り込み禁止状態「cli()実行」にして「hh, mm, ss, ms」を
別の変数にコピーします。
その後、「sei()」で割り込み有効状態に戻します。
そして、sprintfにはコピーした変数を食わせます。
コピーした値は割り込みが入っても変化しません。
面倒でもこうしないと、いつミスが生じるかわかりません。
表示だと実害は無いかもしれませんが、タイマー値を何かの制御
や計算に使っていたら「たまにおかしくなる」が発生します。
見つけにくいバグになってしまいます。
▲補足
これは8bitマイコンの1バイトでしか読み書きできない問題
ではなく、16bit、32bitマイコンでも発生するミスです。
▲補足2
もう一つ気になるのが、アウトプット・コンペアレジスタの
設定値です。
OCR1A = 62500;
OCR1A = 250;
のように、分周値をそのまま入れられてます。
「分周値 - 1」つまり「TOP値」でないと、1クロック余計に
カウントしてしまい、正しい周波数(周期)が得られません。
▲参考に
・『アトミック操作』・・・8bitマイコンに限り何か別の言い方なかったか?
・割り込みで処理させるwordデータの扱い
・Arduinoのタイマー OCRレジスタは「n」じゃなく「n - 1」の値を設定せよ
・Arduinoのタイマー処理
・Arduinoから「タイマー0」を取り上げる(ユーザーが使う)
※体言止めを書き直しました。
| 固定リンク
「Arduino」カテゴリの記事
- Arduino UNO R3で±19.9V表示電圧計(2023.10.14)
- 「御詠歌プレーヤー」の製作 (MP3-TF-16Pモジュールの使用例)(2023.08.10)
- Arduino UNO R3のソケット・・思えば違和感がぁ(2023.07.07)
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 液晶表示コントローラ HD44780で迎撃(2023.05.16)
「重箱の隅」カテゴリの記事
- C-MOS ICの入力ピンをオープンにすると(2023.11.01)
- トラ技の作図能力が落ちている・・・かもの続き(2023.10.31)
- トラ技の作図能力が落ちている・・・かも(2023.10.27)
- 不安な接続記号「●」(2023.06.07)
- トラ技Jr. 2023年春号(2023.04.12)
「割り込み処理」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 8ビットマイコンの割り込み処理・・・1バイトに収まるなら1バイトに(2023.03.01)
- 8bitマイコンにも16bitのメモリ読み書き命令があった(2022.10.14)
- 何度も言うぞ! Arduino(8bitマイコン)の割り込みには気をつけろ!(2022.10.11)
- ロータリーエンコーダーのチャタリング波形(2022.09.11)
コメント