__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