<!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.52">
 <META NAME="LFCATEGORY" CONTENT="Hardware">
 <link rel="icon" href="../../common/images/lf-16.png" type="image/png">
 <TITLE>lf236, Hardware: Eine LCD Anzeige und Steuertasten f&uuml;r den Linux Server</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_: Eine LCD Anzeige und Steuertasten f&uuml;r den Linux Server
 =LF=NUMBER: 236
 =LF=ANAME_: article236.shtml
 =LF=PARSER: 2.52
 -->

<!-- 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/May2002/article236.shtml">English</a> &nbsp;<A href="../../Castellano/May2002/article236.shtml">Castellano</a> &nbsp;<A href="../../ChineseGB/May2002/article236.shtml">ChineseGB</a> &nbsp;<A href="../../Deutsch/May2002/article236.shtml">Deutsch</a> &nbsp;<A href="../../Francais/May2002/article236.shtml">Francais</a> &nbsp;<A href="../../Italiano/May2002/article236.shtml">Italiano</a> &nbsp;<A href="../../Nederlands/May2002/article236.shtml">Nederlands</a> &nbsp;<A href="../../Russian/May2002/article236.shtml">Russian</a> &nbsp;<A href="../../Turkce/May2002/article236.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 mag Linux nicht nur, weil es Spa&szlig; macht, die
    gro&szlig;artigen M&ouml;glichkeiten, die dieses System bietet
    zu entdecken, sondern auch wegen der Leute, die an seiner
    Entwicklung beteiligt sind.</p>
<!-- aboutauthor_stop -->
<!-- TRANSLATED_TO de -->
<BR><BR><I>&Uuml;bersetzt ins Deutsche von:</I><BR>
Guido Socher (<a href="http://linuxfocus.org/~guido/"><font size="1">homepage</font></a>)
<br>
<!--
 =LF=TRANSTO=de: Guido Socher
-->
<!-- TRANSLATED_TO_STOP -->
<!-- INDEX_START -->
<BR><i>Inhalt</i>:
<UL>
  <LI><A HREF="#236lfindex0">Einf&uuml;hrung</A></LI>
  <LI><A HREF="#236lfindex1">Ben&ouml;tigte Bauteile</A></LI>
  <LI><A HREF="#236lfindex2">Schaltplan und Platine</A></LI>
  <LI><A HREF="#236lfindex3">Die Schaltung</A></LI>
  <LI><A HREF="#236lfindex4">Wie man eine Platine erstellt</A></LI>
  <LI><A HREF="#236lfindex5">Die Software f&uuml;r deinen Microcontroller</A></LI>
  <LI><A HREF="#236lfindex6">Testen</A></LI>
  <LI><A HREF="#236lfindex7">Die Watchdog anschlie&szlig;en</A></LI>
  <LI><A HREF="#236lfindex8">Wie man die Watchdog benutzt</A></LI>
  <LI><A HREF="#236lfindex9">Die Scripte auf dem Server</A></LI>
  <LI><A HREF="#236lfindex10">Log files</A></LI>
  <LI><A HREF="#236lfindex11">Das Kontrollfeld im Betrieb</A></LI>
  <LI><A HREF="#236lfindex12">Zusammenfassung</A></LI>
  <LI><A HREF="#236lfindex13">Referenzen</A></LI>
  <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=236">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>
<!-- tr_staticssi include virtual -->
<!-- tr_staticssi exec cmd -->
<!-- addedByLfPdf ver 0.1 -->
<TABLE style="border-style:outset; border-width:1px" align="right" bgcolor="#ff9616" cellspacing="1"><TR><TD bgcolor="#ff9616">
        <a href="../Archives/lf-2002_05-0236.pdf"><small>PDF</small></a>
        </TD></TR></TABLE>
         

<H2>Eine LCD Anzeige und Steuertasten f&uuml;r den Linux Server</H2>
 <img src=
    "../../common/images/article236/pic03_finalpanel_th.jpg" width=
    "129" height="108" alt="[Illustration]" hspace="10">
<!-- ABSTRACT OF THE ARTICLE -->
<P><i>Zusammenfassung</i>:
<P>
<!-- articleabstract_start -->

    In diesem Artikel entwickeln wir ein LCD Kontrollfeld basierend
    auf einem Hitachi HD44780 LCD Display und dem AT90S4433 AVR
    8-Bit RISC Microcontroller von Atmel. Beides sind
    gel&auml;ufige Komponenten und sind nicht zu teuer. Das
    Kontrollfeld enth&auml;lt neben Anzeige und zwei Tasten eine
    Watchdog, um den Server zu &uuml;berwachen. Mit Hilfe der
    Anzeige und den Tasten kann man einen Dialog mit dem Benutzer
    f&uuml;hren und einigen Sachen einstellen. Man kann die IP
    Adresse, Netzmaske und Gateway Adresse setzen, au&szlig;erdem
    ist es m&ouml;glich den Rechner herunterzufahren (shutdown)
    oder Statistiken abzufragen. Eigentlich gibt es fast
    unbegrenzte M&ouml;glichkeiten. Der gr&ouml;&szlig;te Teil der
    Logik ist in einem Perlscript implementiert und die ganze
    Schaltung ist &uuml;ber die RS232 Schnittstelle mit dem Server
    verbunden. <br><br>
    F&uuml;r diesen Artikel brauchst du wenigstens Teile der Linux
    AVR Entwicklungsumgebung. Wie man diese Linux AVR
    Entwicklungsumgebung aufsetzt ist in dem Artikel <a href=
    "../March2002/article231.shtml">"Programmierung des AVR
    Microcontroller mit GCC"</a> beschrieben.

    
<!-- 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="236lfindex0">&nbsp;</A>
<H2>Einf&uuml;hrung</H2>


<table align="right" cellspacing="10" width="200">
<tr>
 <td bgcolor="#aedbe8">
<center>
<a href="http://shop.tuxgraphics.org"><img src="../../common/images2/tuxgraphics_hd44780_linux_lcd.jpg" alt="lcd from tuxgraphics" width="120" height="80"></a>
<br><a href="http://shop.tuxgraphics.org">shop.tuxgraphics.org</a> verkauft sehr
gute und g&uuml;nstige LCD Anzeigen.
</center>
 </td>
</tr>
</table>

    Die hier entwickelte Schaltung kombiniert Funktionalit&auml;t,
    die schon in zwei vorhergegangenen Artikeln beschrieben wurde:

    <ul>
      <li><a href="../July2000/article165.shtml">Serial Line LCDs
      f&uuml;r Linux</a></li>

      <li><a href="../January2001/article186.shtml">Ein Knopf zum
      Herunterfahren des Rechners f&uuml;r die serielle RS232
      Schnittstelle mit LEDs</a></li>
    </ul>
    Unsere Neuentwicklung geht jedoch weit &uuml;ber das hinaus.
    Die neue Hardware enth&auml;lt zwei Tasten f&uuml;r den Dialog
    mit dem Benutzer und eine Watchdog, um den Server st&auml;ndig
    zu &uuml;berwachen. Es ist au&szlig;erdem ein analoger Eingang
    vorhanden, den wir hier jedoch nicht benutzen. Man k&ouml;nnte
    z.B einen Temperaturf&uuml;hler anschlie&szlig;en.<br>
    <br>
    Um diese Schaltung aufzubauen, braucht man etwas Geschick und
    Erfahrung im Bereich Hobbyelektronik. Die Bauteile f&uuml;r die
    Schaltung sind nicht teuer und kosten alle zusammen weniger als
    40 Euro. <br>
    <br>
    Die Idee hinter dem LCD Kontrollfeld ist, da&szlig; man damit
    einen Server ohne Monitor und Tastatur bedienen kann. Linux ist
    ein sehr zuverl&auml;ssiges Serverbetriebssystem und kann gut
    per ssh, telent oder remote login verwaltet werden. Wenn man
    die Server jedoch das erste Mal mit dem Netzwerk verbindet,
    mu&szlig; man eine IP Adresse, Netzmaske und Gateway setzen.
    Mit diesem Kontrollfeld kann man das machen. Es bietet
    au&szlig;erdem die M&ouml;glichkeit, den Server
    herunterzufahren w&auml;hrend man noch im Serverraum ist.<br>
    <br>
     Das ganze Kontrollfeld ist sehr allgemein gehalten. All die
    Server spezifischen Teile sind in einem Perlscript
    implementiert. Die gesamte Hardware, der Zustand der Tasten,
    der Text im Dispaly, LEDs, ..., kann &uuml;ber ASCII Kommandos
    gesteuert werden. Man kann daher dieselbe Schaltung
    &uuml;bernehmen, um einen mp3 Spieler zu bauen oder einen
    Toaster zu steuern, was immer du m&ouml;chtest.

    <A NAME="236lfindex1">&nbsp;</A>
<H2>Ben&ouml;tigte Bauteile</H2>

    Um dieses Kontrollfeld zu bauen, ben&ouml;tigst du die folgenden
    Teile:

    <p class="code">1 x Atmel At90S4433 Microcontroller<br>
     1 x 28pin 7.25 mm IC Sockel<br>
     1 x 16pin IC Sockel<br>
     1 x MAX232<br>
     1 x kleines 5V Relai<br>
     1 x 4MHz Quarz<br>
     2 x LEDs (gr&uuml;n und rot)<br>
     1 x BC547 NPN Transistor<br>
     1 x BC557 PNP Transistor<br>
     4 x 1uF Kondensator (Folie oder Elko)<br>
     2 x 27pF Keramikkondensator<br>
     1 x 10nF Kondensator<br>
     1 x 100nF Kondensator<br>
     3 x Widerstand 4k7<br>
     2 x Widerstand 2k2<br>
     1 x Widerstand 10K<br>
     1 x Widerstand 3k3<br>
     2 x Widerstand 100 Ohm<br>
     3 x Widerstand 470 Ohm<br>
     3 x Widerstand 1k<br>
     1 x Widerstand 220 Ohm<br>
     1 x 4K7 Poti (Bauform so klein wie m&ouml;glich)<br>
     1 x Z-Diode 4.3V<br>
     2 x kleine Taster<br>
     1 x Diode (e.g 1N4148, irgendeine kleine billige Diode)<br>
     1 x 2 Zeilen 20 Zeichen LCD Display mit HD44780 kompatiblem
    Interface.<br>
    <br>
    Alle LCD Displays mit 14 oder 16 Anschl&uuml;ssen, die ich
    jemals gesehen habe, waren HD44780 kompatibel. Man kann auch
    ein 3 oder 4 zeiliges Display benutzen, aber dann mu&szlig; man
    die Software f&uuml;r den Microcontroller etwas anpassen.</p>
    Zus&auml;tzlich zu diesen Teilen braucht man noch Dr&auml;hte
    und Anschl&uuml;sse f&uuml;r Stromversorgung und RS2322. Das
    zweizeilige Display kann man an einem gebogenen Aluminiumblech
    befestigen und dann in einem freien 5.25" Schacht am Server
    montieren.

    <A NAME="236lfindex2">&nbsp;</A>
<H2>Schaltplan und Platine</H2>

    Ich habe Eagle f&uuml;r Linux benutzt, um den Schaltplan und die
    Platine zu entwerfen. Es ist eine ausgezeichnete Software, aber
    es braucht Zeit bis man sie bedienen kann. F&uuml;r private
    Zwecke kann man eine kostenlose Version von Eagle bei <a href=
    "http://www.cadsoftusa.com/">cadsoftusa.com</a> erhalten. <br>
     <br>
    Der Schaltplan (mit einem Klick auf den Plan erh&auml;lt man
    ein gr&ouml;&szlig;eres Bild):<br>
     <a href=
    "../../common/images/article236/linuxlcdpanel_schematic_big.gif">
    <img src=
    "../../common/images/article236/linuxlcdpanel_schematic_small.gif"
     width="448" height="267" alt="[Schematic]"></a> <br>
     <br>
     Die Platine (mit einem Klick auf die Platine erh&auml;lt man
    ein gr&ouml;&szlig;eres Bild):<br>
     <a href=
    "../../common/images/article236/linuxlcdpanel_board.gif"><img
    src=
    "../../common/images/article236/linuxlcdpanel_board_small.gif"
    width="442" height="395" alt="[board]"></a> <br>
     <br>
     <br>
    Die Platine mit wei&szlig;em Hintergrund, um das Drucken
    erleichtern: <a href=
    "../../common/images/article236/linuxlcdpanel_board_white.gif">Platine
    in wei&szlig;</a> <small>(Achtung: Das ist nicht die Datei, die
    man zum Belichten der Platine braucht)</small><br>
     <br>
    Die Eagle Dateien (komprimiert mit gzip. Achtung einige
    Webbrowser un-zippen die Dateien schon beim Herunterladen):

    <ul>
      <li><a href=
      "../../common/src/article236/linuxlcdpanel.brd.gz">linuxlcdpanel.brd.gz</a></li>

      <li><a href=
      "../../common/src/article236/linuxlcdpanel.sch.gz">linuxlcdpanel.sch.gz</a></li>
    </ul>

    <A NAME="236lfindex3">&nbsp;</A>
<H2>Die Schaltung</H2>

    Ich werde kurz den Schaltplan erkl&auml;ren. Der AT90S4433 hat
    3 Ports: PB, PC und PD. PC kann als analoger oder digitaler
    Eingang benutzt werden. Alle Ports k&ouml;nnen als digitale
    Ein- oder Ausg&auml;nge benutzt werden. Dieses wird per
    Software &uuml;ber das DDR (Data Direction Register)
    festgelegt. Wir benutzen alle Pins bis auf 23 als digitale Ein-
    oder Ausg&auml;nge (0 oder 5V). Der Max232 ist ein
    Spannungswandler. Das RS232 Interface benutzt +-10V und der
    Max232 konvertiert das in 0-5V. An Pin 1 (Reset) befindet sich
    etwas namens Brownout-Schaltung. Diese Schaltung h&auml;lt den
    Reset auf 0 (aktiv) w&auml;hrend Perioden mit unzureichender
    Spannungsversorgung. Das verhindert, da&szlig; die CPU
    Anweisungen fehlerhaft ausf&uuml;hrt. Normalerweise ist das
    f&uuml;r einige Millisekunden w&auml;hrend des Einschaltens
    oder beim Ausschalten der Fall. Die Brownout-Schaltung stellt
    im wesentlichen sicher, da&szlig; der Microcontroller richtig
    startet. <br>
    <br>
    Einige Leute m&ouml;gen sich wundern, warum eine Diode parallel
    zur Spule liegt und so gepolt ist, da&szlig; sie sinnlos
    scheint. Diese Diode ist sehr wichtig. Beim Ausschalten des
    Stromes an dem Relai w&uuml;rde die Spule eine sehr hohe
    Spannung induzieren, die den Microcontroller sofort
    zerst&ouml;ren kann. Diese induzierte Spannung hat
    entgegengesetzte Polarit&auml;t zur Betriebsspannung an der
    Spule. Die Diode kann eine ganz kleine billige Diode im
    Glasgeh&auml;use sein, aber es ist wichtig, da&szlig; sie
    vorhanden ist.

    <A NAME="236lfindex4">&nbsp;</A>
<H2>Wie man eine Platine erstellt</H2>

    Um die Platine zu &auml;tzen, mu&szlig; zuerst diese <a href=
    "../../common/src/article236/linuxlcdpanel.ps.gz">Postscriptdatei
    (linuxlcdpanel.ps.gz)</a> auf eine transparente Folie
    ausgedruckt werden. In L&auml;den f&uuml;r Architekten kann man
    eine semitransparente Plasikfolie namens Sinolit finden. Sie
    wird von der Firma Regulus hergestellt und ist f&uuml;r den
    Offsetdruck gedacht. Eine andere gute Alternative ist 60g
    Papier + Pausklarspray von Kontakt Chemie. Der Vorteil von
    Papier und Sinolit ist, da&szlig; der Druckertoner dort 100%ig
    haftet. <br>
    Ich habe die Postscriptdatei auch in <a href=
    "../../common/src/article236/linuxlcdpanel1.pdf">PDF</a>
    umgewandelt f&uuml;r den Fall, da&szlig; du kein Postscript
    drucken kannst, aber die Qualit&auml;t ist sehr schlecht.<br>
    Die Belichtungszeit f&uuml;r fotobeschichtete Platinen
    h&auml;ngt von der Lichtquelle ab. Bei einem Heimsolarium sind
    es etwa 1-2 Minuten. Man kann auch Tageslicht benutzen, aber
    direkte Sonneneinstrahlung sollte man vermeiden, da die
    Strahlung einfach zu stark ist. Man sollte vorher die beste
    Belichtungszeit mit einem kleinen Streifen Platine ermitteln.
    Die Folie und die Platine legt man w&auml;hrend des Belichtens
    am besten unter eine Glasplatte, damit die Folie ganz plan
    liegt.

    <table border="1" align="right" width="200">
      <tr>
        <td><a href=
        "../../common/images/article236/pic01_beforeetching.jpg"><img
         src=
        "../../common/images/article236/pic01_beforeetching_th.jpg"
        width="188" height="160" alt="[before etching]"></a></td>
      </tr>

      <tr>
        <td>Die belichtete und entwickelte Platine vor dem
        &Auml;tzen</td>
      </tr>
    </table>
    <br>
     <br>
    Die belichtete Platine wird f&uuml;r einige Minuten in
    Natriumhydroxid (NaOH) entwickelt. Danach sollte man das
    Ergebnis sorgf&auml;ltig pr&uuml;fen und gegebenenfalls
    Korrekturen mit einem &auml;tzfesten Edding 780 Lackstift
    (Edding 780 paint marker) vornehmen. Ich zeichne
    gew&ouml;hnlich die Pads f&uuml;r die Bauteile etwas
    gr&ouml;&szlig;er, weil die von Eagle vorgegegebene
    Gr&ouml;&szlig;e f&uuml;r Hobbyzwecke zu klein ist.

    <table border="1" align="left" width="160">
      <tr>
        <td><a href=
        "../../common/images/article236/pic02_boardready.jpg"><img
        src=
        "../../common/images/article236/pic02_boardready_th.jpg"
        width="149" height="132" alt="[after etching]"></a></td>
      </tr>

      <tr>
        <td>Das fertige Board vor dem Bohren der L&ouml;cher</td>
      </tr>
    </table>
    <br>
    <br>
    Aus irgendeinem Grund scheint es unm&ouml;glich f&uuml;r die
    Hersteller von Relais zu sein, sich auf eine
    Anschlu&szlig;belegung zu einigen. Ich habe ein kleines Relai,
    das von Matsushita hergestellt wurde benutzt. Dein Relai wird
    vermutlich anders aussehen und du mu&szlig;t daher die Platine
    anpassen. Das geht am besten mit so einem &auml;tzfesten Edding
    Lackstift. <br>
     <br>
    Wenn Du mit den Bahnen auf der Platine zufrieden bist, kannst Du
    sie in FeCl3 (Eisendreichlorid) &auml;tzen. FeCl3 hat eine gute
    &Auml;tzgeschwindigkeit bei Raumtemperatur. Es ist einfach zu
    benutzen und daher gut f&uuml;r Hobbyzwecke geeignet. Man
    bekommt die besten Ergebnisse, wenn die Platine in der
    &Auml;tzl&ouml;sung steht. Kupferionen sind schwerer als Eisen
    und sammeln sich deshalb am Boden des Gef&auml;&szlig;es an.
    Liegt dort die Platine, so verlangsamt sich die
    &Auml;tzgeschwindigkeit sehr schnell. <br>
    <br>
    Wenn die Platine fertig ist, sp&uuml;hlt man sie mit Wasser ab
    und wischt den Eddingstift mit Terpentin ab. Den Fotolack kann
    man auf den Bahnen lassen. Er verdampft beim L&ouml;ten und
    sch&uuml;tzt die ungel&ouml;teten Bahnen.

    <A NAME="236lfindex5">&nbsp;</A>
<H2>Die Software f&uuml;r deinen Microcontroller</H2>

    Die Software f&uuml;r den Microcontroller ist auf folgende
    Dateien aufgeteilt:

    <ul>
      <li><a href="../../common/src/article236/c/index.html">lcd.c, lcd.h,
      lcd_hw.h</a>: Das ist eine allgemeine LCD Library. Sie
      basiert auf der Arbeit von Peter Fleury
      (http://jump.to/fleury). Diese Version ist jedoch etwas
      modifiziert und flexibler. Man kann die LCD Hardware an
      jeden Pin des Microcontrollers anschlie&szlig;en. Dazu
      mu&szlig; man lediglich die Definitionen in lcd_hw.h
      &auml;ndern.</li>

      <li><a href="../../common/src/article236/c/index.html">avr-util.c,
      avr-util.h</a>: Funktionen zur Zeitverz&ouml;gerung.</li>

      <li><a href="../../common/src/article236/c/index.html">uart.c,
      uart.h</a>: Das ist die Library f&uuml;r das RS232 Interface.
      Es werden Hardwareinterrupts benutzt. Jedesmal, wenn ein
      Zeichen vom Computer empfangen wird, wird die Funktion
      SIGNAL(SIG_UART_RECV) aufgerufen und das Zeichen wird in
      einen String kopiert. Die ASCII Befehle f&uuml;r das
      Kontrollfeld sind so aufgebaut, da&szlig; ein kompletter
      Befehl immer eine Zeile ist (mit Newline endet). Wenn ein
      Newline gefunden wird, dann wird die Variable
      uart_rx_linecomplete gesetzt. Das bedeutet, da&szlig; man die
      Befehle nicht zu schnell hintereinander schicken darf. Es
      mu&szlig; immer einige Millisekunden Pause geben, damit der
      String ausgewertet werden kann, bevor er durch einen neuen
      Befehl &uuml;berschrieben wird. Jeder Befehl wird durch ein
      Ergebnis, ein ok oder err (f&uuml;r Error) beantwortet. Das
      kann man als Ausl&ouml;ser benutzen, um den n&auml;chsten
      Befehl zu schicken.</li>

      <li><a href="../../common/src/article236/c/index.html">analog.c,
      analog.h</a>: Der Programmcode f&uuml;r den Analogdigitalwandler.
      Er funktioniert auch mit Interrupts. Ein
      Konvertierungsvorgang wird gestartet und dann wartet das
      Programm auf den SIG_ADC Interrupt, um das Ergebis aus dem
      ADC Register zu lesen.</li>

      <li><a href="../../common/src/article236/c/index.html">hardwarewd.c,
      hardwarewd.h</a>: Das ist der Code f&uuml;r die Watchdog. Wir
      benutzen einen internen Teiler (durch 1024), um Pulse f&uuml;r
      den Timer zu liefern. Der Timer ist ein 16 bit register. Wenn
      dieses &uuml;berl&auml;uft, dann z&auml;hlen wir eine 8 Bit
      Variable herunter. Bei einem 4MHz Quarz wird diese 8 Bit
      Variable ungef&auml;hr alle 16 Sekunden heruntergez&auml;hlt.
      Das Perlprogramm auf dem Server zeigt, da&szlig; es am Leben
      ist, indem es die 8 Bit Variable regelm&auml;&szlig;ig wieder
      auf einen Anfangswert setzt. Sollte das mal nicht passieren
      (weil der Server h&auml;ngt), dann wird die 8 Bit Variable
      irgendwann auf Null gehen und das Relai macht klick-klack und
      der Server bekommt ein CPU reset.</li>

      <li><a href="../../common/src/article236/c/index.html">linuxlcdpanel.c</a>: Das ist
      das Hauptprogramm. Es &uuml;berpr&uuml;ft
      regelm&auml;&szlig;ig, ob Kommandos am RS232 Interface
      angekommen sind oder einer der Taster gedr&uuml;ckt
      wurde.</li>
    </ul>
    Um die Software im Detail zu verstehen, empfehle ich das
    Datenblatt f&uuml;r den Microcontroller zu lesen. Das
    Datenblatt findet man im Abschnitt Referenzen am Ende des
    Artikels oder auf der Atmel Webseite (www.atmel.com). <br>
    Um jedoch dieses Kontrollfeld benutzen zu k&ouml;nnen, braucht
    man die Software &uuml;berhaupt nicht zu verstehen. Man
    mu&szlig; lediglich den Quellcode auspacken
    (linuxlcdpanel-0.7.tar.gz gibt's auf der <a href="../../common/src/article236/index.html">download Seite</a>) und dann

    <p class="code">make<br>
     make load<br>
    </p>
    tippen. Man kann sogar einfach die schon vorkompilierte
    Software benutzen und sie mit

    <p class="code">make loadprebuild</p>
    in den Microcontroller laden. Ganz einfach. Eine Beschreibung,
    wie man den Microcontroller programmiert und was man dazu
    braucht, findet sich im ersten Artikel: <a href=
    "../March2002/article231.shtml">Den AVR Microcontroller mit GCC
    programmieren</a>.

    <A NAME="236lfindex6">&nbsp;</A>
<H2>Testen</H2>

    Das LCD Kontrollfeld ist so gebaut, da&szlig; man es an die 5V
    interne Stromversorgung im Linux Server anschlie&szlig;en kann
    (rotes Kabel=5V, schwarzes Kabel=Masse=0V). Man sollte die
    Schaltung jedoch niemals sofort und ungetestet an den Computer
    anschlie&szlig;en. Es k&ouml;nnte sein, da&szlig; du einen
    kleinen Fehler beim Aufbau gemacht hast. Die Stromversorgung des
    Rechners ist sehr leistungsf&auml;hig und ein Fehler
    k&ouml;nnte den Rechner besch&auml;digen und die Schaltung in
    Rauch aufgehen lassen. <br>
    Man sollte zum Testen eine strombegrenzte und elektronisch
    stabilisierte Laborspannungsquelle benutzen. Nachdem die
    Versorgungsspannung angeschlossen ist, kann man die Software
    wie oben angegeben in den EEPROM laden. Sobald das geschehen
    ist, sollte man einen Lauftext mit "linuxfocus.org" in der LCD
    Anzeige sehen. Als n&auml;chstes wird die RS232 Schnittstelle
    angeschlossen:

    <p class="code">MAX232 Pin 14 an CTS (DB-9 Pin 8)<br>
     MAX232 Pin 7 an RXD (DB-9 Pin 2)<br>
     MAX232 Pin 13 an TXD (DB-9 Pin 3)<br>
    Man mu&szlig; au&szlig;erdem DTR, DSR und CD miteinander
    verbinden (DB-9 Pin 4, 6 und 1)</p>
    Das ist auch kurz in dem Schaltplan oben angegeben. <br>
     <br>
     <a href=
    "../../common/images/article236/test_with_cat.gif"><img src=
    "../../common/images/article236/test_with_cat_th.gif" width=
    "235" height="194" alt=
    "[talking to the LCD panel over the serial line]" hspace="5"
    align="right"></a> Bevor man die serielle Schnittstelle
    benutzen kann, mu&szlig; man sie initialisieren. Das
    Quellcodearchiv, linuxlcdpanel-0.7.tar.gz, enth&auml;lt ein
    Programm namens ttydevinit, das diese Initialisierung
    &uuml;bernimmt. Falls das Kontrollfeld und COM2 (ttyS1)
    angeschlossen sind, dann mu&szlig; man einmal folgendes Kommando
    ausf&uuml;hren:

    <p class="code">./ttydevinit /dev/ttyS1</p>
    Nun ist die serielle Schnittstelle im Server initialisiert
    f&uuml;r eine &Uuml;bertragungsrate von 9600 Baud und du kannst
    mit dem Kontrollfeld "reden". Dazu &ouml;ffnet man zwei xterm
    Fenster. In einem tippt man "cat /dev/ttyS1" und in dem anderen
    "cat &gt; /dev/ttyS1". Nun kann man z.B l=11 (LED 1 wird
    eingeschaltet) oder l=10 (LED 1 aus) eintippen. In dem ersten
    xterm Fenster sieht man, da&szlig; das Kontrollfeld immer auf
    die Befehle mit "ok" antwortet.<br>
    Alle verf&uuml;gbaren Befehle sind in der Datei <a href="../../common/src/article236/c/index.html">README.commands</a>
    erkl&auml;rt.<br>
    <br>
    Das Quellcodearchiv enth&auml;lt auch ein Perlscript namens
    ttytest.pl, das nichts anderes macht, als die rote LED in
    Abst&auml;nden ein und wieder auszuschalten. Es ist gedacht als
    ein einfaches Beispielprogramm, in dem man sehen kann, wie das
    Kontrollfeld angesteuert wird. Du kannst es benutzen, um deine
    eigenen Programme zu schreiben. Dazu brauchst Du nur
    Grundkenntnisse in Perl.

    <A NAME="236lfindex7">&nbsp;</A>
<H2>Die Watchdog anschlie&szlig;en</H2>

    Die Watchdog ist standardm&auml;&szlig;ig aus. Man schaltet sie
    mit dem Befehl w=1 an und man setzt die Zeit mit s=x, wobei x
    einen Wert zwischen 1 und 255 haben mu&szlig;. s=10 setzt den
    Watchdog-timeout auf 10*16sec=160sec. Das Ansteuerprogramm
    mu&szlig; diesen Wert periodisch setzen, um zu verhindern,
    da&szlig; die Watchdog zuschl&auml;gt. Falls sich der Server
    irgendwann mal aufh&auml;ngt, dann wird dieser Wert nicht
    gesetzt, und wenn er auf Null heruntergez&auml;hlt hat, gibt es
    einen Reset. Linuxserver sind sehr stabil und bleiben fast nie
    stehen. Wenn es jedoch mal passiert, ist meist niemand da, der den
    Resetknopf dr&uuml;cken k&ouml;nnte oder niemand wei&szlig;, wo der
    Server steht, weil er noch nie Probleme gemacht hat.<br>
    <br>
    Die Watchdog ist so gebaut, da&szlig; sie nur einmal
    zuschl&auml;gt. Das verhindet, da&szlig; sie w&auml;hrend des
    vermutlich folgenden Filesystem Check schon wieder
    zuschl&auml;gt. <br>
     <br>
    Um die Watchdog physikalisch anzuschlie&szlig;en, mu&szlig; man
    die zwei Dr&auml;hte finden, die zu dem Resettaster am Server
    f&uuml;hren. Das Relai unserer Watchdog wird parallel dazu
    angeschlossen.

    <A NAME="236lfindex8">&nbsp;</A>
<H2>Wie man die Watchdog benutzt</H2>

    Die Watchdog stellt sicher, das der Server immer Programme
    ausf&uuml;hren kann. Sie stellt nicht sicher, da&szlig; ein
    Webserver l&auml;uft oder die Datenbank antwortet. Um so etwas
    zu &uuml;berpr&uuml;fen, sollte man crontab oder ein anderes
    Programm benutzen. Man kann recht sicher sein, da&szlig;
    crontab vermutlich funktioniert, weil die Watchdog sicherstellt,
    da&szlig; Software im allgemeinen immer noch ausgef&uuml;hrt
    werden kann.<br>
    <br>
    Man kann z.B ein Script schreiben, das von cronjob
    regelm&auml;&szlig;ig ausgef&uuml;hrt wird und alle 15 Minuten
    eine Webseite von dem Webserver herunterl&auml;dt. Es ist
    jedoch Vorsicht geboten. Ein Webserver kann mit zu vielen
    Anfragen &uuml;berladen sein. In diesem Fall ist es normal,
    da&szlig; er nicht alle beantwortet. Man sollte daher
    z&auml;hlen, wie oft der Server versagt hat und ihn erst
    &uuml;ber das Script rebooten, falls er z.B die letzten 10 mal
    nicht geantwortet hat. Hier reicht ein normaler reboot
    (shutdown -r), ein Reset &uuml;ber die Watchdog ist nicht
    erforderlich. <br>
    <br>
    Abgesehen von den Applikationen sollte man auch den freien
    Plattenplatz &uuml;berwachen. Das folgende Shellscript gibt z.B.
    nur etwas zur&uuml;ck, wenn 80% oder mehr von einer Partition belegt
    sind.

    <p class="code">df | egrep ' (8.%|9.%|100%) '</p>
    &Uuml;ber crontab kann man damit regelm&auml;&szlig;ig
    pr&uuml;fen, ob noch genug Platz vorhanden ist und eine e-Mail
    schicken, wenn der Platz knapp wird (corntab verschickt
    Bildschirmausgaben automatich per e-Mail).

    <A NAME="236lfindex9">&nbsp;</A>
<H2>Die Scripte auf dem Server</H2>

    Fast die gesamte Logik f&uuml;r unser Linux LCD Kontrollfeld
    ist in einem Perlscript namens llp.pl implementiert. Kopiere
    diese Datei nach /usr/sbin/. Als n&auml;chstest kopiere die
    Datei ttydevinit nach /usr/bin und die Datei ifconfig_llp.txt
    (aus dem etc Verzeichnis im Quellcodearchiv) nach /etc. Nun
    editiere die Datei ifconfig_llp.txt und &auml;ndere die
    Adressen wie gew&uuml;nscht.

    <p class="code">NETMASK=255.255.255.0<br>
     IPADDR=10.0.0.4<br>
     GATEWAY=10.0.0.2</p>
    Nun sollte man eine Sicherheitskopie der Datei
    /etc/rc.d/init.d/network erstellen und dann die Datei
    etc/network aus dem Quellcodearchiv nach
    /etc/rc.d/init.d/network kopieren. Dieses Script und die
    Verzeichnisnamen beziehen sich auf Redhat und Mandrake. Das
    Script etc/network_all_distributions ist ein etwas einfacheres
    Script, das f&uuml;r alle Distributionen geeignet ist, man
    mu&szlig; jedoch selbst herausfinden, wo in einer gegebenen
    Linuxdistribution die init-rc Verzeichnise sind. Das ist immer
    etwas unterschiedlich von Linuxdistribution zu Linuxdistribution.<br>
     <br>
    Editiere nun die Datei /etc/rc.d/init.d/network und &auml;ndere
    die Zeile

    <p class="code">/usr/sbin/llp.pl /dev/ttyS1&amp;,</p>
    falls du nicht COM2 benutzt. <br>
    <br>
    Nun kann man

    <p class="code">/etc/rc.d/init.d/network start</p>
    tippen und das Kontrollfeld f&uuml;llt sich mit Leben. Beachte:
    es ist unproblematisch, die IP Adressen &uuml;ber das
    Kontrollfeld zu &auml;ndern. Sie werden erst beim n&auml;chsten
    Reboot wirksam. Man kann daher alles austesten und
    anschlie&szlig;end die Werte wieder zur&uuml;cksetzen (man kann
    auch einfach die Datei /etc/ifconfig_llp.txt editieren, um die
    &Auml;nderungen r&uuml;ckg&auml;ngig zu machen).

    <A NAME="236lfindex10">&nbsp;</A>
<H2>Log files</H2>

    Das llp.pl Script schreibt ein Logfile nach /var/log/llp.log.
    Diese Datei wird nur sehr langsam gr&ouml;&szlig;er. Es sollte
    normalerweise keine Notwendigkeit geben, sie &uuml;ber logrotate
    zu rotieren. Man kann es jedoch machen. Es ist kein post rotate
    Befehl in logrotate dazu n&ouml;tig. Ein Konfigurationseintrag
    f&uuml;r logrotate k&ouml;nnte so aussehen:

    <p class="code">/var/log/llp.log {<br>
     nocompress<br>
     monthly<br>
    }<br>
    </p>
    Das Log enth&auml;lt Eintr&auml;ge, wenn das System manuell
    heruntergefahren wird, eine IP Adresse ge&auml;ndert wurde
    (IP, GW, netmask) oder wenn es einen Watchdog Reset gab.
    Naturgem&auml;&szlig; kann man den Watchdog Timeout nicht
    loggen, wenn er passiert. Er wird beim n&auml;chsten Hochfahren
    in das Log geschrieben.

    <A NAME="236lfindex11">&nbsp;</A>
<H2>Das Kontrollfeld im Betrieb</H2>

    Hier sind einige Fotos der LCD Anzeige. Es sind nur Beispiele.
    Die Anzeige verf&uuml;gt &uuml;ber wesentlich mehr
    M&ouml;glichkeiten und man kann seine eigenen Sachen
    hinzuf&uuml;gen. <br>
     <br>
    Das Hauptmen&uuml;. Es zeigt einen Namen (Linuxfocus in diesem
    Fall) und die Uptime sowie CPU load. Es &auml;ndert sich
    periodisch von selbst.<br>
     <img src=
    "../../common/images/article236/display_inaction1.jpg" width=
    "395" height="137" alt="[main]"> <br>
     <br>
     Das IP Konfigurationsmen&uuml;<br>
     <img src=
    "../../common/images/article236/display_inaction2.jpg" width=
    "395" height="127" alt="[IP configuration menu]"> <br>
     <br>
    Ein Beispiel, wie die IP Adresse gerade ge&auml;ndert wird.<br>
     <img src=
    "../../common/images/article236/display_inaction3.jpg" width=
    "395" height="124" alt="[change IP]"> <br>
     <br>
    ... und wie die Gateway Adresse (default route) ge&auml;ndert
    wird<br>
     <img src=
    "../../common/images/article236/display_inaction5.jpg" width=
    "395" height="128" alt="[GW]">

    <A NAME="236lfindex12">&nbsp;</A>
<H2>Zusammenfassung</H2>

    <img src=
    "../../common/images/article236/linuxlcdpanelfinal.jpg" width=
    "386" height="275" alt="[the final panel]" align="right"> Um
    dieses Kontrollfeld zu bauen, ist etwas an Hobbyelektronikgeschick n&ouml;tig,
     aber es ist keine komplizierte Schaltung.
    Dieses Linux Kontrollfeld bietet mehr Funktionen als jedes
    andere LCD Bedienfeld, das ich bisher gesehen habe, es ist sehr
    allgemein gehalten und preiswert.<br>
    <br>
    Frohes l&ouml;ten :-) <br clear="all">


    <A NAME="236lfindex13">&nbsp;</A>
<H2>Referenzen</H2>


    <ul>
      <li>Die uisp AVR Programmiersoftware: <a href=
      "http://www.amelek.gda.pl/avr/">www.amelek.gda.pl/avr/</a></li>

      <li>Der Quellcode f&uuml;r diesen Artikel <a href=
      "../../common/src/article236/linuxlcdpanel-0.7.tar.gz">linuxlcdpanel-0.7.tar.gz</a><br>

      Der Schaltplan, die Eagle Dateien und ein paar Fotos sind
      auch enthalten.</li>

      <li>Alle Software und Dokumentation <a href="../../common/src/article236/index.html">aus diesem Artikel</a></li>

      <li>Datenblatt f&uuml;r MAX232 <a href=
      "../../common/src/article236/MAX220-MAX249.pdf">MAX220-MAX249.pdf
      448K</a></li>

      <li>Datenblatt f&uuml;r ST232, eine billige Variante, oft
      anstelle des echten MAX232 verwendet. <a href=
      "../../common/src/article236/st232.pdf">st232.pdf
      100K</a></li>

      <li>Datenblatt f&uuml;r Atmel AT90S4433 <a href=
      "../../common/src/article231/avr4433.pdf">avr4433.pdf
      2356K</a></li>

      <li>Die Atmel Webseite: <a href=
      "http://www.atmel.com/">www.atmel.com</a></li>

      <li>Eagle f&uuml;r Linux <a href=
      "http://www.cadsoftusa.com/">cadsoftusa.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=236">&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: Guido Socher (<a href="http://linuxfocus.org/~guido/"><font size="1">homepage</font></a>)</font></td></tr>
</TABLE>
</TD>
</TR></TABLE></CENTER>
<p><font size=1>2005-02-11, generated by lfparser version 2.52</font></p>
<!-- 2pdaIgnoreStop -->
</BODY>
</HTML>