2020年7月30日木曜日

おしゃべり時計withUSB開発日誌(5)、RTCC_キャリブレーションコーディング

今まできちんと時間計測の部分をコーディングしてこなかったので、おしゃべり時計とはいっても時計の機能がキチンとしていなかった。

しかしながら、PIC32MX250F128BはRTCC(Real Time Clock and Calendar)のモジュールが付いているので、MCCでこいつを有効にすれば動き始める。
最近のMCCの設定は、おしゃれで簡単にRTCCの設定が行える。


それで、このRTCCのモジュールには、キャリブレーション機能が付いていて、月差±0.66秒までRTCCの進み具合を調整できるのだ。これは使わない手はない。 


しかしながら、このキャリブレーションはRTCCONレジスタのCALビットに値を格納するのだが、これが 10bitsのサイン付きインテジャーで値は+511~ー512を設定する。マイナス側は補数表記である。



この設定にハタと困った。 10bits の値についてどうやって足し引きしたらよいのか?
c言語では、charは8bits, shortは16bits, longは32bitsである。 10bitsの型なんて無い。
色々と悩んだすえ、shortの変数に6bitsシフトして入れて、足し引きしたのち、6bitsシフト戻してRTCCONbits.CAL にセットする事にした。


//*****************************************************************
// add RTCC Drift Calibration bits
//*****************************************************************
void vRTCC_CalAdd(
short value
)
{
    short cal;

    cal = RTCCONbits.CAL << 6;
    cal = cal + (value << 6);
    
    RTCCONbits.CAL = cal >> 6;
}

//*****************************************************************
// subtract RTCC Drift Calibration bits
//*****************************************************************
void vRTCC_CalSub(
short value
)
{
    short cal;

    cal = RTCCONbits.CAL << 6;
    cal = cal - (value << 6);
    
    RTCCONbits.CAL = cal >> 6;
}

20200730(+1.0h)




0 件のコメント:

コメントを投稿

pic16F18326のNCO1の機能を使った信号発生器

pic16F18326のNCO1の機能を使った、信号発生器をテストしました。 8Mhzのセラクロックを内部PLLで4倍し、FOSC 32Mhzを基に動いています。 pic16FのNOC1の仕様上は上限16MHz程度まで発信できるようですが、試していません。 ロータリーエンコーダー...