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!
Ganz sicher bin ich nicht, ob das was bringt, aber versuch mal, den Typ der Konstanten anzugeben:
1 | |
2 | |
Gast
#2286260
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
Gast
#2286264
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!
Gast
#2286334
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.
Gast
#2286365
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 :-/
Gast
#2288570
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Gast
#2288832
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.