Xmega128A1 Clock-Problem

Gast #3242071
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
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
Gast
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
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
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
Gast
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
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?
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)
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.