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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.