アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

https://sourceforge.jp/projects/cc1101driver/scm …


このプロジェクト内で、リアルタイムデバッグを行っているソースコードで、無線モジュール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としてみたのですが、この考えでよろしいのでしょうか?


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

A 回答 (3件)

>#define F_CPU 2000000UL



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

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

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

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

お礼日時:2014/08/27 09:42

検索すればすぐわかることですが、F_CPUはシステムクロック周波数の定数宣言ですね。


ですから8MHzで使うなら  #define F_CPU 8000000UL  が正解です。

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

あと、関数プロトタイプ宣言もちゃんと書きましょう。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2014/08/27 10:21

No.1です。


回答はしたものの・・・

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

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

お礼日時:2014/08/27 09:44

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