FPGA FMチューナをコントロール Ver2

[以前作ったFPGA FMチューナをコントローラー](https://qiita.com/yamori813/items/15f671dc67c96ff68858)をバージョンアップしてみました。

FPGA FMチューナーは選局の信号を送ると受信状態を返してくれるので、これを確認できるようにします。

前のバージョンではATTiny85を使いましたが、このチップにはUARTのハードウエアサポートが無くソフトウエアで処理しています。送信だけのコードがあったので、それを使いました。

いろいろ調べてみるとソフトウエアでも送受信できるものがあるようです。

しかしI2Cの液晶をつける事を考えるとATTiny85では厳しい感じです。

8ビットマイコン箱のストックを見てみて、ATTiny2313を使ってみることにしました。（実はここまで紆余曲折があったのですが省略）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/0ca0ecab-46d9-4cc6-a6d2-0d17b5b8db4b.png)

オーディオは光ったほうがかっこいいので、LCDはPCF8574をつないだSIIの古いバックライト付のキャラクタ液晶を使います。ATTiny2313は20Pinなので4BitモードのLCDを制御する7本の信号は引き出せますが、PCF8574を使ったI2Cのモジュールがあったので使いました。PCF8574モジュールを使うメリットとして信号線が2本で済むというのもありますが、バックライトを制御できるというのもあります。モジュールのPowerの赤いLEDは必要ないので外しました。

FPGA FMチューナの初期の仕様では制御線は14pinの方にあったのですが、20Pinの方に変更になったので、20Pinの方にコネクタを付けることにします。ただ20Pinの方にはVCCが無いので、14Pinの方からっもらっています。

ビルドはFreeBSDで動かしている、platformioで行いますが、Arduinoのライブラリは使わないのでC++ではなくCで書きました。

flashはAVRいじりの最初に同じATTiny2313で作ったUSBtinyISPで焼きました。

uartとi2cはハードウエアサポートがありますが、初期化などのコードが必要でgithubにあったコードを使いました。PCF8574の使い方は[こちらのページ](https://qiita.com/CoTechWorks/items/08d5bc659daa1e5acdf4)を参考にしました。リモコンの受信処理は前のコードを流用しました。

fuseはデフォルトから8分周を外して、8MHzで動くようにしました。platformio.iniに設定を書いて、下記のコマンドで焼けます。

```
% pio run --target=fuses
```

マイコンは5Vで動かしてTXは1K,2Kで分圧で3.3VにしてRXは1Kをはさんでつないであります。

内蔵8MHzクロックで115200ボーにするとクロックのずれで文字化けする事もあるようですが、大丈夫なようです。だめな時は[外部水晶や発信器を使う](https://www.insidegadgets.com/2013/02/10/using-the-attiny2313a-to-send-serial-data-using-usart/)必要があります。

![FPGAFMCTL2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fd0ea32b-4d71-43a1-b0cc-34af307fdb20.png)


https://github.com/yamori813/fpgafmctl2

LCDの設定はバックライトオフで行って、文字を表示する時にオンにしています。リモコンの信号を最初に受けた時にオンになります。

flashが2kなのでぱつぱつです。何も機能追加ができませんでした。というか前つけたボタンの機能が実装できていません。表示も返ってきた値そのままです。もうすこしいじって見ますが、マイコンの選択に無理があったかもしれません。

```
No dependencies
Building in release mode
Checking size .pio/build/attiny2313/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=====     ]  52.3% (used 67 bytes from 128 bytes)
Flash: [==========]  98.4% (used 2016 bytes from 2048 bytes)
============================== [SUCCESS] Took 0.57 seconds ==============================
```

![IMG_20250426_142936.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a0a7c20a-f466-484b-a699-a39ecefef214.jpeg)

AVRのコードの最適化はAVR4027というドキュメントがあり、この中の最初に型の話があり、コードを見直したところ、12Bitの赤外線信号をlongで扱っていたところ、shortにしたら10%くらい減りました。

一行に3つデーターを表示するようにしました。

![IMG_20250429_062044.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f1c7b4a7-5441-41d8-9042-45ad54db0de3.jpeg)

このSII社製の液晶は秋月で取り扱いがある三共社社製の液晶のオリジナルのようです。

回路を安定するようにいじったところ、逆に動作が不安定になりました。どうも動作が安定した事で、クロックのずれが顕在化したようです。

上のUARTの記事を読み以下のワークアラウンドでどうにか動くようにしました。

まずU2Xを設定して16分周から8分周に変更しました。

これにより

8000000 / (115200 * 8) - 1 = 7.6

~~で7だと送信がうまくいかなくなるので8にしたところFPGA FMチューナが正しく受けられるようになりました。ところが今度はATTinyの受信が化けます。このため送信の時だけ8にして、受信は7でするようにしました。半二重のような通信なので、これでどうにかなりました。~~ なぜか翌日動かなくなったので戻して7で送受信できますが、ときどきおかしくなります。

もうユニバーサル基板にスペースがないので仕方ないのですが、本来であれば適当な外部水晶を使うほうが良いと思います。

我が家にはフルカバレッジバージョンと最初のバージョンの2台のFPGA FMチューナがあり、これは最初のバージョンの方で試しました。最初のバージョンは受信周波数の範囲が狭いのですが、ケーブルテレビのFMの再送信はかなりまとまっているので、すべて受信できています。