一連の Si4735 ラジオモジュールの記事を参考に製作チャレンジされた方から質問をいただきました。(Si4735 ラジオモジュール進捗と〆のコメントにて) 内容は、局の選択後に信号強度のSがリアルタイム更新されないけど対応はあるかというものです。今回その対応分のソースの zip を下のリンクに貼っておきます。また、以下は差分情報になります。
最新のソースは Si4735 ラジオモジュールの Blog 記事一覧 から取って下さい。
$ diff -p Si4735Radio_Ver0.01/ Si4735Radio_Ver0.02
diff -p Si4735Radio_Ver0.01/Si4735.cpp Si4735Radio_Ver0.02/Si4735.cpp
*** Si4735Radio_Ver0.01/Si4735.cpp 2012-12-15 09:31:55.671118400 +0900
— Si4735Radio_Ver0.02/Si4735.cpp 2012-12-15 09:32:02.617515700 +0900
*************** void Radio::updateFMTuneStatus() {
*** 163,168 ****
— 163,189 —-
}
}
+ void Radio::updateFMRsqStatus() {
+ int i;
+
+ i2c.beginTransmission(SI4735ADR);
+ i2c.write(0x23);
+ i2c.write(0x20);
+ i2c.endTransmission();
+ _delay_ms(2);
+
+ i2c.requestFrom(SI4735ADR, 6);
+ for(int i = 0; i < 6; i++) {
+ switch(i) {
+ case 4:
+ FMrssi = i2c.read();
+ break;
+ default:
+ i2c.read();
+ }
+ }
+ }
+
void Radio::updateAMTuneStatus() {
int i;
*************** void Radio::updateAMTuneStatus() {
*** 191,196 ****
--- 212,237 ----
}
}
+ void Radio::updateAMRsqStatus() {
+ int i;
+
+ i2c.beginTransmission(SI4735ADR);
+ i2c.write(0x43);
+ i2c.write(0x00);
+ i2c.endTransmission();
+ _delay_ms(2);
+
+ i2c.requestFrom(SI4735ADR, 6);
+ for(int i = 0; i < 6; i++) {
+ switch(i) {
+ case 4:
+ AMrssi = i2c.read();
+ break;
+ default:
+ i2c.read();
+ }
+ }
+ }
int Radio::getFMFreq() {
return(FMfreq);
diff -p Si4735Radio_Ver0.01/Si4735.h Si4735Radio_Ver0.02/Si4735.h
*** Si4735Radio_Ver0.01/Si4735.h 2012-12-15 09:31:55.795125500 +0900
--- Si4735Radio_Ver0.02/Si4735.h 2012-12-15 09:32:02.628516300 +0900
*************** class Radio {
*** 41,46 ****
--- 41,48 ----
void seekDownAMFreq();
void updateFMTuneStatus();
void updateAMTuneStatus();
+ void updateFMRsqStatus();
+ void updateAMRsqStatus();
int getFMFreq();
int getAMFreq();
int getFMRssi();
diff -p Si4735Radio_Ver0.01/Si4735Radio.cpp Si4735Radio_Ver0.02/Si4735Radio.cpp
*** Si4735Radio_Ver0.01/Si4735Radio.cpp 2012-12-15 09:31:55.816126700 +0900
--- Si4735Radio_Ver0.02/Si4735Radio.cpp 2012-12-15 09:32:02.638516900 +0900
*************** void loop() {
*** 146,151 ****
--- 146,152 ----
switch(mode) {
case FM:
radio.updateFMTuneStatus();
+ radio.updateFMRsqStatus();
ffreq = radio.getFMFreq();
int tmp01, tmp02;
tmp01 = radio.getFMFreq() / 100;
*************** void loop() {
*** 154,159 ****
--- 155,161 ----
break;
case AM:
radio.updateAMTuneStatus();
+ radio.updateAMRsqStatus();
afreq = radio.getAMFreq();
sprintf(msg, "AM %4dkHz S:%i", radio.getAMFreq(), radio.getAMRssi());
break;
$
[/code]
あと、Atmel Studio6 のプロジェクト設定で、以下ハードコピーのように delay マクロ用の周波数定義を入れておくと良いです。