__builtin_avr_delay_cycles

OP #2286249
Lesenswert?

Hallo,

ich habe ein Problem mit der Funktion _delay_ms aus der delay.h.
Ich habe eine mir Zeiten definiert, z.B.

#define min_delay  10
#define max_delay 100

ich rufe dann in meinem Programm z.B.

_delay_ms(min_delay);

auf. wenn ich nun versuche mein Programm mit Build zu erstellen, bekomme 
ich folgenden Fehler des Compilers:

Error  1  __builtin_avr_delay_cycles expects an integer constant. 
c:\programme\atmel\avr studio 5.0\avr 
toolchain\bin\../lib/gcc/avr/4.5.1/../../../../avr/include/util/delay.h 
152  28  MM_TEST


Ich arbeite mit AVR Studio 5.
(Hier im Forum gibt es einen Beitrag zu __builtin_avr_delay_cycles, aber 
der hat keine Lösung für mein Problem :-()

Kann mir jemand sagen woran das liegt?

Unter Toolchain habe ich bei Optimization Optimize (-O1) eingestellt.
Ist das richtig? (Die anderen Optionen funktionieren auch nicht, selber 
Fehler).

Danke für Eure Hilfe!
Gast #2286260
Lesenswert?

in der delay.h kannst du ne backward- kompatible vesion von delay 
benutzen lassen, musst du irgendwas definen, schau einfach in die 
kommentare zur entsprechenden funktion, dort steht ein hinweis.

mfg
OP #2286320
Lesenswert?

Hallo,

danke erstmal.
Habe gesehen, dass es nicht an dem define liegt.
Habe noch eine Funktion, die zu dem Fehler führte.
Ich wollte eine zum Blinken einer LED schreiben:

void blink(int16_t interval_ms, int8_t repeat)
{
  DDRC = 0xFF;
  PORTC = 0xFF;

  uint8_t i;

  for (i=0; i<repeat; i++)
  {
    PORTC &= 0b11111110;
    _delay_ms(interval_ms);

    PORTC |= 0b00000001;
    _delay_ms(interval_ms);
  }
}

der Fehler kommt aus dieser Funktion, wenn ich die beiden _delay_ms(...) 
Zeilen entferne, wird ohne Fehler kompiliert.
Es liegt wohl daran, dass die Variable interval_ms nicht den korrekten 
Typ hat?

Wie kann ich nun _delay_ms(myTime) mit einer Variablen Zeit (myTime) 
aufrufen?

Danke für weitere Hilfe!
Persönliche Seite #2286350
Lesenswert?

Thomas Burns schrieb:

> void blink(int16_t interval_ms, int8_t repeat)
> {
>    ...
>     _delay_ms(interval_ms);
>
> Wie kann ich nun _delay_ms(myTime) mit einer Variablen Zeit (myTime)
> aufrufen?

Garnicht: wie die Fehlermeldung besagt, setzt die Funktion eine 
Konstante als Argument voraus, die zur Compilezeit bekannt sein muss. 
Aus der avr-libc-Doku ist das leider nicht wirklich ersichtlich.

Für "variable" Wartezeiten bau die ne Schleife um die Grundfunktion; 
oder besser: verwende Timer.

Das Thema gehört übrigens nach "GCC".
Gast #2286365
Lesenswert?

Thomas Burns schrieb:
> Wie kann ich nun _delay_ms(myTime) mit einer Variablen Zeit (myTime)
> aufrufen?

Was ist denn an

Thomas Burns schrieb:
> Error  1  __builtin_avr_delay_cycles expects an integer constant.

unklar?

Johann L. schrieb:
> Aus der avr-libc-Doku ist das leider nicht wirklich ersichtlich.

Nur wenn man sie nicht liest. Ansonsten findet man das:

**********************************************
Note:
In order for these functions to work as intended, compiler optimizations 
must be enabled, and the delay time must be an expression that is a 
known constant at compile-time.
**********************************************
Gast #2288570
Lesenswert?

Hallo,

danke nochmal für die Antworten, aber komme immernoch nicht klar.
Ich möchte die _delay_ms mit variabler Zeit ansteuern.
Wie rufe ich die nun korrekt auf? Kann mir evtl jemand Code posten?

Danke!
Moderator Persönliche Seite #2288612
Lesenswert?

Thomas Burns schrieb:

> Ich möchte die _delay_ms mit variabler Zeit ansteuern.

Das geht einfach nicht.

> Wie rufe ich die nun korrekt auf?

Gar nicht.

> Kann mir evtl jemand Code posten?

Effektivste Variante dürfte es sein, dass du dich mal mit Timern
beschäftigst.

Ansonsten kann man noch sowas machen wie:
1
static void
2
delay_ms(int ms)
3
{
4
  while (ms-- != 0)
5
    _delay_ms(1);
6
}

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