1

マイクロコントローラーの C コードで問題が発生しています。言語またはコンパイラの問題のようですが、プログラムは問題なくコンパイルされます。ただし、マイクロコントローラで実行すると、問題が明らかになります。

(これは Atmel AVR AtTiny26 用です。)

アナログからデジタルへのコンバーターから値を読み取り、10 を掛けています。

int SD;
SD = ADCH * 10;

これは正しく機能しませんでした。計算でADCから読み取ろうとすることが問題だと思ったので、試しました:

int SD;
SD = ADCH;
SD = SD * 10;

これも機能せず、マイクロが不安定になりました。(アナログ値が低い限り機能しますが、ある値に達すると、リセットするまで ADC から値を取得することはありません。)

これはうまくいくようです:

int SD;
int TEMP;
TEMP = ADCH;
SD = TEMP * 10;

別の変数を導入すると問題は解決しますが、ややこしいようです。どうしたの?

EE に関する関連質問: https://electronics.stackexchange.com/q/38404/2028

編集:

これは、コンパイルの最適化に関係している可能性があります。コンパイル時にコマンド ラインで -Os と -O2 または -O3 を指定すると、異なる結果が得られます。最適化によって、そのような変数割り当ての仕組みが変わる可能性はありますか?

4

1 に答える 1

0

SD次のように宣言する必要がありますvolatile

volatile int SD;

これは、レジスタの値がハードウェアによって変更される可能性があることを意味します (コンパイラによって制御されません)。あなたの場合、 の値はADCHハードウェアによって変更される可能性があるため、SDasを設定volatileすることで、使用する前にコンパイラーに再度それを読み取らせる (更新する) ように強制します。

于 2012-12-23T22:44:18.450 に答える