| ホーム |     私の電子工作作品集

188. FMステレオラジオ II

[ 初公開日:2020年11月14日 ]

 RDA5807M IC チップの FMラジオモジュールを使用した、前作 "187. FMステレオラジオ" を製作、公開してから1か月ほどが経ちますが、もう1台、アンプモジュールを省いて小型化を図り、 ポケットにも入る携帯用として2号機の製作をしてみました。 アンプがないので大きなスピーカーを駆動することはできませんが、ヘッドフォン(イヤホン)で聞くには十分です。

 前作では、8 ピンの PIC を使用したために I/O ポート数が足らなくて、十分な機能を持たすことができませんでした。 そこで今回は、14 ピンの PIC16F684 に変更をして、電源には単3乾電池2本という構成にしました。 そして、スリープ機能の追加、ステレオ放送時の LED 点灯、受信強度の LCD 表示、SEEK 機能での選局など、前作にはなかった新しい機能を盛り込んでみました。  なお、PIC16F684 は、"183. ラーメン・タイマー III" を製作するときに購入をしたもので、本機のように、乾電池使用で低電圧電源のときや、上述のように 8 ピン PIC の I/O ポート数を、 もう少し増やしたいようなときに使用をすると、とても重宝をします。

テーブルデータのアドレス計算プログラムのバグを修正 ( 2021/1/6 更新 ) ( 2021/1/12 再更新 )

 前作 "187. FMステレオラジオ" で述べたことと同じ理由により、FM ラジオ放送局をプリセットデータで選局するための、「FM ラジオ放送局 データテーブル」の、アドレス計算プログラムにバグがありました。 テーブルのデータ数が 13 までのプリセットデータについては問題はないのですが、その数を超えたプリセットデータ分については正常な選択ができませんでした。

 私が住んでいる地区では、FM ラジオ放送局が 13 を超えることはないので、このようなことは起こりませんが、東京周辺地区にお住まいの方は放送局数が多いので、プリセットの設定数が 13 を超えたときには、この症状が現れます。 詳細は、前作 "187. FMステレオラジオ" の プログラム の項の後半部分を参照してください。

 なお、本機 "FMステレオラジオ II" の修正プログラムは、本ページのプログラムの項の 現在の最新バージョン: Ver. 1.07b に収録がしてありますので、ご利用ください。 (再更新はコメントを追加しただけで影響はありません。)

【 お知らせ 】 ( 2022/1/27 )

 次の回路図下の 注3. で述べている「当初計画していた機能を持たせる」ためと、使用した電源スイッチの不満を解消するために、"194. FMステレオラジオ III" を新たに製作し、ページの公開をしました。 PIC には、本機で使用した PIC16F684 と同様に 14 ピンですが、私にとっては初めての使用となる PIC16F1 ファミリーの、PIC16F1705 を採用したものとなっています。 ご興味がありましたら、ぜひご覧になってください。

■ 回路図 ■

*注1. PIC の RA1、RA2、RA5 は内部プルアップ機能を ON にして使用。 RA3 は入力専用で、出力ポートには使えない。 また、内部プルアップ機能もないため、外付け抵抗 10KΩでプルアップ。
*注2. LED(高輝度 赤)は ステレオ放送のときに点灯させるもので、この LED は正面から見ることが多いため眩しいので、輝度を抑えたいために電流制限抵抗は通常より大きな 8.2KΩを使用。
    (参考: 3V の電源に接続したときの実測値: 7.5 KΩのとき ≒ 223μA、8.2KΩのとき ≒ 204μA、9.1KΩのとき ≒ 182μA、10KΩのとき ≒ 167μA)
*注3. 図中で ( 注 ) とあるのは、終盤になってから予定を変更したためで、当初計画していた機能を持たせることが、PIC16F684 ではできないことが分かったため、未使用で宙ぶらりんになっている。

 当初、VOLUME UP に RA4 を使用して、RA3 は未使用にしていたのですが、RA3 はデジタル入力専用にしか使用ができないため、RA3 と RA4 を入れ替え、アナログ入力にもデジタル入出力にも使用ができる、 RA4 を将来の拡張用に取っておくように変更をしました。 ただし、RA3 を入力ポートとして使用するときには、上図のように外付け抵抗でプルアップをする必要があります。

FMラジオモジュールについて

 このモジュールを使用するにあたって、予め知っておいていただきたいと思い、前作で述べたことをここに再掲をしておきます。

 このモジュールを使用した実際の製作例をネットで検索をしてみると、いろいろとヒットをしますが、それらの製作例には ROUT / LOUT の出力端子が、上回路図とは逆 * に取り扱っている例が多く見受けられますが、 それらは間違いだと思います。 RDA5807M チップのデータシートを見てみると、9 ピン = ROUT10 ピン = LOUT となっており、実際のラジオモジュールを観察してみると、上図のようにチップの 9 ピン = ROUT はモジュールの 8 番端子、 チップの 10 ピン = LOUT はモジュールの 7 番端子に繋がっています。 テスターで導通を確認しました。

    * 逆: あるネットショップ(私が購入したショップ)の商品説明で、写真画像に信号名が書かれているものがあって、それが逆に示されているためと思われる。

| 回路図 (FM_StereoRadioII.CE3) | ページトップ |

■ ケース外観と内部の様子 ■

ケース正面の斜め上から見たところ ケース上側面の斜め上から見たところ
ケース左側面の斜め上から見たところ ケース右側面の斜め上から見たところ
ケース正面を真上から見たところ ケース裏面を真上から見たところ
蓋をあけて内部の様子を見た様子( 拡大 電源スイッチを ON 後、選局をした様子

| ページトップ |

■ 機能概要と使用法 ■

  • 本機 FMステレオラジオ II では、FMラジオモジュール( RDA5807M )と、LCDモジュール( AQM0802A-RN-GBW )を使用し、共に PIC から I 2 C 接続で制御をしている。 なお、本機ではパワーアンプを省いて小型化を図ったため、 ヘッドフォン(イヤホン)で聞くことを想定している。

  • さて、本機の電源スイッチをオンにすると、LCD に次の開始メッセージが交互に2秒間ずつ連続2回表示される。
      			[ FmStereo ]			[ Ver x.xx ]
      			[ Radio II ]			[  by M.Y  ]
      

  • その後、2秒間無表示の後、PIC の EEPROM にバックアップが取られている、前回のセーブ情報(ラジオ局番号、音量設定値)が読み出され、そのラジオ局番号を基にして、 予め番号毎にプリセットがされている情報に変換をする。

  • そして、LCD の1行目にはラジオ局名、2行目には音量設定値(範囲: 0〜15)が表示されるとともに、必要情報を FMラジオモジュールに設定をして、選局、および音量を調節して音声を出力する。

  • この2行目に表示されている音量設定値は初めの約2秒間で、続いて FMラジオモジュールから得た情報の内の、受信強度が約2秒間表示される。 また、ステレオ放送がされているときには、LED (赤)を点灯させる。 その後は、受信しているラジオ局の周波数が表示されて、ユーザがスイッチ操作をするか、PIC がスリープ状態に移行するまで表示し続ける。
      			[ NHK FM   ]			[ NHK FM   ]			[ NHK FM   ]
      			[  Vol:xx  ]			[  Lev:xx  ]			[  82.5MHz ]
      

  • なお、プログラム作成時のデフォルトの EEPROM セーブ情報には、ラジオ局番号 = 名古屋周辺地区では 3、東京周辺地区では 4、大阪周辺地区は 3 の、共に NHK FM で、音量 = 2(範囲: 0〜15)に設定がされている。

  • 周波数の表示の後は、ユーザのスイッチ操作待ちとなって、各スイッチの ON/OFF 状態を監視するが、1分が経過してもスイッチ操作がないときには、乾電池電源のための省電力化として、タイマーによるカウントを停止させ、 PIC をスリープ状態にするとともに、LCD の電源も OFF にし、LED も消灯させる。 これらの操作は既に選局が済んでいる FMラジオモジュールの動作には影響がない(音声は出力され続ける)。

  • 本機では、FMラジオモジュールを操作するためのタクトスイッチが4個あり、まず、 ラジオ局番号(各ラジオ局の局名、周波数、FMラジオモジュールへの設定情報を、番号毎にプリセットしてある)を選択するため に、 TUNING DOWN スイッチTUNING UP スイッチ がある。 なお、ラジオ局番号はプログラム内部で使用をしている番号であって、LCD に表示されることはない。

  • この番号毎にプリセットしてある情報には、名古屋周辺地区用、東京周辺地区用、大阪周辺地区用の3種類が用意されていて、それらをタクトスイッチとは別に、SELECT 1, 0 の2個の DIP スイッチの操作によって、 簡単に変更をすることが可能である。 ただし、この操作は電源スイッチをオンにする前に行っておく必要がある
      			SELECT 1	SELECT 0	( 選局方法 )
      			  0		    0   	名古屋周辺地区用 ┐
      			  0		    1   	東京周辺地区用  │プリセット情報で選局
      			  1		    0   	大阪周辺地区用  ┘
      			  1		    1   	100kHzステップ毎の SEEK機能で自動選局
      
  • 上記の プリセット情報で選局する場合 には、TUNING DOWN スイッチ は、押す毎にラジオ局番号が−1され、0 の次は、プログラム設定されている内の、最大値となる。 また、TUNING UP スイッチ は、押す毎にラジオ局番号が+1され、最大値の次は、0 となる。

  • SEEK機能で選局する場合 には、TUNING DOWN スイッチ を押すと、現在選択されている放送局の周波数から、100kHz ステップ毎に減る方向にシークダウンしながら選局を行う。 また、TUNING UP スイッチ を押すと、逆に、周波数が 100kHzステップ毎に増す方向にシークアップしながら選局を行う。 そして、帯域の上限または下限では停止しないでラップをし、シークを続行する。 なお、本機では、帯域を 76 〜 108 MHz に予め設定がしてある。

  • 次に、音量(範囲: 0〜15)を調節するため に、VOLUME DOWN スイッチと VOLUME UP スイッチがあり、VOLUME DOWN スイッチ は、押す毎に音量が−1され、0 になると、それ以上押しても更新されることはない。 また、VOLUME UP スイッチ は、押す毎に+1され、最大値 15 になると同様に、それ以上押しても更新されることはない。

  • このように、4個のタクトスイッチのどれかを操作すると、ラジオ局番号/シーク選局、または音量設定値が更新され、それに応じて LCD の表示、または音声出力の音量が変更される。
      			[ FM AICHI ]			[ FM AICHI ]			[ FM AICHI ]
      			[  Vol:xx  ]			[  Lev:xxx ]			[  80.7MHz ]
      

  • また、4個のタクトスイッチのどれかを操作したときには、現在カウント中のタイマーが、必ずクリアされて新たに0からカウントが始まり、LCD の2行目に表示される内容は上述のように、初めの2秒間は音量設定値が、 次の2秒間は受信強度が表示され、その後は、周波数が表示されるようになる。
      			タイマーカウントの開始 ・・・ FMラジオモジュールの設定、
      							ラジオ局名、音量設定値の表示
      			   カウントの2秒後 ・・・ FMラジオモジュールから情報の読み出し
      							受信強度の表示
      					4秒後 ・・・ 周波数の表示
      					6秒後 ・・・ セーブ情報をバックアップ
      					1分後 ・・・ スリープ状態に移行
      
  • そして、カウントが0から始まって6秒が経過をすると、現在 FMラジオモジュールに設定されているプリセットの番号(ラジオ局番号)と音量設定値を、電源 OFF 後の次回の本機の使用時に備えたセーブ情報として、 PIC の EEPROM に自動的にバックアップが取られる。

  • したがって、この2秒、4秒、6秒、1分の各カウント値が経過する以前に、4個のスイッチのどれかを続けて押した場合には、押す度に必ず0からの新たなカウントがされるようになる。

  • 特に、セーブ情報のバックアップについては、スイッチの操作毎に無条件で取るのではなく、このように一定の時間監視(6秒間)を行い、続く操作がなくなった時点でバックアップを取るようにしている。 すなわち、6秒が経過する以前に次の操作があった場合には、前の操作のバックアップは取られず無視される。 これは書き込み回数に制限がある EEPROM の寿命を延ばすために、無駄な書き込みをしないための処置である。

  • なお、SEEK機能で選局する場合のセーブ情報は、ラジオ局番号ではなく、FMラジオモジュールに設定するためのチャネル情報等と音量設定値が対象となる。

  • また、同様に SEEK機能で選局する場合には、FMラジオモジュールを設定した直後には、まだ選局したラジオ局名が定まらないため、LCD の1行目の表示には次のように、シークを実行中である旨を表示をする。
      			[ * Seek * ]			[ NHK FM   ]			[ NHK FM   ]
      			[  Vol:xx  ]			[  Lev:xx  ]			[  82.5MHz ]
      

  • そして、タイマーカウント開始の2秒後のタイミングで、FMラジオモジュールから読み出した情報(チャネル情報)と、プリセットで選局するときの登録情報をもとにラジオ局名を特定して、LCD の1行目の表示を書き換える。 また、2行目に表示されるタイミングと表示内容は、プリセット情報で選局するときと同様である。

  • なお、このときにプリセットで選局するときの登録情報内に、FMラジオモジュールから読み出した情報(チャネル情報)が登録されてなかったときには、ラジオ局名が特定できないため、1行目は次のように表示をする。
      							[ ???????? ]			[ ???????? ]
      							[  Lev:xx  ]			[  xx.xMHz ]
      

  • このときの2行目の周波数の表示には、FMラジオモジュールから読み出した情報(チャネル情報)を、計算によって周波数に変換をして表示をする。

  • 本機の4個のタクトスイッチの機能については上述した通りであるが、他に PIC がスリープ状態になっているときだけには、RA ポート変化割り込みの機能を持たせて、4個のタクトスイッチのどれかを操作したときに、 スリープからウェイクアップをさせるようにしている。

  • そして、このウェイクアップをした直後には、再び LCD の電源を ON にして、消してしまっていた表示内容の復活、ステレオ放送のときには LED も点灯をさせる。 このときは FMラジオモジュールに対しての設定は、 既に済んでいるので再設定は行わないが、タイマーのカウントを開始をして、そのタイミングでもって FMラジオモジュールから情報の再読み出しを行ったり、LCD への各種の情報の表示は上述と同様に行う。

  • また、ウェイクアップの直後というのは、4個のタクトスイッチのどれかを操作しても、スリープから目覚めさせることが目的であって、FMラジオモジュールに対して設定の変更は行っていないため、 このときには6秒が経過してもセーブ情報のバックアップも行わない。


    ( Ver. 1.06 で以下を追加 )

  • 周波数-対-受信強度をグラフ化した、FM スペクトラム図 を作成するために、各チャネルの周波数に対する RSSIデータを収集する機能 を追加した。

  • 本機の電源スイッチをオンにした後の開始メッセージが終了する直前までに、TUNING_UP スイッチと VOLUME_DOWN スイッチを同時に押している と、RSSIデータを収集する機能を開始する。

  • 数秒後に押していた手を離すと、まず、LCD の1行目に周波数(76.0MHz)、2行目にその受信強度が表示される。 本機では 76 〜 108 MHz (world wide) の帯域をカバーしているので、下限の 76.0MHz から始まる。
      			[  76.0MHz ]
      			[  Lev:xx  ]
      

  • そして、TUNING_UP スイッチ を押す毎に+ 0.1 MHz ずつ周波数が増加して、その周波数に対する受信強度とともに、LCD の1行目と2行目にそれぞれが表示される。 上限の 108 MHz に達すると、次にはまた初めの 76.0MHz に戻る。

  • また、TUNING_DOWN スイッチ の場合には、逆に、押す毎に− 0.1 MHz ずつ周波数が減少して、同様に LCD の1行目と2行目にそれぞれが表示される。 下限の 76.0MHz に達すると、次には上限の 108 MHz になる。

  • なお、これらの操作の後で VOLUME_DOWN スイッチ を押すと、現在表示されている周波数の増減はしないで、再度、RSSIデータの収集だけを行って、同様に LCD に表示をし直す。

  • このように、帯域 76 〜 108 MHz 内を3個のスイッチの操作で、自由に行き来することが可能であるが、本機ではそれぞれのデータを LCD に表示することしかできないので、データ収集のためには、 ユーザがこれらのデータをメモする必要がある。( (108 - 76) / 0.1 + 1 = 321 個あるので たいへん !! )

  • また、一旦、この RSSIデータの収集機能の実行に移行した場合には、この機能から抜け出す方法はないので、電源スイッチをオフにするしかない。 上述のスイッチ操作をしないで電源を入れ直せば、 再び、通常のラジオ受信機として機能をするようになる。

| ページトップ |

■ プログラム ■

 このプログラムの項は、書いている内に極端に長くなってしまったので、読むのをパスすることができます。  ⇒⇒⇒ 次項の プリント基板の加工と部品配置 へジャンプをする。  各項目への目次(ジャンプ)を作成しました。
● 前作 "FMステレオラジオ" と 本機 "FMステレオラジオ II" との相違点

 まず、1つ目の相違点は、前作 "187. FMステレオラジオ" では、同ページの "プログラム" の項で述べたように、名古屋、東京、大阪の各地区用にプリセットした、 「放送局データテーブル」を切り替える(選択をする)ためには、ソースプログラムのアセンブルをし直さないと、希望地区用のデータテーブルには変更ができませんでした。

 これに対して本機 "FMステレオラジオ II" では、2個の DIP スイッチ(SELECT 1, 0)の設定を変更するだけで、 簡単に希望する地区用に切り替えることができるようにしました。 (ただし、電源スイッチを ON にする以前に、設定変更をする必要がある。) したがって、再アセンブルのような面倒な作業は、一切必要がありません。

 次表は、DIPスイッチの値とプリセット地区名の対応を、一覧に表したものです。
          DIPスイッチの値 地区名 選局方法
          b'00'  名古屋周辺地区 プリセット情報で選局
          b'01'  東京周辺地区
          b'10'  大阪周辺地区
          b'11' -- 100kHzステップ毎のSEEK機能で自動選局
 上表で、DIPスイッチの値 = b'11' に割り当てられている 「SEEK機能で自動選局」 というのは、これも前作 "FMステレオラジオ" にはなかった機能です。 「プリセット情報で選局」 の場合には、 予めプリセットされた 「放送局データテーブル」 に、登録がされていない放送局がもしも存在したような場合には、当然ですが選局をすることはできません。

 これに対して、「SEEK機能で自動選局」 の場合には、帯域 76 〜 108 MHz (world wide) の中を 100kHz ステップ毎にシークをしながら自動選局をするため、プリセット情報には関係なく放送局が存在すれば、 必ず選局をすることができます。 これが2つ目の相違点です。

 3つ目の相違点は、RDA5807M FM Tuner の読み出し用のレジスタの内容を見て、その情報を積極的に利用をしています。 具体的には、放送局を選局したときのその受信強度を数値として LCD に表示をさせたり、 その放送がステレオ放送のときには LED を点灯させて、モノラル放送のときの消灯と区別ができるようにしたり、また、「SEEK機能で自動選局」 の場合には、選局をした放送局の、レジスタ値の周波数を基にして、 放送局名と周波数を LCD に表示をさせたりしています。

 その他の相違点として、アンプモジュールを省いて小型化を図り、電源には単3乾電池2本という構成としたため、積極的に省電力化を図っています。 各タクトスイッチの操作が1分以上なかった場合には、 PIC をスリープ状態にするとともに、LCD の電源も OFF にし、LED も消灯させています。 そして、この PIC がスリープ状態のときには、各タクトスイッチに RA ポート変化割り込みの機能を持たせて、 スリープからウェイクアップをさせるようにしています。

 最後に、これはラジオの機能には直接関係はないのですが、ブログ "矢野零趣味のページ/Grove I2C FM Receiver を使う" で見つけた 「FMスペクトラム」 図を、私もぜひ作成をしてみたいと思い、そのための 「RSSI データ収集機能」 を、本機のプログラムに盛り込んでみました。

 そして、その機能を使用して、実際に我が家での RSSI データ収集(一応、76 〜 108 MHz の帯域すべて)を行い、その実測値を Excel でグラフに変換したものが、次のスペクトラム図です。

 我が家がある名古屋地区では、このような周波数分布になりました。 初め、スペクトラム図の結果を見てプリセット局を増やそう、と思っていたのですが、次図のようにピークは既存局の6本しかなく、 遠局としての新たなピークは存在しませんでした。 (2か所の↓のところで、ほんの微かに音が聞こえる程度でした。)  | プログラムのトップに戻る |


● RDA5807M FM Tuner のレジスタと使用法

 本機 "FMステレオラジオ II" では、改めて言うまでもなく IC チップ RDA5807M を使用していますが、この IC チップを使いこなすためには、RDA5807M 内部にあるレジスタ群の個別の機能、および、それらの扱い方を、 十分に理解をすることが重要でそれが理想的ですが、それは極めて難しいことでもあります。

 現在、"RDA Microelectronics, Inc." 社の英文データシート "RDA5807M FM Tuner V1.0 / Rev.1.0-May.2011" * (注) が、私が知る限り唯一の参考(解説)書のようですが、私の今の拙い英語力と専門知識では、 残念ながら十分には理解をすることができません。
    * (注) 最近になって、もっと新しい Rev.1.8-Aug.2014 なるものが存在しているのを知りました。 Rev.1.0-May.2011 において RSVD となっていた、各種レジスタのビットの多くが新たに定義され直されています。 ( 2021/9/5 追記)
 そこで、ネット検索をして諸先輩方の力を借り、多くの製作例を参考にさせていただきながら、前作と本機とで、2度の私の RDA5807M の使用経験を通して、現時点において私が理解できたこと、このようにすれば良いことなどを、 忘れてしまわない内に、自分自身への備忘録としても、次に記しておこうと思います。 (間違いが含まれているかもしれません。 保証はなし。)

  • まず初めに、RDA5807M 内部のレジスタ群には、制御をするためのデータを設定する 書き込み用のレジスタ群 と、制御した結果を報告データとして返してくる 読み出し用のレジスタ群 の2種類に別れている。

  • 各レジスタ群の1つずつのレジスタのサイズは 2 バイト = 16 ビット( bit 15 〜 bit 0 )で、書き込むときには、上位バイト( bit 15 〜 bit 8 )、下位バイト( bit 7 〜 bit 0 )の順 で送り出し、また、 読み出すときには、上位バイト( bit 15 〜 bit 8 )、下位バイト( bit 7 〜 bit 0 )の順 で受け取る。

  • 書き込み用のレジスタ群、読み出し用のレジスタ群のどちらも、個別のレジスタに書き込んだり、または読み出したりする方法と、連続した複数のレジスタに書き込んだり、または読み出したりする方法とがある。 前者の 個別のレジスタの場合には、レジスタ番号を指定する 必要があるが、後者の 連続した複数のレジスタの場合には、レジスタ番号の指定はしない。 そして、後者の場合で 書き込みの場合には、先頭レジスタは 02H が、読み出しの場合には、先頭レジスタは 0AH が、それぞれ自動的に指定がされる。
      ・個別のレジスタの場合 ……………… レジスタ番号の指定をする
      ・連続した複数のレジスタの場合 …… レジスタ番号の指定はしない
        ・書き込みの場合 ………………… 先頭レジスタ = 02H
        ・読み出しの場合 ………………… 先頭レジスタ = 0AH が、それぞれ自動的に指定される
      
  • そして、後者の連続した複数のレジスタの場合には、必要なレジスタ数だけを書き込んだり、または読み出したりすることができる。

 以上が大まかな基本概要ですが、次に、まず、個別のレジスタに書き込む ための、具体的なプログラム例を示します。 個別書き込みの場合には、h'22' がスレーブアドレス になります。

 なお、以降で使用している各サブルーチン ( i2c_start, i2c_stop, byte_send, byte_reciv, ack, nack ) は、現在の最新バージョン で表記の "I2C LCD 制御サブルーチン (I2C_S_LCD.sub)" 内に収容がされているので、そちらを参照してください。
      			:
      			:
      		movlw	h'03'		;
      		call	rda_reg_write	;RDA_Reg = h'03' へ書き込み
      			:
      			:
      
      ;--------------------------------------------------------------------------
      ;		(RDA5807M FM Tuner)の 指定 RDA_Reg へ書き込み
      ;--------------------------------------------------------------------------
      
      ;		rda_reg_h:	書き込みデータの high バイト
      ;		rda_reg_l:	書き込みデータの low バイト
      
      ;		入力 W_reg:	RDA_Reg 番号
      
      rda_reg_write
      		movwf	work1		;RDA_Reg 番号を退避
      		movlw	rda_reg_h	;書き込みデータの格納アドレス
      		movwf	FSR		;間接アドレスに設定
      
      		call	i2c_start	;スタートコンディション
      		movlw	h'22'		;RDA スレーブアドレス
      		call	byte_send	;1 バイト送信
      
      		movf	work1,W		;RDA_Reg 番号
      		call	byte_send	;1 バイト送信
      
      		movf	INDF,W		;書き込みデータの high バイト
      		call	byte_send	;1 バイト送信
      		incf	FSR,F		;間接アドレスの更新
      		movf	INDF,W		;書き込みデータの low バイト
      		call	byte_send	;1 バイト送信
      
      		call	i2c_stop	;ストップコンディション
      		return
      
 次は、個別のレジスタから読み出す ためのプログラム例で、サブルーチン ( rda_reg_read ) 自体は個別読み出しですが、これを2回 CALL することによって、0AH と 0BH レジスタの内容を連続して読み出しています。

 また、この場合にも個別読み出しですから、スレーブアドレスは h'22' です が、再スタートコンディションの後に h'22' + 1 を送信して、書き込みから読み出しに切り替え ています。 そして、読み出しに切り替えた後は、1バイト目(上位バイト)を受信すると ACK を、2バイト目(下位バイト)を受信すると NACK を、それぞれ RDA5807M に返し、ストップコンディションで終わっています。
      			:
      			:
      		movlw	reg_0a_h	;読み出データの格納アドレス
      		movwf	FSR		;間接アドレスに設定
      		movlw	h'0a'		;
      		call	rda_reg_read	;RDA_Reg = 0ah から読み出し
      
      		incf	FSR,F
      		movlw	h'0b'		;
      		call	rda_reg_read	;RDA_Reg = 0bh から読み出し
      			:
      			:
      
      ;--------------------------------------------------------------------------
      ;		(RDA5807M FM Tuner)の 指定 RDA_Reg から読み出し
      ;--------------------------------------------------------------------------
      
      ;		reg_0a_h:	読み出しデータ high バイトの格納先
      ;		reg_0a_l:	読み出しデータ low バイトの格納先
      ;		reg_0b_h:	読み出しデータ high バイトの格納先
      ;		reg_0b_l:	読み出しデータ low バイトの格納先
      
      ;		入力 W_reg:	RDA_Reg 番号
      
      rda_reg_read
      		movwf	work1		;RDA_Reg 番号を退避
      
      		call	i2c_start	;スタートコンディション
      		movlw	h'22'		;RDA スレーブアドレス
      		call	byte_send	;1 バイト送信
      
      		movf	work1,W		;RDA_Reg 番号
      		call	byte_send	;1 バイト送信
      
      		call	i2c_start	;再スタートコンディション
      		movlw	h'22' + 1	;RDA スレーブアドレス
      		call	byte_send	;1 バイト送信
      
      		call	byte_reciv	;データ 1 バイト受信
      		call	ack		;ACK
      		movwf	INDF
      		incf	FSR,F		;間接アドレスの更新
      		call	byte_reciv	;データ 1 バイト受信
      		call	nack		;NACK
      		movwf	INDF
      
      		call	i2c_stop	;ストップコンディション
      		return
      
 次は、連続した複数のレジスタに書き込む ためのプログラム例です((開始)〜(終了)までの範囲)。 この部分が実行されるのは、本機では電源スイッチを ON にした数秒後に1度だけで、後は OFF にするまでの間に 実行されることはありません。 RDA5807M の初期の設定に必要なデータを、複数のレジスタに一気に書き込んでいます。 このときの スレーブアドレスは h'20' です。

 連続でレジスタに書き込むときにはレジスタ番号の指定はしませんが、上述したように 自動的に指定された先頭レジスタ = 02H から書き込まれ、本機では 05H まで書き込んだところで、 ストップコンディションを送出して終了をしています。 すなわち、02H、03H、04H、05H の4つのレジスタにデータを設定することによって、「FMステレオラジオ」 として機能をするようになります。

 そして、(注意)としてあるところはサブルーチン ( fm_tuner_set ) が選局方法を、上述の DIPスイッチの値の一覧表 で、 b'11' (SEEK機能で自動選局)のときと、それ以外(プリセット情報で選局)のときを切り分けているのです。 しかし、 b'11' (SEEK機能で自動選局)のときでも初回1度目の設定のときだけは、シーク動作はさせていません。

 それは、前回に選局をしていたセーブ情報を基に、再設定をするのが目的だからです。 それでも切り分けを行っているのは、レジスタ 03H の CHAN [9:0] ビットに設定をするための、セーブ情報である元データが異なっているためで、すなわち、 b'11' のときには CHAN [9:0] そのものがセーブ情報ですが、それ以外のときにはプリセットの局番号がセーブ情報であるためです。
      ;==========================================================================
      ;		(RDA5807M FM Tuner)の設定
      ;==========================================================================
      
      fm_tuner_set
      		btfss	updt_flg,7	;初期化直後フラグ = ON か?
      		goto	ftset03		;No
      
      		; updt_flg.7 = 1 (初期化直後)のとき
      										;;;;;;;;;; 連続した複数のレジスタに書き込むためのプログラム例(開始);;;;;;;;;;
      		call	i2c_start	;スタートコンディション
      		movlw	h'20'		;RDA スレーブアドレス
      		call	byte_send	;1 バイト送信
      
      		movlw	b'11010000'	;RDA_Reg 02h、15=DHIZ,14=DMUTE,13=MONO,12=BASS,11=RCLK_N,10=RCLK_D,9=SEEKUP,8=SEEK
      		call	byte_send	;1 バイト送信
      		movlw	b'00000001'	;RDA_Reg 02h、7=SKMODE,6:4=CLK_MODE[2:0],3=RDS_EN,2=NEW_METHOD,1=SOFT_RESET,0=ENABLE
      		call	byte_send	;1 バイト送信
      
      		movlw	b'11'
      		subwf	sel_sw,W
      		btfsc	STATUS,Z	;SELECT 1,0 スイッチ = b'11' か?	;;;;;;;;;;(注意);;;;;;;;;;
      		goto	ftset01		;Yes
      
      		movf	rda_reg_h,W	;RDA_Reg 03h、15:8=CHAN[9:2]
      		call	byte_send	;1 バイト送信      ---------
      		movf	rda_reg_l,W	;RDA_Reg 03h、7:6=CHAN[1:0],5=DIRECT MODE,4=TUNE,3:2=BAND[1:0],1:0=SPACE[1:0]
      		call	byte_send	;1 バイト送信     ---------
      		goto	ftset02
      
      ftset01		movf	radio_no,W	;RDA_Reg 03h、15:8=CHAN[9:2], (radio_no = chan_h)
      		call	byte_send	;1 バイト送信      ---------
      		movf	chan_l,W	;RDA_Reg 03h、7:6=CHAN[1:0],5=DIRECT MODE,4=TUNE,3:2=BAND[1:0],1:0=SPACE[1:0]
      		iorlw	h'18'		;4=TUNE = '1', 3:2=BAND[1:0] = '10' = 76-108 MHz (world wide), 1:0=SPACE[1:0] = '00' = 100 kHz
      					;チューニング操作が完了すると、TUNE = 0 に設定され、STC = 1 に設定される
      		call	byte_send	;1 バイト送信
      
      ftset02		movlw	b'00000000'	;RDA_Reg 04h、15:12=RSVD,11=DE,10=RSVD,9=SOFTMUTE_EN,8=AFCD
      		call	byte_send	;1 バイト送信
      		movlw	b'00000000'	;RDA_Reg 04h
      		call	byte_send	;1 バイト送信
      
      		movlw	b'10001000'	;RDA_Reg 05h、15=INT_MODE,14:12=RSVD,11:8=SEEKTH[3:0]
      		call	byte_send	;1 バイト送信
      		movf	volume,W
      		iorlw	b'10000000'	;RDA_Reg 05h、7:6=?? ,5:4=RSVD,3:0=VOLUME[3:0]
      		call	byte_send	;1 バイト送信                      -----------
      
      		call	i2c_stop	;ストップコンディション
      		goto	ftset06
      										;;;;;;;;;; 連続した複数のレジスタに書き込むためのプログラム例(終了);;;;;;;;;;
      ftset03		btfss	updt_flg,0	;ラジオ局番号更新フラグ = ON か?
      		goto	ftset05		;No
      
      		; updt_flg.0 = 1 (ラジオ局番号更新)のとき
      
      		movlw	b'11'
      		subwf	sel_sw,W
      		btfsc	STATUS,Z	;SELECT 1,0 スイッチ = b'11' か?	;;;;;;;;;;(注意2);;;;;;;;;;
      		goto	ftset04		;Yes
      
      		movlw	h'03'		;
      		call	rda_reg_write	;RDA_Reg = h'03' へ書き込み
      		goto	ftset06
      
      		; updt_flg.0 = 1 && sel_sw = b'11' (SEEK選局)のとき
      
      		;	9 = SEEKUP:  0 = シークダウン, 1 = シークアップ
      		;	8 = SEEK:    0 = ストップシークを無効, 1 = 有効
      		;	    シーク動作が完了すると、SEEK = 0 に設定され、STC = 1 に設定される
      		;	7 = SKMODE:  0 = 帯域の上限または下限でラップしてシークを続行, 1 = シークを停止
      
      ftset04		movlw	b'11010001'	;RDA_Reg 02h、15=DHIZ,14=DMUTE,13=MONO,12=BASS,11=RCLK_N,10=RCLK_D,9=SEEKUP,8=SEEK
      		iorwf	seekup,W	;                                                                  -------- ------
      		movwf	rda_reg_h
      		movlw	b'00000001'	;RDA_Reg 02h、7=SKMODE,6:4=CLK_MODE[2:0],3=RDS_EN,2=NEW_METHOD,1=SOFT_RESET,0=ENABLE
      		movwf	rda_reg_l	;             --------                                                      --------
      		movlw	h'02'		;
      		call	rda_reg_write	;RDA_Reg = h'02' へ書き込み
      		goto	ftset06
      
      		; updt_flg.1 = 1 (音量更新)のとき
      
      ftset05		movlw	b'10001000'	;
      		movwf	rda_reg_h
      		movf	volume,W
      		iorlw	b'10000000'	;
      		movwf	rda_reg_l
      		movlw	h'05'		;
      		call	rda_reg_write	;RDA_Reg = h'05' へ書き込み
      
      ftset06		return
      
 上のサブルーチン ( fm_tuner_set ) で後半(ラベル ftset03 以降)は、このサブルーチンが2度目以降に CALL されたとき、すなわち、4個のタクトスイッチ(TUNING UP、TUNING DOWN、VOLUME UP、VOLUME DOWN)の内の、 どれかが押されたときに実行される部分で、初回のときにサブルーチンの前半部分で設定をした各レジスタの内容を、変更が必要なレジスタだけを個別に書き込んで更新 をしています。

 この後半部分でも(注意2)のところで、 b'11' (SEEK機能で自動選局)のときと、それ以外(プリセット情報で選局)のときを切り分けて、まず、それ以外(プリセット情報で選局)のときには、レジスタ 03HCHAN [9:0] の設定を書き換えています。 これに対して、 b'11' (SEEK機能で自動選局)のときには、レジスタ 02H の bit 9 = SEEKUP、bit 8 = SEEK、bit 7 = SKMODE それぞれを指定して、ここで初めてシーク動作をさせています。

 また、音量の更新スイッチ(VOLUME UP、VOLUME DOWN)が押されたときには、レジスタ 05HVOLUME [3:0] を書き換えています。

 以上が、レジスタに書き込むための具体的なプログラム例ですが、それぞれのプログラムで扱った各レジスタの各ビットの意味は、次表のようになります。 これは、英文データシート "RDA5807M FM Tuner V1.0 / Rev.1.0-May.2011" * (注) 内の、 ( 6 Register Definition )の表のままでは、私が非常に分かり辛かったので日本語化をして書き換えたのですが、どの程度の正確性があるかは保証の限りではありません。
    * (注) 最近になって、もっと新しい Rev.1.8-Aug.2014 なるものが存在しているのを知りました。 Rev.1.0-May.2011 において RSVD となっていた、各種レジスタのビットの多くが新たに定義され直されています。 ( 2021/9/5 追記)
 薄い水色に塗ったビットは、「FMステレオラジオ」 として機能をさせるために必要なビットで、プログラム例でもこれらを扱っています。 残りの白抜きにしてあるビットについては、とりあえず無視をしても良い(と、私が判断をした)ビットで、 私にとっては、ほとんど意味不明? というものが多く含まれています。
      ( 書き込み用のレジスタ群 )
      REG BITS 名前 機能 デフォルト値
      02H 15 DHIZ オーディオ出力
        0: ハイインピーダンス
        1: 通常の操作
      0
      14 DMUTE ミュート無効
        0: ミュート
        1: 通常の操作
      0
      13 MONO モノラル選択
        0: ステレオ
        1: モノラルを強制
      0
      12 BASS 低音ブースト(高める)
        0: 無効
        1: 有効
      0
      11 RCLK NON-CALIBRATE MODE RCLK 非校正モード
        0: RCLK クロックは常に供給される
        1: 常に供給されるとは限らない
      0
      10 RCLK DIRECT INPUT MODE RCLK 直接入力モード
        1: RCLK クロックは直接入力モードを使用する
      0
      9 SEEKUP シークアップ
        0: シークダウン
        1: シークアップ
      0
      8 SEEK シーク
        0: ストップシークを無効にする
        1: 有効にする
      シークは、SEEKUPで指定された方向から始まり、チャネルが見つかるか、
      バンド全体が検索されたときに終了する。
      シーク動作が完了すると、SEEKビット = "0" に設定され、
      STCビット = "1" に設定される。
      0
      7 SKMODE シークモード
        0: バンドの上限または下限でラップし、シークを続行する
        1: バンドの上限または下限でシークを停止する
      0
      6:4 CLK_MODE[2:0] クロックモード
        000: 32.768kHz、001: 12Mhz、101: 24Mhz、010: 13Mhz、
        110: 26Mhz、011: 19.2Mhz、111: 38.4Mhz
      000
      3 RDS_EN RDS/RBDS イネーブル
        1: RDS/RBDSを有効にする
      0
      2 NEW_METHOD 新しい復調方法の有効化により、受信感度を約1dB向上させることができる 0
      1 SOFT_RESET ソフトリセット
        0: リセットしない
        1: リセットする
      0
      0 ENABLE パワーアップイネーブル
        0: 無効
        1: 有効
      0
      03H 15:6 CHAN[9:0] チャネル選択
        BAND = 00: 周波数=チャネル間隔(kHz)x CHAN + 87.0 MHz
        BAND = 01,10: 周波数=チャネル間隔(kHz)x CHAN + 76.0 MHz
        BAND = 11: 周波数=チャネル間隔(kHz)x CHAN + 65.0 MHz
      CHANは、シーク操作後に更新される
      0x00
      5 DIRECT MODE 直接制御モード、テスト時にのみ使用される 0
      4 TUNE チューニング
        0: 無効
        1: 有効
      チューニング操作は、TUNEビット = "1" に設定されたときに開始される。
      チューニング操作が完了すると、自動的に TUNEビット = "0"
      リセットされ、STCビット = "1" に設定される。
      0
      3:2 BAND[1:0] バンド選択
        00: 87〜108 MHz (US/Europe)
        01: 76〜91 MHz (Japan)
        10: 76〜108 MHz (world wide)
        11: 65〜76 MHz (East Europe) or 50〜65MHz
      00
      1:0 SPACE[1:0] チャネル間隔
        00: 100 kHz、01: 200 kHz、10: 50kHz、11: 25KHz
      00
      04H 15 RSVD 予約済み 0
      14 ? ?
      13:12 RSVD 予約済み 00
      11 DE ディエンファシス
        0: 75μs
        1: 50μs
      0
      10 RSVD 予約済み
      9 SOFTMUTE_EN ソフトミュート
        0: 無効
        1: 有効
      1
      8 AFCD AFC無効
        0: 有効、AFCは機能する
        1: 無効
      0
      7:0 ? ?
      05H 15 INT_MODE 割り込みモード
        0: 5 msの割り込みを生成する
        1:
      1
      14:12 RSVD 予約済み 000
      11:8 SEEKTH[3:0] シークのSNRしきい値
      デフォルト値 1000 は約32dB SNR
      1000
      7:6 ? ?、   重要: bit7 = 1 にしないといけない !!
      5:4 RSVD 予約済み 00
      3:0 VOLUME[3:0] ボリューム
      DACゲイン制御ビット(ボリューム)。
      0000 = 最小、1111 = 最大: ボリュームスケールは対数。
      0000 の場合は、出力ミュートと出力インピーダンスが非常に大きい。
      1111
      06H 15 RSVD 予約済み 0
      14:13 OPEN_MODE[1:0] 予約レジスタモードを開く
        11: レジスタ書き込み機能の背後で開くその他:
          レジスタ読み取り機能の背後でのみ開く
      00
      12:0 ? ?
      07H 15 RSVD 予約済み 0
      14:10 TH_SOFRBLEND[5:0] ノイズソフトブレンド設定のしきい値、単位2dB 10000
      9 65M_50M MODE BAND[1:0] = 11 ( 0x03H_bit <3:2> )の場合に有効
        0: 50〜76MHz
        1: 65〜76 MHz
      1
      8 RSVD 予約済み 0
      7:2 SEEK_TH_OLD[5:0] 古いシークモードのシークしきい値
        Seek_Mode = 001 の場合に有効
      000000
      1 SOFTBLEND_EN   1: ソフトブレンドを有効にする 1
      0 FREQ_MODE 1の場合、周波数設定が変更された。
      Freq = 76000(または87000)kHz + freq_direct(08H)kHz。
      0

 読み出し用のレジスタ群については、個別のレジスタから読み出すためのプログラム例、サブルーチン ( rda_reg_read ) を上に示したので、 ここでは、読み出した後の各レジスタ各ビットの取り扱い方を、具体的なプログラム例で示すことにします。 本機では、次のプログラム例のように、レジスタ 0AH、0BH だけを読み出し、残りのレジスタについては無視をしています。

 FM放送局を選局をするには、プリセット情報で選局を行う方法 と、SEEK機能で自動選局を行う方法の、2種類があることを既に何度も述べてきましたが、前者の場合には レジスタ 03H の bit 4 = TUNE が、 また、後者の場合には レジスタ 02H の bit 8 = SEEK が、"1" に設定されたときにそれぞれの選局操作が開始されます。

 そして、それらの選局が完了すると、"1" に設定した TUNE ビットや SEEK ビットが自動的に "0" にリセットされ、どちらの場合にも レジスタ 0AH の bit 14 = STC が "1" に設定されます。 したがって、この STC ビットが "1" になったかどうかをプログラムで監視をすれば、それぞれでの選局が完了したかどうかを把握することが可能となります。

 次のプログラム例では、STC ビットが "1" になったのを確認してから、続くレジスタ 0BH を読み出すようにしています。 そしてまず、レジスタ 0AH の bit 10 = ST ビットの状態( "0": モノラル/ "1": ステレオ) で選局をした放送局の状態が分かるので、本機では "1" のときには LED を点灯させて、ステレオ放送であることを表示させています。

 次には、レジスタ 0BH の bit 15:9 = RSSI [6:0] で受信強度 * が分かるので、10進数文字列に変換をしてから LCD に表示をさせています。 また、レジスタ 0AH の bit 9:0 = READCHAN[9:0] を参照すると、 受信したチャネルが分かるので、SEEK機能で自動選局の場合には、放送局名やその局の周波数に変換をして、同様に LCD に表示をさせています。

* 受信強度: (RDA5807M FM Tuner)のレジスタ設定をした直後に読み出した、レジスタ 0BH の RSSI の値と、しばらく経った後で読み出した RSSI の値とでは、随分と異なっている。(後者の方が大きい)
そこで本機では、2秒が経過をしてから読み出した RSSI の値を採用して、LCD に表示をさせている。
      ;==========================================================================
      ;	(RDA5807M FM Tuner)からレジスタ内容の読み出しと表示
      ;==========================================================================
      
      rssi_disp
      		movlw	reg_0a_h	;読み出しデータの格納アドレス
      		movwf	FSR		;間接アドレスに設定
      		movlw	h'0a'		;
      		call	rda_reg_read	;RDA_Reg = h'0a' から読み出し
      
      		btfss	reg_0a_h,6	;STC ビット = 1(シーク/チューン完了)か?
      		goto	rssi_disp	;No
      
      		incf	FSR,F
      		movlw	h'0b'		;
      		call	rda_reg_read	;RDA_Reg = h'0b' から読み出し
      
      		bcf	PORTC,LED_ST	;ST/MO LED 消灯
      		btfsc	reg_0a_h,2	;ST(Stereo Indicator)ビット = 1 か?
      		bsf	PORTC,LED_ST	;Yes. ST/MO LED 点灯
      
      		rrf	reg_0b_h,W
      		andlw	h'7f'		;RSSI[6:0]
      		movwf	work1
      		call	bindec8cz_cnv	;10進数文字列に変換(ゼロサプレス)
      
      ;			[ Lev:   ]
      ;			 01234567
      		Disp_I2cLcd    h'c0',level_msg,1 ;(2行目表示) … 受信強度の表示
      
      		movlw	h'c5'		;DDRAM のアドレスをセット
      		call	I2cLcd_Cmd	;I2C LCD へコマンドを出力
      
      ;		movlw	buff		;変換文字列の格納エリア
      		movlw	buff + 1	;変換文字列の格納エリア
      		movwf	FSR		;間接アドレスの設定
      ;		movlw	3		;
      		movlw	2		;
      		movwf	lpcnt		;ループカウンタに設定
      
      rssi01		movf	INDF,W
      		call	I2cLcd_Data	;I2C LCD へデータを1文字出力
      		incf	FSR,F		;間接アドレスの更新
      		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か?
      		goto	rssi01		;No
      
      		movlw	b'11'
      		subwf	sel_sw,W
      		btfsc	STATUS,Z	;SELECT 1,0 スイッチ = b'11' か?
      		call	channel_compare	;Yes. 局名の表示
      
      		return
      
 なお、上のサブルーチン ( rda_reg_read ) 内で使用をしている、サブルーチン ( bindec8cz_cnv, channel_compare ) やマクロ ( Disp_I2cLcd ) については、現在の最新バージョン で表記の "ソースファイル (FM_StereoRadioII.asm)" 内に収容がされているので、そちらを参照してください。 同様に、サブルーチン ( I2cLcd_Cmd, I2cLcd_Data ) については、I2C LCD 制御サブルーチン (I2C_S_LCD.sub) 内に収容がされています。
    ** (注) 下表の中で、レジスタ 0AH の ビット 14(STC)の、0 / 1 の機能の意味が、0:完了 / 1:未完了 と逆になって間違っていました。 正しくは、下表のように訂正をしました。 ( 2022/6/24 訂正)
      ( 読み出し用のレジスタ群 )
      REG BITS 名前 機能 デフォルト値
      0AH 15 RDSR RDS対応
        0: RDS / RBDSグループの準備ができていない(デフォルト)
        1: 新しいRDS / RBDSグループの準備ができている
      0
      14 STC シーク/チューン完了
        0: 未完了
        1: 完了
      シーク/チューン完了フラグは、シークまたはチューン操作が完了すると
      設定される。
      0
      13 SF シーク失敗
        0: シーク成功
        1: シーク失敗
      シーク失敗フラグは、シーク操作がSEEKTH [5:0]より大きい
      RSSI レベルのチャネルを見つけられなかった場合に設定される。
      0
      12 RDSS RDS同期
        0: RDSデコーダーが同期されていない(デフォルト)
        1: RDSデコーダーが同期
      RDS詳細モードでのみ使用可能
      0
      11 BLK_E RDSが有効な場合:
        0: ブロック E が見つかった
        1: ブロック E が見つからない
      0
      10 ST ステレオインジケーター
        0: モノラル
        1: ステレオ
      1
      9:0 READCHAN[9:0] 読み取りチャネル
        BAND = 00:
         周波数=チャネル間隔(kHz)x READCHAN[9:0] + 87.0 MHz
        BAND = 01,10:
         周波数=チャネル間隔(kHz)x READCHAN[9:0] + 76.0 MHz
        BAND = 11:
         周波数=チャネル間隔(kHz)x READCHAN[9:0] + 65.0 MHz
      READCHAN [9:0]は、チューンまたはシーク操作の後に更新される。
      0BH 15:9 RSSI[6:0] 受信強度
        000000: 最小
        111111: 最大
      RSSIスケールは対数
      0
      8 FM TRUE FM TRUE
        0: 現在のチャネルはステーションではない
        1: 現在のチャネルはステーションである
      0
      7 FM_READY 準備
        0: 準備ができていない
        1: 準備ができている
      0
      6:5 RSVD 予約済み 0
      4 ABCD_E   0: レジスタ 0cH、0dH、0eH、0fHのブロックIDは A, B, C, D
        1: レジスタ 0cH、0dH、0eH、0fHのブロックIDは E
      3:2 BLERA[1:0] RDS_DATA_0のブロックエラーレベル
      常にRDSBLOCK A(RDSモードの場合)またはBLOCK E(ABCD_E
      フラグが1の場合のRBDSモードの場合)のエラーレベルとして
      読み取られる。
        00: 修正が必要な 0エラー
        01: 修正が必要な 1〜2エラー
        10: 修正が必要な 3〜5エラー
        11: 6以上のエラーまたはチェックワードのエラー、修正できない。
        RDS 詳細モードでのみ使用可能
      1:0 BLERB[1:0] RDS_DATA_1のブロックエラーレベル
      常にRDSBLOCK B(RDSモードの場合)またはE(ABCD_Eフラグが
      1の場合のRBDSモードの場合)のエラーレベルとして読み取られる。
        00: 修正が必要な 0エラー
        01: 修正が必要な 1〜2エラー
        10: 修正が必要な 3〜5エラー
        11: 6以上のエラーまたはチェックワードのエラー、修正できない。
        RDS 詳細モードでのみ使用可能
      0CH 15:0 RDSA[15:0] BLOCK A(RDSモードの場合)またはBLOCK E(ABCD_Eフラグが
      1の場合のRBDSモードの場合)
      0x5803
      0DH 15:0 RDSB[15:0] BLOCK B(RDSモードの場合)またはBLOCK E(ABCD_Eフラグが
      1の場合のRBDSモードの場合)
      0x5804
      0EH 15:0 RDSC[15:0] BLOCK C(RDSモードの場合)またはBLOCK E(ABCD_Eフラグが
      1の場合のRBDSモードの場合)
      0x5808
      0FH 15:0 RDSD[15:0] BLOCK D(RDSモードの場合)またはBLOCK E(ABCD_Eフラグが
      1の場合のRBDSモードの場合)
      0x5804
 | プログラムのトップに戻る |


● PIC16F684 と MPLAB IDE v8.92 のリンクエラーについて

 私が PIC でのプログラムを作成をするようになって、もう 15 〜 16 年ぐらいになりますが、今回、大変珍しい事象に初めて遭遇をした、というか経験をしました。

 MPLAB IDE も最終更新が v8.92 で、現在では MPLAB X IDE に移行をして v5.45 が最新のようですが、私は使い慣れているので、今でも MPLAB IDE の v8.92 を愛用しています。 実は、少し以前まではもっと古いバージョン(v番号までは記憶にない)を使用していたのですが、今年の2月末頃にそれまで使用をしていた PC のハードディスクが、突然、クラッシュをしたようで使用不可となり、 4月になって新しい PC を購入したときに、MPLAB IDE v8.92 のインストールをしました。

 ですから、MPLAB IDE v8.92 としての使用歴は意外に短く 7 か月ほどで、その間に4本のプログラムを作成し、その内の1本が本機のプログラムで、PIC16F684 を使用したものは今回が初めてでした。 ただし、以前の古いバージョンでは PIC16F684 を使用したものは、既に1本(小規模プログラム)の作成経験があります。

 前書きが少々長くなりましたが、このような経歴で、今回のようなリンクエラーという事象には、 15 〜 16 年の内で初めて遭遇をしました。 そして、この珍しい経験を記録として、プログラム中にもコメントとして書き込んでありますが、 以下にも再度、まとめ直してみました。

― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ―

 本機のプログラムも( Ver. 1.05 )までで一応は完成をしたのですが、上述したように、ブログ "矢野零趣味のページ/Grove I2C FM Receiver を使う" で見つけた 「FMスペクトラム」 図を、私もぜひ作成をしてみたいと思い、( Ver. 1.06 )でそのための RSSI データ収集機能を本機のプログラムにも盛り込んでみたのです。 そして、そのプログラミングもほとんど終了間近というときに、 突然、リンクエラーが発生をしたのです。

それは、タイミングの調節をしていたときで、
    		call	wait_1sec	; 1 秒 ウェイトルーチン
    
という命令を1行書いたときにはリンクエラーは発生せず、何事もなかったようにビルドが終了をしました。 ところが、もう少しウエイトを増やした方がいいかな、と思ってもう1行同命令を付け加えたところ、 突然、 MPLAB IDE が次のエラーメッセージを吐き出したのです。  ・・・ なんだ、これは !!
    ----------------------------------------------------------------------
    Debug build of project `D:\Project\PIC\FM_StereoRadioII\FM_StereoRadioII.mcp' started.
    Language tool versions: MPASMWIN.exe v5.51, mplink.exe v4.49, mplib.exe v4.49
    Preprocessor symbol `__DEBUG' is defined.
    Sun Nov 08 02:46:05 2020
    ----------------------------------------------------------------------
    Make: The target "D:\Project\PIC\FM_StereoRadioII\FM_StereoRadioII.o" is out of date.
    Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F684 "FM_StereoRadioII.asm" /l"FM_StereoRadioII.lst" /e"FM_StereoRadioII.err" /d__DEBUG=1
    Make: The target "D:\Project\PIC\FM_StereoRadioII\FM_StereoRadioII.cof" is out of date.
    Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\mplink.exe" /p16F684 "FM_StereoRadioII.o" /u_DEBUG /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /o"FM_StereoRadioII.cof" /M"FM_StereoRadioII.map" /W /x
    MPLINK 4.49, Linker
    Device Database Version 1.14
    Copyright (c) 1998-2011 Microchip Technology Inc.
    Error - section '.org_3' can not fit the absolute section. Section '.org_3' start=0x00000008, length=0x00000bf2
    Errors    : 1
    
    Link step failed.
    ----------------------------------------------------------------------
    Debug build of project `D:\Project\PIC\FM_StereoRadioII\FM_StereoRadioII.mcp' failed.
    Language tool versions: MPASMWIN.exe v5.51, mplink.exe v4.49, mplib.exe v4.49
    Preprocessor symbol `__DEBUG' is defined.
    Sun Nov 08 02:46:06 2020
    ----------------------------------------------------------------------
    BUILD FAILED
    
 上のエラーメッセージの中で、次の
    Error - section '.org_3' can not fit the absolute section. Section '.org_3' start=0x00000008, length=0x00000bf2
    
が問題なわけで、「 '.org_3' は絶対セクションに適合できない。」 の意味がまったく分からない?  '.org_3' とは何?  ちなみに、アセンブルリストを見てみると、当然ながら正常でエラーはない。 次は、リンクエラーが発生したとき(call wait_1sec が2行のとき)の、アセンブルリストで表示されるメモリの使用状況など。
    	         :
    	         :
    	All other memory blocks unused.
    
    	Program Memory Words Used:  1531	← 1530 を超えるとエラーになる! ???
    	Program Memory Words Free:   517
    
    	Errors   :     0
    	Warnings :     0 reported,     0 suppressed
    	Messages :     0 reported,    23 suppressed
    
 そこで、ソースプログラムをもう少しあれこれと変更をしてみて分かったことは、命令の種類が問題ではなく(当然だ)命令数が問題で、現状より1つ以上の増加をさせると同エラーとなる。 しかし、そうなると今後のプログラムの更新ができないではないか。 どうすれば良いのか ???

 なおも、いろいろと試していると
    	MEMORY USAGE MAP ('X' = Used,  '-' = Unused)
    
    	     :
    	     :
    	0580 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
    	05C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  ← 5FF を超えるとエラーになる
    	0600 : X--------------- ---------------- ---------------- ----------------
    	2000 : -------X-------- ---------------- ---------------- ----------------
    	2100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX--- ----------------
    
のように、5FFh 番地を超えたときに、確実にリンクエラーが発生することが分かりました。 こんな事象が起こるのは、リンカーのバグではないのか ???
    		call	wait_1sec	; 1 秒 ウェイトルーチン
    
の命令が1行のときには、偶然にも丁度 5FFh 番地までのメモリを使用していたのが、もう1行を追加したためにメモリの使用が 5FFh 番地を超えて 600h 番地までになり、結果、リンクエラーとなった。 ということになるようです。

 PIC16F684 を使用の本機においては、今後、プログラムの更新をする場合には、600h 番地以降のメモリが使用できないとなると、本来のラジオ機能には関係がない( Ver. 1.06 )で追加をした、 RSSI データ収集機能関連のルーチンを取り除いて、プログラムエリアを空けるしか方法がないのでは ??? (現在、500 ワード以上もの未使用の空きエリアがあるにもかかわらず!!)

 これは非常に不合理なことで何か方法があるはず。 フッとひらめいたのが次のように、プログラムの一部を 600h 番地以降に移動させてみたらどうか? ということでした。
    		org	h'0600'		;;;;; リンクエラーの回避策
    
    spectrum
    		movlw	b'00101110'
    		xorwf	PORTA,W
    	     :
    	     :
    
 的中しました。 リンクエラーは発生しません。 そのときのメモリ使用マップが次の通り。
    	MEMORY USAGE MAP ('X' = Used,  '-' = Unused)
    
    	     :
    	     :
    	0480 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
    	04C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX-  ← 5FF を超えて連続で
    	0600 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX     600 以降に続かないようにする
    	0640 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
    	     :
    	     :
    
 上のメモリ使用マップのように、5FFh 番地を超えて連続で 600h 番地以降に続かない(両番地の境を跨がない)ように すれば、リンクエラーを回避することが可能なことが分かりました。

 以上から、結論は、やはりリンカーのバグだと思います。 そして、この事象の回避策としては、5FFh 番地を超えるような大きなプログラムの場合には、5FFh 番地のメモリを使用しないようにする ことです。

 *** その後、もう一つ分かったことがありました ***

  '.org_3' とは何?  と上述をしましたが、MPLAB IDE がビルドをする過程でリンカーが作り出す .map ファイルの中にありました。

 まず、リンクエラーが発生したとき の、アセンブルリストで表示されるメモリ使用マップ
      MEMORY USAGE MAP ('X' = Used,  '-' = Unused)
      
      0000 : X---X---XXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
           :
           : (省略)
           :
      0580 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      05C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      0600 : X--------------- ---------------- ---------------- ----------------
      2000 : -------X-------- ---------------- ---------------- ----------------
      2100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX--- ----------------
      
      All other memory blocks unused.
      
      Program Memory Words Used:  1531
      Program Memory Words Free:   517
      
      Errors   :     0
      Warnings :     0 reported,     0 suppressed
      Messages :     0 reported,    23 suppressed
      
 そのときの リンカーが作り出す .map ファイル の先頭の一部分。
      MPLINK 4.49, Linker
      Linker Error Map File - Created Mon Nov 09 01:55:14 2020
      
      *Warning* - This is only a partial map file due to a link time error.
         Only sections which were allocated prior to the error are shown below.
      
      CODEPAGES:
          Memory      Start        End              Section    Address Size(Bytes)
       ---------  ---------  ---------            ---------  ---------  ---------
            page     0x0000     0x05ff               .org_0     0x0000     0x0000
                                                     .org_1     0x0000     0x0002
                                                     .org_2     0x0004     0x0002
      
           debug     0x0600     0x07ff                                           
      
         .idlocs     0x2000     0x2003                                           
      
      .device_id     0x2006     0x2006                                           
      
          eedata     0x2100     0x21ff                                           
      
         .config     0x2007     0x2007 .config_2007_FM_STEREORADIOII.O     0x2007     0x0002
      
 次に、org h'0600' で回避策をしたとき の、アセンブルリストで表示されるメモリ使用マップ
      MEMORY USAGE MAP ('X' = Used,  '-' = Unused)
      
      0000 : X---X---XXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
           :
           : (省略)
           :
      0480 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      04C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX-
      0600 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      0640 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      0680 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      06C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
      0700 : XX-------------- ---------------- ---------------- ----------------
      2000 : -------X-------- ---------------- ---------------- ----------------
      2100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX--- ----------------
      
      All other memory blocks unused.
      
      Program Memory Words Used:  1531
      Program Memory Words Free:   517
      
      Errors   :     0
      Warnings :     0 reported,     0 suppressed
      Messages :     0 reported,    23 suppressed
      
 そのときの リンカーが作り出す .map ファイル の先頭の一部分。
      MPLINK 4.49, Linker
      Linker Map File - Created Mon Nov 09 01:56:03 2020
      
                                       Section Info
                        Section       Type    Address   Location Size(Bytes)
                      ---------  ---------  ---------  ---------  ---------
                         .org_0       code   0x000000    program   0x000000
                         .org_1       code   0x000000    program   0x000002
                         .org_2       code   0x000004    program   0x000002
                         .org_3       code   0x000008    program   0x0009ee
                         .org_4       code   0x000600    program   0x000204
      .config_2007_FM_STEREORADIOII.O       code   0x002007    program   0x000002
                         .org_5       code   0x002100    program   0x00005a
      
                                    Program Memory Usage 
                                     Start         End      
                                 ---------   ---------      
                                  0x000000    0x000000      
                                  0x000004    0x000004      
                                  0x000008    0x0004fe      
                                  0x000600    0x000701      
                                  0x002007    0x002007      
                                  0x002100    0x00212c      
                  1577 out of 2310 program addresses used, program memory utilization is 68%
      
 ここで、上で示した リンクエラーが発生したときの、リンカーが作り出す .map ファイルの、次の部分に注目をすると、
      CODEPAGES:
          Memory      Start        End              Section    Address Size(Bytes)
       ---------  ---------  ---------            ---------  ---------  ---------
            page     0x0000     0x05ff ←注目        .org_0     0x0000     0x0000
                                                     .org_1     0x0000     0x0002
                                                     .org_2     0x0004     0x0002
      
           debug     0x0600     0x07ff                                           
      
 この辺りにリンクエラーが発生する原因があるのではないかと思われます。 リンカーがプログラム内部でどのような動作をしているのか、具体的なことは私にはわかりませんが、 End Memory が 0x05ff となっていることに起因するのではないでしょうか。

 以下は私の想像ですが、上述した MPLAB IDE がエラーメッセージを吐き出したときの、リンカーのパラメータ指定をしている部分だけを再表示すると、次のようになっています。
    Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\mplink.exe" /p16F684 "FM_StereoRadioII.o" /u_DEBUG /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /o"FM_StereoRadioII.cof" /M"FM_StereoRadioII.map" /W /x
    
 これらのパラメータは、もちろん私が指定をしたものではありません。 初めに Project Wizard を使用したときに、MPLAB IDE が勝手に作り出したものです。 そして、これらのパラメータの意味は私にはよくわかりませんが、 もしかしたら、これらのパラメータを変更することで、リンクエラーの発生をなくすことができるのかもしれない。 フッと、そう思いました。

 | プログラムのトップに戻る |


現在の最新バージョン: Ver. 1.07b  ( 2021/01/12 更新 )

ソースファイル (FM_StereoRadioII.asm)
 I2C LCD 制御サブルーチン (I2C_S_LCD.sub)  Ver. 1.03
HEX ファイル (FM_StereoRadioII.hex)

| ページトップ |

■ プリント基板の加工と部品配置 ■

 使用したプリント基板は、"秋月電子" の "片面ガラス・ユニバーサル基板 Bタイプ(95×72mm)めっき仕上げ(通販コード P-00518)" ですが、ケース加工図 で示したポリスチレンケース内に収納するためには、 下図に示すようにプリント基板の切断等の加工が必要です。 まず、横 ----- X 線の位置で切断をし、次に、縦 ----- Y1、Y2 線の2ヶ所の位置で切断をします。

 そして次に、左横の位置に図のような ----- 線のコの字型になるようにくり抜きます。 この位置には基板取付用の BOX型Φ3.5ステレオジャックを取り付けたいのですが、使用したケースの左横の形状が特殊?で単純な垂直ではないことと、 ケース内側の底板と天板との空間サイズが小さいために、プリント基板の部品面に取り付けたのでは、BOX型ジャックのプラグ挿入口をケース外に取り出すことが不可能です。 そこで、サブ基板を使用してメイン基板のハンダ面側に位置するように取り付けます。 (BOX型ジャックの取り付け の項を参照)

 また、基板の右下の角には ----- 線の図のような形状で切り抜きます。 この切り抜いた後の空間には電源スイッチが位置します。 使用した電源スイッチは、手持ちにあったプッシュスイッチを採用しました。 しかし、このスイッチを採用したことは 完全に失敗( 後述 )でした。 このプッシュスイッチはオルタネイト型(1度ボタンを押すと ON 状態になり、ボタンから手を離しても、ON 状態を保持する)で、"ミヤマ" の製品ですが型番は分かりません。

 最後に、基板の四隅にケースに取り付け用の穴Φ3.2 を4個開けます。 残りの小さな穴5個は、LCDモジュールの取り付け台のための木片固定用、サブ基板の固定用、およびアンテナ線の取り出し用で、すべてΦ2 を開けます。



切断、穴あけしたプリント基板 (部品面)


同プリント基板 (ハンダ面)

| プリント基板部品配置図 (FM_StereoRadioIIPC0.CE3) | ページトップ |

■ プリント基板パターン図 (部品面) ■

 本機で使用する LCDモジュールは、基板との接続用の足ピンのピッチが 1.5 mm のため、通常の 2.54 mm ユニバーサル基板には、そのままでは搭載することができません。 そのために、専用のピッチ変換基板を使用する場合は良いのですが、 本機のように専用のピッチ変換基板を使用しない場合には、一工夫が必要です。 そこら辺りのことを "184. ストップウオッチ II" の "LCDのプリント基板への取り付け" で詳細に述べていますので、そちらを参照してください。

 また、FMラジオモジュールについても、外部との各接続用端子間のピッチが 2 mm のため、同様にそのままでは搭載することができません。 こちらについては、前作 "187. FMステレオラジオ" の "FMラジオ、デジタルアンプの各モジュールの加工" で、ピッチ変換の方法を詳細に述べていますので、そちらを参照してください。



BOX型ジャックサブ基板を取り付け前


同基板を取り付け配線が済んだ後

 BOX型ジャック用サブ基板については、後述の BOX型ジャックの取り付け を参照してください。 4個のタクトスイッチについては、毎回述べているように本機でも、キートップ長が通常のものより長いもので、 実測 9.5mm のものを使用しています。 左下の2個の青色の四角いものは以前に "秋月電子" で購入した、ニッセイ電機のメタライズドフィルムコンデンサで、立てて取り付けるとケース内部の空間に収まらないため、寝かせて取り付けました。

 コネクタの 4P のピンヘッダ(オス)、および 2P のピンヘッダについては、"秋月電子" の背の低いタイプのロープロファイルピンヘッダ(全長:7.7 mm)を使用しました。 そして、相棒のコネクタ(メス)には、 空間の高さが小さくてピンソケットの使用ができないため、"TJC8ピンターミナル(メス)" を曲げて使用しました。 このターミナルについては、"182. ラーメン・タイマー II 2題" の "ケースへのプリント基板の取り付け" を参照してください。

| プリント基板パターン図 (部品面) (FM_StereoRadioIIPC.CE3) | ページトップ |

■ プリント基板パターン図 (ハンダ面) ■

| プリント基板パターン図 (ハンダ面) (FM_StereoRadioIIPC1.CE3) | ページトップ |


配線用ワイヤーについて (余談)

 上写真に写っている白色の配線用ワイヤーは、最近購入したもので、今回、本機で初めて使用をしてみました。 最近になって、私はアマゾンにおける中国製品の市場(しじょう)にハマっていて、安価だったので購入をしてみました。 少し前に、"185. TMS1121 デジタルタイマー・シミュレータ II" のページで書いたように、大昔、ラッピング用ワイヤーを "秋月電子" である量をまとめて購入をした (現在では "秋月電子" では入手ができない) のですが、それらのワイヤーがだんだんと底をつき始めたため、他での補充を何とかしなければならない、と常々思っていました。

 そんな折、アマゾンでこのワイヤーを目にしたので、注文をしてみたのです。 ラッピングワイヤー AWG30 ということで、このサイズが私にとっては最も使い易いのです。 そして、実際に使ってみた私の使用感ですが、 今まで使い慣れていた "秋月電子" のものと比べると、芯線の太さが何となく少しばかり細いように感じられます。 また、被覆については逆に太く(厚く)感じられ、しかも、(表現がおかしいですが)芯線に対しての密着感がなく、 何となくブカブカしているように感じられました。

 最も肝心なハンダ付けをしたときの感想ですが、やはり被覆は熱には弱いようで、鏝先を少々長めに(というほどでもないのですが)当てていると熱源に近いところでは、被覆が融けるように細長く縮むようになります。 そして、鏝先が誤って被覆に触れたりすると、黒く焦げてしまいます。 購入したものは白色の被覆なので、焦げ目がすごく目立って見苦しい状態になってしまいます。

 もっとも、このワイヤーはラッピング用ということなので、ハンダ付けをするというのは、使用目的が異なっていて間違いなのかもしれません。 いずれにせよ、ハンダ付けをするという目的には向いていないようです。 後、書き忘れるところでしたが、このワイヤーの被覆はすごく柔らかく、被覆を剥くのにストリッパーはいりません。 親指と人差し指の爪先で簡単に剥くことが可能です。

 以上から、本機のように配線量も少なくあまり密集しないような製作物の場合には、上述のように不満はありますが使って使えないことはない、という程度でしょうか。 ただし、鏝先の当てている時間には、常に細心の注意が必要です。 逆に、上述の "185. TMS1121 デジタルタイマー・シミュレータ II" のように配線量が多い製作物の場合には、ワイヤーの被覆が太い(厚い)ために嵩ばってしまい、配線材としては向いていないと思います。 というよりも、常に鏝先の当て時間にばかり気を配っていては、配線量が多いだけに疲れてしまいます。

 このワイヤー、1巻で 305 メートルあって、私は1巻のつもりで発注をしたのですが、どういうわけか2巻も送られてきました。 これはサービスなのでしょうか?  しかし、上述のような理由から、この先、出番は少なそうなワイヤーとなった今、600 メートルもあって如何にして消化をして行ったら良いのやら ・・・

■ BOX型ジャックの取り付け ■

 プリント基板の加工と部品配置 の項でも述べたように、使用するケースの左横の形状が特殊?で単純な垂直ではないことと、ケース内側の底板と天板との空間サイズが小さいために、 BOX型ジャックをプリント基板の部品面に取り付けたのでは、プラグ挿入口をケース外に取り出すことが不可能です。 そこで次の写真に示すように、サブ基板を使用してメイン基板のハンダ面側に位置するように取り付けます。

 まず、5 x 7 穴のプリント基板を用意してサブ基板としますが、ユニバーサル基板のために、そのままでは BOX型ジャックの端子が基板の穴には入りません。 そこで、次の左2枚の写真のように、BOX型ジャックを取り付けたときの、 その端子の位置に該当する穴の加工をします。 しかし、私はカッターナイフの先で行ったために、写真に示す通りで奇麗にはできませんでした。

 いずれにしても、穴のハンダ面側のランドがつぶれてしまうので、このままではハンダがうまく付かなくなります。 そこで、つぶれたランドを補正するために、 * を付した写真( 拡大 )のように、隣の空きランドを使用して細線でハンダ面積が広がるようにします。 同様に、該当のすべてのランドを補正してハンダ付けをした結果が、 * 写真の右側の写真です。

ハンダ面 部品面 BOX型ジャックを取り付け つぶれたランドを補正 * すべての端子をハンダ付け 部品面

 こうして、BOX型ジャックを取り付けたサブ基板をハンダ面を上にして、メイン基板のコの字型にくり抜いた空間に、BOX型ジャックが嵌まるように載せた後、M2 のなべねじ2本で固定をします。

| ページトップ |

■ ケース加工図 ■

 使用したケースは、100均(セリア)で購入した "トラベルケース L 1P (No.1432) 山田化学" というポリスチレンケースです。


 上図では、ケースの形状を正確に描くことが難しいので、かなり単純化して全体像を表していますが、実際には、上下左右の各 "かど" などは、角ではなく丸みを帯びていたり、しかもテーパ状になっていたりして、 2次元の図では表現がしきれません。 特に、上図右側の(下面図)では実際に裏側から見ると、複雑?な形状をしていて表現をすることができません。

上の(上面図)において下側面側から見たところ 上の(上面図)において左側面側から見たところ

 したがって、ケースの加工図として寸法を記入してありますが、これらの値は参考までに見ておいてください。

 そこで実際にケース加工を行う場合には、(上面図)に示す4個のΦ3.5 タクトスイッチ用の穴位置は、ケースが透明で中が透けて見えるので、現物合わせで行った方が確実です。 その方法は、まず、(下面図)に示す4個の穴をあけて(これも現物合わせ)、プリント基板(BOX型ジャック用サブ基板を取り付けないで)をケース底板に仮に取り付けておいて、 上蓋を閉めると4個のキートップの位置が透けて見えるので、実際の穴位置が明確になります。 BOX型ジャックのプラグ挿入口の○穴は、BOX型ジャック用サブ基板を取り付けておいて、同様に現物合わせで開けました。

 下の写真は、以上述べた現物合わせ法で穴開け加工をして、プリント基板を組み込んだ様子を、各側面から見たところです。 ケースの複雑?な形状を理解する上での参考にしてください。 なお、プリント基板の下側とケース底板との間に見える白いものは、M3 x 5 サイズのスペーサで、この 5 mm 長のものが本機の場合には丁度良い長さとなっています。

上側面を見たところ 左側面を見たところ 両者中央の側面から見たところ

使用した電源スイッチについて

 本機の電源スイッチとして、当初は、前作の "FMステレオラジオ" のように、トグルスイッチを使用してプリント基板上に取り付けるつもりでいました。 しかし、本機ではタクトスイッチの取り付けを、 前作とは縦横を逆にして 90 度異なって付けたために、トグルスイッチとは中心線がずれてしまうので、トグルスイッチの使用は断念をしたのです。

 そこで、どんなスイッチにしようか、と手持ちの中でいろいろ検討をして、次の写真のようなプッシュスイッチに決めたのですが、これがまた大失敗でした。 それは、結果として、スイッチ本体の全長が少しばかり長過ぎたのが一番の問題で、使用したケースが上のケース加工図に示すように、厚さ 21 mm と薄い中に収納するのには少々無理があったようです。

 そのために、スイッチのハンダ付け用の端子を根元から 90 度横に曲げ広げて、その分だけ全長を縮めたりもしました。 そして、スイッチ本体を薄いケース内から上方向に抜くために、ケースの上蓋の上面側に ( 2 ) のワッシャを挟んで取り付けてもまだ長いので、何か他にもう少し厚いワッシャ代わりになるようなものはないかと、いろいろなものを探し回りました。 ワッシャ代わりとするためには、内径が 11 mm ほどの穴が開いていなければなりません。

 そして、何とか代理になりそうなものを見つけたのが ( 5 ) でした。 これは、( 4 ) と ( 5 ) がペアになっているもので、プラスチック系のブッシングのねじで、写真では分かりませんが厚さが 5 mm あります ( 2 mm ほどが丁度良いと思われる)。 そのため、今度は逆にケース内から上方向に抜き過ぎになりました。

 結果として、ケース外観と内部の様子 の写真群に写っているように、この電源スイッチがケースに対して大き過ぎるのが強調されて、見苦しい存在となっています。 作者の私としては、大いに不満を感じているのですが、今のところ何ともならないのが現状です。


 なお、使用したプッシュスイッチは上述もしましたが、オルタネイト型(1度ボタンを押すと ON 状態になり、ボタンから手を離しても、ON 状態を保持する)で、 "ミヤマ" の製品ですが型番までは分かりません。

| ケース加工図 (FM_StereoRadioIICS.CE3) | ページトップ |

■ 使用部品表 ■

(主要部品: IC, トランジスタ等)

(データシート)
PICマイコン .................... PIC16F684
トランジスタ .................... 2SA1015
LCDモジュール .................... AQM0802A-RN-GBW

| 部品表 | Excel ファイル (FM_StereoRadioII_parts.xls) | ページトップ |

■ 参考資料・サイト ■

59円チューナモジュールを使ったFMラジオ .......... http://www.asahi-net.or.jp/~rn8t-nkmr/family/pic/fr/index.html
矢野零趣味のページ/Grove I2C FM Receiver を使う .......... http://yanozero.blog.fc2.com/blog-category-26.html
PIC16F684 データシート .......... https://akizukidenshi.com/download/ds/microchip/PIC16F684.pdf
RDA5807M データシート .......... http://www.datasheet.jp/pdf/808923/RDA5807M.html
AQM0802A-RN-GBW データシート .......... https://akizukidenshi.com/download/ds/xiamen/AQM0802.pdf
Ren He FMラジオモジュール RDA5807M RRD-102V2.0 ステレオ DC 2.7-3.6V 5個 収納ボックス付き

| ページトップ | ホーム |


Copyright (C) 2020-2023 やまもとみのる
初版:2020年11月14日、初公開:2020年11月14日、最終更新:2023年10月26日