delay für µs

Gast #396677
Lesenswert?

Genau! Bei Verwendung der Funktionen bitte den eingeschränkten
Wertebereich achten. Welcher µs-Wert maximal eingegeben werden kann,
ist von der Taktfrequenz abhängig und steht auch in der delay.h drin.
Gast #396678
Lesenswert?

Thanks!

Kannst du mir auch sagen, warum ich immer nur auf 400µs komme, egal
welchen Wert ich eingebe?

Wie hier

PORTB |= (1 << PB0);
_delay_us(20);
PORTB &= ~(1 << PB0);

ergibt einen 400µs High Impuls
Gast #396679
Lesenswert?

F_CPU im Makefile richtig eingestellt? Das muss deiner Taktfrequenz in
Hz entsprechen (z.B. 10000000UL für 10MHz).

Bzw. wenn du nicht das Standard-Makefile verwendest: Wird F_CPU
irgendwo definiert, bevor delay.h eingebunden wird?
Gast #396683
Lesenswert?

Hallo,

gibt es so eine Funktion auch für den ARM GNU Compiler.
Bisher habe ich zwar eine delay Funktion gefunden die einen
Integerwert als Parameter erwartet. Aber wie bekomme ich
exakte delays in µS oder mS hin.
#396689
Lesenswert?

> delay_us ist mist

das würde ich so nicht sagen.
Man muss nur wissen wie man sie benutzt.
Da aber dieses Wissen sowohl im Header-File selbst als auch
in der Doku gesammelt und weitergegeben wird folgt nur
ein Schluss: Wer mit delay_xx nicht zurecht kommt, war zufaul
sich zu informieren.
Gast #396690
Lesenswert?

@Qwerty: Sorry, aber was oder wo ist Switch -O... auf der
         Kommandozeile


@Karl-Heinz: Hallo Karl-Heinz, hab versucht mich über die delay-
             Funktion zu informieren. Hab mir auch das Header-File
             angeschaut aber nicht ganz verstanden. Die maximale
             Länge in µs ist klar, nur was ist die kürzeste?
             Bräuchte 6µs, ist das mit der delay-Funktion möglich?
Gast #396691
Lesenswert?

@Jahn:
Das was Du schreibst, stimmt so nicht! Wenn man die
Compiler-Optimierung einstellt, werden alle Gleitkommaoperationen zur
Compilerlaufzeit durchgeführt. "Langsam" ist völliger Käse. Bei mir
(und auch bei denjenigen, die in dem von Dir oben verlinkten Thread
zunächst Probleme damit hatten) funktionieren die _delay_xx-Funktionen
tadellos!

@Joshi:
Klar ist das möglich, vorausgesetzt, Dein µC läuft mit einer
Taktfrequenz, die so bemessen ist, dass sich die 6µs noch durch eine
ganzzahlige Anzahl von Durchläufen bewerkstelligen lassen. Wenn Dein µC
mit nur 1MHz läuft, dürfte es da allerdings schon Probleme geben... Das
machste dann besser tatsächlich mit Inline Assembler und nop.
Gast #396692
Lesenswert?

Der µC läuft mit einer Taktfrequenz von 8MHz.

Mit einem Programm wo nur die delay-Funktion läuft, komm ich locker auf
nano_Sekunden.

Doch wenn ich die Funktion in mein Programm einbaue, wo noch zwei
Interrupts(Compare und UART-Receive)laufen + die Initialisierungen dann
schafft er gerade mal 60µs.

...???
Gast #396693
Lesenswert?

Wenn da natürlich ein Interrupt dazwischenhaut, isses eh Essig mit
präzisen delay-Routinen. Und je nachdem, was in den ISRs gemacht wird,
ist das kein Wunder, dass es hakt. Versuch mal, vor dem delay die
Interrupts zu deaktivieren und danach wieder zu aktivieren, dann sollte
das auch funktionieren.
Gast #396694
Lesenswert?

Dann taucht aber das Problem auf, dass mir de Takt für das Signal fehlt.


Erzeuge mir nämlich mit dem Timer Interrupt ein Taktsignal. Ab einer
bestimmten Stelle des Taktsignals sollen dann zeitgleich ein paar
Impulse von 6µs Länge kommen.

ne andere Möglichkeit gibt es nicht?
Gast #396695
Lesenswert?

Wenn Du mit einem relativ langsam laufenden Timer das ganze triggerst,
was hindert Dich daran, wenn es so weit ist, dass die "paar Impulse"
raus sollen, die Interrupts kurzzeitig zu deaktivieren? Anscheinend hat
die Impulserzeugung ja oberste Priorität, gell?
Gast #396696
Lesenswert?

@Joshi: Die Kommandozeile ist der Befehl, der den avr-gcc startet. Also
"avr-gcc foo bar blah blubb blarf ....". Das "foo bar blah blubb
blarf..." sind Dateinamen, Parameter, Optionen, Schalter, die dem
Compiler sagen was er wie zu tun hat. Unter anderem kann man dort auch
die Option -O angeben, gefolgt von einer Kennung für die gewünschte
Optimierung, also z.B. -OS für eine Size-Optimierung (möglichst kurzer
Code), -O3 für möglichst schnellen Code, -O0 zur Abschaltung aller
Optimierungen.

Für die effektive delay-Nutzung müssen Optimierungen eingeschaltet
sein, da sonst das schon erwähnte Floating-Point-Problem auftritt.

In der Doku ist IMHO übrigens erwähnt, dass die Delay-Routinen nur dann
präzise arbeiten, wenn die CPU nicht zwischendurch noch ISRn abarbeitet.
Also musst du entweder die Interrupts ausschalten, oder einen
Hardware-Timer nehmen, oder mit der Ungenauigkeit leben.
Gast #396697
Lesenswert?

>>Also musst du entweder die Interrupts ausschalten, oder einen
Hardware-Timer nehmen, oder mit der Ungenauigkeit leben.

Oder einfach besser programmieren lernen... Warteschleifen lassen sich
eigentlich immer umgehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren