RTCCモジュール制御による
時刻表示とアラーム動作
(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード)
RTCCモジュールを使った キャラくタ液晶への時刻表示と所定時刻でのアラーム発生動作の例を紹介します。
<仕様>
・PIC32MZのRTCCモジュールを用いて以下をキャラクタ液晶に表示すること。
液晶1行目: 西暦年、月、日、曜日 (例) 2017/04/30 Fri
液晶2行目: 時、分、秒 (例) 15:03:26
・初期設定の時刻は 西暦2017年2月28日23時59分45秒とする。
・アラーム発生の時刻は 西暦2017年3月1日0時0分15秒とする。
・RTCCモジュールが動作している場合はLEDを周期 1sec、デューティ 50%で点滅させること。
・アラームが発生するまで、RCTT(RD0)ピンに RTCCセカンドパルス(0-3.3v、周期1sec、デューティ50%)を出力すること。
RTCCピンにコンデンサ経由でスピーカを接続してパルス立ち上がり、立下り時の音を聞けること。
・アラームが発生したら液晶に以下を表示のこと。
液晶1行目: Alarm occurred
液晶2行目: アラーム発生時刻(0:0:15)
・RTCCモジュールのクロック基準は32.768KHzの副発振器を用いること。
・RTCCドライバーは システムサービスのRTCCドライバーを使用すること。
<外観>PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。
汎用モジュール評価ボード(段積みボード)には本テーマと関係ない部品が多々実装されています。
<動作結果> (→ 動画:1080pのHD動画を見ることができます。)
液晶表示 | |
①起動直後 | ②初期値の時刻を表示しているところです。 1行目: 西暦年/月/日/ 曜日 2行目: 時/分/秒 |
![]() |
![]() |
③2017年(平年)の2/28から 3/1に変わった 直後の表示です。 RTCCモジュールのカレンダーが 2月を正しく28日と処理しているのがわかります。 |
④アラームが発生した場合の表示です。 2行目に アラーム発生の時刻が表示されて います。 |
![]() |
![]() |
RTCC(RD0)ピン出力電圧 1v/div 500msec/div |
|
アラーム発生前では、連続して 1Hz, Duty 50% の パルスが出力されています。 |
アラーム発生後(画面中央位置)からはに出力が パルスがなくなくなっています。 |
![]() |
![]() |
<解説>以下に、記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います
(以下は、Harmony v2.04 をもとに作成しています。最新のバージョンとは異なることがあるかもしれませんので注意してください。)
■ MHC設定
■ Options
<要点> RTCCドライバーは、システムサービスのドライバーです。 Driversのドライバーではありません。
■ Pin Settings
項目 | ③ポート設定1 | ④ポート設定2 |
MHC | ![]() |
![]() |
備考 | デフォルトからの変更要領 RG15/Function: GPIO_OUT (LED出力ポート設定) |
デフォルトからの変更要領 RD0/Functon: RTCC (RTCC出力ポート設定) |
■ キャラクタ液晶表示のライブラリ 1lcd_lib_XC32.h と 1lcd_lib_XC32.cを main.cと同じフォルダにコピーして、プロジェクトに追加します。
(詳細→ キャラクタ液晶表示方法 参照)
■ app.cに、青字部分を追加します。
①インクルードファイルを追加します。stdio.hがないと、sprintf( )がコンパイラのバージョンによってコンパイルで警告となることが
あります。 "peripheral/rtcc/plib_rtcc.hは RTCC_ID_0を定義して、drv_rtcc_static.cのように ハーモニー関数の
PLIB_RTCC_XXXXX( )をappc.でも使う為です。
#include "stdio.h"
#include "1lcd_lib_XC32.h"
#include "peripheral/rtcc/plib_rtcc.h" //RTCC_ID_0 有効化用
② 所要の変数、遅延関数を宣言、定義します。 曜日を表す文字列もプログラムを簡単にするために
2次元の配列char Week[7][4] = {{"Sun"},{"Mon"},{"Tue"},{"Wed"},{"Thu"},{"Fri"},{"Sat"}};
として定義しておきます。
int delay_Clock = 200000000; //200MHz
char Buf[32];
bool LED;
……
……
③APP_Initialize( )の中に 動作チェック用として液晶への文字表示のコードを記載します。
lcd_init(); // LCD初期化
lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF
lcd_clear();
……
……
④つづいて RTCCモジュールの時刻初期値、アラーム発生時刻を設定してRTCCモジュールをスタートします。
PLIB_RTCC_RTCDateSet(RTCC_ID_0, date); //年月日設定
PLIB_RTCC_RTCTimeSet(RTCC_ID_0, time); //時分秒設定
PLIB_RTCC_AlarmTimeSet(RTCC_ID_0, AlarmTime); //アラーム発生時刻設定
……
……
⑤App_Tasks( )で、Half Second bitの反転ごとのタイミングを捉えます。
SecStatus1 = PLIB_RTCC_HalfSecondStatusGet(RTCC_ID_0); //Half Second
bitの状態取得
// SecStatus1 = RTCCONbits.HALFSEC; //Half Second bitの状態取得
if(SecStatus1 != SecFlag)
……
……
⑥ LEDを点滅すべく、LEDを反転します。
if(LED == 1)
{
LED = 0;
LATGbits.LATG15 = 1; //LED点灯
……
……
⑦ RTCCモジュールの時刻を読みだします。
Year = PLIB_RTCC_RTCYearGet(RTCC_ID_0); //西暦年下2桁取得
Month = PLIB_RTCC_RTCMonthGet(RTCC_ID_0); //月 取得
Day = PLIB_RTCC_RTCDayGet(RTCC_ID_0); //日 取得
……
……
⑧ アラーム発生の割り込みが発生していない場合の液晶表示をおこないます。
if(AlarmOccurrence != 1 ) //アラーム発生の割り込みが発生していない場合
{
lcd_cmd(0x80); //1目の先頭へ
sprintf(Buf,"20%02x/%02x/%02x %s ",Year,Month,Day,Week[WeekDay]);//
……
……
⑨ アラームが発生した時刻を取得し、アラーム時の表示をおこないます。 更に、RTCCピンの出力を停止します。
else
{
Display_DateTime(); //年月日と時刻の液晶表示
PLIB_RTCC_ClockOutputDisable(RTCC_ID_0); //RTCC(RD0)ピンへのRTCCクロック(1Hz,duty=50%))の停止
……
……
以下、app.c
■ system_interrupt.cに、青字部分を追加します。
①アラーム割り込みが発生した場合の 割り込みハンドラを記述します。
Hour0 = PLIB_RTCC_RTCHourGet(RTCC_ID_0); //時 取得
Minute0 = PLIB_RTCC_RTCMinuteGet(RTCC_ID_0); //分 取得
Second0 = PLIB_RTCC_RTCSecondGet(RTCC_ID_0); //秒 取得
AlarmOccurrence = 1; //アラーム発生のフラグをたてる
以下、system_interrupt.c