Forum: Compiler & IDEs AVR Studio und Funktion _delay_ms()


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael D. (michael86)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nach einer sehr langen Pause bin ich gerade dabei mich wieder in die AVR 
Mikrocontroller einzuarbeiten. Leider scheitere ich schon ganz am Anfang 
an den einfachsten Dingen und finde den Fehler einfach nicht.

Das Programm läuft soweit, nur wenn ich die Funktion _delay_ms verwende, 
kann ich nicht mehr kompilieren.
Hab im Internet schon einiges dazu gelesen, auch Alternativen, aber 
diese funktionieren auch nicht. Was genau mache ich falsch?

Mein Setup:
Atmel STK500, Atmega2561, RS232
Windows 2000 SP4, IE6, AVR Studio 4.19

Da ich erstmal alles wieder deinstalliert habe,
hier die Reihenfolge der Neuinstallation
(falls das einen Unterschied macht)

+ WinAVR-20100110
+ AVR Studio 4.18
+ AVR Studio 4.18 SP1
+ AVR Studio 4.18 SP2
+ AVR Studio 4.18 SP3
+ AVR Toolchain 3.4.2
+ AVR Studio 4.19

Fehlermeldungen:
habe ich teilweise mitprotokolliert als Text-Datei.

Und das Programm:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main()
{
  int delay_time = 2000;

  DDRB = 0xFF;    // PORTB STK500 LEDs
  PORTB = 0x00;

  DDRC = 0xFF;    // PORTC 2x 74C48
  PORTC = 0x00;

  for (;;)
  {
    for (int i = 0; i <= 255; i++)
    {
      _delay_ms (delay_time);
      PORTB = i;
      PORTB = ~PORTB;
      PORTC = i;
      _delay_ms (delay_time);    
    }
  }
  return 0;  
}

Habe es an einem anderen PC mit AVR Studio 6.1 versucht. Kompiliert 
einwandfrei und lässt sich übertragen
(musste den dazu aber den AVRISP MK2 verwenden, da das STK500 den 
Controller offiziell nicht kennt und ich diesen somit nicht auswählen 
konnte.)
Habe es zeitweise auch mit einem Atmega8515 versucht.

Somit kann es eigentlich nur am Compiler bzw. Linker liegen.
Habe die Atmel Toolchain (verschiedene Versionen) versucht und auch die 
beiden AVRGCC.EXE und MAKE.EXE von WinAVR.
Beides will nicht.

Danke schon mal für die Hilfe.

von Thomas R. (r3tr0)


Bewertung
0 lesenswert
nicht lesenswert
Funktioniert es denn, wenn du direkt _delay_ms (2000); schreibst?

von Bauteiltöter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Auf was für einem Computer hast du das installiert?

Das hier:
../8-Bit_Counter.c:20: internal compiler error: Illegal instruction
klingt als wäre der avr-gcc für eine neuere Platform compiliert. Deine 
CPU kennt diese instruction nicht. (z.B. neuster GCC auf einem alten 
386er)

von Michael D. (michael86)


Bewertung
0 lesenswert
nicht lesenswert
Nein, es macht keinen Unterschied ob mit oder ohne Variable und auch die 
Zeit auf ein Minimum runtersetzen (1) bringt keinen Erfolg.
Das Programm selbst funktioniert auch (mit einem anderen AVR Studio 
getestet.
Der Kompiler bricht ab, sobald die Funktion _delay_ms() verwendet wird.
Wenn ich sie auskommentiere funktioniert es.

von Ingo Less (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ab einer gewissen Version konnte man keine zur Laufzeit variablen Delays 
mehr machen... Sind nur noch Konstanten möglich.

von Bauteiltöter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kann man schon ewig nicht (oder noch nie?) Die Cycle-Zähl-Magie hinter 
__delay_ms() rechnet in float und ist darauf angewiesen, dass diese 
Berechnung zur Compiletime gemacht wird.

Wenn man sich daran nicht hält, dann stimmen halt die Zeiten nicht. Das 
darf aber niemals zu einem ICE führen (Internal compile error).
Generel darf C-Code, egal wie falsch er ist, nie zu einem ICE führen. 
Der TO hat also ein Problem mit seiner Toolchain, nicht mit dem 
geschriebenem Programm.

von Michael D. (michael86)


Bewertung
0 lesenswert
nicht lesenswert
Bauteiltöter schrieb:
> Auf was für einem Computer hast du das installiert?
>
> Das hier:
> ../8-Bit_Counter.c:20: internal compiler error: Illegal instruction
> klingt als wäre der avr-gcc für eine neuere Platform compiliert. Deine
> CPU kennt diese instruction nicht. (z.B. neuster GCC auf einem alten
> 386er)

Ist ein alter AMD K6 irgendwas. Aber dürfte damit nichts zu tun haben, 
da ich ja für einen MCU kompiliere. Der PC kennt ja die I/O Ports auch 
nicht.Oder verstehe ich das falsch?

Ingo Less schrieb:
> Ab einer gewissen Version konnte man keine zur Laufzeit variablen Delays
> mehr machen... Sind nur noch Konstanten möglich.

Auch als const oder den direkten Wert als Übergabe für die Funktion 
macht keinen Unterschied.

Wie schon gesagt, ich hab es über einen anderen PC zum laufen gebracht, 
nur möchte ich verstehen warum es mit dem alten AVR Studio nicht will.

: Bearbeitet durch User
von Hmmm (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael D. schrieb:
> Ist ein alter AMD K6 irgendwas. Aber dürfte damit nichts zu tun haben,
> da ich ja für einen MCU kompiliere. Oder verstehe ich das falsch?

Bei einem 20 Jahre alten Prozessor kann es durchaus passieren, dass die 
Toolchain-Binaries Instructions verwenden, die der noch nicht kennt.

Teste mal dasselbe auf aktuellerer Hardware.

von Bauteiltöter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael D. schrieb:
> Ist ein alter AMD K6 irgendwas. Aber dürfte damit nichts zu tun haben,
> da ich ja für einen MCU kompiliere. Der PC kennt ja die I/O Ports auch
> nicht.Oder verstehe ich das falsch?

Da verstehst du etwas falsch. Es geht nicht um den Mikrocontroller, 
sondern um das Programm avr-gcc.exe an sich. Das ist für einen viel 
neuere Prozessoren gebaut und verwendet Befehle (für sich selber, nicht 
das, was es generiert!) die dein AMD K6 nicht kann.

Da kann man nichts machen außer einen älteren avr-gcc nehmen.

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


Bewertung
0 lesenswert
nicht lesenswert
Bauteiltöter schrieb:
> Da kann man nichts machen außer einen älteren avr-gcc nehmen.

… oder sich den Compiler selbst compilieren. Kann aber auf so'ner alten 
Kiste schon mal eine Beschäftigung für einen ganzen Tag werden.

von Ingo Less (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich will ja garnichts gegen alte Sachen sagen... Aber ist ein 20 Jahre 
altes Setup evtl. nicht etwas viel zu alt? Wenn man sieht, dass man für 
~300€ ein neuen PC der Mittelklasse und somit zum Programmieren völlig 
ausreichend ist?

von Michael D. (michael86)


Bewertung
0 lesenswert
nicht lesenswert
Hab noch ne alte Toolchain 3.2.3 gefunden und getestet.
Jetzt funktioniert alles.
Danke für den Tipp, hab die ganze Zeit versucht immer neuer zu 
installieren.

Ja, der PC ist vielleicht nicht mehr ganz zeitgemäß, aber für meine 
Bastel-Projekte war er immer ausreichend. Außerdem lauft auf dem auch 
noch die alte Software für meine Geräte. Die müsste ich dann auch alle 
mit nem neuen PC mit ersetzen.

von Rolf M. (rmagnus)


Bewertung
1 lesenswert
nicht lesenswert
Das sollte zwar nicht die Ursache für dieses spezifische Problem sein, 
abr:

> avr-gcc  -mmcu=atmega8515

Warum Compilierst du Code für einen mega8515, wenn du in Wirklichkeit 
einen

Michael D. schrieb:
> Atmega2561

hast?

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.

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