Moin, Set: Xmega64D3 + Atmel Studio 6 + GCC + AVR ONE! Ich benutze den internen 32Mhz Oszillator + automatische Kalibrierung. Das funktioniert auch ganz gut wenn man sich erstmal an dieses fürchterliche neue Tool (Studio 6) angepasst hat. Die Registerbenennung ist erst beim zweiten Blick genial, die automatische Kalibrierung ist aber richtig nett. 3 Uarts, 3 Baudraten und kein Bedarf an einem externen Taktgeber. Nun jage ich allerdings einen etwas bizarren Fehler und habe die Kompileroptimierung ausgestellt um diese Fehlerquelle auszuschliessen. Problem: Taktregister für 3 cycle freigeben, beschreiben, nächstes freigeben etc.pp. bis alle geschützten Register gesetzt sind. In endlos While darauf warten das 2Mhz und 32Mhz stabil sind und erst dann umschalten weil die Hardware das sonst ignoriert. Mit 'Size' optimierung läuft das wie erwartet. Schalte ich die Optimierung jedoch aus, funktioniert das nicht. Die Schleife wird durchlaufen, es bleibt aber beim 2Mhz Systemtakt. (code siehe unten) Keine Compilerwarnung, kein Fehler, es geht einfach nur nicht. (Alle IRQs sind zu dem Zeitpunkt deaktiviert) Kann mir das jemand erklären ? mkn Code: // 2Mhz CLK is standard CLK after Reset. CPU_CCP = 0xd8; // release register protection for 4 cycles OSC_CTRL = 0x07; // CPU_CCP = 0xd8; // release register protection OSC_DFLLCTRL = 0x00; // reference for 32Mhz CLK-Calibration is 32,786 Khz oscillator CPU_CCP = 0xd8; // release register protection for 4 cycles DFLLRC32M_CTRL = 0x01; // Enable Auto-Calibration for 32Mhz Oscillator CPU_CCP = 0xd8; // release register protection for 4 cycles CLK_PSCTRL = 0x00; // No Prescaler while (!(OSC_STATUS & 0x06)) {} // Wait till both oscillators are stable CPU_CCP = 0xd8; // release register protection for 4 cycles CLK_CTRL = 0x01; // CLK source = internal 32Mhz Oscillator CPU_CCP = 0xd8; // release register protection for 4 cycles OSC_CTRL = 0x06; // 2Mhz CLK is useless now, disable it CPU_CCP = 0xd8; // release register protection for 4 cycles CLK_LOCK = 0x01; // CLK and prescaler are protected from accidental write
Benutzt doch auch die neuen Funktionen... die Hexzahlen kann man durch nette defines ersetzen, so dass man den Code auch lesen kann.... Eigentlich benutzt GCC auch eher so ein Syntax: rtc.crtl |= xxx_xxx_gc Zur Lösung würde ich mir mal die ASF Funktionen anschauen. Da kann man gut abgucken und natürlich die riesige Erreta. Benutzt eigentlich fast nur noch die ASF... Geht recht fix. Manchmal ist die Beschreibung der Funktionen aber so mies, dass man doch lieber wie oben, die Register setzt... MfG Basti
Michael Knoelke schrieb: > Mit 'Size' optimierung läuft das wie erwartet. > Schalte ich die Optimierung jedoch aus, funktioniert das nicht. > Die Schleife wird durchlaufen, es bleibt aber beim 2Mhz Systemtakt. Dann tippe ich mal, daß mehr als 4 clock cycles vergehen. Steppe doch mal durch und halte dabei den PC im Auge (sofern das "geniale" Studio das hat).
Bassti schrieb: > Eigentlich benutzt GCC auch eher so ein Syntax: > > rtc.crtl |= xxx_xxx_gc Ja, und ich habe nie verstanden was daran übersichtlicher sein soll. Jetzt muß ich nicht nur das Bit finden das ich schubsen muß, sonder darf dann noch die Information suchen wie xxxx_xxxx_gc / _bm oder was auch immer den nun in diesem speziellen Fall heißt um es dann in einer 3 zeiligen veroderungs Schreiborgie hinzupinseln. Natürlich für alle 3 dutzend register die ich setzen will. Danke, register = wert reicht mir. > Zur Lösung würde ich mir mal die ASF Funktionen anschauen. Da kann man ... Basti ... Der Code ... funktioniert ... bis .. ich .. die .. optimierung ... ausschalte ... ASF ist fürn ....... Um dieses zu benutzen muß ich jenes einbinden, was aber folgende komponente erfordert wovon insgesammt -x vernünftig beschrieben ist. Der Code verweist auf code der auf codeverweisenden code verweist der über optionen schalter und geschnickel vom tiny bis zum ARM verwendbar ist. Das ist Murks. Ganz viel an dem Murks ist Murks und Instabil ist Studio 6 obendrein. Für umsonst muss man nunmal manche Kröte schlucken. mkn
na, wie jeder halt mag! Ich kann mir auch nicht vorstellen, wieso man für IRA bezahlen soll. Du musst dich anscheinend erst eingewöhnen ;) Wenn du zB RTC. schreibst, kommt doch schon DropDown und alles wird einfach ohne mit einem Auge immer im Datenblatt zu bleiben. Wenn du dann nen Konfig suchst, dann schreibst du wieder: RTC.CRTL | = RTC_ wieder kommt ein DropDown Menü, wenn nicht dann Strg+Press Spart viel Arbeit im Gegensatz zu AVRStudio 4... Ob du dich da dran gewöhnen kannst oder nicht, auch bei den Entwicklungsumgebung geht voran. Die ASF hat feste Funktionen, die entsprechenden lib Dateien werden für XMega, Mega, SAM unterschiedlich eingebunden. Da ist nicht so viel überladen wie du dir das einbildest. Mein Tipp steht immer noch, mach dir ein ASF Projekt für den Prozessor und schau einfach mal in die Funktionen rein um dir was abzuschauen. Optimierung hin oder her. So hat sicher keiner Lust deinen Source zu lesen. Daher sicher auch die große Reso hier.... MfG Basti
@ Lutz Ja eigentlich ... Debuggen geht auch nicht richtig, z.b. breakpoints werden nicht ausgelöst obwohl der code an der stelle ausgeführt wird. Ich nehm das jetzt so hin, egal. mkn
Schau dir den compilierten Quellcode einfach mal an. Ich hatte das Problem, dass der C-Code in Befehle umgesetzt wurde, der jeweils mehr als drei Taktzyklen gedauert hatte. Das sieht man sehr schön, wenn man in Atmel Studio 6 das disassembly Fenster aktiviert. Meine Lösung war, für das Umschalten den Beispielcode aus der Application Note AVR1003 zu benutzen. Dort sind Funktionen drin, welche das Umschalten mit Assemblercode erledigen. Dieser wird nicht mehr verändert beim Optimieren und hält immer die 3-Takte Regel ein. Ciao, Rainer
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.