Forum: Mikrocontroller und Digitale Elektronik Verzögerung in C


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.