codeblocks meckert bei _delay_ms()

#4711052
Lesenswert?

Hallo Freunde ,
schon vor einiger Zeit hatte ich mich hier wegen der AVR - Kapriolen 
von Code::Blocks unter Linux hier etwas durchgefragt und es auch Gott 
sei dank der Antworten von hier und vieler Internetrecherchen 
geschafft, das ich mit Code::Blocks sozusagen das AVR-Studio ( Windows) 
unter Linux damit ersetzen konnte.

Aber wie der Pechvogel nun so fliegt, kam ein HHD Fehler und damit auch 
ein Neuaufsetzen des PC mit gleich dem aktuellem Linux auf mich zu.
Natürlich installierte ich auch wieder Code::Blocks, was für mich etwas 
einfacher zu handeln ist bei der AVR Programmierung.

Nun habe ich heute, zum ersten Male, damit Hantieren wollen und wieder 
ein "Fehlschuss" der nach hinten los ging. :(

Code::Blocks meckert beim Compilieren über die Funktionen
 _delay_ms bzw. _delay_us.

Hier der Code:
1
// avr-test.c  
2
// STK-500 mit ATmega32 MCU
3
// Zählt von 255  gegen NUlL usw..
4
// Die Ziffer wird binär auf dem STK500 mittels LEDs angezeigt
5
#include <avr/io.h>
6
#include <stdint.h>
7
#define F_CPU  3686400UL    // Quarz mit 3.6864 Mhz STK500
8
//#define F_CPU 16000000UL
9
#include <util/delay.h>     // in älteren avr-libc Versionen <avr/delay.h> 
10

11

12

13
int main( void )
14
{
15
    DDRB =  0xFF ;          // PB0 an PORTB als Ausgang setzen
16
    PORTB = 0xFF;
17
  uint8_t var = 255;
18
    while( 1)               // Endlosschleife
19
    {
20

21
    PORTB = var;            // schreibe Variable in PORTB z.&nbsp;B. angeschlossene LEDs
22
    
23
    _delay_ms(1000);        // Eine Sekunde warten...
24
    --var;
25
  if (var <= 0)
26
  {
27
  var = 255;
28
    }
29
 }
30
    return 0;
31
}
Fehleranzeige : /usr/lib/avr/include/util/delay.h|163|error: 
__builtin_avr_delay_cycles expects a compile time integer constant

Habe recherchiert und herausbekommen das ich nicht der Einzige bin der 
vor diesen Rätsel steht, aber keine rechte Lösung gefunden .
Mit Geany kann ich den Code ohne Fehler compilieren ...
Geany und C::B benutzen doch wohl den selben AVR Compiler und selbe AVR 
Libs... ???

Kann mir wer bitte einen Tip geben wo ich nach suchen muss/kann , um 
dieses Makel zu beheben ??

Besten Dank für eventuelle Hilfe
Gruss

Gerhard
#4711139
Lesenswert?

Haben beide parallel hier geschrieben..konnte nicht mehr den Beitrag 
ergänzen..compilieren geht jetzt, genaues morgen..

Irgendwo in den Einstellungen waren 2 versch. MCUs einmal Atmega32 und 
andermal Atmega 128 zu finden ..woher ??????

Danke vielmals... Hab schon Kopfweh, muss aufhören.

Gerhard
Gast #4711158
Lesenswert?

Mike B. schrieb:
> "expects a compile time integer constant"
>
> uint16 i=1000;
> ..
> _delay_ms(i);
>
> schon mal probiert?

Glaube nicht, daß das funktioniert. Deswegen verlangt er ja
"a compile time integer constant". Und i ist eine Variable. Das 
verlangte wäre eine Zahl in der Klammer. Das hat der TO allerdings schon 
gemacht. Also muß meiner Meinung nach die Ursache woanders liegen.
#4711172
Lesenswert?

Mike B. schrieb:
>> uint8_t var = 255;
> uint16 i=1000;
>
> beides sind m.W.n. Constanten-Deklarationen (in c++)

Nein, weder in C, noch in C++ sind das Konstanten.

> i ist eine integer-Constante,

Nein. i ist eine Integer-Variable.

> der Wert ist zur Compile-Zeit bekannt

Im Kontext von Standard-C nicht. Der Optimizer weiß aber natürlich, was 
der Wert ist, wenn er später benutzt und zwischendrin nicht mehr 
verändert wurde.
Persönliche Seite #4712186
Lesenswert?

Jörg W. schrieb:
> Mike B. schrieb:
>> na dann
>> const uint16 i=1000;
>
> Ist auch nur bei C++ eine Konstante, die tatsächlich diesen Namen
> verdient.  Bei C ist es nur eine nicht modfizierbare Variable.
>
> Den Unterschied merkst du, wenn du sowas mal probierst:
> const int i = 1000;
> int array[i];

ist nur die Frage, ob ihm das bei C als "integer const at compile time" 
reicht
Persönliche Seite #4712204
Lesenswert?

Gerhard H. schrieb:
> Fehleranzeige : /usr/lib/avr/include/util/delay.h|163|error:
> __builtin_avr_delay_cycles expects a compile time integer constant

Kann ich nicht nachvollziehen, probiert mit avr-gcc v4.7, v4.8, v4.9, v6 
und v7 mit folgenden Optionen: -O -mmcu=atmega32, teilweise auch -O3, 
-O2.

Aber wie immer, erweist sich Raten als denkbar mieseste Alternative im 
Vergleich dazu, vorhandene Informationen zu liefern (Optionen, 
Compiler-Version, etc).
#4712223
Lesenswert?

Gerhard H. schrieb:
> Habe recherchiert und herausbekommen das ich nicht der Einzige bin der
> vor diesen Rätsel steht, aber keine rechte Lösung gefunden .

Hast du mal ein paar Links zu den anderen, die genau dein Problem haben 
(und nicht nur zu faul waren, die Doku zu lesen)?

Ansonsten ist ein üblicher Tipp immer, einen aktuellen AVR-gcc mit allem 
Zubehör von Hand zu installieren. Die Versionen, die in den 
Linux-Distributionen mitgeliefert werden, sind manchmal arg seltsam.

Oliver

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