Variablenübergabe bei _delay_ms

OP (Firma: privat) #3651621
Lesenswert?

Hallo,
Bin beim programmieren auf ein Hindernis gestoßen: Ich wollte für eine 
Methode die Pausendauer übergeben, nur scheint Atmel Studio da zu 
meckern.
1
void Ebenen_ansteuern(unsigned char ebenen, unsigned char dauer)
2
{
3
  PORTC=ebenen;
4
  _delay_ms(dauer);
5
}

Folgender Fehler wird ausgegeben:
Error  1  __builtin_avr_delay_cycles expects a compile time integer 
constant

Ich könnte natürlich eine Zahl übergeben, bis zu der eine schleife 
hochzählt und dann jeweils x Milisekunden delay reingeschoben wird, aber 
gibt es da eine elegante Weise wie man das Problem umgeht?
Gast #3651628
Lesenswert?

> Ich könnte natürlich eine Zahl übergeben, bis zu der eine Whileschleife
> hochzählt und dann jeweils x Milisekunden delay reingeschoben wird, aber
> gibt es da eine elegante Weise wie man das Problem umgeht?

Selbstverfreilich, einfach den von Dir schon angesprochenen Code in eine 
Funktion verpacken.
Gast #3651646
Lesenswert?

Du kannst und solltest _delay_ms nur mit einem KONSTANTEN Wert aufrufen. 
Ansonsten klappt das nicht. Der Compiler baut das nämlich fest ein. 
Musst dir mal ansehen wie das umgesetzt wird!

Ansonsten könntest du einen Timer als einstellbare Verzögerung 
verwenden. Ist natürlich aufwändiger. Aber _delay_ms würde ich insgesamt 
NICHT verwenden, weil du damit das gesamte System blockierst.
Gast #3651668
Lesenswert?

isnah schrieb:
> Versuch mal den Parameter "dauer" mit dem Datentyp "double"

Und wie bringst du diese Empfehlung mit der in delay.h angegebenen 
Anweisung zur Nutzung in Einklang?

Wenn ich mal aus delay.h zitieren darf:
"In order for these functions to work as intended, compiler
    optimizations <em>must</em> be enabled, and the delay time
    <em>must</em> be an expression that is a known constant at
    compile-time.  If these requirements are not met, the resulting
    delay will be much longer (and basically unpredictable), and
    applications that otherwise do not use floating-point calculations
    will experience severe code bloat by the floating-point library
    routines linked into the application."

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