Mikrocontroller mit C und avr-gcc programmieren



  • Hallo,

    ich habe mich ein wenig in die Welt der Mikrocontroller reingedacht. Ein Kollege von mir hat mir einen Atmel zusammengelötet und nun habe ich mir die avr-gcc Bibliothek heruntergeladen und versuche ein erstes Programm mit PonnyProg2000 auf meinen Atmel zu überspielen.

    Allerdings benötige ich noch ein wenig selbstverständnis, sowohl was die Programmierung in C, als auch das Schreiben der Makefiles angeht. Ich hoffe, dass sich hier einige finden, die mir Tips geben können. Ich habe mir auf der avr-gcc Seite das Tutorial mal angeschaut, allerdings finde ich den Part über die Makefile gänzlich schlecht.

    Ich halte auch nix von diesem Mfile generator, weil ich meine Makefiles selber schreiben will. Aus diesem Grund habe ich folgende Fragen:

    1.) Generell weiss ich, wie man ein Makefile aufbaut (habe damit in meiner Ausbildung zu tun). Allerdings wie ist hier der Weg der Programmerstellung? In einem normalen C Programm geht man ja den Weg über sogenannte Objectfiles (.o oder .obj) und evneutell auch statischen (.a oder .lib) und dynamischen (.so oder .dll) Bibliotheken, die dann zusammen zu einem Programm (meinstens .x oder .exe). Wie sieht das denn bei einem Mikrocontrollerprogramm aus?

    Folgende Dateitypen sind mir über den Weg gelaufen:

    => .hex
    => .out
    => .elf
    => .eep

    Kann mir vielleicht jemand dort weiterhelfen, das wäre zuerst mal das wichtigste?

    2.) Vielleicht kennt jemand eine Seite über die wichtigsten Flags. Mich würde auch interessieren, wie man eine statische Bibliothek erstellt, die die Anwendung dann linken kann, da ich vorhabe, einige Archivfunktionen zu erstellen, welche oft verwendet werden können (z.B. ausgabe übers Display u.ä.).

    Naja das wars erstmal ich hoffe auf zahlreiche antworten....

    Gruß Sebastian.



  • Hallo,

    ich will mich auch damit beschäftigen, finde aber leider keine Zeit dafür. 😞

    Aber guck evtl. auch mal hier:
    http://www.mikrocontroller.net/



  • @fluxy
    Normalerweise gibst du doch selber beim Compiler an, welchen Namen dein Objectfile haben soll und wenn du eine IDE verwendest, dann solltest du das dort irgendwo einstellen können.



  • Naja ich habe keine IDE.

    Ich habe einen Editor (Programmer's notepad 2), den avr-gcc kompiler und die make.exe, mehr nicht. Die Erstellungsschritte muss ich in einem Makefile selbst definieren.



  • Hast Du die vorkonfigurierte WinAVR geladen? Wenn nicht:
    http://sourceforge.net/projects/winavr/

    Lad' das Teil, da ist auch eine make mit dabei und jede Menge Demostoff.

    Was am PC die exe ist, ist beim Controller die .hex. In den mitgelieferten Simulator/Debugger geladen, kann man sie dort auf ihr Tun überwachen, was ansonsten beim Compilieren ausgespuckt wird, sind die ganzen Zwischenschritte samt Debug- Info.

    Das Erstellen von Libraries läuft analog den anderen gcc- Compilern, aber es kommt eh' schon viel mit dem Paket ins Haus.

    Dann heißt es READMEs und Doku wälzen, ohne geht's nicht und hier reicht der Platz nicht.

    RTFM! 😉



  • hmmm wo ich das herhabe weiss ich nicht mehr.... ich habe mir das vor ein paar monaten mal gedownloaded und hatte es noch auf platte.... es ist aber auf jedenfall die winavr... Ich weiss also nicht ob ich das da habe.

    Ich habe mir schon gedacht das der RTFM-Spruch kommt. Allerdings denke ich das es nicht so schwierig ist meine Fragen zu beantworten:

    1.) Ich baue im Allgemeinen Makefiles so auf, dass das Objektfile automatisch erstellt wird. Soweit ich weiss nutzt make in diesem Fall den vordefinierten Kompiler gcc der nur "cc" heisst. Der wird natürlich auf meinem System nicht gefunden. Also der erste Schritt ist natürlich, aus meinen Sourcen jeweils ein Objectfile zu erzeugen, welches weiter verwendet werden kann.

    Frage: Ist es schlecht, das Objectfile mit gcc zu erzeugen und dann erst mit avr-gcc zu arbeiten? In wie weit unterscheidet sich der avr-gcc denn vom gcc? Was ich meine ist das folgende.... In dem Beispiel will ich aus ner Sourcedatei beispiel.c und beispiel.h erstmal mein .o erstellen, das geht normalerweise automatisch:

    OBJFILES=beispiel.o    #Hier können weitere .o stehen 
    OUTFILE=beispiel.out
    FLAGS= -g -Wall -mcu=atmega.... 
    
    # Ich habe gehört, dass aus dem .o dann ein .out file erzeugt wird. Ist das richtig???
    $(OUTFILE):(OBJFILES)
    \tavr-gcc $(FLAGS) $(OBJFILES) -o $(OUTFILE)
    
    # Naja ich weiss nicht wie es zu den anderen Buildschritten geht bis hin zur hex!
    
    # Hier stehen nur die Abhängigkeiten
    beispiel.o: beispiel.c beispiel.h
    
    # Weitere .o hier angeben mit Abhängigkeiten
    

    Die zweite Frage ist eigentlich schon Formuliert.... Wenn ich die .o habe was kommt dann? Wirklich eine .out ? Und was dann? Vielleicht kann jemand mal die Buildreihenfolge hier aufzeichnen, sollte kein Problem sein wenn man ein lauffähiges Makefile hat, welches die Ausgaben erzeugt....



  • Hi,
    auch ich möchte mich mit dem Thema mal genauer beschäftigen, aber die liebe Zeit ... :+)

    Hier noch ein interessanter Link zum Thema AVR Microcontroller:

    http://www.linuxfocus.org/Deutsch/November2004/article352.shtml

    Gruss,
    Thomas.



  • Ja. Ja. Keine Zeit und dann immer hier im Forum rumsurfen. ;-))



  • Hallo,
    Man darf Objectfiles, die der avr-gcc erstellt hat, nicht mit vom gcc erstellten mischen, und auch nicht avr-gcc auf Objectfiles anwenden, die mit gcc erstellt wurden, oder umgekehrt. Das sind nämlich zwei verschiedene Plattformen, für die kompiliert wird; beim gcc: i386 (PC), beim avr-gcc: avr (Atmel AVR-Microcontroller). Hoffentlich ist diese Information hilfreich (für avr-gcc -Benutzer 😉 ).

    Mit freundlichen Grüßen

    gcc-Kenner



  • Hey fluxy,

    was hast du denn für nen Board? Hast du dir selber eins gezimmert oder sowas wie das STK 500 gekauft?



  • hmmmm....

    ich kriege das Makefile einfach nicht vernünftig hin. Ich kann jetzt zwar das .o file erstellen aber das wars auch. Beim .elf bricht er schon ab:

    Ausgabe:

    vr-gcc -g -Os -Wall -Wstrict-prototypes -Wa,-ahlms=main.lst main.c -o main.o
    main.c:7:2: warning: no newline at end of file
    avr-gcc -W1,-Map=main.map,--cref -mmcu=at90s8535 main.o -o main.elf
    main.o(.text+0x50): In function \_\_vector\_10': : multiple definition of__bad_interrupt'
    C:/WinAVR/bin/../lib/gcc/avr/3.4.1/../../../../avr/lib/crts8535.o(.text+0x0): first defined here
    main.o(.text+0x0): In function \_\_vector\_default': : multiple definition of__vectors'
    C:/WinAVR/bin/../lib/gcc/avr/3.4.1/../../../../avr/lib/crts8535.o(.vectors+0x0): first defined here
    make.exe: *** [main.elf] Error 1

    ich weiss nicht was ich da machen soll. Wo kommen denn diese Vektordefinitionen her?



  • Hast du dir die Seite mal angeguckt?

    http://www.mikrocontroller.net/avr-gcc-installation.htm

    Oder mal hier
    www.avrfreaks.net





  • fluxy schrieb:

    hmmmm....
    ich kriege das Makefile einfach nicht vernünftig hin. Ich kann jetzt zwar das .o file erstellen aber das wars auch. Beim .elf bricht er schon ab:

    Fluxy, ich kann Dir versichern, daß ich vom Makefile- Schreiben fast keine Ahnung habe und das wohl auch daran liegt, daß ich's nie gebraucht habe. Beim aktuellen WinAVR ist ein Makefile dabei, das wirklich funzt. CPU- Typ eintragen und fertig ist der Hüttenzauber!
    Nimm das doch wenigstens als Vorlage, alles andere wäre übertriebener sportlicher Ehrgeiz 😉

    Und da mit RTFM habe ich nicht böse gemeint, es ist dort wirklich viel Zeug dabei, was Dir hilft, Dein erstes Projekt zu compilieren. 😃


Anmelden zum Antworten