Forum: Compiler & IDEs XMega64A3U RTC nochmal


von Thomas S. (thomasschattat)


Lesenswert?

Hallo,
einen ähnlichen Beitrag hatte ich schon mal, leider ohne ein wirkliches 
Ergebnis.
Da ich mit den Bootloader chip45boot2 ein Problem hatte bin ich auf den 
BL XBoot umgestiegen, der ist mit Quellcode und klappt ganz gut.

Nun habe ich µC hier (alle XMega64A3U), deren 2MHz Takt nicht genau 
genug ist, um per UART zu flashen. Etwa 10% der Teile "ticken falsch", 
das Programmieren geht schief oder nur nach Erwärmung.

Nun habe ich den BL XBoot angepasst um den vorhandenen 32KHz Uhrenquarz 
zu nutzen um den 2MHz Oszillator zu synchronisieren.
Klappt auch soweit OK, Brennen funktioniert ohne Fehler.
ABER: Nun habe ich das gleiche Problem wie mit chip45boot2, meine 
Applikation startet nicht richtig weil der RTC mit dem Quarz nicht mehr 
"tickt".
Folgendes habe ich im BL eingestellt um die Genauigkeit zu erreichen:

OSC.XOSCCTRL = OSC_XOSCSEL_32KHz_gc; //32.768 Hz Quarz an TOSC
OSC.CTRL = OSC_XOSCEN_bm | OSC_RC2MEN_bm; //Quarz, 2MHz RC ein
while(!(OSC.STATUS & OSC_RC2MRDY_bm)); //Warte, bis 2MHz stabil
while(!(OSC.STATUS & OSC_XOSCRDY_bm)); //Warte, bis Quarz stabil
OSC.DFLLCTRL=(OSC.DFLLCTRL & (~OSC_RC32MCREF_bm)) | 
OSC_RC2MCREF_bm;//32.768 Quarz als Referenz wählen

// Dieser Befehl setzt hier meine RTC ausser Betrieb:
DFLLRC2M.CTRL|=DFLL_ENABLE_bm;
Wenn ich diese Zeile auskommentiere ist das Problem (und leider die 
Genauigkeit) verschwunden.


Am Ende des BL räume ich so auf auf :
//Cleanup before we leave
OSC.XOSCCTRL &= 255 - OSC_XOSCSEL_32KHz_gc;  //Wieder aus
OSC.CTRL &= 255- OSC_XOSCEN_bm;      //wieder aus
DFLLRC2M.CTRL = 0;  //wieder aus

Trotzdem ich DFLLRC2M.CTRL auf 0 setze geht mein RTC in der Applikation 
nicht. Setze ich ihn am Anfang erst gar nicht ist das Problem nicht da.

Ist das ein bekannter Bug? Ich hab den Wert DFLLRC2M.CTRL auch mal in 
einer Endlosschleife seriell ausgegeben, der erste Wert ist immer 1, 
dann alles 0. Kann ich immer wieder reproduzieren.

Hat jemand Erfahrungen mit so etwas?

Danke für Inspirationen, mir gehen die Ideen aus.

Gruß Thomas

von Gerhard G. (g_g)


Angehängte Dateien:

Lesenswert?

Hallo,

schau dir mal meine Initialisierung an:
Stammt aus CodeVisionAVR/CodeWizardAVR.

Läuft bei mir halt nicht im Bootloader sondern herkömmlich. Das sollte 
aber nicht das Problem sein.

Funktioniert mit USART-Anwendung bestens.




Gruß G.G.

von Thomas S. (thomasschattat)


Lesenswert?

Hallo Gerhard,
vielen Dank für den Code, aber damit läuft mein BL gar nicht an.
Warum? Keine Ahnung!
Muss mal sehen wo der hängt.

gruß
Thomas

von Dieter Glas (Gast)


Lesenswert?

Hallo Thomas,

ich habe da eine Idee woran das liegen kann!
Kannst du bitte mal deinen Code posten, damit ich das im Ganzen 
betrachten kann.

Gruß Dieter

von Thomas S. (thomasschattat)


Angehängte Dateien:

Lesenswert?

Hallo Dieter,
da bin ich ja gespannt.
Mit dem angehängten Code (Compiliert mit WinAVR 20100110) klappt der BL 
aber meine Applikationm steht fest, RTC tickt dann nicht.
Diese initialisiert folgendermassen:

int main(void)
{
  cli();
  CCP = CCP_IOREG_gc;        //Secret handshake
  MCU.MCUCR = 0x01;        //DISABLE jtag - it locks the upper 4 pins of 
PORT B

  PR.PRPC = 0x7F;          //turns off all USART clocks
  PR.PRPD = 0x7F;
  PR.PRPE = 0x7F;
  PR.PRPF = 0x7F;
  PR.PRPA = 7;          //turns off all analog stuff
  PR.PRPB = 7;
  PR.PRGEN = 0x5B;        //allow RTC only

  set_sleep_mode(SLEEP_MODE_PWR_SAVE);

  PORTA.DIR=255;
  PORTB.DIR=255;
  PORTD.DIR=255;
  PORTE.DIR=255;
  PORTF.DIR=0x33;    //PF2, PF3, PF6 and PF7 inputs for buttons buttons, 
rest output
  PORTF.PIN7CTRL |= PORT_OPC_PULLUP_gc;  //Pullups on for PF6 and PF7 
internal buttons and PF2 PF3 external!!
  PORTF.PIN6CTRL |= PORT_OPC_PULLUP_gc;
  PORTF.PIN3CTRL |= PORT_OPC_PULLUP_gc;
  PORTF.PIN2CTRL |= PORT_OPC_PULLUP_gc;
//initialize RTC for 16384 HZ and 256 tick for 64 IRQs per second
        OSC.XOSCCTRL = OSC_X32KLPM_bm | OSC_XOSCSEL_32KHz_gc;
        OSC.CTRL = OSC_XOSCEN_bm;
        while (OSC.STATUS & (OSC_XOSCRDY_bm));        //wait until osc. 
is ready
        CLK.RTCCTRL = CLK_RTCSRC_TOSC32_gc | CLK_RTCEN_bm;  //32KHz 
Crystal
        RTC.PER = 0xFFFF;                  //Max value
        RTC.COMP = 127;
        RTC.CTRL = RTC_PRESCALER_DIV2_gc;          //Prescaler 2, 32KHz 
/ 2 = 16KHz
        while(RTC.STATUS & RTC_SYNCBUSY_bm);
        RTC.INTCTRL =  RTC_COMPINTLVL_MED_gc | RTC_OVFINTLVL_LO_gc; 
//MED Level for COMP Match interrupt, LOW for overflow
//RTC initialized!

Danke für die Bemühungen.
Gruß
Thomas

von Dieter Glas (Gast)


Lesenswert?

Hi Thomas,

das sieht ja schon mal sehr gut aus, sollte eigentlich funzen.
Wie lässt du dir die Uhrzeit denn ausgeben?

Gruß Dieter

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.