Forum: Compiler & IDEs AVR GCC, at90s2313, Atmega8, wie kompiliere ich richtig?


von Christian S. (roehrenvorheizer)



Lesenswert?

Hallo,

ich möchte mich in das Programmieren in C einarbeiten und habe direkt 
Anfängerschwierigkeiten. Um ein einfaches Beispielprogramm mit GCC aus 
dem Winavr-Paket zu Compilieren, habe ich mir folgende Befehle 
herausgesucht, in der Windows-DOS-Box an der Kommandozeile eingegeben 
und damit als erstes ein zufrieden stellendes Ergebnis erhalten:

blinky.c ist der Quellcode von der nachfolgend angegebenen Seite, der 
Timer-Interrupts verwendet.
(blinky-mit-interrupt-fuer-mega8.c)

avr-gcc blinky.c -c -o blinky.o -Os -g -mmcu=atmega8

avr-gcc blinky.o -o blinky.elf -mmcu=atmega8

avr-objcopy -j .text -j .data -O ihex blinky.elf blinky.hex

avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex blinky.elf 
blinky_eeprom.hex

avr-objdump -h -S -j .text -j .data blinky.elf > blinky.lst

Das Beispiel stammt von hier:
http://www.rn-wissen.de/index.php/Hallo_Welt_f%C3%BCr_AVR_%28LED_blinken%29
__________

nächster Schritt:

folgendes Blinkprogramm ohne Interrupts, nur mit Warteschleifen von 
hier:

http://www.rn-wissen.de/index.php/LED-Blinken_ohne_Timer
(blinky-fuer-mega8.c)


avr-gcc blinky.c -c -o blinky.o -Os -g -mmcu=atmega8
nach diesem Befehl erscheint bereits folgende Fehlermeldung:
#warning: "F_CPU not defined for <util/delay.h>

avr-gcc blinky.o -o blinky.elf -mmcu=atmega8
OK, keine Fehlermeldung

avr-objcopy -j .text -j .data -O ihex blinky.elf blinky.hex
OK, keine Fehlermeldung

______________________

weiterer Schritt, da ich früher mit dem AT90S2313 viel gemacht habe in 
Assembler und deshalb sie alten Versuchsschaltungen verwenden möchte:

anderer Prozessor, blinky-Programm mit Warteschleifen, da dieses sehr 
einfach ist und auf jedem Prozessor laufen müßte, wenn man oben die 
Ports von C nach A oder B ändert:

....//LED Defines
#define LED_DDR    DDRA
#define LED_PORT  PORTA
#define LED_PORTPIN  PA1......

(blinky-fuer-at90s2313.c)

avr-gcc blinky.c -c -o blinky.o -Os -g -mmcu=at90s2313
ergibt eine ganze REihe Fehlermeldungen:
#warning: "F_CPU not defined for <util/delay.h>
in function 'main'
'DDRA' undeclared
'PA1' undeclared
'PortA' undeclared

Offensichtlich werden diverse Vereinbarungen nicht gefunden.
Woher kommen die Warnungen in Schritt2? Diese wirken sich in Schritt3 
vollends aus. Wie schaffe ich Abhilfe, wenn ich den anderen Prozessor 
verwenden möchte?

Kann mir bitte jemand mit Tipps helfen?

Mit freundlichem Gruß

von Stefan E. (sternst)


Lesenswert?

Christian S. schrieb:
> weiterer Schritt, da ich früher mit dem AT90S2313 viel gemacht habe in
> Assembler und deshalb sie alten Versuchsschaltungen verwenden möchte:
>
> anderer Prozessor, blinky-Programm mit Warteschleifen, da dieses sehr
> einfach ist und auf jedem Prozessor laufen müßte, wenn man oben die
> Ports von C nach A oder B ändert:
>
> ....//LED Defines
> #define LED_DDR    DDRA
> #define LED_PORT  PORTA
> #define LED_PORTPIN  PA1......

Also ich kann im Datenblatt vom AT90S2313 weit und breit nichts von 
einem Port A sehen.

Christian S. schrieb:
> Woher kommen die Warnungen in Schritt2?

F_CPU muss vor dem Einbinden von <util/delay.h> definiert sein, damit 
der Code darin weiß, mit welcher Frequenz dein Controller getaktet ist.
Also z.B.:
1
#define F_CPU 1000000
2
#include <util/delay.h>
Im verlinkten Beispiel ist dieses #define im Source-Code nicht 
vorhanden, weil dort mit einem Makefile gearbeitet wird, welches das 
Symbol über die Compiler-Kommandozeile definiert:
avr-gcc ... -DF_CPU=1000000 ...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Christian S. schrieb:

> avr-gcc blinky.c -c -o blinky.o -Os -g -mmcu=atmega8
> nach diesem Befehl erscheint bereits folgende Fehlermeldung:
> #warning: "F_CPU not defined for <util/delay.h>

"Nur" eine Warnung. F_CPU wird vorbesetzt falls nicht angegeben. Du 
kannst es beim Compileraufruf mitgeben, siehe Quellkommentar im 1. 
Beispiel:

$ avr-gcc blinky.c -c -o blinky.o -Os -g -mmcu=atmega8 -DF_CPU=1000000

oder welcher Wert auch immer der richtige ist für F_CPU.

> mit dem AT90S2313
> ergibt eine ganze REihe Fehlermeldungen:
> #warning: "F_CPU not defined for <util/delay.h>
> in function 'main'
> 'DDRA' undeclared
> 'PA1' undeclared
> 'PortA' undeclared
>
> Offensichtlich werden diverse Vereinbarungen nicht gefunden.

Die Beispiele sind idR für einen einzigen µC geschrieben, hier wohl 
ATmega8.  AVRs haben alle unterschiedliches SFR-Layout und damit auch 
unterschiedliche Bedürfnisse was Port-Layout, Timer-Konfiguration etc. 
angeht.

> Woher kommen die Warnungen in Schritt2?
> Diese wirken sich in Schritt3 vollends aus.

Nein, die Warnung hat mit dem Fehler nichts zu tun. Es sind 2 
unterschiedliche Baustellen.

Wenn du einen anderen µC verwendest, musst du das Programm portieren, 
d.h. Datenblatt wälzen und schauen, wie die SFR-Settings anzupassen 
sind. Selbst wenn ein SFR gleich heisst kann es sein, daß es anders 
konfiguriert werden muss.

Die Einstirgsbeispiele so allgemein zu schreiben daß sie auf jeden 
denkbaren der > 200 AVRs passen würden wäre der absolute Overkill und 
würde das Verständnis eher behindern anstatt ein kleines, überschaubares 
Minimalbeispiel zu liefern.

von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

Hallo,

erstmal vielen Dank für die fundierten Auskünfte!

DAß am at90s2313 die beiden Ports B und D heißen, hätte mir auch selbst 
bei einem Blick auf das Anschlußbild auffallen können. OK, Fehler von 
mir, da "früher" vor 10 Jahren war.

Durch folgende Änderung tauchte die Fehlermeldung nicht mehr auf:
#define LED_DDR    DDRA  ---->  DDRB
#define LED_PORT  PORTA  ---->  PORTB
#define LED_PORTPIN  PA1  ---->  PB1

Beispiel "LED-blinken ohne Interrupt nur mit w2313.c" compiliert:

avr-gcc w2313.c -c -o w2313.o -Os -g -mmcu=at90s2313

avr-gcc w2313.o -o w2313.elf -mmcu=at90s2313

avr-objcopy -j .text -j .data -O ihex w2313.elf w2313.hex

avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex w2313.elf 
w2313_eeprom.hex

avr-objdump -h -S -j .text -j .data w2313.elf > w2313.lst

avr-gcc w2313.o -o w2313.elf ... -Wl,-Map,w2313.map

der letzte Befehl geht nicht! Sonst alles perfekt.
Fehlermeldung:
C:/winavr-xxxxx/.../.../avr/bin/ld.exe: ...: no such file: permission 
denied

Kann mich über diese Fehlermeldung bitte noch jemand aufklären?

Mit freundlichem Gruß

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Christian S. schrieb:

> avr-gcc w2313.o -o w2313.elf ... -Wl,-Map,w2313.map
>
> der letzte Befehl geht nicht! Sonst alles perfekt.
> Fehlermeldung:
> C:/winavr-xxxxx/.../.../avr/bin/ld.exe: ...: no such file: permission
> denied
>
> Kann mich über diese Fehlermeldung bitte noch jemand aufklären?

... ist kein wirklich toller Dateiname. Der Linker sucht eine Datei ... 
und die findet er nicht.

von Reohenvorheizer (Gast)


Lesenswert?

Hallo,

ich möchte ein C-Programm für einen AT90s2313 per Befehl für die 
Kommandozeile im AVR-Studio als .cof-File laden und debuggen. OK ist 
veraltet, weiß ich aber und hat spezielle Gründe.

Die einzige Angabe, welche Befehle man dafür braucht,habe ich in diesem 
Makefile gefunden. Hier ein Ausschnitt:

http://todbot.com/projects/smart-leds/softpwm_t13/Makefile

On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or 
VMLAB).
#
# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR 
Studio
#                4.07 or greater).
#
# make program = Download the hex file to the device, using avrdude. 
Please
#                customize the avrdude settings below first!
#
# make filename.s = Just compile filename.c into the assembler code only
#
# To rebuild project do "make clean" then "make all".

# Convert ELF to COFF for use in debugging / simulating in AVR Studio or 
VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000


coff: $(TARGET).elf
  @echo
  @echo $(MSG_COFF) $(TARGET).cof
  $(COFFCONVERT) -O coff-avr $< $(TARGET).cof


extcoff: $(TARGET).elf
  @echo
  @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
  $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof

Wie müßte nun meine Befehlszeile lauten? Ich habe schon mehrfach 
probiert, komme aber nicht hin.

Mit freundlichem Gruß

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Was ist denn das Problem / die Fehlermeldung?

Wird COFF überhaupt unterstützt von deiner Toolchain?

Zum Debuggen geht doch auch ELF, vorausgesetzt der Bock wurde nicht bei 
der ELF -> COFF Konvertierung geschossen.

Und noch was: Mach für sowas nen neues Thema auf. Mit dem OT hat deine 
Frage grad garnix zu tun...

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

also um es ausführlich  und deutlich zu beschreiben: Was ich nicht habe, 
ist der Befehl mit all seinen Optionen, um an der Kommandozeile ein .cof 
- File zu erhalten. Also gibt es auch keine Fehlermeldung. Die 
Dokumentation zu AVR-GCC ist mir zu wenig hinreichend. Ein .elf - File 
läßt sich mit AVR-Studio nicht öffnen. So dachte ich mir, daß es einen 
Befehl für die Kommandozeile geben muß, wenn es doch direkt eine Vorgabe 
gibt, 'make coff' zu wählen, die das gewünschte liefert, falls man alles 
richtig vorher im Makefile eingestellt hat. Insofern gehört diese Frage 
aus meiner Sicht schon noch zum Thema, weil ich mir ja zum 
C-Programmieren auch noch das Debuggen in AVR-Studio gönnen möchte. Was 
ich sehen möchte ist die Ausführung eines C-Programms für den AVR in 
einzelnen SChritten, die ich mit der F11-Taste im Simulator ablaufen 
lasse. Ein .hex-File läßt sich öffnen und debuggen, enthält aber zu 
spärliche Angaben.

Auszug aus der Hilfe des AVR-Studios, "file menu":
When Open... is selected from the File menu, a file selection dialog 
appears on the screen. The user must then select the object file to 
execute. AVR Studio supports the following formats:
IAR UBROF (.d90)
AVR Object Files generated by the Atmel AVR Assembler (.obj)
Intel-Hex, extended (.hex)
COFF, Common Object File Format (.cof)
AVR Studio automatically detects the format of the object file.

mit freundlichem Gruß

von Peter D. (peda)


Lesenswert?

Was Du bloß mit Deinen .cof hast, das brauchst Du nicht.
Einfach im AVRStudio für Dein Projekt den Simulator auswählen und dann 
Build und Run drücken.

Und es stimmt, Deine Frage hat mit dem OP (Compiler Warnungen und 
Errors) nun überhaupt nichts gemeinsam.


Peter

von Stefan E. (sternst)


Lesenswert?

Reohenvorheizer schrieb:
> ich möchte ein C-Programm für einen AT90s2313 per Befehl für die
> Kommandozeile im AVR-Studio als .cof-File laden und debuggen. OK ist
> veraltet, weiß ich aber und hat spezielle Gründe.

Und was sind die "speziellen Gründe"?

Christian S. schrieb:
> Ein .elf - File
> läßt sich mit AVR-Studio nicht öffnen.

Doch, außer natürlich du benutzt irgendein veraltetes AVR-Studio. Da 
stellt sich dann wieder die Frage: warum?

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


Lesenswert?

Stefan Ernst schrieb:
>> Ein .elf - File
>> läßt sich mit AVR-Studio nicht öffnen.
>
> Doch, außer natürlich du benutzt irgendein veraltetes AVR-Studio.

Das müsste dann eine 3er Version sein.

> Da stellt sich dann wieder die Frage: warum?

Weil die 3er noch problemlos unter Wine lief. :-)

Im Ernst: der einzige mir bekannte Konsument, der immer noch AVR-COFF
benötigt, wäre VMlab.

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

der spezielle Grund ist der veraltete PC, der nun auch noch ein 
C-Programm für den AVR schrittweise ausführen soll.
Favorisiert habe ich AVR-Studio 3.56, weil es noch eine handliche Größe 
hat und ich mehr nicht brauche. Die Versionen >4 sind meiner Ansicht 
nach für den veralteten PC zu groß, 100 MB Installationsdatei plus 38 Mb 
Service-Pack. Und das NUR, um C-Programme von wenigen Textseiten Größe 
zu Lernzwecken auszuprobieren. Kommt mir nicht drauf. So ein veraltetes
Dateiformat würde doch gut passen oder? Sonst ein Dateiformat zum 
Debuggen wäre mir auch recht, aber .elf können die alten Versionen des 
AVR-Studios eben nicht öffnen. Deshalb diese Verbiegung. Nachdem ich 
stundenlang mit Vorlagen aus Makefiles herumprobiert habe, die 
AVR-GCC-Hilfe bemüht habe, komme ich wieder zu dem SChluß, daß diese 
Tools nicht leicht gezielt zu bedienen sind, daß in vielen Fällen mir 
gar nicht klar ist, was die diversen Einstellungen bewirken und daß es 
nicht für Anfänger geeignet ist, außer wenn man auf vorgefertigte Wege 
zurückgreifen kann, mit denen man zumindest am Anfang brauchbare 
Ergebnisse erhält. Ich hätte nie gedacht, daß es so einen derartigen 
Umstand bedeutet, das passende Dateiformat zu erzeugen.

mit freundlichem Gruß

von Karl H. (kbuchegg)


Lesenswert?

> der spezielle Grund ist der veraltete PC, der nun auch
> noch ein C-Programm für den AVR schrittweise ausführen
> soll. Favorisiert habe ich AVR-Studio 3.56, ...

Definiere 'veraltet'.
Mein erstes AVR-Studio hab ich vor 10 Jahren eingesetzt, auf einer 
damals schon alten PC-Platform. Und das war ein 4-er AVR-Studio mit dem 
damals aktuellen WinAVR

>  Ich hätte nie gedacht

Ich hätte nie gedacht das sagen zu müssen: Denkst du nicht, dass sich in 
der Zwischenzeit die Tools verbessert haben?

Ich hab noch mit Lochkarten gerabeitet. Das war auf der einen Seite 
ziemlich einfach (solange alles geklappt hat) und auf der anderen Seite 
aber auch unglaublich kompliziert (wenn es Probleme mit dem 
Lochkartenstanzer/Leser gab oder dir ganz einfach dein Lochkartenstapel 
runtergefallen ist). Alles hat 2 Seiten. Die Tools von 'damals' haben 
ihren Job gemacht, aber man musste wissen, was man tut und wie man sie 
einsetzt. Und nicht selten bedeutete das: stundenlang alle möglichen 
(und unmöglichen) Variationen von X durchprobieren und englische 
Handbücher aquf Wortebene und unter Rückverfolgung aller Querverweise 
stundenlang studieren, bis man raushatte, wie die Logik dahinter 
funktioniert. Bis dann die Revolution ausbrach und das Buzzword 
"Benutzerfreundlichkeit" in aller Munde war.

von Peter D. (peda)


Lesenswert?

Christian S. schrieb:
> Die Versionen >4 sind meiner Ansicht
> nach für den veralteten PC zu groß

Ich kann ja verstehen, man hängt an alten Sachen.
Aber einem 33MHz 486-er mit Windows3.11 sollte man endlich seinen 
verdienten Ruhestand gönnen.
Auch sind ja diese alten Mühlen noch richtig laut gewesen (Festplatten, 
Lüfter).

Alles vor Windows-XP würde ich nicht mal mehr mit der Kneifzange 
anfassen.


Peter

von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

Hallo,

na, wer sagt's denn! Habe nun mein .cof - file! Sieht geöffnet mittels 
AVR-Studio 3.56 aus wie im Bild.

Als veraltet würde ein normaler Gamer oder vielleicht auch Programmierer 
meinen "Dual-Core 3,6 GHZ PC mit 1GByte Ram und 40 Gig-Platte und 
Win-XP" ansehen. Habe den bei einer firmeninternen Verlosung gewonnen.
Und ob das P2-333-MHz-Laptop mit Win-XP-SP3 damit klar kommt, probiere 
ich demnächst aus. Jedenfalls AVR-Studio und WINAVR sind schon drauf.
Ja, OK, 8sec fürs compilieren und AVR-Studio läuft auch damit.
Vor 10 Jahren machte das alles der Pentium2, allerdings nur 
Assemblerprogrammierung. MPLAB für den PIC war mit diesem ebenfalls kein 
Problem.

"Ich hab noch mit Lochkarten gerabeitet."
ich hab auf MFM-Platten DOS geübt...

Da stehen neben mir noch drei PS/2-Rechner mit 10 Gig-Platten und 
TTL-Grafik.

Was habe ich gemacht???

Folgende Vorlagen verwendet:
http://www.rn-wissen.de/index.php/LED-Blinken_ohne_Timer
http://royalclan.de/index.php?site=downloads&show=15
WINAVR 20100110

Im Makefile habe ich wie in Readme.txt verlangt, die Einträge "MCU" und 
"F_CPU" an den favorisierten Prozessor, hier den AT90S2313 angepaßt und 
8 MHz als Takt eingetragen.

Diese Passage des Makefiles hier, habe ich abgeändert, also anstatt 
dwarf-2 habe ich stabs eingetragen. Da ich so viel vorher gelesen habe 
über dieses Dateiformat, habe ich einfach mal das probiert.

# Debugging format.
#     Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
#     AVR Studio 4.10 requires dwarf-2.
#     AVR [Extended] COFF format requires stabs, plus an avr-objcopy 
run.
DEBUG = stabs

Dann erst mal 'make' aufgerufen, bis keine Fehler mehr kamen, dann 'make 
coff' aufgerufen. Das Make-File setzt sehr umfangreiche Befehle ein, wie 
man an den beigefügten Bildschirmmmeldungen sehen kann. Sie befinden

sich in der Datei Readme-chr.txt im ZIP-Archiv.

AVR-Studio 3.56 öffnet die .cof-Datei und frägt nochmal nach 
Prozessortyp und Taktfrequenz. Dann ist schon die Datei geöffnet und man 
kann sich die Watches einrichten.

Warum habe ich nicht gleich die Make-files ausprobiert?

Werde mich nun auf meinen Lorbeeren vorläufig ausruhen und mich auf 
viele selbst geschriebne C-Programme freuen, die ich im veralteten 
AVR-Studio debuggen kann...

von Peter D. (peda)


Lesenswert?

Christian S. schrieb:
> Als veraltet würde ein normaler Gamer oder vielleicht auch Programmierer
> meinen "Dual-Core 3,6 GHZ PC mit 1GByte Ram und 40 Gig-Platte und
> Win-XP" ansehen.

Das ist doch ein Schlachtschiff.
Meiner ist noch älter (Aldi 2004, 3GHz HT).
Ich benutze Studio 4.18 darauf, läuft wie dumm.


Peter

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
Noch kein Account? Hier anmelden.