Servus Leuts. Hab jetzt schon soooo viel von den hier, und anders wo, RTC Beispielen durch probiert, aber bin zu keinem Gewünschtem Ergebnis gekommen. Ich will die RTC im atXmega128a1 einfach nur als Real Time Counter nebenher laufen lassen, und mich ab und zu (duch anderen Interrupt ausgelößt) auf den RT Counter synchroniesieren. Das ganze möglichst auf 1 ms basis. Laut angehängter Figur 17-1 sollte ich den RT Counter mit 1024 Hz betreiben können, durch die auswahl des Internen 32KHz Oscillator und duch die umstellung des RTCCTRL Multiplexer auf den DIV32. Hier mal mein code dazu: CCP = CCP_IOREG_gc; // Schützt I/O Register, Interrupts werden ignoriert OSC.CTRL = OSC.CTRL | OSC_RC32MEN_bm; //enable internal 32MHz oscillator while(!(OSC.STATUS & OSC_RC32MEN_bm)); //wait for stable CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // select internal 32MHz oscillator as CLK input CLK.RTCCTRL = 0x05; // RTCSRC[2:0] = 0b010 für "1.024kHz from 32.768kHz internal oscillator" // & RTCEN = 0b1 für "...enables the selected RTC clock source for the real-time counter." while(RTC.STATUS & RTC_SYNCBUSY_bm); // wait on RTC RTC.CTRL = RTC_PRESCALER_DIV1_gc; // Prescaller = 1 turns RTC on Jetzt geht, der Counter allerdings in ca. 70us schritten und nicht in 1ms schritten hoch... nen plan woran das liegt? Vielen Dank!
Mir fehlt da das vollständige Programm, in dem angegebenen Code wird nur der 32 MHz Oszillator aktiviert und für Systemtakt selektiert, wo aktivierst du denn den internen 32.768Hz Oszillator?
1 | OSC.CTRL = OSC.CTRL | OSC_RC32MEN_bm | OSC_RC32KEN_bm; //enable internal 32MHz and 32.768 Hz oscillator |
@Daniel H. Vielen Dank für die schnelle Antwort! Das war der ganze Quellcode für die Initialisierung ^^ Ich habe mit dem von dir vorgeschlagenem Befehl jetzt auch den internen 32KHz Oszillator aktiviert (hoffentlich richtig). Hier der Initialiesierungscode noch einmal leserlich:
1 | CCP = CCP_IOREG_gc; |
2 | OSC.CTRL = OSC.CTRL | OSC_RC32MEN_bm | OSC_RC32KEN_bm; |
3 | |
4 | while(!(OSC.STATUS & OSC_RC32MEN_bm)); |
5 | CLK.CTRL = CLK_SCLKSEL_RC32M_gc; |
6 | |
7 | /*rtc clock source 1KHz from internal 32KHz*/
|
8 | CLK.RTCCTRL = CLK_RTCSRC_RCOSC_gc|CLK_RTCEN_bm; |
9 | while(RTC.STATUS & RTC_SYNCBUSY_bm); |
10 | |
11 | RTC.CTRL = RTC_PRESCALER_DIV1_gc; |
Sollte so nun nicht die RTC mit 1KHz (~1ms) getaktet werden?
Hey Jungs, ich hab mich nun Entschieden anstelle der RTC einen Timer Counter zu verwenden. Das Problem bei meiner RTC war vermutlich nur, dass der Simulator die Systemzeit einfach nur Ausrechnet und das anhand von den eingestellten 32MHz. Da die RTC aber mit 1KHz getacktet werden sollte, konnte ich die Tacktperiode nicht eindeutig bestimmen. Leider kann ich mir so auch nicht sicher sein, dass die RTC so Tacktet wie ich des will, und auf dem xmega lässt sich das auch nur schwer testen, also nur mit nem Oszie. Vielen Dank für deine Hilfe Daniel.
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.