dynamische Wertübergabe an _delay_us

Gast #4513622
Lesenswert?

Hallo
Wie kann ich während der Laufzeit der Funktion _delay_us Werte 
übergeben?
Diese Werte ändern sich mit der Laufzeit des Programmes und werden aus 
einem Array [30][2] ausgelesen?
Text der Fehlermeldung: __builtin_avr_delay_cycles expects an integer 
constant.

Im Anhang der Programmauszug.
Angehängte Dateien:
#4513638
Lesenswert?

@ Helmut Br (Gast)

>Wie kann ich während der Laufzeit der Funktion _delay_us Werte
>übergeben?

Gar nicht.

>Diese Werte ändern sich mit der Laufzeit des Programmes und werden aus
>einem Array [30][2] ausgelesen?

Solche kleinen, VARIABLEN Verzögerungen muss man wohl oder übel selber 
per Inline ASM machen.

Workaround. Anstatt die einzelnen Delays aus dem Array auzulesen und 
zuzuweisen (was nicht funktioniert), schreibt man für alle Möglichkeiten 
die Sequenz komplett mit konstanten Werten hin und wählt mittels Array 
die Sequenz aus, welche ausgeführt werden soll.
Gast #4513644
Lesenswert?

Nachtrag:
entweder eine eigene delay_us() mit Timern erstellen oder, so mache ich 
es gelegentlich der Einfachheit halber und wenn die absolute Genauigkeit 
keine große Rolle spielt, das ganze in einer Schleife mit der festen 
Grundeinheit unterbringen, z.B. mit:
1
for (i=0; i<Dauer; i++)
2
   {
3
     _delay_us(100); 
4
   }
kannst du n*100µs über die Variable Dauer dynamisch verändern.
Bei sehr kleinen Grundzeiten ist da natürlich ein Overhead durch die 
Schleife vorhanden.
Gast #4513645
Lesenswert?

Helmut Br schrieb:

> Wie kann ich während der Laufzeit der Funktion _delay_us Werte
> übergeben?

Garnicht und das ist auch gut so. Idealerweise benutzt man diese 
vermaledeiten Delay-Funktionen überhaupt nicht. Und für die (relativ 
wenigen) Fälle, bei denen es einen Sinn ergibt, sie zu verwenden, reicht 
es aus, das Delay statisch zur Entwurfszeit konfigurieren zu können.

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