mikrocontroller.net

Forum: Compiler & IDEs codeblocks meckert bei _delay_ms()


Autor: Gerhard Hinze (oderlachs)
Datum:

Bewertung
0 lesenswert
nicht 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:
// avr-test.c  
// STK-500 mit ATmega32 MCU
// Zählt von 255  gegen NUlL usw..
// Die Ziffer wird binär auf dem STK500 mittels LEDs angezeigt
#include <avr/io.h>
#include <stdint.h>
#define F_CPU  3686400UL    // Quarz mit 3.6864 Mhz STK500
//#define F_CPU 16000000UL
#include <util/delay.h>     // in älteren avr-libc Versionen <avr/delay.h> 



int main( void )
{
    DDRB =  0xFF ;          // PB0 an PORTB als Ausgang setzen
    PORTB = 0xFF;
  uint8_t var = 255;
    while( 1)               // Endlosschleife
    {

    PORTB = var;            // schreibe Variable in PORTB z.&nbsp;B. angeschlossene LEDs
    
    _delay_ms(1000);        // Eine Sekunde warten...
    --var;
  if (var <= 0)
  {
  var = 255;
    }
 }
    return 0;
}

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergessen, die Optimierung einzuschalten?

Autor: Gerhard Hinze (oderlachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Optimierung ist an , verschieden schon probiert auch aus...alles 
dasselbe Desaster... Will mir einfach nicht in den Kopf....
aber  es ist nun mal so... ;)

Gruss und Dank

Gerhard

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerhard H. schrieb:
> Optimierung ist an

Welche genaue Kommandozeile wird denn beim Compilieren benutzt?
Die wird ja das Code::Blocks hoffentlich irgendwo zeigen.

Autor: Gerhard Hinze (oderlachs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike B. (Firma: Buchhaltung+Controlling) (mike_b97) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"expects a compile time integer constant"

uint16 i=1000;
..
_delay_ms(i);

schon mal probiert?

Autor: Huh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike B. (Firma: Buchhaltung+Controlling) (mike_b97) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> uint8_t var = 255;
uint16 i=1000;

beides sind m.W.n. Constanten-Deklarationen (in c++)
i ist eine integer-Constante,
der Wert ist zur Compile-Zeit bekannt

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike B. (Firma: Buchhaltung+Controlling) (mike_b97) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na dann
const uint16 i=1000;

Es wäre nett gewesen, wenn Herr R. Magnus sein besseres Wissen auch mit 
uns geteilt und dies gleich korrigiert hätte.

: Bearbeitet durch User
Autor: Huh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike B. schrieb:
> na dann
> const uint16 i=1000;
>
> Es wäre nett gewesen, wenn Herr R. Magnus sein besseres Wissen auch mit
> uns geteilt und dies gleich korrigiert hätte.

Hab ich doch schon gemacht, direkt im nächsten Beitrag.
Das reicht wohl nicht? :-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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];

Autor: Mike B. (Firma: Buchhaltung+Controlling) (mike_b97) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike B. schrieb:
> ist nur die Frage, ob ihm das bei C als "integer const at compile time"
> reicht

Nein.

Aber das ist (zumindest laut obigem Codestückchen) nicht des TEs
Problem.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard Hinze (oderlachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin leider krank, denke mal ich kann bald ausführlich antworten....

Vielen Dank für die Mithilfe bislang.
Gerhard

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.