- ベストアンサー
H8SX/1655のアドレスエラー
- HEWのプログラミングで割り込みの勉強をしていますが、割り込みを使うとアドレスエラーが発生します。
- 実験回路のLEDをスイッチを押すことで点灯させることはできますが、割り込みを使うと実行できません。
- 割り込みの設定に問題があるのか、スイッチはP1に接続され、LEDはP2に接続されています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
mainの中からINT_IRQ2()を呼び出しちゃいけません。 割り込み処理関数は「特殊な呼ばれ方」をするので「特殊な戻り方」をするようになっています。 それなのに「mainの中から普通の呼び方で呼ぶ」と「特殊な戻り方」をしようとして辻褄が合わなくなり、暴走します。 割り込みからもmainからも、どちらからも同じ処理をしたいなら、以下のように「どっちからも呼ぶ、普通の関数」を作りましょう。 #include "iodefine.h" #include <machine.h> const unsigned char led[8] = { //0 1 2 3 4 5 6 7 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 }; unsigned char led_out[8]; void set_led(void) { led_out[0] = 0x00; //LEDを消す if(P1.PORT.BIT.B0 == 0) //スイッチが押されたら { led_out[0] = led[0]; //押されている間、点灯する } P2.DR.BYTE = led_out[0]; } // vector 66 External trap IRQ2 __interrupt(vect=66) void INT_IRQ2(void){ set_led(); } void main(void) { P2.DDR = 0xff;//ledを出力に設定 P1.DDR = 0x00;//全部入力に設定 set_led();//INT_IRQ2()は呼んではいけない set_imask_ccr(0); while(1) { } }