delay für µs

Gast #396676
Ja, für den Avr-gcc.

Hab da jetzt gerade zum ersten mal reingeschaut. In der Doku hab ich
nichts gefunden.

In der delay.h steht was von _delay_us(double __us)

Ist es das was ich suche?
Gast #396677
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
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
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
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
> 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
@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
@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
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
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
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
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
@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
>>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.
Gast #396698
"Warteschleifen lassen sich eigentlich immer umgehen."

Was für eine Technik verwendest du für das Timing des E Signals eines
HD44780-LCDs oder des 1-Wire-Busses?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.