こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

H8SX/1655のアドレスエラー

HEWのプログラミングで、割り込みの勉強をしているんですが
なかなかうまくいきません・・・

割り込みを使わないで、実験回路のLEDをスイッチを押すことで
つけることはできました。

が、割り込みを使うとアドレスエラーとなり実行できません。。。
割り込みのプログラムはこんな感じです。
// vector 66 External trap IRQ2
__interrupt(vect=66) void INT_IRQ2(void){



led_out[0] = 0x00; //LEDを消す

if(P1.PORT.BIT.B0 == 0) //スイッチが押されたら
{
led_out[0] = led[0]; //押されている間、点灯する
}

P2.DR.BYTE = led_out[0];

}

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 main(void)
{


P2.DDR = 0xff;//ledを出力に設定
P1.DDR = 0x00;//全部入力に設定

INT_IRQ2();
set_imask_ccr(0);


while(1)
{
}
}

割り込みの設定がわるいのでしょうか?
スイッチは、P1に接続してLEDはP2に接続しています・・・

投稿日時 - 2010-12-20 12:04:30

QNo.6396038

困ってます

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

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)
 {
 }
}

投稿日時 - 2010-12-20 12:20:53

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問