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