Problemstellung:
Ich will die interne RTC mit dem internen RC-Glied betreiben(anstatt
externer 32,678 khz Quarz). Ich möchte den µC gerne jede Stunde aus dem
Sleep-Modus aufwecken, eine Messung mit einer Photodiode durchführen
(Messung funktioniert ohne RTC einwandfrei), den Messwert in eine
Variable einspeichern, und anschließend wieder den den Sleep Mode
versetzen.
Mein momentaner Code sieht folgendermaßen aus:
1 | //Interrupt Configurations
|
2 | PIR3bits.RTCCIF = 0; //Clear RTC Interrupt Flag
|
3 | PIE3bits.RTCCIE = 1; //Enable RTC Interrupt
|
4 | IPR3bits.RTCCIP = 1; // RTC Interrupt High Priority
|
5 |
|
6 | //RTC Configurations
|
7 | //RTCC Value Registers Write Enable RTCWREN
|
8 | _asm
|
9 | movlb 0x0f
|
10 | movlw 0x55
|
11 | movwf EECON2,0
|
12 | movlw 0xAA
|
13 | movwf EECON2,0
|
14 | bsf RTCCFG,5,1
|
15 | _endasm;
|
16 | RTCCFGbits.RTCEN = 1; //RTCC module is enabled after RTCWREN is set
|
17 | RTCCFGbits.RTCSYNC = 1; //RTCC Value Registers Read Synchronization bit
|
18 | RTCCFGbits.RTCOE = 0; //Disable RTC clock output
|
19 | RTCCFGbits.RTCPTR = 0; //RTC Pointer to Minutes and Seconds
|
20 | RTCCAL = 0x00; //No adjustment
|
21 |
|
22 | ALRMCFGbits.CHIME = 1; //A rollover from 00h to FFh is allowed
|
23 | ALRMCFGbits.ALRMEN = 1; //Enable Alarm
|
24 | ALRMCFGbits.AMASK = 0x05; //Alarm every hour
|
25 | ALRMCFGbits.ALRMPTR = 0; //Value Alarmpointer to Minutes and seconds
|
26 | ALRMRPT = 0xFF; //Alarm will repeat 255 more times
|
Fragen:
1. Vgl. Anhang 16.2.7: Laut Datenblatt muss ich zuerst RTCWREN auf 1
stellen, bevor ich die RTC auf enable stelle. Habe ich das so richtig
eingefügt mit dem Example 16-1????
2. Könnte mir jemand 16.2.5 erklären. Aus dem Text werde ich irgendwie
nicht schlau...??
3.Wenn ich mir das alles in der Watch betrachte nach der Initialisierung
werden soweit alle Register richtig gesetzt, bis auf das
RTCCFG-Register. Dieses Register ist auf 0x00. Sprich RTCWREN = 0 und
RTCEN ebenfalls auf Null (RTC is disabled). Selbst wenn ich den Code
step für step durchgehe werden die Bits in den Registern nicht gesetzt.
Aber warum????
4. Wie gebe ich der RTC Startwerte vor (Tag, Stunde, Minute, etc.).
Einfach immer das Pointerregister veränderung und in die jeweiligen
Register die Startwerte reinschreiben (Year, Minute, etc.)??
5. Vgl. Anhang Figure 16-4. Ich benutze den Internal RC: Wo stell ich
den Clock Prescaler ein?. Wie komme ich zum Sekundentakt. Aus dem
Hinweis "Note 1" werd ich nicht schlauf, welchen Wert ich da in das
Register schreiben muss? Wär super, wenn die Grafik jemand erläutern
könnte.
6. Muss ich überhaupt die RTC Register initialisieren, wenn ich nur die
Alarmfunktion will. Sprich nur aufwecken, messen, schlafen legen ohne
irgendwo eine Uhrzeit anzeigen zu lassen.
P.S.: Manche würden jetzt sagen, dass der interne RC nicht genau genug
ist. Für meinen Zweck würde es jedoch reichen!
Wäre echt super, wenn mir jemand kompetent weiterhelfen könnte, sonst
verzweifle ich hier noch!
Danke im Voraus
Lg Matthias