- ベストアンサー
#define F_CPU という設定の意味と内部周波数の影響
- この質問は、Atmel Studio6.1 + JTAGICE3でATmega88Pのプログラミングを行っている中で、リアルタイムデバッグ中に発生した問題に関するものです。
- #define F_CPUは、プログラム内で使用されるクロック周波数を指定するマクロ定義です。内部周波数の変更によって、CC1101とのSPI通信やeepromへのデータ書き込みに影響が生じることがあります。
- 元周波数が8MHzの場合、8CKDIVのチェックを外すことで内部周波数が8MHzに設定され、コードに到達できます。一方、4分周した2MHzの場合、CC1101とのSPI通信ができなくなります。2000000ULという値は、内部周波数を2MHzに設定するためのものですが、この考えで正しいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>#define F_CPU 2000000UL マクロ定数と言い、関数内で”F_CPU”と記述すれば、コンパイル時に2000000という数字に置換されます。 複数回F_CPUを使っていても、#define行の数値だけを変更してリコンパイルすれば、全てのF_CPUが一括変更されるので非常に便利です。 例えば clock_A = F_CPU/4 ; と記述してコンパイルすれば clock_A = 2000000/4 ; と置換され、clock_Aが求められます。 後半の質問はソースコードの解析が必要なので、さすがに回答出来ません。
その他の回答 (2)
- kabasan
- ベストアンサー率44% (264/588)
検索すればすぐわかることですが、F_CPUはシステムクロック周波数の定数宣言ですね。 ですから8MHzで使うなら #define F_CPU 8000000UL が正解です。 なぜ意図した動作をしないかですが、まず警告メッセージのないソースにしなければデバッグどころではありませんよ。 cc1100.cやi2c.cではF_CPUが宣言されていないので、デフォルトの10MHzとしてコンパイルされています。 まあ、_delay_msの精度がでないだけなのでたいした問題ではないでしょうが・・・・ あと、関数プロトタイプ宣言もちゃんと書きましょう。
お礼
回答頂きありがとうございます。今までAVR Studio4 + winAVRでのプログラムではF_CPUというのは無かったように思うのですが、Atmel Studio5からはこのような定義が必要になったということを確認しました。 今まではマイコンの内部クリスタルの周波数を使う場合はヒューズビットの設定で内部周波数が決定されると思っていました。
- black2005
- ベストアンサー率32% (1968/6046)
No.1です。 回答はしたものの・・・ まさか#defineの意味も解らずに、Cソースを読んだり書いたりする人はいないよな? と考えたら、回答が的外れのような気がしてきました。 だとしたら、ゴメンなさい。
お礼
回答頂きありがとうございます。#defineというのを使ったことが無いわけではないのですが、AVR Studio4 + winAVRでのプログラミングの時には、#define F_CPU 2000000ULこのようなマクロ定義のコードを書いたことが無かったので、今度からは必要なのかなと感じております。
お礼
回答頂きありがとうございます。助かります。