Forum: Mikrocontroller und Digitale Elektronik AtmelStudio 6 - Bug oder Feature ?


von M. K. (Gast)


Lesenswert?

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

von Bassti (Gast)


Lesenswert?

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

von Lutz (Gast)


Lesenswert?

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).

von M. K. (Gast)


Lesenswert?

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

von Bassti (Gast)


Lesenswert?

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

von M. K. (Gast)


Lesenswert?

@ 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

von R. W. (quakeman)


Lesenswert?

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