<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.51"> <META NAME="LFCATEGORY" CONTENT="Hardware"> <link rel="icon" href="../../common/images/lf-16.png" type="image/png"> <TITLE>lf231, Hardware: Den AVR Microcontroller mit GCC programmieren</TITLE> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-family:monospace,Courier } pre.code { font-family:monospace,Courier;background-color:#aedbe8; } p.cl { color:#EE9500 } table.left { margin-right:0.3cm } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } div.tbbutton { background: #ddd; border-right: 1px solid #aaa; border-bottom: 1px solid #aaa; margin: 2px 5px 2px 5px; text-align: center; width: 20em; line-height: 1.2em; padding: 2px; font-size: 12px; white-space: nowrap; color: #555; } div.bbutton { background: #ddd; border-right: 1px solid #aaa; border-bottom: 1px solid #aaa; float: left; margin: 2px 5px 2px 5px; text-align: center; line-height: 1.2em; padding: 2px; font-size: 12px; white-space: nowrap; color: #555; } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://main.linuxfocus.org/~guido/dev/lfparser.html --> <!-- this is used by a number of tools: =LF=AUTHOR: Guido Socher =LF=CAT___: Hardware =LF=TITLE_: Den AVR Microcontroller mit GCC programmieren =LF=NUMBER: 231 =LF=ANAME_: article231.shtml =LF=PARSER: 2.51 --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar, current, style=2 --> <!-- top navegation bar --> <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#2e2292"> <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width= "100%"> <TR><TD width="319"><a href="../../index.shtml"><IMG src="../../common/images/logolftop_319x45.gif" alt="[LinuxFocus-icon]" width="319" height="45" align="left" border="0"></a></TD> <TD class="top"> <TABLE summary="topbar_1_links" width="100%"> <TR align="right"> <TD class="top"> <A class="nodec" href="../../index.shtml"><FONT color= "#DDDDDD" size="2"><--</FONT></A> | <A class="nodec" href="../index.shtml"><FONT color= "#DDDDDD" size="2">Home</FONT></A> | <A class="nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Plan</FONT></A> | <A class="nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Index</FONT></A> | <A class="nodec" href="../Search/index.html"><FONT color= "#DDDDDD" size="2">Suchen</FONT></A> </TD> </TR> <TR align="right"> <TD class="top"> <HR width="100%" noshade size="1"> </TD> </TR> </TABLE> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end top navegation bar --> <!-- blue bar --> <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#00ffff"> <TD><IMG src="../../common/images/transpix.gif" width="1" height= "2" alt=""></TD> </TR> </TABLE> <!-- end blue bar --> <!-- bottom navegation bar --> <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center" width="94%"> <TR bgcolor="#000000"> <TD> <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width= "100%"> <TR align="center"> <TD WIDTH="20%"><A class="nodec" href="../News/index.shtml"><FONT color= "#FFFFFF">Nachrichten</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Archiv</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.shtml"><FONT color= "#FFFFFF">Links</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Über uns</FONT></A> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end bottom navegation bar --> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.5 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Dieses Dokument ist verfübar auf: <A href="../../English/March2002/article231.shtml">English</a> <A href="../../Castellano/March2002/article231.shtml">Castellano</a> <A href="../../ChineseGB/March2002/article231.shtml">ChineseGB</a> <A href="../../Deutsch/March2002/article231.shtml">Deutsch</a> <A href="../../Francais/March2002/article231.shtml">Francais</a> <A href="../../Italiano/March2002/article231.shtml">Italiano</a> <A href="../../Nederlands/March2002/article231.shtml">Nederlands</a> <A href="../../Russian/March2002/article231.shtml">Russian</a> <A href="../../Turkce/March2002/article231.shtml">Turkce</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT_BIO_ABOUT_THE_AUTHOR_AND_INDEX_START --> <TABLE ALIGN="LEFT" BORDER="0" WIDTH="195" summary="about the author" class="left"> <TR> <TD> <IMG src="../../common/images/Guido-S.gif" alt= "[Photo of the Author]" height="164" width="173"> <BR>von Guido Socher <a href="http://linuxfocus.org/~guido/"><font size="1">(homepage)</font></a> <BR><BR> <I>Über den Autor:</I><BR> <!-- aboutauthor_start --> <p>Guido liebt Linux nicht nur, weil es Spaß macht, die großartigen Möglichkeiten dieses Systems zu entdecken, sondern auch wegen den Leuten, die an seiner Entwicklung teilhaben.</p> <!-- aboutauthor_stop --> <!-- TRANSLATED_TO de --> <BR><BR><I>Übersetzt ins Deutsche von:</I><BR> Hubert Kaißer (<a href="http://esac.home.pages.de/"><font size="1">homepage</font></a>) <br> <!-- =LF=TRANSTO=de: Hubert Kaißer --> <!-- TRANSLATED_TO_STOP --> <!-- INDEX_START --> <BR><i>Inhalt</i>: <UL> <LI><A HREF="#231lfindex0">Installation der Software: Was man braucht.</A></LI> <LI><A HREF="#231lfindex1"> Installation der Software: Die GNU binutils</A></LI> <LI><A HREF="#231lfindex2">Installation der Sofware: Der gcc für den AVR </A></LI> <LI><A HREF="#231lfindex3">Installation der Software: Die AVR C-Library</A></LI> <LI><A HREF="#231lfindex4">Installation der Software: Programmiersoftware</A></LI> <LI><A HREF="#231lfindex5">Ein kleines Testprojekt</A></LI> <LI><A HREF="#231lfindex6">Benötigte Hardware</A></LI> <LI><A HREF="#231lfindex7">Die Hardware der Programmierschaltung zusammenbauen</A></LI> <LI><A HREF="#231lfindex8">Software schreiben</A></LI> <LI><A HREF="#231lfindex9">Kompilieren und Hochladen</A></LI> <LI><A HREF="#231lfindex10">Einige interessante binutils</A></LI> <LI><A HREF="#231lfindex11">Fazit</A></LI> <LI><A HREF="#231lfindex12">Quellen</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=231">Talkback für diesen Artikel</A></LI> </UL> </TD></TR></TABLE> <!-- INDEX_STOP --> <!-- SHORT_BIO_ABOUT_THE_AUTHOR_AND_INDEX_STOP --> <!-- HEAD_OF_THE_ARTICLE_START --> <br> <table border="0"><tr><td> <H2>Den AVR Microcontroller mit GCC programmieren</H2> <img src="../../common/images/article231/illustration.jpg" width="160" height="102" alt="[Illustration]" hspace="10"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Zusammenfassung</i>: <P> <!-- articleabstract_start --> Achtung: Es gibt jetzt eine neue Version diese Artikels: <a href="../November2004/article352.shtml">November2004/article352.shtml</a><p> Der AVR 8-Bit RISC Microcontroller von Atmel ist ein sehr verbreiteter Microcontroller. Er ist ein einfache integrierte Halbleiterschaltung mit EEPROM, RAM, A/D-Wandler, einer Menge digitaler Input- und Outputleitungen, Zeitschaltungen, UART für RS232-Datenübertragung und vielen weiteren Eigenschaften. <br><br> Das Beste ist jedoch, daß es unter Linux eine vollständige Programmierumgebung gibt: Man kann diesen Microcontroller unter GCC mit C programmieren. In diesem Artikel werde ich erklären, wie man es installiert und GCC benutzt. Ich werde ebenfalls erklären, wie man die Software auf den Microcontoller lädt. Alles, was man dafür braucht, ist ein AT90S4433 Microcontroller, ein 4MHz-Quarz, etwas Kabel und einige andere sehr billige Teile. <br><br> Dieser Artikel wird nur eine Einführung sein. In einem späteren Artikel bauen wir eine LCD-Anzeige mit ein paar Drucktasen, Analog- und Digitaleingabe, einer Hardwarelaufzeitüberwachung und LEDs. Der Plan ist, daraus eine Mehrzweckkonsole für einen Linuxserver zu machen, aber zuerst werden wir lernen, wie man die Programmierumgebung einrichtet. Darüber geht dieser Artikel. <!-- articleabstract_stop --> <br><!-- HR divider --><center><font color="#8282e0"><b>_________________ _________________ _________________</b></font></center><br> </td></tr></table> <!-- HEAD_OF_THE_ARTICLE_STOP --> <!-- BODY_OF_THE_ARTICLE_START --> <A NAME="231lfindex0"> </A> <H2>Installation der Software: Was man braucht.</H2> <p>Um die GNU C - Entwicklungsumgebung zu nutzen, braucht man die folgende Software::</p> <table border="1"> <tr> <td>binutils-2.11.2.tar.bz2</td> <td>Zum Herunterladen bei:<br> ftp://ftp.informatik.rwth-aachen.de/pub/gnu/binutils/<br> oder<br> ftp://gatekeeper.dec.com/pub/GNU/binutils/</td> </tr> <tr> <td>gcc-core-3.0.3.tar.gz</td> <td>Zum Herunterladen bei: ftp://ftp.informatik.rwth-aachen.de/pub/gnu/gcc/<br> oder<br> ftp://gatekeeper.dec.com/pub/GNU/gcc/</td> </tr> <tr> <td>avr-libc-20020106.tar.gz</td> <td>Die AVR C-Bibliothek ist vorhanden bei: http://www.amelek.gda.pl/avr/libc/ Man kann sie auch von diesem Server herunterladen: <a href="../../common/src/article231/index.html">Download</a> </td> </tr> <tr> <td>uisp-20011025.tar.gz</td> <td>Die AVR-Programmierschaltung ist vorhanden bei: http://www.amelek.gda.pl/avr/libc/ Man kann sie auch von diesem Server herunterladen: <a href="../../common/src/article231/index.html">Download</a> </td> </tr> </table> Wir installieren alle Programme nach /usr/local/atmel. Das machen wir, um das Programm vom normalen Linux-C-Compiler zu trennen. Erzeugen Sie dieses Verzeichnis mit diesem Befehl: <p class="code"> mkdir /usr/local/atmel </p> <A NAME="231lfindex1"> </A> <H2> Installation der Software: Die GNU binutils</H2> Das Paket binutils liefert alle Low-Level-Hilfsprogrammme, die man braucht, um Objektdateien zu erzeugen. Es enthält einen AVR-Assembler (avr-as), einen Linker (avr-ld), Programme für die Bearbeitung von Bibliotheken (avr-ranlib, avr-ar), Programme, um die Objektdateien zu erzeugen, die auf die EEPROM des Microcontrollers geladen werden können (avr-objcopy), Disassembler (avr-objdump) und Programme wie avr-strip und avr-size. <br> <br> Führen Sie folgende Befehle aus, um binutils zu erzeugen und zu installieren: <p class="code">bunzip2 -c binutils-2.11.2.tar.bz2 | tar xvf -<br> cd binutils-2.11.2<br> ./configure --target=avr --prefix=/usr/local/atmel<br> make<br> make install<br> </p> Fügen Sie die Zeile /usr/local/atmel/lib in die Datei /etc/ld.so.conf ein und führen Sie den Befehl /sbin/ldconfig aus, um den Linker Cache neu zu erzeugen. <A NAME="231lfindex2"> </A> <H2>Installation der Sofware: Der gcc für den AVR </H2> avr-gcc wird unser C-Compiler sein. <br> <br> Führen Sie folgende Befehle aus, um es zu erzeugen und zu installieren: <p class="code">tar zxvf gcc-core-3.0.3.tar.gz<br> cd gcc-core-3.0.3<br> ./configure --target=avr --prefix=/usr/local/atmel --disable-nls --enable-language=c<br> make<br> make install<br> </p> <A NAME="231lfindex3"> </A> <H2>Installation der Software: Die AVR C-Library</H2> Die C-Library wird noch entwickelt. Die Installation kann sich von Version zu Version noch ein bisschen ändern. Ich empfehle, die oben in der Tabelle gezeigte Version, wenn Sie der Anleitung Schritt für Schritt folgen wollen. Ich habe diese Version getestet und sie läuft gut für alle Programme, die wir in diesem und den folgenden Artikeln schreiben werden. <p class="code">Einige Umgebungsvariablen setzen (Bash-Syntax):<br> export CC=avr-gcc<br> export AS=avr-as<br> export AR=avr-ar<br> export RANLIB=avr-ranlib<br> export PATH=/usr/local/atmel/bin:${PATH}<br> <br> ./configure --prefix=/usr/local/atmel --target=avr --enable-languages=c --host=avr<br> make<br> make install<br> </p> <A NAME="231lfindex4"> </A> <H2>Installation der Software: Programmiersoftware</H2> Die Programmiersoftware lädt den speziell vorbereiteten Maschinencode in das EEPROM unseres Microcontrollers. <br> <br> Die uisp-Programmiersoftware für Linux ist sehr gut. Sie kann direkt in einem Makefile verwendet werden. Man kann einfach eine "make load"-Regel hinzufügen und in einem Schritt die Software kompilieren und hochladen. <br> <br> uisp wird wie folgt installiert: <p class="code">tar zxvf uisp-20011025.tar.gz<br> cd uisp-20011025/src<br> make<br> cp uisp /usr/local/atmel/bin<br> </p> <A NAME="231lfindex5"> </A> <H2>Ein kleines Testprojekt</H2> Wir fangen mit einer kleinen Testschaltung an. Der Zweck dieser Schaltung ist nur, unsere Entwicklungsumgebung zu testen. Wir können sie benutzen, um zu kompilieren, herunterzuladen und ein einfaches Programm zu testen. Das Programm wird einfach eine LED blinken lassen. <br> <br> Ich schlage vor, ein kleines bedrucktes Schaltungsbrett für den Microcontroller zu machen. Sie können später diese Schaltung für Ihre eigenen Experimente verwenden. Es ist eine gute Idee, ein Steckbrett dafür zu benutzen. Sie sollten jedoch nicht versuchen, die AVR mit ihrem 4MHz-Quartz direkt auf das Steckbrett zu setzen. Es ist besser, einige kurze Drähte zu verwenden, um die Eingabe- und Ausgabeleitungen mit dem Steckbrett zu verbinden, da solche Steckbretter nicht für schnelle digitale Schaltungen gedacht sind. Der 4MHz-Quarz und die Kondensatoren sollten physisch sehr eng am Microcontroller sein. <br> <img src="../../common/images/article231/schematic.gif" width= "527" height="461" alt="[circuit diagram]"> <br> Die Widerstände auf dem Anschluß für die Programmierschaltung werden in unserem Fall eigentlich nicht gebraucht. Sie brauchen sie nur, wenn Sie vorhaben die Port-B Input-/Outputleitungen für andere Zwecke zu verwenden. <br><br> Udo Puetz hat einen Schaltplan gezeichnet, der für Anfänger etwas leichter zu lesen ist: <a href="../../common/images/article231/avr_layout_newbiefriendly.gif">avr_layout_newbiefriendly.gif</a>. <A NAME="231lfindex6"> </A> <H2>Benötigte Hardware</H2> Sie benötigen die Teile der folgenden Tabelle. Davon sind alle sehr verbreitet und billig. Nur der Microcontroller ist ein bisschen teurer, ungefähr 7.50 EUR. Obwohl es ein sehr verbreiteter Microcontroller ist, kann es sein, daß er nicht in jedem örtlichen Elektroladen zu haben ist, aber größere Zwischenhändler für elektronisches Zubehör (wie www.reichelt.de (Deutschland), www.conrad.de (Deutschland), www.selectronic.fr (Frankreich), usw., wahrscheinlich gibt es entsprechende Seiten in Ihrem Land) haben sie alle im Lager. <table border="1" width="70%"> <tr> <td><img src="../../common/images/article231/avr4433.jpg" width="143" height="100" alt="[avr]"> </td> <td>1 x AT90S4433, Atmel 8bit AVR RISC-Prozessor.</td> </tr> <tr> <td><img src= "../../common/images/article231/14pinicsocket.jpg" width= "104" height="100" alt="[socket]"> </td> <td>2 x 14-Pin IC-Sockel<br> oder<br> 1 x 28-Pin 7.5mm IC-Sockel<br> Den 28-Pin-Sockel bekommt man ein bisschen schwieriger. Üblicherweise sind die 28er-Sockel 14 mm breit, aber wir brauchen einen 7,5 mm breiten Sockel.</td> </tr> <tr> <td><img src= "../../common/images/article231/resistor_crystal_capacitor.jpg" width="100" height="80" alt= "[resistor crystal capacitor]"> </td> <td>1 x 10K Widerstand (Farbcode: braun, schwarz, orange)<br> 3 x 470 Ohm Widerstand (Farbcode: gelb, violett, braun)<br> 1 x 1K Widerstand (Farbcode: braun, schwarz, rot)<br> 1 x 220 Ohm Widerstand (Farbcode: rot, rot, braun)<br> 1 x 4MHz-Quarz<br> 2 x 27pF Keramikkondensator</td> </tr> <tr> <td><img src="../../common/images/article231/connector.jpg" width="167" height="110" alt="[Anschluß]"> </td> <td>Irgendeinen 5-Pin-Anschluß/-Sockel für die Programmierschaltung. Gewöhnlich kaufe ich diese Steckerleisten und breche 5 davon ab.</td> </tr> <tr> <td><img src="../../common/images/article231/board.jpg" width="113" height="116" alt="[Lochrasterplatine]"> </td> <td>Lochrasterplatine</td> </tr> <tr> <td><img src="../../common/images/article231/db25male.jpg" width="136" height="124" alt="[DB25]"> </td> <td>1 x DB25-Buchse, für den Parallelport.</td> </tr> <tr> <td><img src="../../common/images/article231/led.jpg" width="51" height="90" alt="[LED]"> </td> <td>1 x LED</td> </tr> <tr> <td><img src= "../../common/images/article231/breadboard.jpg" width="200" height="116" alt="[Lochraster]"> </td> <td>Ein Steckbrett. Wir benutzen es hier nicht, aber es ist sehr nützlich, wenn Sie weitere Experimente mit dem AVR machen wollen. Ich schlage vor, Sie belassen den Microcontroller zusammen mit dem Quartz und den Kondensatoren auf der Lochrasterplatine und verbinden die Input-/Outputleitungen über kurze Kabel mit dem Steckbrett.</td> </tr> </table> Zusätzlich zu den obigen Teilen brauchen Sie ein 5V, elektronisch stabilisiertes DC-Netzteil oder Sie können eine 4,5V Batterie als Stromversorgung verwenden. <A NAME="231lfindex7"> </A> <H2>Die Hardware der Programmierschaltung zusammenbauen</H2> Der AT90S4433 erlaubt In Circuit Programming (ICP). <img src="../../common/images/article231/pcable.jpg" width="223" height="149" alt="[AVR Programmierschaltung]" align="right"><br> Das heißt: Sie müssen den Microcontroller nicht aus der Schaltung nehmen, um ihn zu programmieren. Sie werden merken, daß Sie fertige Programmier-Hardware für 50-150 EUR kaufen können. Sie müssen nicht soviel in eine Programmierschaltung investieren. Mit Linux, der uisp-Software und einem freien Parallelport können Sie eine sehr gute und einfache AVR-Programmierschaltung bauen. Es ist ein einfaches Kabel. Die Verkabelung der Programmierschaltung muß wie folgt sein: <br> <table border="1" bgcolor="#CDCDCD"> <tr> <th>Pin am AVR</th> <th>Pin am Parallelport</th> </tr> <tr> <td>Reset (1)</td> <td>Init (16)</td> </tr> <tr> <td>MOSI (17)</td> <td>D0 (2)</td> </tr> <tr> <td>MISO (18)</td> <td>Busy (11)</td> </tr> <tr> <td>SCK (19)</td> <td>Strobe (1)</td> </tr> <tr> <td>GND</td> <td>GND (18)</td> </tr> </table> <br> Das Kabel sollte nicht länger als 70 cm sein. <A NAME="231lfindex8"> </A> <H2>Software schreiben</H2> Der AT90S4433 kann mit der Hilfe von gcc einfach in C programmiert werden. Ein bisschen AVR-Assembler zu können ist nützlich, aber wird nicht gebraucht. Die AVR-libc hat die <a href= "../../common/src/article231/avr-libc-reference.html">avr-libc-reference</a>, die die meisten Funktionen dokumentiert. Harald Leitner hat ein Dokument mit vielen nützlichen Beispielen geschrieben, wie man den AVR und GCC verwendet (<a href= "../../common/src/article231/haraleit.pdf">haraleit.pdf, 286Kb</a>, ursprünglich von <a href= "http://www.avrfreaks.net/AVRGCC/">http://www.avrfreaks.net/AVRGCC/</a>). Von Atmel's Webseite, (<a href= "http://www.atmel.com">www.atmel.com</a>, gehen Sie nach: avr products -> 8 bit risc-> Datasheets), Sie können die vollständige Spezifikation runterladen (lokale Kopie: <a href= "../../common/src/article231/avr4433.pdf">avr4433.pdf, 2361Kb</a>). Sie beschreibt alle Register und wie man die CPU nutzt. <br> <br> Eines, was man im Hinterkopf behalten sollte, wenn man den 4433er benutzt ist, daß er nur 128 Bytes RAM und 4KB EEPROM hat. Das bedeutet, daß Sie keine großen Datenstrukturen oder Strings deklarieren dürfen. Ihr Programm sollte keine tief verschachtelten Funktionsaufrufe oder Rekursion haben. Eine Zeile wie<br> char string[90];<br> ist schon zuviel. Ein Integer hat 16 Bit. Wenn Sie ein Small Integer brauchen, dann benutzen Sie <br> unsigned char i; /* 0-255 */ <br> Sie werden dennoch überrascht sein, was für große Programme man schreiben kann. Es ist ein wirklich mächtiger Prozessor! <br> <br> Viel besser als alle Theorie ist ein echtes Beispiel. Wir schreiben ein Programm, daß unsere LED veranlaßt in Intervallen von 0,5 Sekunden zu blinken. Es ist nicht sehr nützlich, aber gut, um anzufangen und die Entwicklungsumgebung und die Programmierschaltung zu testen. <p class="code">void main(void)<br> {<br> /* enable PD5 as output */<br> sbi(DDRD,PD5);<br> while (1) {<br> /* led on, pin=0 */<br> cbi(PORTD,PD5);<br> delay_ms(500);<br> /* set output to 5V, LED off */<br> sbi(PORTD,PD5);<br> delay_ms(500);<br> }<br> }<br> </p> Der obige Programmierschnipsel zeigt wie einfach es ist, ein Programm zu schreiben. Sie sehen nur das Hauptprogramm. Die delay_ms-Funktion ist im <a href= "../../common/src/article231/avrledtest.html">vollständigen Listing (avrledtest.c)</a> enthalten. Um den Pin PD5 als Output zu nutzen, müssen Sie das PD5-Bit im Data Direction Register für D-Anschluß (DDRD) setzen. Danach können Sie PD5 mit der Funktion cbi(PORTD,PD5) (clear bit PD5) auf 0V oder auf 5V mit sbi(PORTD,PD5) (set bit PD5) setzen. Der Wert von "PD5" ist in io4433.h definiert, das mit io.h einbezogen ist. Sie müssen sich keine Gedanken darüber machen. Wenn Sie bereits Programme für Multiuser-/Multitaskingsysteme wie Linux geschrieben haben, wissen Sie, daß man niemals eine nichtblockierende Endlosschleife programmieren darf. Dies wäre eine Verschwendung von CPU-Zeit und würde das System sehr verlangsamen. Beim AVR ist dies anders. Wir haben nicht mehrere Aufgaben und es läuft kein anderes Programm. Es gibt nicht einmal ein Betriebssystem. Es ist daher recht normal, ein Busy Loop für immer laufen zu lassen. <A NAME="231lfindex9"> </A> <H2>Kompilieren und Hochladen</H2> Bevor Sie anfangen, stellen Sie sicher, daß Sie /usr/local/atmel/bin in der PATH-Variablen haben. Wenn es nötig ist, dann ändern Sie Ihre .bash_profile oder .tcshrc und fügen folgendes hinzu: <p class="code">export PATH=/usr/local/atmel/bin:${PATH} (bei bash)<br> setenv PATH /usr/local/atmel/bin:${PATH} (bei tcsh)</p> Wir benutzen den Parallelport und uisp, um den AVR zu programmieren. Uisp benutzt die ppdev-Schnittstelle des Kernels. Daher müssen Sie folgende Kernelmodule laden: <p class="code"># /sbin/lsmod<br> parport_pc<br> ppdev<br> parport</p> Überprüfen Sie mit dem Befehl /sbin/lsmod, daß Sie geladen sind. Ansonsten laden Sie sie (als root) mit <br> <p class="code">modprobe parport<br> modprobe parport_pc<br> modprobe ppdev<br> </p> Es ist eine gute Idee, diese Befehle automatisch während dem Hochfahren auszuführen. Sie können Sie zu dem rc-Skript (z.B. bei Redhat /etc/rc.d/rc.local) hinzufügen. <br> Um die ppdev-Schnittstelle als normaler Benutzer zu nutzen, muß root Ihnen Schreibzugriff geben, indem er einmal den Befehl <p class="code">chmod 666 /dev/parport0</p> ausführt. Stellen Sie ebenso sicher, daß kein Drucker-Daemon auf dem Parallelport läuft. Wenn einer läuft, dann stoppen Sie es, bevor Sie das Kabel der Programmierschaltung anschließen. Jetzt ist alles fertig, um zu kompilieren und unseren Microcontroller zu programmieren. <br> <br> Das Paket für unser Testprogramm (<a href= "../../common/src/article231/avrledtest-0.1.tar.gz">avrledtest-0.1.tar.gz</a>) beinhaltet ein Makefile. Sie müssen nur folgendes tippen:<br> make <br> make load<br> Dies wird die Software kompilieren und hochladen. Ich gehe nicht tiefer auf alle Befehle ein. Sie können sie im <a href="../../common/src/article231/Makefile.html">Makefile</a> sehen und sie sind immer gleich. Ich kann mich selber nicht an alle von ihnen erinnern. Ich weiß nur, daß ich "make load" ausführen muß. Wenn Sie ein anderes Programm schreiben wollen, dann ersetzen Sie einfach alle vorkommenden avrledtest im Makefile mit dem Namen Ihres Programmes. <A NAME="231lfindex10"> </A> <H2>Einige interessante binutils</H2> Interessanter als die tatsächliche Kompilierung sind einige der binutils. <p class="code">avr-objdump -h avrledtest.out</p> Zeigt die Größe der verschiedenen Abschnitte in unserem Programm. .text ist Befehlscode und lädt in das Flash EEPROM. .data sind initialisierte Daten wie<br> static char str[]="hello";<br> und .bss sind uninitialisierte globale Daten. Beide sind in unserem Fall null. .eeprom ist für Variablen, die in eeprom gespeichert sind. Ich hatte dafür noch nie Verwendung. stab und stabstr sind Debugging-Informationen und kommen nicht bis in den AVR. <pre> avrledtest.out: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000008c 00000000 00000000 00000094 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00800060 0000008c 00000120 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00800060 0000008c 00000120 2**0 ALLOC 3 .eeprom 00000000 00810000 00810000 00000120 2**0 CONTENTS 4 .stab 00000750 00000000 00000000 00000120 2**2 CONTENTS, READONLY, DEBUGGING 5 .stabstr 000005f4 00000000 00000000 00000870 2**0 CONTENTS, READONLY, DEBUGGING </pre> Sie können ebensogut den Befehl avr-size ausführen, um dies in einer kompakteren Form zu bekommen: <p class="code">avr-size avrledtest.out</p> <pre> text data bss dec hex filename 140 0 0 140 8c avrledtest.out </pre> Wenn Sie mit dem AVR arbeiten, müssen Sie darauf achten, daß text+data+bss nicht mehr als 4k ergibt und data+bss+stack (Sie können die Größe des Stack nicht sehen, es hängt davon ab, wieviele vernestete Funktionsaufrufe Sie haben) darf nicht mehr als 128 Bytes sein. <br> <br> Ebenso interessant ist der Befehl <p class="code">avr-objdump -S avrledtest.out</p> Er generiert ein Assemblerlisting Ihres Codes. <A NAME="231lfindex11"> </A> <H2>Fazit</H2> Jetzt wissen Sie genug, um Ihre eigenen Projekte mit der AVR-Hardware und dem GCC anzufangen. Ebenso wird es weitere Artikel in LinuxFocus geben, mit komplexerer und interessanterer Hardware. <A NAME="231lfindex12"> </A> <H2>Quellen</H2> <ul> <li>Libc und uisp: <a href= "http://www.amelek.gda.pl/avr/libc/">/www.amelek.gda.pl/avr/libc/</a></li> <li>GCC und binutils: <a href= "ftp://gatekeeper.dec.com/pub/GNU/">ftp://gatekeeper.dec.com/pub/GNU/</a></li> <li>avrfreaks <small>(passen Sie auf, manche Leute auf dieser Website benutzen immer noch Windows !?)</small>: <a href= "http://www.avrfreaks.net/">http://www.avrfreaks.net/</a></li> <li>Der tavrasm-Assembler für Linux: <a href= "http://www.tavrasm.org/">www.tavrasm.org</a></li> <li>AVR Webring: <a href= "http://R.webring.com/hub?ring=avr&list">R.webring.com/hub?ring=avr&list</a></li> <li>Vorkompilierte Versionen von gcc: <a href= "http://combio.de/avr/index.html">combio.de/avr/</a></li> <li>Die ganze <a href="../../common/src/article231/index.html">Software und alle Dokumente</a>, die in diesem Artikel erwähnt werden</li> <li>Die atmel Website: <a href= "http://www.atmel.com/">www.atmel.com/</a> </li> </ul> <!-- vim: set sw=2 ts=2 et tw=80: --> <!-- BODY_OF_THE_ARTICLE_STOP --> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Talkback für diesen Artikel</h2> Jeder Artikel hat seine eigene Seite für Kommentare und Rückmeldungen. Auf dieser Seite kann jeder eigene Kommentare abgeben und die Kommentare anderer Leser sehen: <center> <table width="250" border=0><tr><td> <div class="tbbutton"><A class="nodec" href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=231"> Talkback Seite </a></div> </td></tr></table> </center> <br clear="all"> <HR size="2" noshade> <table width="250" border=0><tr><td> <div class="bbutton"><a class="nodec" href="../../index.shtml"><--, LF Home</a></div> </td><td> <div class="bbutton"><a class="nodec" href="index.shtml">Zum index dieser Ausgabe</a></div> </td></tr></table> <br clear="all"> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%" summary="footer"> <TR><TD ALIGN=CENTER BGCOLOR="#bdc6d5" WIDTH="50%"> <A HREF="../../common/lfteam.html">Der LinuxFocus Redaktion schreiben</A> <BR><FONT COLOR="#1111aa"><a href="../../common/copy.html">© Guido Socher</a><br>"some rights reserved" see <a href="../../license/index.shtml">linuxfocus.org/license/</a><br><a href="http://www.linuxfocus.org">http://www.LinuxFocus.org</a></FONT> </TD> <TD BGCOLOR="#bdc6d5"> <!-- TRANSLATION INFO --> <font size=2>Autoren und Übersetzer:</font> <TABLE summary="translators"> <tr><td><font size="2">en --> -- : Guido Socher (<a href="http://linuxfocus.org/~guido/"><font size="1">homepage</font></a>)</font></td></tr> <tr><td><font size="2">en --> de: Hubert Kaißer (<a href="http://esac.home.pages.de/"><font size="1">homepage</font></a>)</font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2004-11-21, generated by lfparser version 2.51</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>