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