Forum: Mikrocontroller und Digitale Elektronik RTC beim XMEGA 128A3


von Johann (Gast)


Lesenswert?

Hallo @ all,

ich verwende eine Atmel XMEGA 128A3. Dort möchte ich den RTC benutzen. 
Den RTC habe ich bereits konfiguriert und er funktioniert auch bis auf 
eine Kleingkeit sehr gut. Nun möchte ich die Kleinigkeit auch noch 
elemenieren.

Ich habe eine Funktion geschrieben, die den CNT wieder zurücksetzen 
soll. Der Name der Funktion lautet restart_rtc. In der Funktion wird 
zuerst der RTC prescaler ausgeschaltet danach schauen ich nach dem Sync 
Flag, anschließend setze ich den Counter auf 0x0000. Danach schalte ich 
den RTC wieder an indem ich den prescaler auf 1 setze.

Ich habe die Ausführungszeit der Funktion nachgemessen. Diese beträgt 
zwischen 1,5ms und 2,5ms. Dies ist sehr lang und schwankt zudem sehr 
stark. Ich habe dann die Deaktivierung des Prescalers entfernt und nun 
benötigt die Funktion nur noch 1,4µs und das konstant. Demnach dauert es 
sehr lange bis der RTC deaktiviert wird.

Nun zu meinem Problem. Kann ich den CNT trotzdem zurücksetzen, obwohl 
der RTC läuft. Atmel schreibt selber das man nur das Sync Flag beachten 
muss.

Hier mein Quellcode:

void restart_rtc(void)
{
    // Make sure that the RTC is stopped before initializing it
    // der RTC wird angehalten, indem der Prescaler ausgeschaltet wird, 
dadurch erhält der RTC keinen CLK mehr
    RTC.CTRL=(RTC.CTRL & (~RTC_PRESCALER_gm)) | RTC_PRESCALER_OFF_gc;

    // Wait until the RTC is not busy
    while (RTC.STATUS & RTC_SYNCBUSY_bm);

    // Set the RTC count register
    RTC.CNT=0x0000;

    // Set the clock prescaler: RTC Clock/1 --> CLK = 1024Hz
    // and start the RTC
    // der RTC wird gestartet und läuft mit 1024Hz
    RTC.CTRL=(RTC.CTRL & (~RTC_PRESCALER_gm)) | RTC_PRESCALER_DIV1_gc;
}

Jedoch bin ich mir nicht ganz sicher das ich trotzdem ein 
Syncronisationsproblem zwischen dem RTC und dem µC bekomme.

von Avr N. (balze)


Lesenswert?

Hallo Johann

Johann schrieb:
> Demnach dauert es
> sehr lange bis der RTC deaktiviert wird.

Da das deaktivieren der RTC eine Synchronisation erfordert, gilt 
folgendes, Zitat (Atmel AVR1314 Seite 3):

When data is transferred from CPU into RTC domain, the synchronization 
takes 3 clock cycles in the RTC clock domain. Note that, when referring 
clock cycles in the RTC clock domain, it is the unscaled clock input to 
the RTC module that it referred to. This is either 32 kHz or 1 kHz.

Zitat Ende.

Bei dem von Dir eingestellten 1kHz Clock also 3 Takte -> ca. 3ms

Die Methode nach der Du die RTC verstellst ist die empfohlene.
Ob (und vor allen Dingen wie) es auch ohne Synchronistaion laeuft 
wirst Du wohl ausprobieren muessen. Darueber wird man wohl keine 
allgemeingueltige Aussage treffen koennen.

Du kannst aber das Synchronisieren um den Faktor 32 verbeesern, indem Du 
einen externen 32kHz Quarz nimmst. Das Synchronisieren wird mit dem 
unskalierten RTC Clock gemacht. Wenn Du also den Prescaler auf 32 
einstellst, bleibt softwareweitig fuer Dich alles beim alten, nur das 
Synchen geht 32 mal so schnell (oder 32 mal so langsam? ;-)

MfG,

Balze aka AVR Noob

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.