H8/3048F IRQポートを使った外部割込みについて
秋月電子のH8/3048Fマイコンボードを購入し、C言語による組み込みプログラムの演習を行っていて、マイコンボードのIRQ端子を使った外部割込みを実装しようとしてつまずいてしまいました。
メインループでLED点灯などの処理を行い、タクトスイッチの押下があったら別の処理を割り込ませ、またもとの処理に戻るという外部割込み処理を行いたいのですが、うまくいきません。
今おきている問題としては、
(1)電源の投入して、メインの処理(LED点灯)が行われる前になぜか一度IRQ割り込みが発生し、別処理が行われ、その後メインの処理を行う。
(2)IRQポートには立下り割り込み処理を行いたいので、プルダウン抵抗回路を組み、通常状態では、
IRQポート→チャタリング防止用のシュミットトリガ74LS19(NOT回路が含まれている)→10KΩの抵抗器→GND
という回路でHIGH状態からタクトスイッチによる押下が行われたら、
0.1μFのコンデンサ→+5V
という回路につながり、LOWになって、立下りエッジが検出され、割り込み処理が行われるはずだが、タクトスイッチを押下してもなかなか反応せず、5~6回押さないと割り込みが行われない。
(3)割り込み処理実行後、元の処理に戻らない。(このとき、タクトスイッチ押下による割り込み処理は再度受け付けてくれる)
の3点です。
C言語関連のH8マイコンの教材は無く、Web上の情報でしか勉強していないので、必要な知識が欠けているかもしれませんが、どなたかお知恵を貸していただけないでしょうか?
当方のH8/3048Fによるプログラミング暦は1ヶ月ほどで、LEDの制御、外部スイッチ入力による処理等基本的なことは出来ていると思います。
メイン処理と割り込み処理のソースコードを載せておきます。
void int_irq0() //割り込み処理関数
{
/*
lcd_init();
lcd_locate(0,0);
lcd_print("ワリコンダYO!");
wait(500);
lcd_locate(0,0);
lcd_print("モトニモドルYO!");
*/
P5.DR.BIT.B0 = 1;
wait(300);
P5.DR.BIT.B0 = 0;
wait(300);
INTC.ISR.BIT.IRQ0F = 0; //ISRフラグをクリアする
}
void main(void){
//char moji[16] = "AKI-H8";
unsigned int rand_seed = 100;
P1.DDR = 0x00;
P5.DDR = 0xff;
PB.DDR = 0xff;
INTC.ISCR.BYTE = 0;
INTC.ISCR.BIT.IRQ0SC = 1; //立下りエッジで割り込み検出
INTC.IER.BIT.IRQ0E = 1;
EI;
srand(rand_seed);
timer_init(); /* タイマーの初期化 */
lcd_init(); /* 液晶表示器の初期化 */
lcd_locate(0,0); /* カーソル位置の指定 */
lcd_print("スイッチオセ!"); /* 文字列の表示 */
while(1){
//disp_data();
led_randset();
wait(100);
led_allclr();
wait(10);
} /* 無限ループ */
}