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
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.
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.
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.
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
Super, ich danke euch mal so weit! Werde mal versuchen was wie funktioniert. Also Danke Jörg
Hallo ich bins nochmal! Hab doch noch ne Frage: asm volatile (" nop"); Was bedeutet das genau? asm? volatile? Jörg
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.