NXP JN516X (TWELITE) をプログラミングする(TICKTIMER)

JN516xで時間計測する方法は複数ある。

・Timer(XTAL)
・TickTimer(XTAL)
・WakeTimer(RC)
・Watchdog(RC)

それぞれ長短あるが正確なのはXTALクロック駆動のTimerとTickTimerだ。どちらもマイクロ秒未満を測ることも可能だ。

16MHz駆動の場合、Timerは16bitなので4,096us、TickTimerは32bitなのだがreference-countが28bitなので16,777,215usまで測れることになる。それ以上を計測するにはオーバーフロー処理すれば良いが計測中にタイマーカウンターを変更したり止めたりすると誤差が生じるため動かし続けることが重要である。

で、どちらを使うかであるが多機能なTimerは残しておきたいと考えるのが普通?だとすると残るはTickTimerのみだ。28bitもあるのでオーバーフロー処理のオーバーヘッドを気にしなくても良いというメリットもある。それとマイクロ秒未満を出来るだけ簡単に計算できるようカウンターは32bitフルで使いたいのでreference-countの28bitに制限されない方法を考えてみた。

32bit以上を計測するにはカウンター(32bit)がゼロになったときにオーバーフロー処理を行う必要があるのでreference-count(28bit)の設定はゼロになる。但し、カウンターが一回りする間に16回マッチしてしまうためオーバーフロー処理は16回毎に行う必要がある。

【TickTimerの初期化】

TickTimerのカウンターとreference-countをゼロ設定しコンティニューモードでスタートすると即座に割り込みが発生し誤動作してしまう。そのためタイマーを先にスタートさせカウンターがゼロ以外になってから割り込み許可するようAPIの実行順で調整している。

【オーバーフロー処理】

16回毎のオーバーフロー処理を割り込み毎に1/16ずつ加算することで単純化している。シンプルイズベスト!だ。

【修正履歴】
2022-05-03
オーバーフロー・マスク値のキャスト・ミスによりmicros64()の戻り値の上位32bitが常にゼロになっていたのを修正。基本的な検証ミス。約71分後にならないと現象確認できないのに性格の問題によりそこまで待てなかったのが敗因か。(-_-;)

【ライブラリ】
64bitのマイクロ秒時間(micros64)、マイクロ秒未満の計測のための16MHzクロックカウントの取得(read)、割り込み禁止状態からのmicros64呼び出しに対応。

【Lチカ再挑戦】

時間計測ができるようになったので前回のLチカを1秒おきに点滅するようにしてみよう。

前回の超高速Lチカの点滅は見えなかったが今回は見えるぞ。(笑)

次回は、UART及びUART用のデバッグライブラリを説明する予定。

【関連投稿】
NXP JN516X (TWELITE) をプログラミングする(開発環境の構築)
NXP JN516X (TWELITE) をプログラミングする(メイン・ルーチン)
NXP JN516X (TWELITE) をプログラミングする(TICKTIMER)
NXP JN516X (TWELITE) をプログラミングする(UART)
NXP JN516X (TWELITE) をプログラミングする(SYSTEM)
NXP JN516X (TWELITE) をプログラミングする(GPIO)
NXP JN516X (TWELITE) をプログラミングする(TIMER)
NXP JN516X (TWELITE) をプログラミングする(ALARM)
NXP JN516X (TWELITE) をプログラミングする(WAKETIMER)
NXP JN516X (TWELITE) をプログラミングする(WATCHDOG)
NXP JN516X (TWELITE) をプログラミングする(I2C)
NXP JN516X (TWELITE) をプログラミングする(SPI)
NXP JN516X (TWELITE) をプログラミングする(ADC)
NXP JN516X (TWELITE) をプログラミングする(COMPARATOR)
NXP JN516X (TWELITE) をプログラミングする(CLOCK)
NXP JN516X (TWELITE) をプログラミングする(BROWNOUT)
NXP JN516X (TWELITE) をプログラミングする(PULSCOUNTER)
NXP JN516X (TWELITE) をプログラミングする(INFRARED)
NXP JN516X (TWELITE) をプログラミングする(RANDOM-GENERATOR)
NXP JN516X (TWELITE) をプログラミングする(FLASH)
NXP JN516X (TWELITE) をプログラミングする(EEPROM)
NXP JN516X (TWELITE) をプログラミングする(WPAN)
NXP JN516X (TWELITE) をプログラミングする(Eclipse-CDT+MWSTAGE)
NXP JN516X (TWELITE) をプログラミングする(乗算と除算)
NXP JN516X (TWELITE) をプログラミングする(マルチタスク)
NXP JN516X (TWELITE) をプログラミングする(フラッシュ・プログラマー)
NXP JN516X (TWELITE) をプログラミングする(OTA UPDATE)
NXP JN516X (TWELITE) をプログラミングする(TWELITE CUE/MC3630)
NXP JN516X (TWELITE) をプログラミングする(LED)
NXP JN516X (TWELITE) をプログラミングする(AES)
NXP JN516X (TWELITE) をプログラミングする(Downloads)