みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

#define F_CPU という設定

現在Atmel Studio6.1 + JTAGICE3でATmega88Pのプログラミングを行っています。

https://sourceforge.jp/projects/cc1101driver/scm/svn/tree/head/branches/test002_AVRS6_20140819/test02/


このプロジェクト内で、リアルタイムデバッグを行っているソースコードで、無線モジュールIC CC1101がある端末出力されて受信したデータがあった場合、SPI通信でATmega88PマイコンにSPI通信割り込みでデータを送信して、データ内容で条件が適合するとAtmega88pの特定のeepromアドレスへ受信データ内容の一部データ(IDコード)を書き込むようにしている箇所があります。


u8 setup_oper() 関数内の

length = cc1101_rx((u8 *)fifo,0);
if(length > 0)
{
gggLength = length;
if(length == sizeof(fifo_t) && fifo-
           
           ・・・・(中略)・・・・
}


リアルタイムデバッグ中に上記のコードで端末側がデータ送信を行っているのに、受信した場合にlength = cc1101_rx((u8 *)fifo,0); のコード部分では受信したデータのlength値が代入されるはずなのですが、それが”0”のままであるため、eepromへの書き込みが行われていないことに気づきました。




いろいろとソースコードの修正を試みたところ、

#define F_CPU 800000UL

元々このように設定されていたコードを


#define F_CPU 2000000UL


このように変更したところ、正常にCC1101からのSPI通信もeepromへのデータ書き込みもうまくいくことがわかりました。


この”#define F_CPU”というコードはどのような意味があるのかご教示頂きますよう、よろしくお願い致します。


また、現在Atmega88pの元周波数は8MHzを使用したく、8CKDIVのチェックを外しています。

なので、

#define F_CPU 8000000UL

このように設定してみたところ、これだとCC1101とのSPI通信ができないようでeeprom書き込みのコードに到達できなくなります。


#define F_CPU 2000000UL


これは内部周波数が元の8MHzを4分周した2MHzのことなのだろうか?
このように思って2000000ULとしてみたのですが、この考えでよろしいのでしょうか?


どうぞ、ご教示頂き増増すよう、よろしくお願い致します。

投稿日時 - 2014-08-22 15:05:11

QNo.8726164

すぐに回答ほしいです

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

>#define F_CPU 2000000UL

マクロ定数と言い、関数内で”F_CPU”と記述すれば、コンパイル時に2000000という数字に置換されます。
複数回F_CPUを使っていても、#define行の数値だけを変更してリコンパイルすれば、全てのF_CPUが一括変更されるので非常に便利です。

例えば
clock_A = F_CPU/4 ;
と記述してコンパイルすれば
clock_A = 2000000/4 ;
と置換され、clock_Aが求められます。

後半の質問はソースコードの解析が必要なので、さすがに回答出来ません。

投稿日時 - 2014-08-22 15:44:26

お礼

回答頂きありがとうございます。助かります。

投稿日時 - 2014-08-27 09:42:11

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

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

回答(3)

ANo.3

検索すればすぐわかることですが、F_CPUはシステムクロック周波数の定数宣言ですね。
ですから8MHzで使うなら  #define F_CPU 8000000UL  が正解です。

なぜ意図した動作をしないかですが、まず警告メッセージのないソースにしなければデバッグどころではありませんよ。
cc1100.cやi2c.cではF_CPUが宣言されていないので、デフォルトの10MHzとしてコンパイルされています。
まあ、_delay_msの精度がでないだけなのでたいした問題ではないでしょうが・・・・

あと、関数プロトタイプ宣言もちゃんと書きましょう。

投稿日時 - 2014-08-22 19:51:37

お礼

回答頂きありがとうございます。今までAVR Studio4 + winAVRでのプログラムではF_CPUというのは無かったように思うのですが、Atmel Studio5からはこのような定義が必要になったということを確認しました。

今まではマイコンの内部クリスタルの周波数を使う場合はヒューズビットの設定で内部周波数が決定されると思っていました。

投稿日時 - 2014-08-27 10:21:01

ANo.2

No.1です。
回答はしたものの・・・

まさか#defineの意味も解らずに、Cソースを読んだり書いたりする人はいないよな?
と考えたら、回答が的外れのような気がしてきました。
だとしたら、ゴメンなさい。

投稿日時 - 2014-08-22 15:53:43

お礼

回答頂きありがとうございます。#defineというのを使ったことが無いわけではないのですが、AVR Studio4 + winAVRでのプログラミングの時には、#define F_CPU 2000000ULこのようなマクロ定義のコードを書いたことが無かったので、今度からは必要なのかなと感じております。

投稿日時 - 2014-08-27 09:44:00

あなたにオススメの質問