D40冷却改造奮闘記 その9
プログラム解説の二回目です。前回説明し切れなかったところを補足説明したいと思います。
アナログ入力
このマイコンは8チャンネル10ビットのAD変換機を内臓していて、0~5Vの電圧をデジタルの0~1023の値に変換してくれます。温度センサーをAD変換機のチャンネル0(AN0)、湿度センサーをチャンネル1(AN1)に接続しています。
どのチャンネルから入力するかの選択はシンボルADCSRの下位3ビットで設定します。たとえばチャンネル1から入力したいなら最初にADCSR = 1;と初期化します。
スイッチ入力
3つのプッシュスイッチを割り込み入力端子(IRQ0~IRQ2)に接続しています。IRQ端子は入力レベルが5V->0Vに変化すると割り込みが発生して、関数irq0()~irq2()が自動的に呼ばれます。
3つのプッシュスイッチは、モード、アップ、ダウンの機能があります。モードスイッチは、どの値を変えるかを選択するスイッチで押すと、液晶のカーソル(>)が移動します。アップスイッチは設定値を上げるスイッチです。ダウンスイッチは設定値を下げるスイッチです。ほんとは、スイッチを4つにして、カーソルの移動を両方向にしたかったのですが、ケースの中に入りませんでした。
スイッチは押すと、チャタリングというON/OFFを繰り返す現象が必ずおきるので、一回押しただけなのに、何回も割り込み関数が起動されてしまうということが起こります。それを避ける処理が関数の先頭に記述されています。まず、2000ループ待った後、スイッチの状態を入力し、指が離れるのを待ちます。それからもう一度2000ループ待ってから処理を始めます。このループ回数はスイッチによって違うので、実際に確認しながら決めます。
もし、もう一個スイッチを増やすなら、IRQ3端子に接続してプログラムを次のように変更します。
460行目を次のように変更
//スイッチ入力IRQ割り込み初期化
PMR1 |= 0xF0;
IENR1 |= 0x0F;
次に、YellowIDEのメニューの(プロジェクト)→(設定)を開き、(割込み)のページをクリックし、ベクタ番号17、関数名irq3として(登録)をクリックします。
割り込み関数は次のように記述します。
void interrupt irq3(void)
{
int i;
for (i = 0; i < 2000; i++) {
; //スイッチのチャタリング防止のため少し待つ
//この間、タイマー割り込みが入らないので、時間がずれる可能性あり
}
PMR1 = 0;
while ((PDR1 & 0x80) == 0)
;
PMR1 = 0xF0;
for (i = 0; i < 2000; i++) {
; //スイッチのチャタリング防止のため少し待つ
//この間、タイマー割り込みが入らないので、時間がずれる可能性あり
}
==ここに処理を書く==
IRR1 &= ~8;
}
液晶表示
液晶表示に関しては少々込み入っていますので説明を省略させてもらいます。回路図どおり作成すればプログラムは問題なく動作します。
| 固定リンク
コメント