Xmega128A1 Clock-Problem

Gast #3242071
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
Gast #3242359
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
Gast #3242383
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...
Gast #3242893
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
Gast #3243018
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?
#3243134
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren