Forum: Mikrocontroller und Digitale Elektronik ATXMEGA 128a1 RTC 1ms Counter


von Lukas S. (stopplukas)


Angehängte Dateien:

Lesenswert?

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!

von Daniel H. (Firma: keine) (commander)


Lesenswert?

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

von Lukas S. (stopplukas)


Lesenswert?

@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?

von Lukas S. (stopplukas)


Lesenswert?

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