Hallo,
der ATmega4809 hat einen Interne Frequenz mit 32.768 kHz. Ich will damit
eine Uhr betreiben. Ich habe aber leider nach kurzer Zeit recht hohe
Abweichungen von der "Vergleichs Uhr (PC)". Ist der Oszillator zu
ungenau?
Ich verwende Folgende Einstellungen:
1 | RTC.CLKSEL = RTC_CLKSEL_INT32K_gc;
|
2 | RTC.CTRLA = RTC_PRESCALER_DIV32768_gc | RTC_RTCEN_bm; //Modul on
|
3 | while (RTC.STATUS > 0); //Wait inizialision
|
4 | RTC.INTCTRL |= RTC_OVF_bm; //Overflow Interrupt Enable
|
5 | RTC.PER = 0; //Overflow Value // Loest jede Sekunde aus
|
oder möglichkeit zwei
1 | RTC.PITCTRLA = RTC_PERIOD_CYC32768_gc | RTC_PITEN_bm; //CYC32768 + Enable
|
2 | RTC.PITINTCTRL = RTC_PI_bm; //Interrupt //Loest auch jede Sekunde aus
|
Auswertung über Interrupt
1 | volatile uint16_t sek = 0;
|
2 |
|
3 | #if Enable_RTC
|
4 | ISR(RTC_CNT_vect)
|
5 | {
|
6 | RTC.INTFLAGS = RTC_OVF_bm;
|
7 | sek++;
|
8 | }
|
9 | #endif
|
10 |
|
11 | //oder
|
12 |
|
13 | #if Enable_PIT
|
14 | ISR(RTC_PIT_vect)
|
15 | {
|
16 | RTC.PITINTFLAGS = RTC_PI_bm;
|
17 | sek++;
|
18 | }
|
19 | #endif
|
Die restliche Berechnung und Anzeige läuft über die Hauptschleife.
Alternativ habe ich die Berechnung in der Interruptroutine probiert,
gleiches Ergebnis.
Vielen dank.
LG