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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.