Forum: Compiler & IDEs __builtin_avr_delay_cycles


von Thomas B. (mrburns)


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!

: Verschoben durch Moderator
von Edi R. (edi_r)


Lesenswert?

Ganz sicher bin ich nicht, ob das was bringt, aber versuch mal, den Typ 
der Konstanten anzugeben:
1
#define min_delay  10L
2
#define max_delay 100L

von dunno.. (Gast)


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

von dunno.. (Gast)


Lesenswert?

tschuldigung, vergessen:

mit der backward-compatible version von delay_ms() geht dann das was du 
machen willst wieder.

mfg

von Thomas B. (mrburns)


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!

von dunno.. (Gast)


Lesenswert?

hast du das probiert, mit dem define...? denn bei mir war das problem 
quasi exakt gleich..

mfg

von Johann L. (gjlayde) Benutzerseite


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

von Thomas L. (thomasblue)


Lesenswert?

Helfen dir die

void _delay_loop_1(uint8_t __count);
void _delay_loop_2(uint16_t __count);

aus der

#include <util/delay_basic.h>

weiter? Die gehen ohne Probleme mit Variablen.

von Rolf Magnus (Gast)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Johann L. schrieb:
>> Aus der avr-libc-Doku ist das leider nicht wirklich ersichtlich.
>
> Nur wenn man sie nicht liest. Ansonsten findet man das:

http://nongnu.org/avr-libc/user-manual/group__util__delay.html#gad22e7a36b80e2f917324dc43a425e9d3

Ok, hätte wohl hochscrollen sollen :-/

von Thomas Burns (Gast)


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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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
}

von Rolf Magnus (Gast)


Lesenswert?

Thomas Burns schrieb:
> danke nochmal für die Antworten, aber komme immernoch nicht klar.
> Ich möchte die _delay_ms mit variabler Zeit ansteuern.

Ja wie oft denn noch? DAS GEHT NICHT!

> Wie rufe ich die nun korrekt auf?

Man übergibt eine Konstante.

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.