Forum: Mikrocontroller und Digitale Elektronik Variablenübergabe bei _delay_ms


von Torben K. (Firma: privat) (schnagglz)


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?

: Bearbeitet durch User
von g457 (Gast)


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.

von isnah (Gast)


Lesenswert?

Versuch mal den Parameter "dauer" mit dem Datentyp "double"

von Max H. (hartl192)


Lesenswert?

Torben K. schrieb:
> Error  1  __builtin_avr_delay_cycles expects a compile time integer
> constant
_delay_ms(ms) kann anscheinen nur mit Konstanten arbeiten. Mögliche 
Lösung:
1
void Ebenen_ansteuern(unsigned char ebenen, unsigned char dauer)
2
{
3
  PORTC=ebenen;
4
  while(dauer--)
5
    _delay_ms(1);
6
}

: Bearbeitet durch User
von meckerziege (Gast)


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.

von N.G. (Gast)


Lesenswert?

ja, es geht nur mit Konstanten.
Noch ne Möglichkeit:
Makro (etwa so):
1
#define Ebenen_ansteuern(ebenen, dauer)\
2
  do{\
3
  PORTC = ebenen;\
4
  _delay_ms(dauer);}\
5
  while(0)

von Torben K. (Firma: privat) (schnagglz)


Lesenswert?

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

Funktioniert nicht,

dann steuer ich das über die Methode an. :)

von Torben K. (Firma: privat) (schnagglz)


Lesenswert?

meckerziege schrieb:
> 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.

Wie meinst du das?
Hab bisher nur mit delay gearbeitet.

von Max H. (hartl192)


Lesenswert?

Torben K. schrieb:
> Wie meinst du das?
> Hab bisher nur mit delay gearbeitet.
Timer-Interrupt, dann kann der µC in der Wartezeit auch was Anders 
machen.

: Bearbeitet durch User
von Mike (Gast)


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."

von isnah (Gast)


Lesenswert?


von Torben K. (Firma: privat) (schnagglz)


Lesenswert?

isnah schrieb:
> @Torben
> warun glaubst du Atmel nicht? ;-)
>
> http://www.atmel.no/webdoc/AVRLibcReferenceManual/...

Ich glaube gerne Atmel, nur funktioniert dein Vorschlag mit der Übergabe 
eines double bei mir nicht.
Ich kann nur wiederholen was ich gesagt habe:
Gebe ich den Datentyp double an, kommt da die selbe Fehlermeldung.

von Max H. (hartl192)


Lesenswert?

Das liegt immer noch daran, dass der Parameter eine zur Compilierzeit 
bekannte konstante sein muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.