Einrichten der AVR-C-Programmierung unter Ubuntu-Linux ?· Ubuntu-Linux 12.04 Ein Erfahrungsbericht…

  • Published on
    05-Jun-2018

  • View
    213

  • Download
    0

Embed Size (px)

Transcript

<ul><li><p>Dieter Holzhuser http://www.system-maker.de</p><p>E-Mail: diehol@system-maker.de</p><p>30.05.2011</p><p>berarbeitung 27.02.2013</p><p>berarbeitung 10.03.2013</p><p> Einrichten der AVR-C-Programmierung unter Ubuntu-Linux 12.04</p><p>Ein Erfahrungsbericht</p><p>VorbemerkungDer Auslser fr die vorliegende berarbeitung war ein Problem bei den fertigen deb-Paketen, die ich bisher fr die Installation von avr-gcc und avrdude benutzt habe. Bei Atmel habe ich einen um Lngen besseren Ersatz gefunden, und zwar eine Toolchain mit hervorragender Dokumentation, die sich durch einfaches Entpacken installieren lies. Das Paket avrdude wird unabhngig davon aus dem Ubuntu Software-Center installiert.</p><p>Ich werde zuknftig Programme nur noch mit Code::Blocks entwickeln. Daher ist der Editor gedit als Mini-Entwicklungsumgebung in diesem Artikel kein Thema mehr. </p><p>Es gibt also Grnde genug fr eine berarbeitung.</p><p>Worum es gehtIch schreibe C-Programme, und zwar hauptschlich fr den Mikrocontroller ATmega32 aus der AVR-Familie von Atmel. Die ganze Entwicklung findet auf dem PC statt. Weil der C-Code in den Maschinencode des Mikrocontrollers bersetzt (cross-compiliert) wird, muss das Programm in den Speicher des Mikrocontrollers bertragen werden, denn nur dort kann es laufen. Zwecks bertragung sind PC und Mikrocontroller durch einen Programmieradapter verbunden. </p><p>Ich verwende den AVR ISP mk II von Atmel (siehe Bild oben), der bei Reichelt ( www.reichelt.de ) fr etwa 40 zu haben ist. Er ist an eine USB-Schnittstelle des PC und an das SPI (Serial Interface) des Mikrocontrollers angeschlossen.</p><p>1</p><p>http://www.system-maker.de/http://www.reichelt.de/</p></li><li><p>Man sollte den Betrag investieren und sich nicht mit Bastellsungen herumschlagen, die meistens fr die parallele oder serielle Schnittstelle gemacht sind. Solche Schnittstellen hat ein moderner PC ohnehin nicht mehr. </p><p>Der Artikel handelt von meinen Erfahrungen bei der Einrichtung der integrierten Entwicklungsumgebung (IDE) Code::Blocks fr die Entwicklung von C-Programmen und die Programmierung von AVR-Mikrocontrollern. Unter Letzterem ist das Schreiben von Maschinencode in den Flash-Speicher des Mikrocontrollers zu verstehen. </p><p>Bentigte ProgrammeIm Mittelpunkt stehen der C Cross Compiler avr-gcc mit seinen Bibliotheken und der Programmer avrdude. </p><p>avr-gcc liefert als Endprodukt eine Datei *.hex, whrend avrdude mit dieser Datei den Mikrocontroller programmiert. </p><p>Es ist allerdings nicht einfach, den avr-gcc und auch avrdude so aufzurufen, dass die Programme genau das tun, was sie sollen. Das liegt an den unglaublich vielen Aufrufoptionen, was eine Eigenart aller Compiler ist, nicht nur von avr-gcc. Es wrde viel zu viel Arbeit machen, diese Parameter immer richtig im Terminal einzugeben. Deshalb bringt Linux das Programm make mit, das komplizierte Aufrufe erledigt, indem es die Datei makefile auswertet, die der Anwender nach bestimmten Regeln zu schreiben hat. Damit muss man sich aber nicht abgeben, wenn man Code::Blocks eingerichtet hat. </p><p>Code::Blocks ist eine Cross-Compile-Plattform, die mit einer Reihe von Cross-Compilern zusammenarbeiten kann. Der avr-gcc ist einer davon. Auch Tools knnen generiert werden. </p><p>Installation und Konfiguration der Programme</p><p>avr-gccEs handelt sich nicht um ein Programm, sondern um mehrere und eine ganze Reihe von Dateien. Alles zusammen wird auch als Toolchain bezeichnet. Es gibt viele Mglichkeiten die AVR-Toolchain zu installieren. Manche Pakete installieren den Compiler und den Programmer avrdude in einem Vorgang. Keine der Mglichkeiten, die ich probiert habe, war vllig problemlos, bis auf die Toolchain, die Atmel zum Download anbietet, und zwar unterhttp://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx</p><p>Weil der ATmega32 ein 8-Bit Mikrocontroller ist, habe ich Atmel AVR 8-bit Toolchain 3.4.1 - Linux 32-bit heruntergeladen. Das geht aber nicht ohne Registrierung. Man gibt Name und E-Mail-Adresse an und erhlt eine E-Mail mit dem eigentlichen Link fr den Download.</p><p>Die Installationsanleitung (pdf) kann man sich ohne Registrierung ansehen.</p><p>Was dann folgt, kann man kaum Installation nennen. Die heruntergeladene Datei wird in das gewhlte Installationsverzeichnis verschoben (bei mir /usr/local/bin ) und dort entpackt. Das war's schon fast. Die ganze Toolchain befindet sich nun im Verzeichnis avr8-gnu-toolchain-3.4.1.798-linux.any.x86 Weil mir der Name zu lang war, habe das Verzeichnis in avrtoolchain umbenannt.</p><p>Die Orte von avr-gcc, von der Dokumentation und von den Header-Dateien, die beim Programmieren ggf. zu includieren sind, sollte man kennen:</p><p>In /usr/local/bin/avrtoolchain/bin befindet sich avr-gcc Man muss den Pfad nicht zum Suchpfad in der Umgebungsvariablen PATH machen, wie es die Installationsanleitung fordert, wenn man ihn in Code::Blocks setzt (s.u.) </p><p>In /usr/local/bin/avrtoolchain/avr/include und in drei Verzeichnissen darunter stehen die Header-Dateien, die in Programmen relativ zu diesem Pfad eingebunden werden, z.B. #include oder #include . </p><p>2</p><p>http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx</p></li><li><p>Die Dokumentation ist in /usr/local/bin/avrtoolchain/doc/avr-libc/avr-libc-user-manual/index.html zu finden. Eine pdf-Datei des Manuals gibt es auch. Die Doku drfte keine Wnsche offen lassen.</p><p>avrdudeDen Programmer avrdude gibt es als Paket im Ubuntu Software-Center. Die Installation ist ohne Besonderheiten. Aufgerufen wird das Programm mit /usr/bin/avrdude und einer ganzen Reihe von Optionen. Die vollstndige Zusammenstellung ist im Manual enthalten, das mit man avrdude im Terminal erscheint.</p><p>Die Aufrufe von avrdude, die ich brauche, habe ich in Code::Blocks als Tool konfiguriert (siehe Code::Blocks Tools). </p><p>Eine ziemlich unangenehme Besonderheit hat avrdude aber doch. Nur root kann die USB-Schnittstelle ffnen. Es kostet einigen Aufwand, unter dieser Restriktion mit dem Programmer zu arbeiten, denn die ganze Programmentwicklung als root zu machen kommt nicht in frage. Erst vor kurzem habe ich herausgefunden, wie das zu ndern ist.</p><p>Der Editor gedit wird aufgerufen mit : gksudogedit/etc/udev/rules.d/80usbprog.rules</p><p>In die Datei 80-usbprog.rules wird der folgende Text geschrieben, und zwar in einer Zeile:ATTR{idVendor}==03eb,ATTR{idProduct}==2104,GROUP=plugdev,MODE=0660#AVRISPmkII</p><p>Dieser Text ist im wesentlichen eine Regel, die angibt, welche Gruppe von Usern mit dem AVRISP mkII arbeiten kann, wenn er in eine USB-Schnittstelle eingesteckt wird. Ob der jeweilige User Mitglied der Gruppe plugdev ist, lsst sich mit groups berprfen. Damit die Regel wirksam wird, muss udev mit sudo /etc/init.d/udev restart neu gestartet werden. Zur Sicherheit sollte man danach den USB-Stecker ziehen und wieder einstecken.</p><p>Hat man einen anderen Programmer als den AVRISP mkII, kann man mit lsusb dessen Identcodes feststellen, aber auch die aller anderen eingesteckten USB-Gerte. </p><p>Wahrscheinlich wegen einer Software-Aktualisierung nach der beschriebenen nderung konnte bei mir pltzlich wieder nur root mit avrdude arbeiten. Nur eine ganz radikale Lsung hat geholfen: Ich habe meine Festplatte in zwei Partionen aufgeteilt und ein zweites Ubuntu-Linux (12.04 LTS) installiert. Dort habe ich dann avr-gcc, avrdude und Code::Blocks so eingerichtet, wie es hier beschrieben ist. Dennoch, fr den Fall, dass das Problem wieder auftreten sollte, habe ich mir eine Lsung berlegt (siehe: Code::Blocks Tools / Das root / non-root Problem).</p><p>Weil eine Distributionsaktualisierung bei mir noch nie vllig problemlos war, werde ich in Zukunft nur noch LTS (Long Time Support)-Updates machen, und zwar als Neuinstallation in eigener Partition. Nach und nach werde ich dann mit meinen Daten dahin umziehen, wodurch die alte Partition fr die nchste Installation zur Verfgung steht. </p><p>Code::Blocks IDEDas Paket dieser integrierten Entwicklungsumgebung ist im Ubuntu-Software-Center zu finden. Nach dem ersten Start muss man sich um die Settings kmmern.</p><p>Unter Settings/Compiler and debugger/Selected compiler erscheint der GNU CC Compiler als voreingestellt. Das ist der Compiler fr C-Programme, den jedes Linux mitbringt. Die von diesem Compiler bersetzten Programme laufen auf dem PC.</p><p>Durch einen Klick auf das Feld rechts erscheint die Auswahlliste der anderen Compiler, mit denen Code::Blocks arbeiten kann, und da ist dann auch der GNU AVR CC Compiler dabei. Den habe ich ausgewhlt und zum default Compiler erklrt. Installiert ist er bereits. Die Registerkarten im Fenster beziehen sich auf den jeweils ausgewhlten Compiler.</p><p>3</p></li><li><p>Compiler settings </p><p>Hier wird der verwendete Mikrocontroller markiert.</p><p>Linker settings</p><p>Damit die Funktionen printf() und scanf() aus der Standardbibliothek stdio.h float-Typen aus- bzw. eingeben knnen, mssen bei den Linker settings (am besten per copy and paste) die folgenden Options eingetragen werden :Wl,u,vfprintflprintf_fltWl,u,vfscanflscanf_fltlm</p><p>Man verwendet die Options nur, wenn man sie unbedingt braucht, denn ihr Ressourcenverbrauch ist hoch. Um die Options unwirksam zu machen, kenne ich bisher nur die Methode, sie aus dem Fenster zu entfernen. </p><p>Search directories</p><p>Hier wird der Suchpfad zu avr-gcc eingetragen, wodurch es berflssig wird, ihn in die PATH-Umgebungsvariable aufzunehmen.</p><p>4</p></li><li><p>Toolchain executables</p><p>An dieser Stelle ist das Installationsverzeichnis des Compilers einzutragen, wobei vorausgesetzt wird, dass sich die auszufhrenden Programme in dessen Unterverzeichnis bin befinden, was bei der AVR-Toolchain der Fall ist.</p><p>Code::Blocks ToolsDie Tools, die ich konfiguriert habe, sind ausschlielich Aufrufe von /usr/bin/avrdude . Die notwendigen Parameter sind bei den folgenden Beschreibungen der Tools zu finden.</p><p>avrdude verlangt bei seinen Parametern die Seriennummer des Programmieradapters, die nach usb: steht und jeweils anzupassen ist. Das gilt zumindest dann, wenn der Adapter AVR ISP mkII verwendet wird. </p><p>Auer pg und writefuseshex verwendet jeder Aufruf die Datei temp. Bei den Aufrufen read..... wird sie berschrieben, wenn sie im aktuellen Verzeichnis existiert, andernfalls wird sie angelegt. Der Zusatz :i bedeutet Hex-Format. </p><p>pg (program)patmega32Pusb:0200040133cavrisp2Uflash:w:${TARGET_OUTPUT_FILE}.hex</p><p>Dieses Tool wird am hufigsten verwendet. Es schreibt den Maschinencode des Programms, der nach einer erfolgreichen Compilierung in der Datei bin/Release/.elf.hex enthalten ist, in den Flash-Speicher des Mikrocontrollers. Da der Name der Hex-Datei von Projekt zu Projekt wechselt, ist ein Makro verwendet worden, der auch fr den Pfad steht.</p><p>5</p></li><li><p>Die folgenden Tools werden im gleichen Fenster editiert. Makros kommen nicht vor. </p><p>readflashpatmega32Pusb:0200040133cavrisp2Uflash:r:temp:i</p><p>Der Flash-Speicher des Mikrocontrollers wird in die Datei temp ausgelesen. </p><p>writeflashpatmega32Pusb:0200040133cavrisp2Uflash:w:temp:i</p><p>Dieses Tool macht das gleiche wie pg. Nur ist die Datei, die verwendet wird, wiederum temp. Dadurch wird es zum Gegenstck von readflash. Das heit, die mit readflash ausgelesenen Daten knnen mit writeflash zurck geschrieben werden. Das braucht man zum Beispiel, um Kopien von Mikrocontrollern herzustellen, ohne auf den Quelltext zurckzugreifen.</p><p>readeeprompatmega32Pusb:0200040133cavrisp2Ueeprom:r:temp:i</p><p>Wirkt wie readflash, nur dass der EEPROM-Speicher gelesen wird.</p><p>writeeeprompatmega32Pusb:0200040133cavrisp2Ueeprom:w:temp:i</p><p>Das Tool schreibt die mit readflash gelesenen Daten zurck. Auch dieser Vorgang gehrt zum Herstellen von Kopien.</p><p>6</p></li><li><p>readhfuse und readlfusepatmega32Pusb:0200040133cavrisp2Uhfuse:r:temp:b</p><p>patmega32Pusb:0200040133cavrisp2Ulfuse:r:temp:b</p><p>Diese beiden Tools lesen das High-Fuse-Byte bzw. das Low-Fuse-Byte des Mikrocontrollers ATmega32 jeweils in die Datei temp. Die Fuse-Bytes enthalten die Fuse-Bits, die fr grundlegende Funktionen stehen.</p><p>High-Fuse-Byte ATmega32</p><p>Hex OCDEN JTAGEN CKOPT EESAVE BOOTSZ1 BOOTSZ0 BOOTRST</p><p>fabrikneu 0x99 1 0 0 1 1 0 0 1</p><p>Praxis 0xC1 1 1 0 0 0 0 0 1</p><p>Low-Fuse-Byte ATmega32</p><p>Hex BODLEVEL BODEN SU1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0</p><p>fabrikneu 0xE1 1 1 1 0 0 0 0 1</p><p>Praxis 0xFF 1 1 1 1 1 1 1 1</p><p>Ganz wichtig: Eine Null bedeutet, dass die mit dem Bit verbundene Funktion (siehe Datenblatt), aktiviert ist. Das Bit wird auch als programmiert bezeichnet. Die Eins bedeutet: Funktion ist deaktiviert. Das ist entgegen der Gewohnheit und hat wohl damit zu tun, dass Bits im gelschten Flash-Speicher im Zustand 1 sind.</p><p>Die Datei temp enthlt beispielsweise nach dem Aufruf von readhfuse beim fabrikneuen ATmega32 die folgenden Zeichen, die denen in der vorstehenden Tabelle entsprechen:0b10011001</p><p>Der Zusatz :b bedeutet Binr-Format, was fr Kontrollzwecke am zweckmigsten ist. Dennoch ist die Kopie eines MC erst dann vollstndig, wenn auch die Fuse-Bytes kopiert wurden.</p><p>writefuseshexpatmega32Pusb:0200040133cavrisp2uUhfuse:w:0xC1:mUlfuse:w:0xFF:m</p><p>Der Aufruf schreibt die Fuse-Bytes, diesmal allerdings nicht aus einer Datei. Die Hex-Bytes sind Parameter, hier C1 und FF. Diese beiden Werte habe ich bisher immer verwendet (siehe auch die Zeile Praxis in der obigen Tabelle).</p><p>Im High-Byte deaktiviere ich das JTAG-Interface und schtze den EEPROM gegen Lschen. Im Low-Byte stelle ich die Taktquelle ein, die bei mir ein externer 16 MHz-Quarz ist. </p><p>Fehler sollte man keine machen, insbesondere muss man die eingestellte Taktquelle auch verwenden, sonst luft nichts, auch nicht das Lesen und Schreiben der Fuse-Bytes. Dumm, wenn man nicht mehr wei, welche Taktquelle im Fuse-Byte eingetragen ist. Ich kann mir vorstellen, dass mit Ausprobieren aller Taktquellen, die in frage kommen knnten, das Problem zu lsen ist.</p><p>Dieses Tool irrtmlich anzuklicken, wre also fatal. Weil das sehr leicht passieren kann, habe ich einen Fehler in den Aufruf eingebaut ( /usr/bin/avrdu ), der zuerst korrigiert werden muss. Dieser Ersatz fr eine Besttigungsabfrage strt nicht weiter, da das Tool sehr selten gebraucht wird. </p><p>7</p></li><li><p>Das root / non-root-ProblemSollte der Fall eintreten, dass pltzlich nur noch root mit avrdude arbeiten kann (siehe avrdude oben), sind die Tools nicht mehr brauchbar. Mit der folgenden Notlsung kann die Arbeit jedoch fortgesetzt werden:</p><p>Terminal ffnen und mit sudo -s -h root werden. Dann wird der Aufruf /usr/bin/avrdude in die Kommandozeile geschrieben. Die Parameter des jeweils auszufhrenden Tools bertrgt man am besten mit copy and paste. Beim Tool pg ist der Makro durch den Pfad/Namen der Hex-Datei zu ersetzen, z.B. bin/Release/demo.elf.hex</p><p>Das Terminal bleibt geffnet. Mit der Auf- und Ab-Taste kann man durch die zurckliegenden Aufrufe scrollen, auch wenn der Rechner zwischenzeitlich ausgeschaltet wurde. Wiederholte Aufrufe mssen also nur gesucht und nicht von Hand eingegeben werden.</p><p>Arbeiten mit Code::BlocksMan erffnet ein neues Projekt, indem man ein Muster dafr auswhlt, z.B. das AVR Projekt. Der Projektname, der vergeben werden muss, wird fr die Projektdatei *.cbp , aber auch fr das Projektverzeichnis verwendet, das gleichzeitig Arbeitsverzeichnis ist. Es enthlt nach der Projekterzeugung ein leeres Hauptprogramm main.c</p><p>Eigene Quellcode-Dateien werden in das Arbeitsverzeichnis kopiert oder im Editor geffnet u...</p></li></ul>