• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:H8SX/1655のアドレスエラー)

H8SX/1655のアドレスエラー

このQ&Aのポイント
  • HEWのプログラミングで割り込みの勉強をしていますが、割り込みを使うとアドレスエラーが発生します。
  • 実験回路のLEDをスイッチを押すことで点灯させることはできますが、割り込みを使うと実行できません。
  • 割り込みの設定に問題があるのか、スイッチはP1に接続され、LEDはP2に接続されています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)  {  } }

関連するQ&A