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
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
|
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
tschuldigung, vergessen: mit der backward-compatible version von delay_ms() geht dann das was du machen willst wieder. mfg
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!
hast du das probiert, mit dem define...? denn bei mir war das problem quasi exakt gleich.. mfg
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".
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.
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. **********************************************
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 :-/
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!
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.