GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
setup時にrtc_set_time(&t);をスキップすれば、前回セットした時刻を元にRTCがカウントアップし続けている仕様だとの思っていたのですが、リセットして直ぐにrtc_get_time(&t);してみるとすべて0に初期化され、秒のカウントアップも始まらないようです。リセットボタンを押しても、前回セットした時刻に基づく現在時刻が得られるような方法はありませんか?
パワーオンリセットで RTC を設定、以降 RTC の内容が更新されるたびに初期化されない未使用領域の RAM に RTC の内容を記録し、リセット時にはその値で RTC を設定するスケッチの例。
/*GR-KURUMI Sketch Template Version: V1.11*/ #include <RLduino78.h> #include <RLduino78_RTC.h> #define latestTime ((RTC_TIMETYPE*)0xfaf00) #define validLatestTime *((int*)0xfaf20) void rtcConstantPeriodInterruptHandler(void) { int modifyLatestTime = (validLatestTime < 0) ? 0 : 1 - validLatestTime; rtc_get_time(&latestTime[modifyLatestTime]); validLatestTime = modifyLatestTime; } static const uint8_t deadbeef[] = {0xde, 0xad, 0xbe, 0xef}; bool isPowerOnReset(void) { for (unsigned i = 0xaf30; i < 0xaf8f; i++) { if (*(uint8_t*)i != deadbeef[i % sizeof(deadbeef)]) { return true; } } return false; } void releasePowerOnReset(void) { for (unsigned i = 0xaf30; i < 0xaf8f; i++) { *(uint8_t*)i = deadbeef[i % sizeof(deadbeef)]; } } void setup() { Serial.begin(9600); rtc_init(); if (isPowerOnReset() || validLatestTime < 0) { validLatestTime = -1; static /*const*/ RTC_TIMETYPE initTime = {97, 8, 29, RTC_WEEK_FRIDAY, 2, 14, 0}; rtc_set_time(&initTime); releasePowerOnReset(); } else { rtc_set_time(&latestTime[validLatestTime]); } rtc_attach_constant_period_interrupt_handler(rtcConstantPeriodInterruptHandler); rtc_set_constant_period_interrupt_time(RTC_CONSTANT_PERIOD_TIME_1SECOND); } void loop() { static RTC_TIMETYPE lastTime; RTC_TIMETYPE currentTime; noInterrupts(); rtc_get_time(¤tTime); interrupts(); if (memcmp(¤tTime, &lastTime, sizeof(RTC_TIMETYPE))) { char buf[100]; static const char dayOfWeek[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; sprintf(buf, "%4d/%2d/%2d(%s) %2d:%2d:%2d", currentTime.year + (currentTime.year >= 70 ? 1900 : 2000), currentTime.mon, currentTime.day, dayOfWeek[currentTime.weekday], currentTime.hour, currentTime.min, currentTime.second); Serial.println(buf); lastTime = currentTime; } }
fujitaさん、ありがとうございます。GR-CARRYでもそのまま動きました。リセットを押しても1秒程度しか遅れません。いいですね。KURUMIでも使えるので嬉しいです。