システムメンテナンスのお知らせ

マイコンのメインルーチン内でwhile(1)文を用いてループしたとき、正常な動作をしない事があります。

使用しているマイコンはAVRです。

具体的には



各種インクルードファイル
int temp =0;

//tempはタイマー割り込みによって加算される

int main (void)
{
初期設定
while(1)
 {
  if (temp >= 50)
{
    全割り込み禁止
    LED出力トグル
temp =0;
    全割り込み許可
  }
 
 }
}

と記述するとwhileループ内のif分岐がうまく処理されない事があります。

この時whileループ内に1usのdelayを入れると正常に動作します。

具体的には

int main (void)
{
初期設定
while(1)
 {
  if (temp >= 50)
{
    全割り込み禁止
    LED出力トグル
temp =0;
    全割り込み許可
  }
  _delay_us(1);
 }
}
のように記述すれば問題なく動きます。

このような症状の原因としては何が考えられますでしょうか?

gooドクター

A 回答 (2件)

割り込みで値が変化する場合、


コンパイラにそれを教えないといけません。
volatile int temp =0;
にしてみては?
    • good
    • 0
この回答へのお礼

変数temp にvolatileをつけてみたところ、delayなしでも正常に動作するようになりました。

的確なご回答を頂きましてありがとうございました。

お礼日時:2020/05/13 19:34

何が「正常な動作」で, 具体的にはどう「うまく処理されない」ことがあるんですか?

    • good
    • 0
この回答へのお礼

ご回答いただきましてありがとうございます。

if分岐が実行されることが期待する動作でしたが、if分岐が実行されない事があり、それを質問させていただいておりました。

質問文に不足がありました事、お詫び申し上げます。

また機会がございましたらぜひお力をお貸しいただけますと幸いです。

お礼日時:2020/05/13 19:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング