• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:AVRのサーボ制御で困っています。)

AVRのサーボ制御で困っています

このQ&Aのポイント
  • AVRマイコンを使用してサーボを8個制御するプログラムをC言語で作成中です。
  • プログラムではタイマ2とタイマ0を使用してサーボを動かし、グローバル変数を使用してサーボの角度を制御しています。
  • しかし、特定のプログラムの箇所が飛ばされて実行されてしまう問題が発生しています。どうしてそれが起こるのかを教えてください。

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

  • ベストアンサー
  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.1

こんにちは。 servopos[FR_LEG]=31;   // ←1 servopos[RL_LEG]=31; <中略> servopos[FR_LEG]=94;   // ←2 servopos[RL_LEG]=94; 1の処理の後、その変数を使う事なく2の処理で新しい値(94)をセットしているため、コンパイラ君が 「ん?もしかして1の処理って要らないんじゃね?」 と気を利かせて、1を削除したと思われます。 処理1にも意味があるんだよ、という事をvolatileというキーワードで教えてあげればよいと思います。

mildwel
質問者

お礼

回答ありがとうございます。volatileで宣言したらうまく動作しました。 volatile修飾子というのをはじめて知ったので調べてみました。AVR wikiのよくある質問を見てみたら「コンパイラが勝手にループの中の式を削除しちゃうんですけど。」というところにvolatile修飾子のことが書いてありました。指摘してくださったとおり最適化の対象になるみたいです。 これで滞りなくプログラミングできそうです。

関連するQ&A