[H8-ML(5734)] Re::H8/3069 タイマーカウンターが作動しません
From: "dimension" <dimension4500c@xxxxxxxxxxx>
Date: 2005年11月06日(日)18時51分42秒
こんばんは

鈴木さんが既に指摘されておられますが、補足情報。

> 4)プログラムの考え方について
> LCD_DisplayNumber(n)が、メインと割込みの2箇所にでて
> きますが、割り込みの中にまとめた方が良いのでは?
> メインルーチン(永久ループ)では、条件判断により常に
> 何かを表示する?LCDの表示ルーチン?が呼ばれていま
> すが、逆に言うと割込みが入らない間はひっきりなしに呼ば
> れ続けられています。
> できれば、メインルーチンは何も書かず、割込みの中で何を
> 表示するかを決めてLCDのルーチンを呼んだ方がわかり易い
> かと思います。
> 尚、割込みルーチンの中で使う変数はスタティック変数で宣言
> しないと内容が保持されませんので注意して下さい。

C言語の関数は、デフォルトでリエントラント(再入可能)に
コンパイルされます。
その結果、メイン処理中で、関数LCD_DisplayNumber()を実行の途中で、
(タイマー)割り込みが入ると、割り込み処理の中で、同じ、LCD_DisplayNumber()
が同関数の先頭から実行されてしまいます。

LCD_DisplayNumber()がLCDコントローラ制御信号線のアサート
/ネゲートする処理をやっていると仮定すると、その信号シーケンス
が、(タイマー)割り込みの瞬間に崩れてしまい、その結果
LCD表示が正しく動作しなくなる可能性があると思われます。

このリエントラントの動きを防止するには、ひとつの簡単なやり方には、
メイン処理で、関数LCD_DisplayNumber()をCALLする直前で、
タイマー割り込みをマスクし、同関数のCALL終了後
タイマー割り込みのマスクを解除します。

ほか、気づいた点として、割り込みを解除してからタイマーの初期設計
をやられていますが、考え方としては、処理の順が逆で、
初期設定を完了してから、割り込みを解除します。

そうしないと、初期化処理内容にもよりますが、初期設定にある種の設定確定
時間が必要な場合、割り込み処理が動作した場合、その時間遅れを発生し、初期設定失敗の
原因になりえます。(今回該当するわけではなさそうですが、ハード制御の
初期設定処理の基礎的ノウハウの一つと思います。)

dimension







スレッド概略
[表示中](起点)


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]