mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verzögerung in C


Autor: Jörg (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Fritz Ganter (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

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

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super,

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

Also Danke
Jörg

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich bins nochmal!

Hab doch noch ne Frage:

asm volatile (" nop");

Was bedeutet das genau? asm?
volatile?

Jörg

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]
  • [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.