Forum: Mikrocontroller und Digitale Elektronik ASF sysclk_get_cpu_hz() nur Konstanten?


von Bassti (Gast)


Lesenswert?

Hallo,

also ich hab jetzt bei meinem XMega A4U (also der neue mit USB) schon so 
ziemlich alle Teilmodule durchprobiert und die laufen auch ohne 
Probleme.

Nun möchte ich natürlich eine sinnvolle Anwendung daraus stricken, nur 
leider sind mir die Clockoptionen der ASF 3.0.1 total suspekt.

Es geht um einen Batteriebetriebenen GPS Logger der ohne USB auf 2 MHz 
getaktet sein soll und wenn USB angesteckt wird, muss der Prozessor ja 
mit 32 MHz versorgt werden. Soweit so gut... Im einzelnen hab ich alles 
schon zum laufen gebracht und bin ganz gut mit den Beispielen und 
Funktionen klar gekommen...
Jetzt der Haken!

Wenn ich umschalte spuckt die Funktion sysclk_get_cpu_hz() immer nur den 
Wert aus, der in der conf_clock.h in den defines gesetzt wurde.
Das schlimme ist nun, dass sich alle Module die mit dem Prozessorclock 
arbeiten, sich die Taktrate aus dieser Funktion besorgen.
Das heißt ich kann nach dem Umschalten, alle Funktionen der ASF 
vergessen und muss entweder die Register wieder einzeln setzen (von 
allen Modulen) oder die sysclk Funktionen anpassen.

Da beides für mich sehr unsinnig klingt und ich der ASF etwas mehr 
zugetraut hätte, wollte ich nochmal nachfragen ob evtl. noch was falsch 
mache?!

Hier ein kurzer Codeschnipsel: (der Controller wird mit 2MHz gestartet)
1
void Setze_sysclock_32MHz(void) {
2
  
3
  //sysclk_disable_peripheral_clock(&USB);
4
  osc_enable(OSC_ID_RC32MHZ);
5
  do {} while(!osc_is_ready(OSC_ID_RC32MHZ));
6
  sysclk_set_source(SYSCLK_SRC_RC32MHZ);
7
  osc_disable(OSC_ID_RC2MHZ);
8
}


MfG

Basti

von Bassti (Gast)


Lesenswert?

hm, anscheinend arbeiten noch nicht so viele mit dem Atmel Software 
Framework... :-/

oder ich hab meine Frage unklar gestellt...

Also es geht darum den Systemclock zur Laufzeit zu verändern und danach 
noch die Teilmodule mit der ASF anzusprechen

z.B.

adc_set_clock_rate(&adc_conf, 200000UL);

In der Funktion steht dann:

clk_per = sysclk_get_per_hz();
ratio = clk_per / clk_adc;

usw.

klar kann man die Register hier selbst schnell setzen, aber es gibt noch 
30 weitere Funktionen die es genauso handhaben und ich kann mir nicht 
vorstellen, dass es hier keine andere Möglichkeit gibt. So macht der 
ganze ASF keinen Sinn.

Weiß keiner Rat?

Danke

Basti

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.