Xmega _delay_us: Seltsames Verhalten

OP #1628215
Lesenswert?
• ▲
▼
Hallo,
ich habe mal mit meinem xmega mit der delay-Funktion gespielt, das 
Programm gibt eine Rampe über den D/A-Wandler aus. Werte kleiner als 20 
µs bewirken keine messbare Verzögerung. Die Schleife müsste alleine 
schon 1ms laufen, eine Rampe dauert aber nur 22ms.
Bei Werten größer 20 µs fehlt in der Periodendauer ein Faktor 16.
Was ist da los?
1
while (1)      //Endlosschleife, gibt eine Rampe aus
2
{
3
 DACA.CH0DATA = i;    //Wert zum Ausgeben
4
 i++;
5
 for (uint8_t j=0;  j<100; j++)
6
 {
7
  _delay_us(10);               //Verzoegerung 100x
8
 }
9
}

Den Takt habe ich auf 32MHz eingestellt.
1
//32 MHz interne Taktfrequenz ausgewählt
2
void mhz ()
3
{
4
 OSC.CTRL = 3;
5
 while(OSC.STATUS != 3)
6
  {
7
  }
8
 CCP = 0xD8;
9
 CLK.CTRL = 1;
10
}
OP
Lesenswert?
• ▲
▼
Ohne for-Schleife sieht es bei kleinen delays besser aus, das war Trick 
17 mit Selbsüberlistung.

Optimierung habe ich -Os eingestellt.
1
#define F_CPU 32000000UL
 habe ich noch eingebaut.
1
while (1)      //Endlosschleife
2
{
3
 PORTB.OUTTGL = PIN0_bm;  //Ausgang umschalten
4
}
Ergibt eine Frequenz von 4MHz, egal was für einen Wert in F_CPU steht. 
Das müsste 4 Takte benötigen, damit läuft der Prozessor auf 32MHz. Aber 
wieso wird das ignoriert?
Gast
Lesenswert?
• ▲
▼
Schau hier mal genau drauf!

OSC.CTRL = 3;

Wie kommst du auf OSC.CTRL = 3 bei 32 Mhz?

Also wenn ich mich jetzt nicht gnadenlos verschaut hab, musst du das 2 
bit auf eins setzen.

Schau mal Seite 87 im Datasheet XMEGA A Family!

Und damit sowas auch klarer wird kann man es auch wie folgt schreiben:

OSC.CTRL |= OSC_RC32MEN_bm;

Gruß Flo

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.