- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 45

Thema: AVR Programmieren unter LINUX

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    Zitat Zitat von Falte Beitrag anzeigen
    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:

    Code:
    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.

    Code:
    dump:
    -->Tab zum einrücken"        "$(OBJDDUMP)....
    [1] http://www.ijon.de/comp/tutorials/makefile.html

    Gruß
    Georg

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo Georg !

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

    Gruss
    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    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.
    Geändert von schorsch_76 (27.08.2014 um 07:03 Uhr) Grund: Erweiterung der Antwort für Falte

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2014
    Beiträge
    10
    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. 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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    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.
    Geändert von schorsch_76 (27.08.2014 um 07:42 Uhr)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2014
    Beiträge
    10
    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...

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    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.

Ähnliche Themen

  1. [AVR-gcc] Installation unter Linux
    Von Bääääär im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 13.05.2008, 10:16
  2. avr-gcc unter linux
    Von donni im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 06.04.2006, 21:57
  3. AVR unter Linux programmieren?
    Von jagdfalke im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 12
    Letzter Beitrag: 20.03.2006, 20:48
  4. Bascom-AVR unter Linux?
    Von raptor_79 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 17.01.2006, 11:17
  5. gcc-avr unter Linux
    Von bluebrother im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 03.01.2005, 21:54

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress