<!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">&lt;--</FONT></A> &nbsp;| 
                 <A class="nodec" href="../index.shtml"><FONT color=
                 "#DDDDDD" size="2">Home</FONT></A> &nbsp;| 
                 <A class="nodec" href="../map.html"><FONT color=
                 "#DDDDDD" size="2">Plan</FONT></A> &nbsp;| 
                 <A class="nodec" href="../indice.html"><FONT color=
                 "#DDDDDD" size="2">Index</FONT></A> &nbsp;| 
                 <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">&Uuml;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&uuml;bar auf: <A href="../../English/March2002/article231.shtml">English</a> &nbsp;<A href="../../Castellano/March2002/article231.shtml">Castellano</a> &nbsp;<A href="../../ChineseGB/March2002/article231.shtml">ChineseGB</a> &nbsp;<A href="../../Deutsch/March2002/article231.shtml">Deutsch</a> &nbsp;<A href="../../Francais/March2002/article231.shtml">Francais</a> &nbsp;<A href="../../Italiano/March2002/article231.shtml">Italiano</a> &nbsp;<A href="../../Nederlands/March2002/article231.shtml">Nederlands</a> &nbsp;<A href="../../Russian/March2002/article231.shtml">Russian</a> &nbsp;<A href="../../Turkce/March2002/article231.shtml">Turkce</a> &nbsp;</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>&Uuml;ber den Autor:</I><BR>
<!-- aboutauthor_start -->
<p>Guido liebt Linux nicht nur, weil es Spa&szlig; macht, die gro&szlig;artigen
    M&ouml;glichkeiten dieses Systems zu entdecken, sondern auch wegen den
    Leuten, die an seiner Entwicklung teilhaben.</p>
<!-- aboutauthor_stop -->
<!-- TRANSLATED_TO de -->
<BR><BR><I>&Uuml;bersetzt ins Deutsche von:</I><BR>
Hubert Kai&szlig;er (<a href="http://esac.home.pages.de/"><font size="1">homepage</font></a>)
<br>
<!--
 =LF=TRANSTO=de: Hubert Kai&szlig;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&uuml;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&ouml;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&uuml;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>&nbsp;
<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&uuml;r RS232-Daten&uuml;bertragung und vielen
    weiteren Eigenschaften. <br><br>
    Das Beste ist jedoch, da&szlig; es unter Linux eine vollst&auml;ndige
    Programmierumgebung gibt: Man kann diesen Microcontroller unter GCC
    mit C programmieren. In diesem Artikel werde ich erkl&auml;ren, wie man es
    installiert und GCC benutzt. Ich werde ebenfalls erkl&auml;ren, wie man die
    Software auf den Microcontoller l&auml;dt. Alles, was man daf&uuml;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&uuml;hrung sein. In einem sp&auml;teren
    Artikel bauen wir eine LCD-Anzeige mit ein paar Drucktasen, Analog-
    und Digitaleingabe, einer Hardwarelaufzeit&uuml;berwachung und LEDs.
    Der Plan ist, daraus eine Mehrzweckkonsole f&uuml;r einen Linuxserver zu
    machen, aber zuerst werden wir lernen, wie man die
    Programmierumgebung einrichtet. Dar&uuml;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">&nbsp;</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">&nbsp;</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&auml;lt einen
    AVR-Assembler (avr-as), einen Linker (avr-ld), Programme f&uuml;r die
    Bearbeitung von Bibliotheken (avr-ranlib, avr-ar), Programme, um die
    Objektdateien zu erzeugen, die auf die EEPROM des Microcontrollers
    geladen werden k&ouml;nnen (avr-objcopy), Disassembler (avr-objdump) und
    Programme wie avr-strip und avr-size.
    <br>
    <br>
    F&uuml;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&uuml;gen Sie die Zeile /usr/local/atmel/lib in die Datei
    /etc/ld.so.conf ein und f&uuml;hren Sie den Befehl /sbin/ldconfig aus, um
    den Linker Cache neu zu erzeugen.


    <A NAME="231lfindex2">&nbsp;</A>
<H2>Installation der Sofware: Der gcc f&uuml;r den AVR </H2>

    avr-gcc wird unser C-Compiler sein. <br>
    <br>
    F&uuml;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">&nbsp;</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 &auml;ndern. Ich empfehle, die oben in
    der Tabelle gezeigte Version, wenn Sie der Anleitung Schritt f&uuml;r Schritt
    folgen wollen.  Ich habe diese Version getestet und sie
    l&auml;uft gut f&uuml;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">&nbsp;</A>
<H2>Installation der Software: Programmiersoftware</H2>

    Die Programmiersoftware l&auml;dt den speziell
    vorbereiteten Maschinencode in das EEPROM unseres Microcontrollers.
    <br>
    <br>
    Die uisp-Programmiersoftware f&uuml;r Linux ist sehr gut. Sie kann direkt in
    einem Makefile verwendet werden. Man kann einfach eine "make
    load"-Regel hinzuf&uuml;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">&nbsp;</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&ouml;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&uuml;r den
    Microcontroller zu machen. Sie k&ouml;nnen sp&auml;ter diese Schaltung
    f&uuml;r Ihre eigenen Experimente verwenden. Es ist eine gute
    Idee, ein Steckbrett daf&uuml;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&auml;hte zu verwenden, um die
    Eingabe- und Ausgabeleitungen mit dem Steckbrett zu verbinden, da solche
    Steckbretter nicht f&uuml;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&auml;nde auf dem Anschlu&szlig; f&uuml;r die Programmierschaltung werden
    in unserem Fall eigentlich nicht gebraucht. Sie brauchen sie nur,
    wenn Sie vorhaben die Port-B Input-/Outputleitungen f&uuml;r andere
    Zwecke zu verwenden.

<br><br>
Udo Puetz hat einen Schaltplan gezeichnet, der f&uuml;r Anf&auml;nger etwas
leichter zu lesen ist: <a
href="../../common/images/article231/avr_layout_newbiefriendly.gif">avr_layout_newbiefriendly.gif</a>.

    <A NAME="231lfindex6">&nbsp;</A>
<H2>Ben&ouml;tigte Hardware</H2>

    Sie ben&ouml;tigen die Teile der folgenden Tabelle. Davon sind alle sehr
    verbreitet und billig. Nur der Microcontroller ist ein bisschen
    teurer, ungef&auml;hr 7.50 EUR. Obwohl es ein sehr verbreiteter
    Microcontroller ist, kann es sein, da&szlig; er nicht in jedem &ouml;rtlichen
    Elektroladen zu haben ist, aber gr&ouml;&szlig;ere Zwischenh&auml;ndler f&uuml;r
    elektronisches Zubeh&ouml;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.
        &Uuml;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&szlig;]"> </td>

	<td>Irgendeinen 5-Pin-Anschlu&szlig;/-Sockel f&uuml;r die
        Programmierschaltung. Gew&ouml;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&uuml;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&uuml;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 &uuml;ber kurze Kabel mit dem Steckbrett.</td>
      </tr>
    </table>
Zus&auml;tzlich zu den obigen Teilen brauchen Sie ein 5V, elektronisch
stabilisiertes DC-Netzteil oder Sie k&ouml;nnen eine 4,5V Batterie als
Stromversorgung verwenden.

    <A NAME="231lfindex7">&nbsp;</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&szlig;t: Sie m&uuml;ssen den Microcontroller nicht aus der Schaltung nehmen,
    um ihn zu programmieren. Sie werden merken, da&szlig; Sie fertige
    Programmier-Hardware f&uuml;r 50-150 EUR kaufen k&ouml;nnen. Sie m&uuml;ssen nicht
    soviel in eine Programmierschaltung investieren. Mit Linux, der
    uisp-Software und einem freien Parallelport k&ouml;nnen Sie eine sehr
    gute und einfache AVR-Programmierschaltung bauen. Es ist ein
    einfaches Kabel. Die Verkabelung der Programmierschaltung mu&szlig; 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&auml;nger als 70 cm sein.

    <A NAME="231lfindex8">&nbsp;</A>
<H2>Software schreiben</H2>

    Der AT90S4433 kann mit der Hilfe von gcc einfach in C programmiert
    werden. Ein bisschen AVR-Assembler zu k&ouml;nnen ist n&uuml;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&uuml;tzlichen Beispielen geschrieben, wie man den
    AVR und GCC verwendet (<a href=
    "../../common/src/article231/haraleit.pdf">haraleit.pdf,
    286Kb</a>, urspr&uuml;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
    -&gt; 8 bit risc-&gt; Datasheets),  Sie k&ouml;nnen die vollst&auml;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&szlig; er nur 128 Bytes RAM und 4KB EEPROM hat. Das
    bedeutet, da&szlig; Sie keine gro&szlig;en Datenstrukturen oder Strings
    deklarieren d&uuml;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 &uuml;berrascht sein, was f&uuml;r gro&szlig;e Programme man
    schreiben kann. Es ist ein wirklich m&auml;chtiger Prozessor! <br>
    <br>
    Viel besser als alle Theorie ist ein echtes Beispiel. Wir schreiben
    ein Programm, da&szlig; unsere LED veranla&szlig;t in Intervallen von 0,5 Sekunden
    zu blinken. Es ist nicht sehr n&uuml;tzlich, aber gut, um anzufangen und
    die Entwicklungsumgebung und die Programmierschaltung zu testen.

    <p class="code">void main(void)<br>
    {<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* enable PD5 as output
    */<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbi(DDRD,PD5);<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (1) {<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*
    led on, pin=0 */<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cbi(PORTD,PD5);<br>

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(500);<br>

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*
    set output to 5V, LED off */<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbi(PORTD,PD5);<br>

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(500);<br>

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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&auml;ndigen Listing
    (avrledtest.c)</a> enthalten. Um den Pin PD5 als Output zu nutzen,
    m&uuml;ssen Sie das PD5-Bit im Data Direction Register f&uuml;r D-Anschlu&szlig;
    (DDRD) setzen. Danach k&ouml;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&uuml;ssen sich keine Gedanken dar&uuml;ber machen. Wenn
    Sie bereits Programme f&uuml;r Multiuser-/Multitaskingsysteme wie Linux
    geschrieben haben, wissen Sie, da&szlig; man niemals eine nichtblockierende
    Endlosschleife programmieren darf. Dies w&auml;re eine Verschwendung von
    CPU-Zeit und w&uuml;rde das System sehr verlangsamen. Beim AVR ist dies
    anders. Wir haben nicht mehrere Aufgaben und es l&auml;uft kein anderes
    Programm. Es gibt nicht einmal ein Betriebssystem. Es ist daher
    recht  normal, ein Busy Loop f&uuml;r immer laufen zu lassen.

    <A NAME="231lfindex9">&nbsp;</A>
<H2>Kompilieren und Hochladen</H2>

    Bevor Sie anfangen, stellen Sie sicher, da&szlig; Sie /usr/local/atmel/bin
    in der PATH-Variablen haben. Wenn es n&ouml;tig ist, dann &auml;ndern Sie Ihre
    .bash_profile oder .tcshrc und f&uuml;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&uuml;ssen Sie
    folgende Kernelmodule laden:

    <p class="code"># /sbin/lsmod<br>
    parport_pc<br>
    ppdev<br>
    parport</p>
    &Uuml;berpr&uuml;fen Sie mit dem Befehl /sbin/lsmod, da&szlig; 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&auml;hrend dem
    Hochfahren auszuf&uuml;hren. Sie k&ouml;nnen Sie  zu dem rc-Skript (z.B. bei
    Redhat /etc/rc.d/rc.local) hinzuf&uuml;gen. <br>
    Um die ppdev-Schnittstelle als normaler Benutzer zu nutzen, mu&szlig; root
    Ihnen Schreibzugriff geben, indem er einmal den Befehl

    <p class="code">chmod 666 /dev/parport0</p>
    ausf&uuml;hrt.
    Stellen Sie ebenso sicher, da&szlig; kein Drucker-Daemon auf dem
    Parallelport l&auml;uft. Wenn einer l&auml;uft, dann stoppen Sie es, bevor Sie
    das Kabel der Programmierschaltung anschlie&szlig;en. Jetzt ist alles
    fertig, um zu kompilieren und unseren Microcontroller zu programmieren.
    <br>
    <br>
    Das Paket f&uuml;r unser Testprogramm (<a href=
    "../../common/src/article231/avrledtest-0.1.tar.gz">avrledtest-0.1.tar.gz</a>)
    beinhaltet ein Makefile. Sie m&uuml;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&ouml;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&szlig; nur, da&szlig; ich "make load" ausf&uuml;hren mu&szlig;.
    Wenn Sie ein anderes Programm schreiben wollen, dann ersetzen Sie
    einfach alle vorkommenden avrledtest im Makefile mit dem Namen
    Ihres Programmes.

    <A NAME="231lfindex10">&nbsp;</A>
<H2>Einige interessante binutils</H2>

    Interessanter als die tats&auml;chliche Kompilierung sind einige der
    binutils.

    <p class="code">avr-objdump -h avrledtest.out</p>
    Zeigt die Gr&ouml;&szlig;e der verschiedenen Abschnitte in unserem Programm.
    .text ist Befehlscode und l&auml;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&uuml;r
    Variablen, die in eeprom gespeichert sind. Ich hatte daf&uuml;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&ouml;nnen ebensogut den Befehl avr-size ausf&uuml;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&uuml;ssen Sie darauf achten, da&szlig;
    text+data+bss nicht mehr als 4k ergibt und data+bss+stack (Sie
    k&ouml;nnen die Gr&ouml;&szlig;e des Stack nicht sehen, es h&auml;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">&nbsp;</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">&nbsp;</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&uuml;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&amp;list">R.webring.com/hub?ring=avr&amp;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&auml;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">&nbsp;</a>
<h2>Talkback f&uuml;r diesen Artikel</h2>
Jeder Artikel hat seine eigene Seite f&uuml;r Kommentare und R&uuml;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">&nbsp;Talkback Seite&nbsp;</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">&lt;--, 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">&copy; Guido     Socher</a><br>&quot;some rights reserved&quot; 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 &Uuml;bersetzer:</font>
<TABLE summary="translators">
  <tr><td><font size="2">en --&gt; -- : Guido Socher (<a href="http://linuxfocus.org/~guido/"><font size="1">homepage</font></a>)</font></td></tr>
  <tr><td><font size="2">en --&gt; de: Hubert Kai&szlig;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>