RP2350の内部タイマーの生の値はtimer_hw->timerawlで取得できます(マイクロ秒)。 ここで、GPSとRV-8803-C7の1pps時にタイマーの生の値を取得し比較します。 GPSと同期できていれば理論上では両者に差がないはずですがおおよそ数百マイクロ秒のずれがあるはずです。 これはI2Cのクロックや書き込み量にもよりますが、I2C書き込みの遅延によります。 SPI駆動で高速動作するDS3234では見られなかった現象です。ただし、SPI駆動は消費電力が大きいためRV-8803-C7は消費電力で有利なI2Cを選択したのだと思われます。 RV-8803-C7そういうときのためにRTC機能を一旦停止するRESETフラグが存在します。 私の環境(I2C 100kHz、7バイトとRESETの書き込み)ではおおよそ700μsの差があったので、GPSと同期時に
- RESETフラグ書き込みし、RTCを一時停止
- 年月日時刻(7バイト)を書き込み
- add_alarm_in_us()を1000000+700マイクロ秒後に実行しRESETフラグをクリアしRTCを再始動
という手順を踏むことで数十μs以内のずれに抑え込むことができました。このとき1秒遅れるのであらかじめ書き込みを行う年月日時刻は1秒進める必要があります。 繰り上がりも考慮しなくてはいけないので同期は秒数1桁が8より小さいときに(GPSの1pps時に判明する時刻は1秒過去、I2Cの遅延解消で1秒遅れ)で行うとよいです。
つぎに、RV-8803-C7のオフセット調整です。 RP2350のタイマの生の値はそれほど正確ではありませんが、RV-8803-C7のオフセット調整を行うには十分です。 たとえば、GPSとの同期直後のずれが30μsだったとして、10秒後に33μsならばずれは3/10=0.3ppmのずれがあることになります。 RV-8803-C7は0.238ppmごとにオフセットが設定できますので0.3/0.238=1.2≒1をレジスタに(-32~+31の範囲)書き込んでやれば調整できます。

こんな感じでRP2350ニキシー管時計はRV-8803-C7の性能を限界まで引き出しています。


