なんとか同期させることができました。

 

プログラムでキーとなる要件は、

・RTCは秒設定完了から500ms後に動作する(DS3234Sデータシートより)

・GPSの$GPZDAデータ(例:$GPZDA,023545.000,16,04,2016,,*55)を利用する

・USARTで受けたGPSデータは格納時に2秒加算しておく

・曜日はツェラー(Zeller)の公式を使って1(日曜)~7(土曜)の値にしておく

・GPSの1PPSをIOC(インタラプトオンチェンジ)で受けて500msタイマー(微調整有)をかける

タイマー満了時にRTCの年月日時分秒曜日を設定する(設定中はUSARTはオフSPEN=0)

といったところです。

 

あらゆる割り込み(I2C、SPI、USART、IOC、TMR1)を駆使して、できるだけ正確な時間でRTCに設定をかけるだけのプログラム、見た目は汚い(複雑)です^^;

毎秒出力されるGPZDAデータは、時分秒、日、月、年、のみ入っていて便利でした。

ツェラーの公式は、新人研修時の課題で使って以来なのでとても懐かしい^^。

こんなところでPICに搭載することになるとは。

 

RTCはフリーラン状態にしておき、時刻合わせが必要になったらGPSを接続します。

ただしGPSから1PPSが出てこないと同期できませんので空が見える場所に移動させないとだめです。もちろん時刻合わせが終わったらGPSを外して構いません。↓外したところ

 

GPSぴったり時計のコア部分が安価にできてしまいました。

実験のタイムスタンプに使うことを想定していましたが、壁掛け時計なんかを作るのもよいかも知れません。