PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR Programmieren unter LINUX



oderlachs
07.05.2014, 17:33
Hallo Linux Kenner !
Ich möchte gerne unter Linux in AVR in C programmieren, aber ich kenne mich nicht mit den Einstellungen von Geany oder Eclipse aus ,
auch kann ich keine Ordner von AVR finden wo die wohl gesuchten Compiler und Libraries enthalten sind.

Ich habe die AVR-Pakete nach einer Anleitung im Web unter Ubuntu mit APT-Get installiert, aber nun bin ich am Verzweifeln wie ich da Pfade und so weiter einstellen soll, weil ich nix von AVR finden kann.
Doch es wird mir angezeit das alles (??) von AVR installiert ist..

Hat vielleicht wer von Euch ein paar Hinweise für mich?
Es würde mich sehr freuen.
Auch suche ich Hinweise/Tututs zum Einstellen von Programmers-Notepad unter Windows

Gruss und Danke
Gerhard

markusj
07.05.2014, 18:44
Hallo Gerhard,

normalerweise musst du gar nicht wissen, wo genau der avr-gcc und die avr-libc hin installiert werden. Es gibt vorgegebene Suchpfade unter denen das System automatisch nach aufgerufenen Programmen sucht. Ähnliches gilt für die avr-libc und andere Programmbibliotheken. Normalerweise musst du diese auch nicht konfigurieren.

Zu den Pfaden: Die avr-libc residiert unter /usr/lib/avr/include, avr-gcc weitere Programme unter /usr/bin/

mfG
Markus

-schumi-
07.05.2014, 21:48
Hier gibts eine Anleitung wie du was einstellen musst http://wiki.ubuntuusers.de/avr#Programmierung-in-C

Würde mich über Feedback bezüglich der Anleitung freuen, da die hauptsächlich auf meinem Mist gewachsen ist und mich sehr intressieren würde inwiefern sie hilfreich (oder auch nicht) ist.

oderlachs
08.05.2014, 10:19
Hallo !

Vielen Dank Euch beiden für die Infos. Ich möchte dazu sagen das ich in Sachen AVR & Linux ganz am Anfang stehe. Dazu muss ich sagen, das ich noch nie dazu "verpflichtet" war ein Makefile zu schreiben, ohne dieses es ja wohl nicht geht. Also bin ich da noch ein DAU oder wie man es nennt ;)

Mir geht es auch darum sowenig wie möglich tippen zu müssen, da sich durch meine kranken Finger oft Tippfehler einschleichen und ich in einer IDE besser den Überblick habe...

@Schumi,
natürlich werde ich mir die Wiki gut ansehen ..lesen, wenn ich es noch nicht schon unwissend über Deinen Anteil gemacht habe...
Ich habe ja auch noch Zeit bis es komplett laufen muss..aber ich möchte doch schon mal anfangen zu üben...dazu benötige ich sozusagen eine "Wanderkarte: Installation der benötigten Dateien...Code schreiben...Zusätzliches und Kompilierung..damit ich an Hand eines einfachen 0-8-15 Beispiel was nachvollziehen kann und daraus lernen kann...
Na bestimmt werde ich im Web noch Infos finden...und ich weiss das ich hier mich in Not befragen kann..

Danke Euch und Gruss
Gerhard

Nachtrag : Genau wie ich dachte, habe nun nach dem Beispiel (Wiki) Geany eingestellt..doch beim Kompilieren kommt immer Fehler


make all (im Verzeichnis: /home/gerhard/Projekte/Gtest1)
Kompilierung fehlgeschlagen.
make: *** Keine Regel, um »all« zu erstellen. Schluss.

derNeue
08.05.2014, 15:29
Noch jemand, der wie ich es mit Linux versucht. Ich denke, wir stehen beide an der selben Stelle, ich habe auch schon eine Weile gesucht, bin aber auch noch nicht zu einem zufriedenstellenden Ergebnis gekommen. Ich hab eben Windows noch in einer virtuellen Maschine laufen und da das Atmel-Studio. Frisst zwar viele Resourcen, das AtmelStudio 6 aber man gewöhnt sich eben ganz schnell an den Komfort, den es bietet. Der Code lässt sich dort so super lesen, auf sowas verzichtet man eben sehr ungern.


Dennis

oderlachs
08.05.2014, 16:33
Ja dennis ich habe heut fast den ganzen tag, bis jetzt, daran gesessen unter Linux so etwas wie ein C Programm für AVR zu programmieren...mit nichten das da was geht...hunderte Anleitungen im Web..aber funzen tut nix..Will man eines nachvollziehen fehlt die Datei und hat man diese fehlt eine Andere und immer im Kreise...oder man kommt dahin , das diese datei gar nicht da ist wo sie soll und man kann sie per Apt Get nicht installieren.
Nun überlege ich wirklich, wo mir mehr graue Haare noch wachsen können....wenn ich auf Linux oder später auf Win8 umsteige... Eigentlich mag ich ja Linux, aber wehe man möchte etwas anders als wie den Standart der Installation haben..dann kommt das Grosse Grausen ;)
Ich weiss ja nicht wie und warum , nach ein zwei Updates war heute sogar mein Drucker nicht mehr installiert und es war ein Grausen einen Netzwerkdrucker zu installieren ..sonst ging das eins fix drei.. :)
Ich habe jetzt versucht Mittels Geany, Code:Blocks und Eclipse was in Sachen AVR zu Wege zu bringen... nur verplemperte Zeit.. Ich bin wohl möglich wirklich zu Blöd... :(
Na ja im Winter habe ich dann mehr Zeit... bis dahin ist ja noch Zeit schlauer zu werden...
Na ich wills nochmals über Wine versuchen AVR Studio zu installieren..aber da muss ich micht erst wieder in Wine einarbeiten..das hatte ich vor gut 10 Jahren wegen meinen 2..3 "Spielen" mal verwendet..

Gerhard

-schumi-
08.05.2014, 17:53
Nachtrag : Genau wie ich dachte, habe nun nach dem Beispiel (Wiki) Geany eingestellt..doch beim Kompilieren kommt immer Fehler

make all (im Verzeichnis: /home/gerhard/Projekte/Gtest1)
Kompilierung fehlgeschlagen.
make: *** Keine Regel, um »all« zu erstellen. Schluss.

Keine Bange, viel fehlt nicht mehr :) Welche Dateien liegen denn jetzt alles im Ordner "/home/gerhard/Projekte/Gtest1" ? Es müssten drin sein:

main.c
makefile

derNeue
08.05.2014, 18:35
Ja, das kenne ich. Ich habe auch diese 3 Programme probiert, aber irgendwie auch nicht ein Programm in meinen µC bekommen. Selbst kompilieren ging nicht. AVR Studio 4.19 hab ich mal mit Wine installiert, aber das ist irgendwie auch nicht Sinn der Sache, mit dem Atmel Studio hab ichs nicht probiert. Naja, ich weis auch noch nicht so richtig, ob ich jemals auf eine virtuelle Maschine mit Windows verzichten kann, man hat sich eben an diese Art schon sehr gewöhnt.


Dennis

oderlachs
08.05.2014, 19:10
Keine Bange, viel fehlt nicht mehr :) Welche Dateien liegen denn jetzt alles im Ordner "/home/gerhard/Projekte/Gtest1" ? Es müssten drin sein:

main.c
makefile



Ja Schumi , es fehlt wirklich nicht mehr viel bei mir ...auf dem Weg zur Irrenanstalt ;)

Heute habe ich es aufgegeben, der Rauchmelder hat schon gebiept bei meiner "rauchenden Rübe"... ;)

Es liegt ja am Makefile das weiss ich aber ich weiss doch viel was, wie so was erstellt wird...und genau das möchte ich vermeiden..da noch jedes mal ein MF zu erstellen, womit ich auch gar nicht klarkomme...
Ich habe krampfhaft tagelang versucht mit dem "Programmers Notepad " zu compilieren...vergebends..auch wenn ich da auch die Pfade gefunden habe...
Na dann muss ich eben wenn mal mehr Ruhe habe nochmal rumprobieren...denn nur mit Arduino IDE ist mir das nix...dann brauch ich nicht auf Linux umsatteln, so gerne ich es auch wolle...

Mir geht es jetzt auch noch gar nicht darum, schon einen µC zu flashen, wenn doch nur erst mal das Compilieren eines C-Programmes(AVR) gehen würde.....

Gruss und Danke

Gerhard

Wsk8
08.05.2014, 20:31
1. Installier Code::Blocks (m.M.n eine der besten IDEs) und WinAVR(natürlich die Linux version, kA wie die heißt).
2. Gib den WinAVR Pfad bei C::B ein.
3. Neues Projekt -> AVR Projekt -> Durch den Wizard klicken und alles benötigte einstellen.
4. Programm schreiben.
5. Programm flashen
6. ???
7. Profitieren!

mfg

RoboHolIC
08.05.2014, 21:09
Hallo oderlachs.

Ich bewundere ja insgeheim deinen Elan und deine Ausdauer! Bluthochdruck mit Linux abseits der Standardinstallation - das geht mir ähnlich.
Hier zwei unreife Gedankensplitter von mir ( "Just my two cents", wie andere hier zu sagen pflegen):

1) Kann man sich das Makefile eventuell als Projekt-Abfallprodukt einer anderen Programmierumgebung stibitzen? In seiner Struktur müsste das doch versteh- und anpassbar sein. Oder ist das genau das, was du vermeiden willst? Nur mal ganz einfach gedacht; die IDEs setzen gerade bei Linux doch ganz oft auf Standardtools auf. Das führt auch zu 2):

2) Ich hatte beim Überganz zu Linux mehr Glück mit dem MPLABX (die Microchip-IDE, ganz erstaunlich), sonst hätte ich viel schneller als du aufgegeben. Ich bin damals lediglich darüber gestolpert, dass ich "build-essential" nachinstallieren musste.

Gruß
RoboHolIC

oderlachs
08.05.2014, 21:12
Code::Blocks das habe ich alles aber irgendeine h. Datei ist unauffindbar und das Paket was ich lt. WebTutut installieren soll finde ich nicht


||=== Blink_2313, Debug ===|
/usr/include/gnu/stubs.h|7|fatal error: gnu/stubs-32.h: Datei oder Verzeichnis nicht gefunden|
||=== Build finished: 1 errors, 0 warnings ===|

-schumi-
08.05.2014, 21:25
1) Kann man sich das Makefile eventuell als Projekt-Abfallprodukt einer anderen Programmierumgebung stibitzen? In seiner Struktur müsste das doch versteh- und anpassbar sein.
Genau das wird in dem von mir oben geposteten Link gemacht. Dort wird ein Makefile von WinAVR verwendet, in dessen ersten paar Zeilen man alles einstellen kann. Vom Prinzip her ist das auch nicht sooo kompliziert finde ich, ein Projekt ist dann einfach nur ein Ordner mit der main.c und makefile (das man von einem vorherigem Projekt kopiert und die ersten paar Zeilen anpasst (Controller, Takt etc)). Aber die Hürde am Anfang ist natürlich größer als bei einer IDE.


Code::Blocks das habe ich alles aber irgendeine h. Datei ist unauffindbar und das Paket was ich lt. WebTutut installieren soll finde ich nicht
Arbeitest du auf einem 64Bit-System? Dann musst du explizit die 32-Bit Variante installieren:

sudo apt-get install libc6-dev-i386
Arbeitest du auf Ubuntu 12.04?

Wsk8
08.05.2014, 21:41
Habe es jetzt selbst probiert. C::B hatte ich bereits.



sudo apt-get install avr-libc binutils-avr gcc-avr avrdude


sudo apt-get install libc6-dev-i386

Dann ließ sich alles fehlerfrei kompilieren.

Xubuntu 14.04

mfg

oderlachs
09.05.2014, 07:39
Ich weiss, aber:

sudo apt-get install libc6-dev-i386

kann apt-get nicht finden...weshalb auch immer ....ich meine apt-get kann diese package nicht finden...muss ich vielleicht noch Quellen hinzufügen ??


Paket libc6-dev-i386 ist nicht verfügbar, wird aber von einem anderen Paket
referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
wurde oder nur aus einer anderen Quelle verfügbar ist.

E: Paket »libc6-dev-i386« hat keinen Installationskandidaten


Nachtrag : Habe mir soeben das Makefiele Template aus WinAvr in meine Linux AVR-Projekte kopiert.. Na ja bei F_CPU das ist kein Problem, aber bei MCU , woher weiss ich denn WIE genau sich den die µC hier nennen . ich glaube nicht, das ich da meine geläufigen benenungen nehmen kann...Gibt es da ne Infoliste ??

ich habe 12.04 XUbuntu 32Bit

-schumi-
09.05.2014, 12:31
E: Paket »libc6-dev-i386« hat keinen Installationskandidaten

ich habe 12.04 XUbuntu 32Bit
Wenn du ein 32-Bit-System hast sollte es mit
sudo apt-get install libc6-devgehen.



Nachtrag : Habe mir soeben das Makefiele Template aus WinAvr in meine Linux AVR-Projekte kopiert.. Na ja bei F_CPU das ist kein Problem, aber bei MCU , woher weiss ich denn WIE genau sich den die µC hier nennen . ich glaube nicht, das ich da meine geläufigen benenungen nehmen kann...Gibt es da ne Infoliste ??

Normalerweise einfach sowas wie "atmega32" oder "attiny2313". Eine etwas unübersichtliche, aber zumindest alphabetisch sortierte Liste kannst du so ausgeben lassen:

avr-gcc -mmcu=?

oderlachs
09.05.2014, 13:07
Hallo Schumi !

Danke Dir für die Hinweise... für die Hinweise, aber so langsam wird es mir Leid AVR unter Linux zu programmieren...;) Ich denek ich werde in die "Sommerpause" gehen und dann im Spätherbst-Winter weitermachen.
Es ist für mich wirklich "Irreführend" das ich gar nicht mehr weiss was ich alles an Paketen installiert habe. Diese libc6-dev habe ich schon installiert. Ich denke mal das da irgendwo ein grundlegender Fehler ist, aber da ich noch nicht mal weiss wie es funktioniert wenn alles richtig ist, kann ich auch nicht sagen was nun noch zu machen ist. Es würde mir auch leid werden hier alle Fehler im Forum zu posten..
das wäre zuviel verlangt auch für die, die mir gerne helfen möchten...
Ich bin zum Glück Rentner kannmich auch viel mit dem PC/Linux usw. befassen, aber einmal dreht es sich dann doch im Kopfe ...und summt wie im Bienenkorb... Ja gott sei dank hab ich den Humor noch nicht verloren dabei.
Ich versuche gerade Xubuntu 14.04 downzuladen...was ich bei meiner schaumgebremsten Onlineverbindung 10km vor Polen hier so als runterladen bezeichnen kann....
Vielleicht habe ich unter 14.04 mehr Glück.. na mal sehen.
Auf jedem falle kann ich normale C Programme kompilieren...nur eben AVR ist widerspenstig und das "mannhaft" ;)

Vielleicht liegt es auch an der Hardware meines PC , aber solange Win7 noch läuft, was ich ja für eben bestimmte Anwendungen brauche, ist es ja noch nicht sooo schlimm...
Wollen wir sehen was wird..ich kämpfe mal noch ein wenig weiter...

Gruss und Dank Gerhard

PS. Die MCU-Liste hab ich gefunden und ausgedruckt für mich(PDF und Papier) aber nicht wie Du vorgeschlagen hast:

gerhard@w340-ubuntu:~$ avr-gcc -mcu=?
avr-gcc: no input files



Nachtrag: Habe noch was gefunden als Anleitung : (http://www.heise.de/ct/projekte/machmit/ctbot/wiki/AVRToolchain)für Toolchains und Eclipse, ich denke das ich damit weiterkommen werde...aber kommende Woche oder später..ich muss mal pausieren !

markusj
09.05.2014, 17:39
Hallo Gerhard,

ich glaube du machst dir das ganze selbst (unnötig) schwer. Eigentlich ist der avr-gcc unter Linux/Ubuntu/Debian in Windeseile installiert:
apt-get install gcc-avr avr-libc make avrdude

Ich persönlich arbeite mit Eclipse, dazu wird die C/C++-"Geschmacksrichtung" (CDT) + die Erweiterung AVR-Eclipse benötigt. Damit läuft eigentlich alles automatisch ...

Nachtrag: Du bekommst die Liste der unterstützten AVRs (zusammen mit einem Haufen weiterer Informationen) mit
avr-gcc --target-help -mlist-devices

mfG
Markus

oderlachs
09.05.2014, 20:31
Danke Markus...
für heut ist mein Bedarf an Linux und AVR erst mal gedeckt... auf Ubuntu 14.04 geupdatet...nix alles runter und wieder xubuntu 12.04 drauf... und das bleibt erst mal so werde das nun langsam angehen...Bis 2017 werde ich zeit haben..solange soll Win7 gehen..nur hätt ich das in Linux doch schon gern früher kapiert und bewerkstelligt...

Gruss und Dank Gerhard

Nachtrag : Heute(13.05.14) habe ich es endlich geschafft, nach gut 8 Stunden probieren und Webrecherchen erst einmal unter Windows AVR mittels eclipse zu Programmieren, d.h. das Kompilieren ist mir erst mal gelungen..
Ja man muss schon fast ein Hellseher sein um zu wissen was man machen muss , bzw. was man falsch macht...oder denkt das es richtig ist...aber nur denkt.

In der nächsten Zeit werde ich das ganze mal auf Linux angehen, hoffe das dies dann auch klappt

Falte
26.08.2014, 15:42
Moin zusammen,

es ist ja jetzt ein paar Tage her seit dem letzten Post. Ich wollte mal Fragen ob das Problem AVR auf Linux zu programmieren gelöst wurde. Wenn ja kann mir einer ein How-To dafür geben wie ich das auch hin bekomme. Ich versuche mich seit ein paar Tagen durch Webrecherche das hinzubekommen und es klappt einfach nicht. Bin schon ein wenig am Verzweifeln...

Besten Gruß zusammen

schorsch_76
26.08.2014, 18:06
Ähm ... ich programmiere die AVRs immer unter Linux ....

Ich installiere avr-gcc, make, meinen Editor (vim oder geany) und zum schubsen des Programmes auf den AVR den avrdude.

Das wars ...



cat ../usbstepper/firmware/Makefile
CC=avr-g++
RM=rm -f
OBJCOPY=avr-objcopy
AVRDUDE=sudo avrdude -p m168 -c avrispmkii -P usb
AVRSIZE=avr-size

OBJDUMP=avr-objdump

MCU=atmega168p
F_CPU=16000000

CFLAGS=-g -DF_CPU=$(F_CPU) -Wall -Os --std=c++11 -mcall-prologues

OBJ = main.o rs232.o parser.o timer1.o io.o

BIN = usbstepper.bin
HEX = usbstepper.hex
MAP = usbstepper.map

.phony: all

all: $(OBJ)
$(RM) $(HEX) $(BIN) $(MAP)
$(CC) -mmcu=$(MCU) $(CFLAGS) -o $(BIN) -Wl,-Map,$(MAP) $(OBJ)
$(OBJCOPY) -R .eeprom -O ihex $(BIN) $(HEX)

%.o: %.cpp
$(CC) -mmcu=$(MCU) $(CFLAGS) -c $<

clean:
$(RM) $(OBJ) $(BIN) $(HEX) $(MAP)

flash: $(OBJ)
$(AVRDUDE) -e -U flash:w:$(HEX)

readfuse:
$(AVRDUDE) lfuse:r:-:i -v

writefuse:
$(AVRDUDE) -U lfuse:w:0xde:m -U hfuse:w:0xdf:m -U efuse:w:0x01:m

size: $(BIN)
$(AVRSIZE) -B $(BIN)

dump:
$(OBJDUMP) -d --demangle $(BIN)

markusj
26.08.2014, 19:08
Ich wollte mal Fragen ob das Problem AVR auf Linux zu programmieren gelöst wurde.
Es gab und gibt keine Probleme mit der AVR-Programmierung unter Linux. Und es gibt eigentlich gute Anleitungen, unter anderem bei den ubuntuusers. Die Einrichtung von avr-eclipse mag vielleicht nicht trivial sein, aber auch keine unüberwindbare Hürde. Und man braucht weder Eclipse noch avr-eclipse um AVRs unter Linux zu programmieren.

mfG
Markus

Falte
26.08.2014, 19:13
Vielen Dank für die schnelle Antwort erstmal. Aber...

Ich habe bis jetzt immer nur unter Windows mit AVR Studio programmiert. Da ich aber zu Hause auf Linux umgestiegen bin versuche ich mich jetzt im Moment daran das ganze unter Linux laufen zu lassen damit ich nicht immer mit VMs arbeiten muss. AVRDUDE und die Pakete habe ich auch schon alle installiert aber irgendwie fehlt mir noch der letzte Kniff und das Wissen es richtig zu machen... Zum Beispiel konnte ich unter AVRStudio ganz einfach eine externe Makefile nutzen die zum Beispiel wie folgt aussieht:



CONTIKI = /home/benutzerxy/contiki-2.7/

all: Micaz

PROJECT_SOURCEFILES += ordner1/datei1.c ordner2/datei2.c

include $(CONTIKI)/Makefile.include


Jetzt ist eine Frage wie muss ich das dann unter Linux machen. Du hast ja schon eben ein Code-Schnipsel gepostet. Kannst du mir den vielleicht noch erklären? Und wie bekomme ich mehrere Ordner mit in das Projekt, dass ich quasi wie bei der Makefile aus AVRStudio das machen kann. Kann mir da jemand helfen?
Besten Dank und beste Grüße,

Falte

oderlachs
26.08.2014, 21:04
Hallo Falte !

heute habe ich erst mal wieder einen "Schock" unter Linux hinter mir.. ;) Na ja ich bin komplett auf Ubuntu 14.04 umgestiegen...aber viel Insiderwissen fehlt noch...es macht sich langsam...Auch konnte ich meine Anleitungen die ich immer kopiert hatte nicht alle Retten.. CodeBlocks habe ich installiert...verzweifle am AVR Teil ebenso bei Eclipse...aber jetzt noch nicht probiert, da neuer Rechner dafür ins Hauskam..
Ich krame grad noch beim Thema Arduino umher, was ich auch nebenbei nutze.
Ich muss auch noch rausbekommen kann wie ich mein STK500 unter Linux nutzen kann..

Gruss
Gerhard

schorsch_76
26.08.2014, 22:26
Jetzt ist eine Frage wie muss ich das dann unter Linux machen. Du hast ja schon eben ein Code-Schnipsel gepostet. Kannst du mir den vielleicht noch erklären? Und wie bekomme ich mehrere Ordner mit in das Projekt, dass ich quasi wie bei der Makefile aus AVRStudio das machen kann. Kann mir da jemand helfen?
Besten Dank und beste Grüße,

Falte

Das ist nicht nur ein Codeschnipsel .. das ist das komplette Makefile für mein Projekt usbstepper.



Hier mal eine Erklärung:

----- Festlegung der Befehle. avrgcc und der flags
CC=avr-g++
RM=rm -f
OBJCOPY=avr-objcopy
AVRDUDE=sudo avrdude -p m168 -c avrispmkii -P usb
AVRSIZE=avr-size

OBJDUMP=avr-objdump

----- meine MCU
MCU=atmega168p
F_CPU=16000000

--- die CFlags stellen die Compileroptionen dar, hier setze ich eben die Defines für F_CPU und Compileroptionen
CFLAGS=-g -DF_CPU=$(F_CPU) -Wall -Os --std=c++11 -mcall-prologues

--- Hier werden die Objekte welche übersetzt werden müssen angegeben. *.o anstatt *.cpp. Wenn du eine Datei in einem Ordner hast einfach "lib/dasding.o". Ganze Biblitheken kann man natürlich auch einbinden. Siehe Makefile Tutoriol unter Google.
OBJ = main.o rs232.o parser.o timer1.o io.o

---- Hier lege ich die Zieldateien fest
BIN = usbstepper.bin
HEX = usbstepper.hex
MAP = usbstepper.map

--- Hier wird festgelegt dass bei nur "make" eben "make all" gemacht werden soll
.phony: all

-- Das hauptziel: Erstellen der firmware. all hängt von den OBJ (siehe oben) ab
--- Ich lösche die Zieldateien
--- Und Kompiliere das elf file das ich unter BIN angegeben habe
--- und erzeuge das hex file für den avrdude
all: $(OBJ)
$(RM) $(HEX) $(BIN) $(MAP)
$(CC) -mmcu=$(MCU) $(CFLAGS) -o $(BIN) -Wl,-Map,$(MAP) $(OBJ)
$(OBJCOPY) -R .eeprom -O ihex $(BIN) $(HEX)

--- diese Regel sagt, dass für alle *.o in OBJ eine passende *.cpp datei übersetzt werden soll
%.o: %.cpp
$(CC) -mmcu=$(MCU) $(CFLAGS) -c $<

--- clean = alles löschen ws der Kompiler erzeugt hat
clean:
$(RM) $(OBJ) $(BIN) $(HEX) $(MAP)

--- flash: hängt auch von den OBJ sachen ab und schubst anschliessend das Hex file auf den AVR
flash: $(OBJ)
$(AVRDUDE) -e -U flash:w:$(HEX)

--- hier kann ich ich die Fuses auslesen zur Kontrolle
readfuse:
$(AVRDUDE) lfuse:r:-:i -v

--- hier kann ich meine Fuses setzen. In diesem Fall lfuse= 0xde / hfuse = 0xdf / efuse = 0x01 für externen Quarz und > 8 MHz. Siehe fuse calculatur bei google
writefuse:
$(AVRDUDE) -U lfuse:w:0xde:m -U hfuse:w:0xdf:m -U efuse:w:0x01:m

--- hier kann ich die Größe auf dem Ziel ausgeben lassen.
size: $(BIN)
$(AVRSIZE) -B $(BIN)

--- hier kann ich das elf file dumpen lassen und sehen welche funktionen wieviel Speicher brauchen
dump:
$(OBJDUMP) -d --demangle $(BIN)




Das ganze nutzt man dann so:



georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ ls
Makefile atmega168p.h fifo.h io.cpp io.h main.cpp motion.h parser.cpp parser.h rs232.cpp rs232.h stepper.h timer1.cpp timer1.h units.h
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ make
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c main.cpp
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c rs232.cpp
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c parser.cpp
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c timer1.cpp
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c io.cpp
rm -f usbstepper.hex usbstepper.bin usbstepper.map
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -o usbstepper.bin -Wl,-Map,usbstepper.map main.o rs232.o parser.o timer1.o io.o
avr-objcopy -R .eeprom -O ihex usbstepper.bin usbstepper.hex
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ ls
Makefile fifo.h io.h main.cpp motion.h parser.h rs232.cpp rs232.o timer1.cpp timer1.o usbstepper.bin usbstepper.map
atmega168p.h io.cpp io.o main.o parser.cpp parser.o rs232.h stepper.h timer1.h units.h usbstepper.hex
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ make flash
sudo avrdude -p m168 -c avrispmkii -P usb -e -U flash:w:usbstepper.hex
Passwort:

avrdude: stk500v2_command(): command failed
avrdude: stk500v2_program_enable(): bad AVRISPmkII connection status: Unknown status 0x00
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.


avrdude done. Thank you.

make: *** [flash] Fehler 1
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ make size
avr-size -B usbstepper.bin
text data bss dec hex filename
7626 308 370 8304 2070 usbstepper.bin
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $


Hier habe ich nur am avrispmkii keinen atmega168 dran....

Wie ich die Dateien erstelle mit welchem Editor ist doch völlig egal.... Ein Makefile funktioniert immer, unabhängig davon welche "IDE" oder Editor ich einsetze.

Viel mehr als hier [1] beschrieben mache ich nicht ...

Wichtig bei makefiles ist, dass nur die Ziele wie "all" ganz vorne stehen bzw die Variablenzuweisungen weiter oben.



dump:
-->Tab zum einrücken" "$(OBJDDUMP)....


[1] http://www.ijon.de/comp/tutorials/makefile.html

Gruß
Georg

oderlachs
27.08.2014, 06:31
Hallo Georg !

Vielen Dank für diese sehr gute Einweisung..und Übung macht den "Meister"...

Gruss
Gerhard

schorsch_76
27.08.2014, 06:51
Jetzt wo ich das so geschrieben habe, stelle ich fest, daß das Makefile nicht optimal ist, aber es funktioniert und ist einfach. Es sollte noch ein Ziel namens hex geben ... Das ist aber ein kleiner Bug (oder feature? ;) ). Mit dem Ziel hex wäre bei einem "make flash" und geänderten Quelldateien automatisch die Kompilierung angeworfen.

@Falte: Makefile ist Makefile. Bei mir ist das ganze eben von dem Obj Files her aufgezogen und nicht von den C/C++ Files. Lässt sich aber durch die Regeln auch von den c/c++ Files her aufziehen.

Heute abend kann ich mal
a) mein hex target einbauen
b) das ganze über c/c++ files her aufziehen.

Die Entsprechung deiner PROJECT_SOURCES ist meine OBJ Variable. Vermutlich kannst du sogar das Makefile das du unter WinAVR genutzt hast auch unter Linux verwenden. WinAVR setzt auch auf die GNU Toolchain. Es muss auch CC usw. Variable geben. Die musst du halt anpassen. Kannst ja mal so ein Makefile hier posten (nicht nur Ausschnitte). Dann kann ich dir helfen.

Falte
27.08.2014, 07:17
Erstmal besten Dank Georg für dein Makefile und der Erklärung. Beim durcharbeiten deines Makefiles ist mir eine Frage aufgekommen. Und zwar frage ich mich welche Frequenz ich für die CPU einstellen muss. Also ich gehe davon aus, dass MCU der jeweilige Mikrocontroller ist und die F_CPU die entsprechende Frequenz richtig? Ich nutze ein Micaz-Modul mit einem ATmega128. Ein entsprechendes Datenblatt findet man hier (http://www.openautomation.net/uploadsproductos/micaz_datasheet.pdf). Im AVRStudio stelle ich keine explizite Frequenz ein. Kannst du mir da vielleicht auch nochmal helfen? Vielen Dank nochmal für deine Hilfe. Erste Hilfe die verständlich ist für mich.

Besten Gruß,

Falte

schorsch_76
27.08.2014, 07:32
Das define (-DF_CPU=16000000) stellt nichts ein. Es teilt dem Compiler und damit dem Programm die Taktfrequenz als ein define mit. Das define wird dann im Quelltext benutzt um bsp. Register für RS232 zu berechnen welche von der Taktrate der CPU abhängen. Die Takteinstellung geht klassisch über Quarz und die Fuses. Stimmt das define nicht, stimmen die Werte für meine RS232 Einstellung nicht und RS232 funktioniert dann nicht.

MCU = Micro Controller Unit = Mikroprozessor

EDIT:
Wenn du das define F_CPU nicht im Quelltext brauchst, ist es nicht nötig. Wenn deine Fuseflags passen, brauchst du hier nicht zu drehen.

Falte
27.08.2014, 07:43
Okay. Ich weiß noch nicht genau ob ich das verstanden habe. Wo bekomme ich denn raus, welche Frequenz ich da eingeben muss. Ist das die gleiche Frequenz wie die Baudrate, die ich zum Beispiel im GTKTerm einstelle wenn ich auf den USB-Port horche und mir die Ausgaben anschaue? Habe ein bischen Muffe davor die Boards kaputt zu machen, weil es nicht meine sind...

schorsch_76
27.08.2014, 07:49
Ich weis ja nicht was du exakt machen willst.

Das einzigste Problem bei den Atmegas ist, dass man sie "verfusen" kann ....

Wenn du ...
... an den Fuseflags nichts drehst
... das Ding einen ISP Anschluss hast
... du das "orginal" hex File hast (eventuell auch einen EEPROM Abzug)

Kannst du das Ding (zumindest die CPU) nicht zerstören. Was die IO's mit der anderen Hardware wie dem Funkmodul machen, kann ich dir nicht sagen.

Wenn du Angst hast das Ding zu zerstören, dreh nicht an den FUSES!

F_CPU = Taktfrequenz der CPU
Baudrate RS 232 ist etwas ganz anders. Das ist das was du bei gtkterm und Konsorten einstellst.

Falte
27.08.2014, 07:51
Also dann lieber nicht dein Makefile nehmen?

schorsch_76
27.08.2014, 07:57
Mein Makefile dreht nur bei einem "make writefuses" an den Fuses. Es wird nur durch diesen Befehl die Fuses angepasst. Falls du sichergehen willst, kannst du die Ziele readfuse/writefuse und die dazugehörigen Befehlszeilen löschen.

Falte
27.08.2014, 08:00
Alles klar besten Dank für deine Hilfe nochmal. Ich werde es mal probieren. Kannst du heute abend dann nochmal schauen ob du es vielleicht schaffst das ganze über die C/C++ Files aufzuziehen? Das habe ich noch nicht ganz verstanden was du damit meinst.

markusj
27.08.2014, 08:49
Falte: MicaZ läuft auf 7,3728 MHz (da ist ein Baudratenquarz im Einsatz, daher die krumme Zahl).

Und wenn du mit Contiki arbeitest, solltest du auch das Buildsystem von Contiki nutzen. Ich bin mir ziemlich sicher, dass es dort Beispiel-Projekte gibt, deren Makefiles du für deine eigene Arbeit abwandeln kannst.
Und früher oder später wirst du dich zwangsläufig mit dem Schreiben von Makefiles selbst beschäftigen müssen ...

mfG
Markus

Falte
27.08.2014, 10:58
Habe jetzt mal versucht ein Makefile aus den examples mittels make zu bauen. Das ist kein Problem. Schreibe ich dieses jetzt aber auf mein Projekt um, kommt folgende Fehlermeldung:

TARGET not defined, using target 'native'
make: *** Keine Regel vorhanden, um das Target »Micaz«,
benötigt von »all«, zu erstellen. Schluss.

Kann mir da jemand weiterhelfen?

markusj
27.08.2014, 12:48
Kann mir da jemand weiterhelfen?
Da wir hier keine Hellseher sind: Nein. Woher sollen wir wissen, wie du das Makefile umgeschrieben hast?

Davon abgesehen: Du brauchst keine Hilfe zur AVR-Programmierung unter Linux, du brauchst Hilfe zum Buildsystem von Contiki. Und das ist ein beachtlicher Unterschied.

mfG
Markus

schorsch_76
27.08.2014, 12:57
Poste doch mal das Makefile das du nutzt, und wichtiger, wie du versucht hast zu kompilieren und die Ausgabe des ganzen. Siehe mein obiger Auszug wie ich mein Makefile nutze.

Falte
27.08.2014, 13:23
Okay also das Original Makefile sieht folgendermaßen aus:

CONTIKI_PROJECT = hello-world
all: $(CONTIKI_PROJECT)
#UIP_CONF_IPV6=1
CONTIKI = ../..
include $(CONTIKI)/Makefile.include

Das rufe ich ganz normal über make auf im Terminal. Das klappt auch. Dieses habe ich mir jetzt folgendermaßen umgeschrieben:


CONTIKI_PROJECT = Micaz
all: $(CONTIKI_PROJECT)

CONTIKI = /home/falte/Dokumente/contiki-2.7/

PROJECT_SOURCEFILES += drivers/bolt_drv.c interface/bolt_int.c
PROJECT_SOURCEFILES += drivers/photosensor_drv.c interface/photosensor_int.c
PROJECT_SOURCEFILES += drivers/uart_drv.c
PROJECT_SOURCEFILES += drivers/extflash_drv.c service/extflash_service.c interface/extflash_int.c ../shared/interface/MemoryInterface/MemoryInterface.c
PROJECT_SOURCEFILES += drivers/proficonn_driver.c
PROJECT_SOURCEFILES += drivers/radio_drv.c ../shared/interface/CommunicationInterface/CommunicationInterface.c
PROJECT_SOURCEFILES += ../shared/agents/DummyAgent.c
PROJECT_SOURCEFILES += ../shared/agents/RoutingAgent/RoutingAgent.c
PROJECT_SOURCEFILES += ../shared/agents/PlatformAgent/PlatformAgent_Ramp.c
PROJECT_SOURCEFILES += ../shared/agents/OrderAgent/OrderAgent.c
PROJECT_SOURCEFILES += ../shared/agents/PackageAgent/PackageAgent.c
PROJECT_SOURCEFILES += ../shared/AgentRTE/AgentRTE.c

include $(CONTIKI)/Makefile.include

Das sind beides die kompletten Makefiles. Jetzt wollte ich im Terminal auch wieder mittels make das ganze zusammenbauen lassen aber dann kommt der Fehler wie oben angegeben. Ich weiß nicht wo ich Hilfe brauche. Ich verzweifele einfach nur an diesem Problem aber will auch nicht wieder zurück zu Windows, nur weil ich was nicht verstehe. Will es verstehen und mein neu geliebtes Linux nutzen.

schorsch_76
27.08.2014, 13:49
Er kann kein Target finden das Micaz heist. Ich sehe auch keines ... nur
CONTIKI_PROJECT = Micaz

Schau mal unter $(CONTIKI)/Makefile.include was es für Targets gibt. Eventuell musst du hier dein hello-world projekt noch anlegen. In dieses "Makefile.include" passiert hier das meiste oder in Unter Makefiles. Das weis ich nicht.

markusj
27.08.2014, 15:16
Zwei Gedanken:
1. Bitte einen Mod, die Diskussion in einen neuen Thread auszulagern. Das hat echt nichts mit dem Ursprungsthema zu tun.
2. Kann es sein, dass beim Beispielprojekt eine Datei hello-world.c vorhanden ist? Hast du in deinem Projekt eine Micaz.c? Ich gehe davon aus, dass Projektname == Haupt-Quelltextdatei gelten muss.

mfG
Markus

Falte
27.08.2014, 16:13
Also habe es jetzt soweit hinbekommen, dass ich schonmal ein compile machen kann. Das lag daran, dass ich im Makefile einen anderen Projektnamen stehen hatte als die .c-Datei hieß. Jetzt ist er im Moment nur am meckern, dass er eine curses-ctk.h nicht findet obwohl die genau da liegt wo die liegen soll. Aber da muss ich selber mal schauen. Eine andere Frage habe ich aber noch. Und zwar wenn ich das Projekt compiliert habe, wie bekomme ich das dann auf meinen Mikrocontroller? Das geht doch dann über AVRDude oder nicht? Hoffe das ist meine letzte Frage und ich bekomme es dann auch hin und kann anderen Leuten bei solchen Problemen helfen.

markusj
27.08.2014, 16:48
Das geht doch dann über AVRDude oder nicht? Hoffe das ist meine letzte Frage und ich bekomme es dann auch hin und kann anderen Leuten bei solchen Problemen helfen.

Bitte die Contiki-Dokumentation lesen. Ich gehe schwer davon aus, dass es dort etwas wie make install o.ä. gibt. Zumindest kenne ich das von TinyOS so. Aber ja, AVRDude ist das Werkzeug mit dem da gearbeitet wird.

mfG
Markus

schorsch_76
27.08.2014, 19:32
So sieht das neue Makefile jetzt aus:


################################################## ##########
# Projekteinstellungen
################################################## ##########

# MCU
MCU=atmega168p
F_CPU=16000000
LFUSE=0xde
HFUSE=0xdf
EFUSE=0x01

# Die Sources
SOURCES = OBJ = main.cpp rs232.cpp parser.cpp timer1.cpp io.cpp

# Die Zieldateien
ELF = usbstepper.elf
HEX = usbstepper.hex
MAP = usbstepper.map

################################################## ##########
# Compiler Flags. Muss vermutlich nicht angepasst werden
################################################## ##########
CFLAGS=-g -DF_CPU=$(F_CPU) -Wall -Os --std=c++11 -mcall-prologues

################################################## ##########
# Die Toolchain. Muss vermutlich nicht angepasst werden
# Die AVRDUDE Zeile muss an den Programmer und
# die Ziel CPU angepasst werden
################################################## ##########
AVRDUDE=sudo avrdude -p m168 -c avrispmkii -P usb

CC=avr-g++
RM=rm -f
OBJCOPY=avr-objcopy
AVRSIZE=avr-size
OBJDUMP=avr-objdump

################################################## ##########
# Ab hier muss nichts mehr angepasst werden
################################################## ##########
# OBJ = Sources mit ersetzter Dateiendung
OBJ=$(SOURCES:%.cpp=%.o)

all: hex

hex: elf
$(OBJCOPY) -R .eeprom -O ihex $(ELF) $(HEX)

elf: $(OBJ)
$(CC) -mmcu=$(MCU) $(CFLAGS) -o $(ELF) -Wl,-Map,$(MAP) $(OBJ)

%.o: %.cpp
$(CC) -mmcu=$(MCU) $(CFLAGS) -c $<

.phony: flash
flash: hex
$(AVRDUDE) -e -U flash:w:$(HEX)

# Ziele ohne Abhängigkeiten
clean:
$(RM) $(OBJ) $(ELF) $(HEX) $(MAP)

readfuse:
$(AVRDUDE) lfuse:r:-:i -v

writefuse:
$(AVRDUDE) -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m

size: $(ELF)
$(AVRSIZE) -B $(ELF)

dump:
$(OBJDUMP) -d --demangle $(ELF)



Das ist jetzt ein einfaches klar strukturiertes makefile das auch bei "make flash" und einer geänderten Datei in SOURCES das hex file neu baut. Ist immer noch fast das selbe. Der Schritt aus den Sources die OBJ Variable zu machen.

Gruß
Georg

Falte
27.08.2014, 21:10
Sehr cool vielen Dank Georg. Ich hoffe mit eurer Hilfe hier kriege ich es bald ans laufen. Im Moment habe ich Probleme mit MCUSR aber ich glaube das ist ein Problem bezüglich contiki...

- - - Aktualisiert - - -

So ich wollte mich nochmal bei allen bedanken die mir so tatkräftig geholfen haben. Hat alles soweit geklappt. Vielen Dank an alle.