作成日:2013年1月3日
最終更新日:2013年1月21日

Arduino DUEのリアルタイムクロックを使ってみる

Arduino DUEのSAM3X8Eにはリアルタイムクロックが搭載されている。これを使ってみる。

注:この情報はドキュメント作成日におけるIDEの最新版であるVer1.5.1を元に作成しています。このIDEはβ版のため、今後変更される可能性があります。

ライブラリを使えば簡単

ATMELでライブラリが用意されているので、これを使えば簡単。RTC関連のレジスタはBCD表記なので、直接レジスタに設定するよりもライブラリを活用したほうが簡単。
起動時には内蔵RCクロックで動作するようだが、一部ロットには32kHzの外部Xtalが搭載されているのでこれが使える。この場合もライブラリを使えば簡単。外部Xtalに切り替える設定をした後に32768クロックを要するらしい。Arduino的にはdelay関数で1900mSecくらい待ったら外部Xtalに切り替わった。
ちなみに内蔵RCクロックの精度は全く期待できない。手元のArduino DUEで、1分で(1時間で、ではなく)約10秒遅れた。

Sketch
char buff[255];

void setup() {
  Serial.begin(57600);

  pmc_switch_sclk_to_32kxtal(0); // 外部水晶に切り替える
  delay(1900);
  Serial.println(pmc_osc_is_ready_32kxtal()); // 外部水晶に切り替わったか確認

  RTC_SetDate(RTC,2013,1,1,1); // 日付の設定。2013年1月1日。曜日は適当
  RTC_SetTime(RTC,0,0,0); // 時刻の設定。0時0分0秒。
}


void loop() {
  uint8_t month,day,hour,minute,second;  
  uint16_t year;
  
  RTC_GetTime(RTC,&hour,&minute,&second);
  RTC_GetDate(RTC,&year,&month,&day,0); // ここでは曜日は取得しない。取得不要であれば0を渡せば無視される。
  sprintf(buff,"%04d/%02d/%02d %02d:%02d:%02d",year,month,day,hour,minute,second);
  Serial.println(buff);
  delay(100); 
}

これで0.1秒間隔で、現在の日付・時刻が表示される。

アラームを使う

カレンダー、時計のアラームを使う場合でも、ライブラリの中のそれらしい名称の関数を使ったら期待どおり動いた。注意点としてはアラームの設定には値ではなくポインタを渡すということ。ここに0を渡すとその値は比較対象ではなくなる(例えば時に0を、分と秒に0へのポインタを渡せば、毎時0分0秒に割り込みが発生する)。
あとは割り込みを有効にすることを忘れずに。
割り込みハンドラの名称はRTC_Handler()。ATMELのライブラリにて定義されている。

Sketch
void setup() {
  Serial.begin(57600);
  uint8_t hour,minute,second;  

  RTC_SetDate(RTC,2013,1,1,1); // 日付の設定。曜日は適当
  RTC_SetTime(RTC,0,0,0); // 時刻の設定

  second = 0;
  RTC_SetTimeAlarm(RTC,NULL,NULL,&second); // アラームの時刻を設定。この場合は秒だけ。
  RTC_EnableIt(RTC,RTC_IER_ALREN); // 割り込みを有効に
  NVIC_EnableIRQ(RTC_IRQn); // NVICの設定も忘れずに
}

void loop() {
}

void RTC_Handler() {
  RTC_ClearSCCR(RTC, RTC_SCCR_ALRCLR);
  Serial.println("RTC HANDLER"); 
}

このスケッチの例の場合、毎分0秒に(つまり1分間隔に)RTC_Handler()が呼ばれる。

 

 



home | Elec top

inserted by FC2 system