www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Xmega _delay_us: Seltsames Verhalten


Autor: Gregor Wetzel (gregor78)
Datum:

Bewertung
0 lesenswert
nicht 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?
while (1)      //Endlosschleife, gibt eine Rampe aus
{
 DACA.CH0DATA = i;    //Wert zum Ausgeben
 i++;
 for (uint8_t j=0;  j<100; j++)
 {
  _delay_us(10);               //Verzoegerung 100x
 }
}

Den Takt habe ich auf 32MHz eingestellt.
//32 MHz interne Taktfrequenz ausgewählt
void mhz ()
{
 OSC.CTRL = 3;
 while(OSC.STATUS != 3)
  {
  }
 CCP = 0xD8;
 CLK.CTRL = 1;
}

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Werte kleiner als 20 µs bewirken keine messbare Verzögerung.
Das drumrum (die for-Schleife) braucht auch Zeit...

> Den Takt habe ich auf 32MHz eingestellt.
Weiß das der Compiler (#define F_CPU 32000000UL)?

Welchen Optimierungslevel hast du eingestellt?

Autor: Gregor Wetzel (gregor78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne for-Schleife sieht es bei kleinen delays besser aus, das war Trick 
17 mit Selbsüberlistung.

Optimierung habe ich -Os eingestellt.
#define F_CPU 32000000UL
 habe ich noch eingebaut.
while (1)      //Endlosschleife
{
 PORTB.OUTTGL = PIN0_bm;  //Ausgang umschalten
}
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?

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal das Assembler-Listing dazu an.

Wahrscheinlich braucht die Schleife 8 Takte und daher resultiert die 
Frequenz von 4 MHz = 32 MHz / 8...

MfG
Marius

Autor: Gregor Wetzel (gregor78)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
8 Takte pro Schleifendurchlauf kann eigentlich nicht sein: Der Ausgang 
wird einmal pro Durchlauf umgeschalten, für eine ganze Periode braucht 
es 2 Durchläufe: 32MHz/(2*8Takte)=2MHz.
Ich habe es nachgemessen: es sind 4MHz. Habe mal einen Screenshot 
gemacht:

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gregor Wetzel schrieb:
> 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?

Was denn?  Das F_CPU?  Wo soll das denn bei dem Stückchen Code eine
Rolle spielen?

Autor: stromflo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.