質問: 0x00;//全部入力に設定 int_irq2(); set_imask_ccr(0); while(1) { } } 割り込みの設定がわるいのでしょうか? スイッチは、p1に接続してledはp2に接続しています・・・
回答: mainの中からint_irq2()を呼び出しちゃいけません。 割り込み処理関数は「特殊な呼ばれ方」をするので「特殊な戻り方」をするようになっています。 それなのに「mainの中から普通の呼び方で呼ぶ」と「特殊な戻り方」をしようとして辻褄が合わなくなり、暴走します。 割り込みからもmainからも、どちらからも同じ処理をしたいなら、以下のように「どっちからも呼ぶ、普通の関数」を作りましょう。 #include "iodefine.h" #include 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) { } }