Forum: Mikrocontroller und Digitale Elektronik Verzögerung in C


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jörg (Gast)


Lesenswert?

Hallo!
Kann mir mal jemand einen Tip geben wie man eine ganz einfache
Verzögerung in C programmiert, nur ein paar Takte, braucht nicht
großartig präzise zu sein. Da müsste doch eine einfache Schleife wie

for(i=0;i=100;i++
{}
reichen, oder? Irgendwie funktioniert das aber nicht.
Wird das ev. wegoptimiert vom Compiler?

Danke Jörg

von crazy horse (Gast)


Lesenswert?

wenn schon, dann müsste das so heissen:
for(i=0;i<100;i++)
{}

Da solch eine Sache an sich keine Wirkung hat (ausser Zeit zu
verbrauchen) könnte es schon sein, dass ein Compiler die
"wegoptimiert", glaube ich aber nicht.

von Fritz Ganter (Gast)


Lesenswert?

lass ihn was machen, also:

for(i=0;i<100;i++)
 asm volatile (" nop");

Aber einen Durchlauf macht er im Mikrosekundenbereich, wennst lange
Zeiten brauchst musst halt verschachteln:
for(j=0;j<10000;j++)
for(i=0;i<10000;i++)
 asm volatile (" nop");

i und j müssen aber 16bit Integer sein.

von Jörg Wunsch (Gast)


Lesenswert?

Doch doch, avr-gcc ist bekannt dafür, diese zumindest
,,kleinzuoptimieren''.  Wenigstens sollte man also

for (i = 0; i < XXX; i++)
  asm volatile ("nop");

schreiben.

Besser ist es, Schleifen mit genau bekannten Zyklenzahlen zu benutzen.
Bei der avr-libc gibt's sowas in <avr/delay.h>, andere Compiler
bieten
sicher etwas ähnliches an.

Für alles, was mehr als ein paar 100 µs ist, nimmt man dann sowieso
besser einen Hardware-Timer.  Dafür sind sie ja da.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Anbei ein Beispiel, wie man ein Delay mit Timer macht.

Der Vorteil ist, daß es Compiler unabhängig ist.

Ich benutze es z.B. um für den 1-Wire Bus das Timing zu machen.


Peter

von Jörg (Gast)


Lesenswert?

Super,

ich danke euch mal so weit!
Werde mal versuchen was wie funktioniert.

Also Danke
Jörg

von Jörg (Gast)


Lesenswert?

Hallo ich bins nochmal!

Hab doch noch ne Frage:

asm volatile (" nop");

Was bedeutet das genau? asm?
volatile?

Jörg

von Jörg Wunsch (Gast)


Lesenswert?

> asm volatile (" nop");

> Was bedeutet das genau?

asm -- eine Ausflucht zum Assembler (auch `inline assembler' genannt)
volatile -- der Compiler darf die Lage der Anweisung nicht optimieren
"nop" -- der eigentliche Assemblerbefehl, ein Null-Befehl

Das Ganze ist GCC-Syntax, andere Compiler machen das geringfügig
anders, z. B. mittels #pragma asm, oder sie haben einen Makro _NOP()
dafür.

Der Sinn der Sache ist, daß im Body der Schleife eine Anweisung steht,
die der Compiler nicht wegoptimieren darf.

von Jörg (Gast)


Lesenswert?

Aha!

Ok, danke dir für die infos!
Hab mal wieder was dazugelernt, und außerdem scheint auch jetzt meine
Zeitverzögerung zu funktionieren!

Jörg

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]
  • [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.