一定の間隔でAD変換を実行してSDカードにそのデータを記録していくわけだが、そのあたりのタイミングをどうやって取ろうか考え中だ。
普通にタイマーの割り込みでもいいが、RTCCにはAlarmの機能がついている。
時計だからアラームは付き物なわけで、これが割り込みを発生させることも出来そうなので、ちょっと試してみた。
RTCCの基本の時刻を刻む機能は普通に動いていて、その前提でAlarmを追加するとした場合、以下のような設定を書き加えることになる。
まずは、ちゃんと割り込みが機能しているかをLEDの点滅でチェックするための割り込み処理の部分。
1 2 3 4 |
void __attribute__((interrupt, auto_psv)) _RTCCInterrupt (void){ IFS3bits.RTCIF = 0;//Real-Time Clock/Calendar Interrupt Flag LATAbits.LATA0 = ~LATAbits.LATA0; } |
8ビットのPICでの書き方から比べるとちょっと見慣れない感じがするが、基本的にはこの「_RTCCInterrupt」の部分を割り込みの種類によって変更するだけだ。
Alarm関連の部分は以下のようになる。
いろいろ悩みながら試したので、その過程もコメント・アウトするだけで消さずに残してある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//Settings for Alarm and Interrupt //PADCFG1bits.RTSECSEL = 0;//RTCC seconds clock is selected for the RTCC pin PADCFG1bits.RTSECSEL = 1;//RTCC alarm prulse is selected for the RTCC pin //RCFGCALbits.RTCOE = 1;//RTCC Output is enabled RCFGCALbits.RTCOE = 0;//RTCC Output is disabled ALCFGRPTbits.ALRMEN = 1;//Alarm is enabled //ALCFGRPTbits.ALRMEN = 0;//Alarm is Disabled ALCFGRPTbits.CHIME = 0;//Chime is Disabled ALCFGRPTbits.AMASK = 0b0001;// ALCFGRPTbits.ARPT = 0b11111111; //ALCFGRPTbits.ALRMPTR = 0b00; //ALRMVAL = 10; IEC3bits.RTCIE = 1;//Real-Time Clock/Calendar Interrupt request is enabled IPC15bits.RTCIP = 1;//Real-Time Clock/Calendar Interrupt Priority |
とりあえず、これで、1秒間隔(ALCFGRPTbits.AMASK = 0b0001;)で255回(ALCFGRPTbits.ARPT = 0b11111111;)の点滅を繰り返すという動作ができる。
半端な時間間隔にしたければ一工夫必要そうだが、まあ、当面はこれだけで十分間に合うだろう。
RTCIEとRTCIFは存在は分かっているのに名前を確認するのに手間取った。
RTCIPは、そもそも16ビットのPICではプライオリティが設定できること自体を聞きかじった程度だったので、初めは設定するのを忘れていた。
いずれにしても、データシートのRTCCの部分だけでなくInterrupt Controllerの部分も一通り目を通した方がいい。