Forum: Mikrocontroller und Digitale Elektronik Xmega128A1 Clock-Problem


von Stefan (Gast)


Lesenswert?

Hallo Zusammen,

ich versuche gerade die Basics von der µC-Programmierung in C zu 
begreifen.

Dazu habe ich ein Xplained128A1 (Xmega128A1) einen 8 Bit LED Zähler 
programmiert um die Pin Ansteuerung zu üben.

Als nächstes möchte ich die den Oszillator unterschiedlich einstellen.
Dazu habe ich folgenden Code gefunden:


OSC.CTRL |= OSC_RC32MEN_bm;
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;

Programm (siehe unten Läuft!) !!!



Wenn ich jedoch auf 2 MHz gehen möchte blinken meine LEDs (Zähler) 
(siehe Programm unten) immer noch gleich schnell!!?????

OSC.CTRL |= OSC_RC32MEN_bm;
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;


Wo habe ich den Fehler/ Gedankenfehler?



Hier der gesamte Programmcode:

#include <asf.h>
unsigned int k,n,start;
char TastenD = 0;


void wait_sinnfrei (void)
{
  k = 0;
  while (k<10000)
  {
    k++;
  }
}


int main (void)
{

  OSC.CTRL |= OSC_RC32MEN_bm;
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
  CCP = CCP_IOREG_gc;
   CLK.CTRL = CLK_SCLKSEL_RC32M_gc;

  PORTE.DIR = 0xff;

  while (1)
  {

  n = 0;

    while (n<255)
    {
      PORTE_OUT = n;
      n++;
      wait_sinnfrei();
    }

  }



}


Vielen Dank für die Hilfe !!!!

Stefan

von Stefan (Gast)


Lesenswert?

Ich meine im zweiten Block natürlich:


OSC.CTRL |= OSC_RC2MEN_bm;
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC2M_gc;

also statt 32 einfach nur 2

von Martin (Gast)


Lesenswert?

Ich habe auch das Problem !

Der µC läuft auch ohne Clock Initialisierung allerdings weiß ich nicht 
mit welcher Frequenz.

Die Änderung habe ich so gemacht wie Stefan Sie beschrieben hat.

Ebenfalls ohne merkliche Auswrkungen auf die Geschwindigkeit bei der 
Programmausführung.

Weiß jemand Bescheid?

Martin

von Basti (Gast)


Lesenswert?

Martin schrieb:
> Weiß jemand Bescheid?

Ja, dass Datenblatt... der µC läuft standardmäßig mit 2 MHz los...

Für Clockeinstellung benutz ich die ASF... ist mir zu mühsam das mit 
"Hand" zu machen, aber wenn du was lernen willst. Analysiere z.B. den 
Code der ASF... muss ich auch tun, wenns mal nicht so läuft wie ich 
will...

von Stefan (Gast)


Lesenswert?

Schon mal Danke für den Tipp...


Was meinst du mit ASF?


Wo kann ich nachlesen was es ist und wie es geht?
Kannst du mir vieleicht ein Beispiel geben?

Merci
Stefan

von Hagen R. (hagen)


Lesenswert?

Stefan schrieb:
> while(!(OSC.STATUS & OSC_RC32MRDY_bm));

wartest du hier wirklich auf den 2MHz RC ?

von Jens (Gast)


Lesenswert?

Ja da muss man warten. Aber nicht auf den RC, sondern bis der richtig in 
der PLL eingerastet ist. Steht im Datenblatt.

Schau dir mal das hier an: CLK_SCLKSEL_RC2M_gc
Das ist ja auch nur eine Bitmaske. Die findest du im Header zum 
Controller. Findest du über die IO.h und musst dich durchhangeln.
Dann nimmst du das Datenblatt und schaust, ob das mit den 
Bitdefinitionen übereinstimmt. Ich vermute mal nicht. So wie ich mich 
erinnere ist das der Prescaler für den Clock.

Gruß, Jens

von Hagen R. (hagen)


Lesenswert?

@Jens,

er wartet aber auf den 32MHz RC und nicht den 2MHz RC, das ist es worauf 
ich hinaus will.

von Stefan (Gast)


Lesenswert?

Stimmt da ist ein Fehler ich warte ja auch 2Mhz habe aber 32Mhz 
geschrieben. Das ist richtig.

OSC.CTRL |= OSC_RC2MEN_bm;
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC2M_gc;


Damm müsste er aber in der while-Schleife

while(!(OSC.STATUS & OSC_RC32MRDY_bm));

hängen bleiben.

Warum kommt er da jemals raus. Die Bedingung wird ja nie erfüllt ????
Anscheinend aber doch.

WARUM?

von Timmo H. (masterfx)


Lesenswert?

Also mein Atxmega128A3 bleibt "wie gewünscht" bei "while(!(OSC.STATUS & 
OSC_RC32MRDY_bm));" hängen.
Mache aber nichts anders als du. 1:1 gleich.

Achja, damit das
1
CCP = CCP_IOREG_gc;
2
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
funktioniert musst die die optimierungen an schalten, denn sonst sind 
zwischen CCP = CCP_IOREG_gc; und CLK.CTRL = CLK_SCLKSEL_RC32M_gc; mehr 
als 4 Takte (und dann geht das setzen von CLK.CTRL nicht mehr)

von Stefan (Gast)


Lesenswert?

Oh die Optimierung !!!!

Daran habe ich gar nicht gedacht!


Das war die Ursache!
Jetzt läuft es wie es soll mit 32MHz oder 2MHz.
Danke vielmals!!!!!


Gruß
Stefan

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.