<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Johnjohn</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Johnjohn"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Johnjohn"/>
	<updated>2026-04-10T23:29:39Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Schaltplaneditoren&amp;diff=61410</id>
		<title>Schaltplaneditoren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Schaltplaneditoren&amp;diff=61410"/>
		<updated>2011-11-04T04:33:53Z</updated>

		<summary type="html">&lt;p&gt;Johnjohn: /* Inkscape */  Fehlerhaften Link korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== AACircuit ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AACircuit&#039;&#039;&#039; ist ein Schaltplaneditor mit einer Ausgabe als ASCII-Grafik. Das Programm wurde dafür entwickelt, um mal eben eine Frage oder eine Antwort in &#039;&#039;newsgroups&#039;&#039;, Chats oder Foren zu veranschaulichen, wenn keine Upload-Möglichkeit von Bilddateien da ist. AACircuit gibt es bei http://www.tech-chat.de/&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  .---o----o------o---o---------------o---o----o------------o 12-15V&lt;br /&gt;
  |   |    |  22uF| + |               |   |    |&lt;br /&gt;
 .-.  |   .-.    ###  |              .-.  |    |    .-------o&lt;br /&gt;
 | |&amp;lt;-&#039;   | |    ---  |              | |  |    |    |   .---o&lt;br /&gt;
 | |5k    | |5k6  |   |              | |  |    |    |   |&lt;br /&gt;
 &#039;-&#039;      &#039;-&#039;     |   o--.           &#039;-&#039;  |   _|_   o  /o&lt;br /&gt;
  |        |     ===  |  |            |   |  |_/_|-   /&lt;br /&gt;
 .-.       |     GND  | ---100n   LED V   -    |     /&lt;br /&gt;
 | |       |          | ---           -   ^    |    o&lt;br /&gt;
 | |6k2    |          |  |            |   |    |    |&lt;br /&gt;
 &#039;-&#039;       |          | GND           &#039;---o----o    &#039;-------o&lt;br /&gt;
  |        |       2|\|7                       |&lt;br /&gt;
  o-----------------|-\ LM741      ___       |/&lt;br /&gt;
  |        |        |  &amp;gt;-------o--|___|--o---|&lt;br /&gt;
  |        o---o----|+/ 6      |   22k   |   |&amp;gt;  BC547&lt;br /&gt;
  |        |   |   3|/|4       |         |     |&lt;br /&gt;
 .-.       |   |     ===       o---.    .-.    |&lt;br /&gt;
 | |       |   o---. GND       |   |    | |5k6 |&lt;br /&gt;
 | |2k7   .-.  |   |   ___    _V_  |    | |    |&lt;br /&gt;
 &#039;-&#039;     KTY10 | + &#039;--|___|--|___|-&#039;    &#039;-&#039;    |&lt;br /&gt;
  |       | | ###      47k   220k        |     |&lt;br /&gt;
  |       &#039;-&#039; ---                        |     |&lt;br /&gt;
  |        |   |                         |     |&lt;br /&gt;
  |        |   |                         |     |&lt;br /&gt;
  &#039;--------o---o-------------------------o-----o------------o GND&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BAE ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B&#039;&#039;&#039;artels &#039;&#039;&#039;A&#039;&#039;&#039;uto &#039;&#039;&#039;E&#039;&#039;&#039;ngineer unterstützt die Erstellung von Schaltplänen, Leiterplatten und integrierten Schaltungen und läuft unter Windows, Linux und verschiedenen X11-/Unix-Systemen. Der Schaltplaneditor kann Pläne auf beliebig vielen Blättern erstellen, wobei auch hierarchische Strukturen möglich sind. Der Autorouter erzeugt recht brauchbare Ergebnisse, wobei beliebige Teile mit der Hand vorab geroutet werden können. Ein Autoplacer ist ebenfalls vorhanden.&lt;br /&gt;
&lt;br /&gt;
Eine auf Schaltplaneingabe beschränkte Version und eine kastrierte Evaluierungsversion sind auf der [http://www.bartels.de/bae/bae_de.htm BAE Homepage] downloadbar.&lt;br /&gt;
&lt;br /&gt;
Die [http://www.bartels.de/bae/baeprice_de.htm preiswerteste] kostenpflichtige Version ist das &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;BAE Light&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;. Diese Version ist auf Leiterplatten der Groesse 180x120 mm² und auf 2 Lagen beschränkt, eine Beschränkung auf eine bestimmte Pinanzahl gibt es aber nicht.&lt;br /&gt;
&lt;br /&gt;
Ansonsten wird eine Economy-, Professional- und Highendversion angeboten, die jeweiligen Eigenschaften sind im Abschnitt [http://www.bartels.de/baedoc/inst_de.htm Bartels AutoEngineer Softwarekonfigurationen] erklärt. Interessant ist z.&amp;amp;nbsp;B. der Bauteilhöhencheck.&lt;br /&gt;
&lt;br /&gt;
Mit dem &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;BAE IC Design&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; dringt man bis in den Bereich der IC-Entwicklung vor.&lt;br /&gt;
&lt;br /&gt;
[[BAE-Tutorial]]&lt;br /&gt;
&lt;br /&gt;
== Basic Schematic == &lt;br /&gt;
&lt;br /&gt;
[[Bild:Base schematic example.png|right|thumb|Screenshot Base Schematic]]&lt;br /&gt;
&lt;br /&gt;
Basic Schematic (&#039;&#039;&#039;BSch3V&#039;&#039;&#039;) ist ein freier Schaltplaneditor für Windows (98/Me/2000/XP). Es enthält einen Component Library Editor, einen Parts List Generator und einen Netlist Generator, sowie eine Automatic Numbering Funktion.&lt;br /&gt;
&lt;br /&gt;
Ein ZIP-Archiv mit engl. Programm, Handbuch und Sourcecode gibt es bei http://www.suigyodo.com/online/e/index.htm.&lt;br /&gt;
&lt;br /&gt;
Ebenso ist dort eine Cross-Plattform Version &#039;&#039;&#039;Qt-BSch3V&#039;&#039;&#039; auf der Basis von Qt-Grafiklibraries erhältlich.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist bis dato (2011) gut gepflegt.&lt;br /&gt;
&lt;br /&gt;
== BlackBoard Breadboard Designer == &lt;br /&gt;
&lt;br /&gt;
[[Bild:BlackBoard.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;BlackBoard Breadboard Designer&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; ist ein freier Editor für Lochrasterplatinen Layouts, der das Planen der Bauteilplazierung sowie der beidseitigen Verdrahtung deutlich vereinfacht und sich u.a. auch für die Dokumenation solcher Prototypenaufbauten eignet.&lt;br /&gt;
&lt;br /&gt;
Er läuft auf allen Plattformen für die eine Java Runtime zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Homepage von Blackboard ist unter http://blackboard.serverpool.org zu erreichen. Blackboard steht unter Der GPL V2 und wird ständig weiterentwickelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DipTrace ==&lt;br /&gt;
&lt;br /&gt;
Design-Editor für PCB-Leiterplatten für Windows NT, 2000, XP, Server 2003&lt;br /&gt;
- erweiterte Pro-Version erlaubt den Export in DXF, Gerber und N/C Drill sowie Leiterplattenlayouts mit mehr als 250 Pins.&lt;br /&gt;
&lt;br /&gt;
http://www.diptrace.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eagle ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Eagle.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;Eagle&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; von Cadsoft ist nicht nur ein &amp;lt;b&amp;gt;Schaltplaneditor&amp;lt;/b&amp;gt;, sondern ein komplettes Paket mit &amp;lt;b&amp;gt;Layoutprogramm&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;Autorouter&amp;lt;/b&amp;gt;. Das hat den Vorteil, dass man einen erstellten Schaltplan gleich zur Platine weiterverarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Mitgeliefert werden umfangreiche Symbol- bzw. Bauteilbibliotheken, von Widerständen in allen Bauformen über Taster bis hin zu [[AVR]]s. Eine Library für viele aktuelle AVRs findet sich im Download-Bereich &lt;br /&gt;
von [http://www.embedit.de http://www.embedit.de].&lt;br /&gt;
&lt;br /&gt;
Eagle läuft unter Linux, Windows (2000/XP/Vista/7) und Mac OS X.&lt;br /&gt;
&lt;br /&gt;
Eine für nichtkommerzielle Anwendungen kostenlose Version ist von [http://www.cadsoft.de/ CadSoft] erhältlich. Diese ist auf zweilagige Platinen im halben Euro-Format (80x100mm) sowie Schaltpläne mit nur einer Seite beschränkt.&lt;br /&gt;
&lt;br /&gt;
=== 3D-Ansicht===&lt;br /&gt;
[[Bild:Stereobild-elektronik-3d.jpg|right|thumb|Rot-Grün-Stereo-Bild]]&lt;br /&gt;
Zum Betrachten des fertigen, bestückten Platinenentwurfs in Form eines 3D-Bilds bietet sich das Paket [http://www.matwei.de/doku.php?id=en:eagle3d:eagle3d eagle3D] an. Mit Hilfe eines ULP wird eine Beschreibungsdatei für den open source Renderer &amp;lt;i&amp;gt;POVray&amp;lt;/i&amp;gt; erzeugt, welche dann anschließend halbautomati generiert werden kann. Auch Bewegungsanimation und KAmeraflug ist möglich. Es wird bereits ein große Zahl an Bauteilen unterstützt.&lt;br /&gt;
&lt;br /&gt;
Anwendungshinweise:&lt;br /&gt;
* [[Eagle im Hobbybereich]]&lt;br /&gt;
* [http://gaussmarkov.net/wordpress/category/tools/software/eagle/ Eagle CAD Tutorial] im Blog von gaussmarkov: diy fx (englisch)&lt;br /&gt;
* [[Stereobilder mit EAGLE 3D]]&lt;br /&gt;
&lt;br /&gt;
== FreePCB ==&lt;br /&gt;
&lt;br /&gt;
FreePCB ist ein freier, open-source PCB editor für Microsoft Windows, der unter der GNU General Public License veröffentlicht wurde. Er wurde entwickelt, um ihn einfach erlernen und nutzen zu können und dennoch für professionellesArbeiten geeignet. Er besitzt keinen eingebuten Auto Router, kann jedoch den web-basierten auto router auf www.freerouting.net verwenden.&lt;br /&gt;
&lt;br /&gt;
== Electric ==&lt;br /&gt;
&lt;br /&gt;
Das [http://www.staticfreesoft.com/index.html Electric(TM)] VLSI Design System ist ein Open Source Electronic Design Automation (EDA) System.&lt;br /&gt;
&lt;br /&gt;
== ExpressPCB ==&lt;br /&gt;
&lt;br /&gt;
Die Firma &amp;lt;b&amp;gt;ExpressPCB&amp;lt;/b&amp;gt; bietet den kostenlosen Schaltplaneditor &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;ExpressSCH&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; an. Zusätzlich gibt es das kostenlose Layoutprogramm &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;ExpressPCB&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; zum Erstellen von zwei- und vierlagigen Leiterplatten. Die beiden Programme sind auf Windows (NT, 2000, XP, Vista) beschränkt. Die Firma bietet auf der [http://www.expresspcb.com/ ExpressPCB Homepage] ausserdem einen kommerziellen Service für die Herstellung von zwei- und vierlagigen Leiterplatten an. Auf der Seite finden sich [http://www.expresspcb.com/ExpressPCBHtm/Tips.htm hier] einige Hinweise zum Entwurf von Leiterplatten.&lt;br /&gt;
&lt;br /&gt;
== FidoCadJ ==&lt;br /&gt;
&lt;br /&gt;
[http://davbucci.chez-alice.fr/index.php?argument=elettronica/fidocadj/fidocadj.inc&amp;amp;language=English FidoCadJ] is a very easy to use editor, with a library of electrical symbols and footprints (through hole and SMD). Albeit its ease of use, it is a very immediate and effective EDA tool for the hobbyst. FidoCadJ stores its drawings in a compact text format. This choice is well suited for the copy and paste in newsgroups and forums. This explains the success of FidoCadJ in Usenet groups and in several portals. FidoCadJ is multi-platform Java program and runs on MacOSX, Linux and Windows. FidoCadJ and its manuals are in english, french and italian. Lizenz: Creative Commons 3.0 BY-NC-ND&lt;br /&gt;
&lt;br /&gt;
== Fritzing ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fritzing&#039;&#039;&#039; verwendet die Metapher eines Breadboards (Steckbretts), auf dem die Benutzer virtuell Bauteile einstecken. Fritzings Zielgruppe sind Künstler, Designer und Hobbyisten aber nicht unbedingt Profielektroniker, und die Software soll speziell auf die Zielgruppe zugeschnitten werden. Dabei wird auf eine niedrige Zugangsschwelle wert gelegt. Versionen für Mac OS X, Linux und Windows (XP/Vista) sind bei http://www.fritzing.org/ erhältlich.&lt;br /&gt;
&lt;br /&gt;
== Gschem ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gschem.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; ist der Schaltplaneditor aus dem Open Source Projekt gEDA. &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; wird hauptsächlich auf Linux Rechnern entwickelt, läuft aber auch auf anderen Unix-Betriebssystemen und unter Windows. &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; ist für die Linuxdistributionen RedHat und Debian als Paket verfügbar, für Windows ist nur eine ältere Version erhältlich und für alle anderen ist selber kompilieren angesagt.&lt;br /&gt;
&lt;br /&gt;
Die Bedienung ist nicht sonderlich anfängerfreundlich. Hat man sich aber mal daran gewöhnt, dass jeder Menupunkt mit 1 oder 2 Tasten erreichbar ist, läßt sich&#039;s mit &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; prima arbeiten. &lt;br /&gt;
&lt;br /&gt;
In der Symbolbibliothek (die auch online betrachtet werden kann) sind etwas mehr als 1000 Symbole; das Selbsterzeugen von Symbolen ist jedoch problemlos möglich. Insbesondere ist es aufgrund des gut dokumentierten und einfachen Datei-Formates möglich, mit einfachen Perl-Programmen z.&amp;amp;nbsp;B. aus Reports von Xilinx ISE Symbole zu erzeugen und automatisch zu aktualisieren, wenn sich die Pinzuordnung ändert. Das fehlerhafte Eingeben der Pinbelegung von CPLDs und FPGAs von Hand und die Änderung derselben ist damit für &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; User Geschichte.&lt;br /&gt;
&lt;br /&gt;
Die Schaltpläne lassen sich als png und als Postscript exportieren. &lt;br /&gt;
&lt;br /&gt;
Netzlisten (insgesamt über 20 Formate für PCB, Protel, Eagle, BAE, spice, pads, ... ) lassen sich mit dem Programm &amp;lt;i&amp;gt;gnetlist&amp;lt;/i&amp;gt; generieren. Aus diesem Grund ist man (bis auf die Namen der Footprints) unabhängig von der verwendeten Layout-Software und kann diese auch sehr leicht wechseln.&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil der gEDA-Suite sind die Dateiformate, welche alle reiner ASCII-Text sind. Dies macht die Entwicklung von Helper-Tools zur Lösung von speziellen Aufgaben sehr leicht. Außerdem können die Dateien deswegen sehr einfach in Versionsverwaltungssystemen wie CVS verwaltet werden, was insbesondere die Entwickler größerer Projekte zu schätzen wissen.&lt;br /&gt;
&lt;br /&gt;
Nähere Informationen über &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; (gEDA) gibt es unter [[http://www.geda.seul.org/ http://www.geda.seul.org/]].&lt;br /&gt;
&lt;br /&gt;
== Inkscape ==&lt;br /&gt;
&lt;br /&gt;
Etwas bekannter noch als Jfig ist [http://inkscape.org/ &#039;&#039;&#039;Inkscape&#039;&#039;&#039;], ebenfalls ein reines Vektorzeichenprogramm, das vor allem (aber nicht nur) SVG-Dateien erstellt, die mit der Wikipedia eine große Verbreitung gefunden haben. Es ist in fast jeder gängigen Linux Distribution enthalten, eine Windowsversion sowie eine [http://portableapps.com/apps/graphics_pictures/inkscape_portable &#039;&#039;&#039;portable Windowsversion&#039;&#039;&#039;] existiert auch. In der Wikipedia findet sich eine Sammlung von Elektroniksymbolen im [http://commons.wikimedia.org/wiki/Category:SVG_electrical_symbols SVG-Format] und [http://commons.wikimedia.org/wiki/File:Electrical_symbols_library.svg hier]. Als Beispiele damit gezeichneter Schaltpläne sei diese [http://commons.wikimedia.org/wiki/Category:Created_with_electrical_symbols_library] genannt.&lt;br /&gt;
&lt;br /&gt;
== JFig ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Jfig.png|right|thumb|Screenshot]]&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;JFig&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; ist eigentlich ein &amp;quot;ganz normales&amp;quot; Vektorzeichenprogramm. Um Schaltpläne zu zeichnen benötigt man deshalb zusätzliche Symbolbibliotheken. &lt;br /&gt;
&lt;br /&gt;
Die Exportmöglichkeiten für das weitverbreitete fig-Format sind sehr vielfältig: mit dem Zusatzprogramm &amp;lt;i&amp;gt;fig2dev&amp;lt;/i&amp;gt;, das direkt aus dem &amp;lt;i&amp;gt;jfig&amp;lt;/i&amp;gt;-Menü aufgerufen kann, bleiben von Postscript über PNG bis hin zu [[LaTeX]] kaum Wünsche offen. Für kleine Schaltpläne oder Diagramme, die ausgedruckt oder in PDF-Dateien verbreitet werden sollen, gibt es deshalb nichts besseres.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist ein komplett in [http://java.sun.com/ Java] geschriebener 1:1-Klon des [[Linux]]-Programms &amp;lt;i&amp;gt;xfig&amp;lt;/i&amp;gt; und sollte daher mit jedem Betriebssystem von Windows bis Mac OS laufen. Es ist kostenlos auf [http://tams-www.informatik.uni-hamburg.de/applets/jfig/ http://tams-www.informatik.uni-hamburg.de/applets/jfig/] erhältlich. (Leider ist der Download schon geraume Zeit nicht mehr möglich. Zitat von der Seite: &amp;quot;Sorry. Recently, I got two serious bug reports which have now been confirmed, and jfig downloads are suspended until these have been resolved.&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
Die Bedienung wird für Windows-Benutzer am Anfang wohl ziemlich ungewohnt sein, aber wenn man mal das Grundprinzip verstanden, hat findet man sich durch die eindeutig beschrifteten Schaltflächen schnell zurecht.&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
[[Bild:kicad1.gif|right|thumb|Screenshot]]&lt;br /&gt;
[[Bild:kicad2.gif|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
[[KiCAD]] ([http://www.lis.inpg.fr/realise_au_lis/kicad/ Homepage&amp;amp;Download]) ist ein Paket aus Design / Layout / Routing Programmen. Es basiert auf wxWidgets und ist damit plattformübergreifend. Die Progamme sind unter der GPL veröffentlicht und damit Open Source.&lt;br /&gt;
&lt;br /&gt;
Eine Kicad User-Group findet sich unter http://groups.yahoo.com/group/kicad-users/. Die Anmeldung erfolgt erst, nachdem man vom Besitzer der User-Group freigeschaltet wurde (wie üblich für die meisten Yahoo-Groups).&lt;br /&gt;
&lt;br /&gt;
Neben der mitgelieferten, bereits umfangreichen Bibliothek gibt es auf vielen anderen Seiten (z.&amp;amp;nbsp;B. http://www.kicadlib.org/) weitere Bibliotheken zum Download, die einfach integriert werden können.&lt;br /&gt;
&lt;br /&gt;
Für Umsteiger von anderen Programmen sollten sich nach wenigen Stunden bereits die gleichen Ergebnisse erzielen lassen. Beim Erlernen kann das Tutorial von http://www.curiousinventor.com/guides/kicad helfen.&lt;br /&gt;
&lt;br /&gt;
Kicad liefert eine schöne 3D-Ansicht des fertigen Layouts einschließlich der bestückten Bauteile, so dass man an dieser Stelle schon einmal einen Überblick bekommt, ob vielleicht nicht doch etwas vergessen wurde. Es gibt zwar nicht für alle Bauformen ein 3D-Modell, allerdings lassen sich diese selbst erstellen.&lt;br /&gt;
&lt;br /&gt;
Als Nachteil ließe sich noch aufführen, dass der PCB-Layouter in der Version vom Januar 2006 etwas instabil ist und gerne abstürzt. Die Version vom Mai 2010 läuft aber sehr stabil. Ebenso sind die Autorouterfunktionen nicht gut dokumentiert. Ein weiterer Kritikpunkt wäre, dass die offizielle Symbolbibliothek nur amerikanische, aber keine europäischen Schaltplansymbole enthält.&lt;br /&gt;
&lt;br /&gt;
== Lochmaster ==&lt;br /&gt;
&lt;br /&gt;
[http://www.abacom-online.de/html/lochmaster.html Lochmaster] ist ein Programm zur Erstellung von Layouts speziell auf [[Lochrasterplatine]]n. Schaltplan und Layout sind ein und das selbe.&lt;br /&gt;
&lt;br /&gt;
== PCB ==&lt;br /&gt;
&lt;br /&gt;
[http://pcb.sourceforge.net/index.html PCB] ist ein freies (open source) Layoutprogramm inklusive Autorouter. Zum Zeichnen der Schaltpläne kann [[Schaltplaneditoren#Gschem|Gschem]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; wurde ursprünglich für den Atari ST entwickelt und später nach &lt;br /&gt;
Unix portiert. &amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; läuft meist unter Linux, kann allerdings mit [http://www.cygwin.com/ Cygwin] auch unter Windows betrieben werden.&lt;br /&gt;
&lt;br /&gt;
Als Ausgabeformate stehen [http://de.wikipedia.org/wiki/Postscript Postscript] und Gerber RS-274-X zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil von &amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; ist, dass alle Funktionen auch über &lt;br /&gt;
Hotkeys gesteuert werden können, was insbesondere nach längerer Einarbeitungszeit ein großer Gewinn gegenüber manchen Windows-Programmen ist.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung ist es meines Erachtens sehr wichtig, sich das [http://www.geda.seul.org/wiki/geda:gsch2pcb_tutorial Tutorial] durchzulesen. &amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; und &amp;lt;i&amp;gt;Gschem&amp;lt;/i&amp;gt; sind nicht besonders einfach zu benutzen. Gerade am Anfang, wenn man sich versucht damit einzuarbeiten. Aber wenn man einmal mit dem Werkzeug arbeiten kann, wird man es nicht mehr missen wollen.&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Einstellungen &amp;amp; Tips ===&lt;br /&gt;
&lt;br /&gt;
Die neue GTK+ Version aus dem CVS Archiv ist der alten, etwas angestaubten Version vorzuziehen. Auch das Kompilieren ist nicht wirklich schwierig. Alles, was dazu notwendig ist (und das Programm hat keine großen Abhängigkeiten), ist in der Readme erklärt. Somit fällt die Kompilierung recht einfach aus.&lt;br /&gt;
&lt;br /&gt;
Auf der linken Seite befindet sich die Auswahl der jeweiligen Layer. Gerade bei Verwendung des Autorouters sollte man hier den 2. Layer deaktivieren. Dies kann ganz einfach mit einem Klick auf die Beschriftung erfolgen (component, GND-comp und VCC-comp). Ebenso sollte man unused (grün) und unused (blau) deaktivieren.&lt;br /&gt;
&lt;br /&gt;
Als Route Style verwende ich den &#039;&#039;Power Style&#039;&#039; mit einer Dicke von 25 Mil (0.6 mm). Der &#039;&#039;Signal Style&#039;&#039; scheint mir gerade bei schlechten Belichtungsverhältnissen nicht ganz optimal zu sein.&lt;br /&gt;
&lt;br /&gt;
=== Autorouter ===&lt;br /&gt;
&lt;br /&gt;
Der Autorouter von &amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; hat einige Schwächen, welche allerdings bei Hobby-Projekten völlig belanglos sind: Beispielsweise kann es bei TQFP-Gehäusen mit 100 Pins u. 0.5mm Pinabstand zu Problemen kommen, 64polige TQFP-Gehäuse (z.&amp;amp;nbsp;B. vom ATmega 128) gehen jedoch ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Hat man sich soweit im [http://www.geda.seul.org/wiki/geda:gsch2pcb_tutorial Tutorial] durchgearbeitet und seine Bauteile positioniert, kann der Autorouter zum Einsatz kommen. Auch hier ist ein wenig Experimentierfreude erforderlich, um zu zufriedenstellenden Ergebnissen zu kommen.&lt;br /&gt;
&lt;br /&gt;
Unter &#039;&#039;&#039;Connects / Optimize routed Tracks / Miter&#039;&#039;&#039; können die gerouteten Linien in 45 Grad Winkel modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
=== Footprints ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pcbgtk.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig für das Zusammenspiel zwischen dem Schaltplaneditor [http://www.geda.seul.org/tools/gschem/ Gschem] und dem [http://pcb.sourceforge.net PCB] ist die Verwendung der richtigen Footprints.&lt;br /&gt;
&lt;br /&gt;
Mir persönlich ist aufgefallen, daß viele Pads zu klein sind. Gerade im Bereich der Hobbyätzerei könnten sie ruhig größer ausfallen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Element&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Footprint&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Alternativer Footprint&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Beschreibung&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;Widerstand 1/4 Watt&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;R0w4&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;R025&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;Ich benutze R0w4, weil es die Pads größer sind.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;Elko&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;CR200&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;RADIAL_CAN 200&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;CR200 ist für größere Elkos (Umfang), während bei RADIAL_CAN 200 der Umfang kleiner ist. Leider fehlt die Polarität bei diesem Symbol.  Allgemein jedoch sind bei beiden Elementen die Pads zu klein.&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pcb_widerstand.png]]&lt;br /&gt;
&lt;br /&gt;
Mir waren irgendwie alle Widerstände nicht ideal genug.&lt;br /&gt;
Die Löcher werden ja meist mit 0.8mm gebohrt: (0.8 mm * (1 mil/ 0.0254 mm) = 31 mil. Eine Richtlinie für den gesamten Paddurchmesser habe ich nicht gefunden. Aus einer Elektor Platine habe ich mit Meßschieber ungefähr 2 mm gemessen, also 78 mil.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Element[&amp;quot;&amp;quot; &amp;quot;R__0w4_10.16mm&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; 0 0 0 -10300 0 100 &amp;quot;&amp;quot;]&lt;br /&gt;
(&lt;br /&gt;
    Pin[0 0 7800 3100 6100 3500 &amp;quot;&amp;quot; &amp;quot;1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[40000 0 7800 3100 6100 3500 &amp;quot;&amp;quot; &amp;quot;2&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    ElementLine [7900 0 4400 0 1000]&lt;br /&gt;
    ElementLine [32000 0 35500 0 1000]&lt;br /&gt;
    ElementLine [7900 -3300 7900 3300 1000]&lt;br /&gt;
    ElementLine [32000 -3300 32000 3300 1000]&lt;br /&gt;
    ElementLine [7900 -3300 32000 -3300 1000]&lt;br /&gt;
    ElementLine [7900 3300 32000 3300 1000]&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für Kapazitäten mit einer Breite von 2.54 mm oder 5.08 mm nutze ich folgendes Element&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Element[&amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; 65000 78500 0 0 0 100 &amp;quot;&amp;quot;]&lt;br /&gt;
(&lt;br /&gt;
    Pin[2000 -2500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_2&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[-8000 -2500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[-18000 -2500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pad[-16000 -2500 -10000 -2500 1000 2000 3000 &amp;quot;&amp;quot; &amp;quot;1&amp;quot; &amp;quot;&amp;quot;]&lt;br /&gt;
    ElementLine [-4000 -6500 -4000 2500 1399]&lt;br /&gt;
    ElementLine [-2000 -6500 -2000 2500 1399]&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eine Breite von 5.08 mm oder 7.62 mm nutze ich folgendes Element:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Element[&amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; 63000 93500 0 0 0 100 &amp;quot;&amp;quot;]&lt;br /&gt;
(&lt;br /&gt;
    Pin[14000 -4500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_2&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[4000 -4500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_2&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[-16000 -4500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pad[5500 -4500 12500 -4500 1000 2000 3000 &amp;quot;&amp;quot; &amp;quot;1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    ElementLine [-7500 -8500 -7500 500 1399]&lt;br /&gt;
    ElementLine [-5500 -8500 -5500 500 1399]&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ProtoCAD ==&lt;br /&gt;
&lt;br /&gt;
[http://protomind.net/page.php?7 ProtoCAD] ist ein Werkzeug, um schnell Schaltpläne zu entwerfen. Es ist für [[Lochrasterplatine]]n entwickelt worden, kann aber auch für andere Methoden genutzt werden. (Java 1.5 kompatibel, Swing GUI, Open Source)&lt;br /&gt;
&lt;br /&gt;
== QCAD ==&lt;br /&gt;
&lt;br /&gt;
[http://www.ribbonsoft.de/qcad.html QCAD] gibt es in einer lizenzpflichigen und in einer Open Source Community Version. QCAD ist kein ausschliesslicher Schaltungseditor, sondern kann auch für andere 2D Zeichnungen (Konstruktionen etc.) eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== sPlan ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sPlan&#039;&#039;&#039; ist ein relativ preiswerter Schaltplaneditor für Windows (95,98,ME,NT,2000,XP)&lt;br /&gt;
Infos und eine Demoversion von sPlan gibt es u.a. bei http://www.abacom-online.de/html/splan.html&lt;br /&gt;
&lt;br /&gt;
== TARGET 3001! == &lt;br /&gt;
&lt;br /&gt;
[[Bild:target3001.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;TARGET 3001!&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; für Windows (ME/NT4/2000/XP/Vista/Win7) bietet folgende Funktionen&lt;br /&gt;
&lt;br /&gt;
* Schaltplan&lt;br /&gt;
* Bauteilerstellung &lt;br /&gt;
* Schaltungssimulation (PSPICE-Syntax)&lt;br /&gt;
* Platinen-Layout mit Autoplatzierer&lt;br /&gt;
* Autorouter &lt;br /&gt;
* Anzeige der Platine in 3D&lt;br /&gt;
* Frontplattenentwurf direkt an oder über der Platine&lt;br /&gt;
&lt;br /&gt;
Die Platinen-Layout-Software ist in deutscher, englischer oder französischer Sprache. Es gibt eine für nicht kommerzielle Anwendungen kostenlose Version: &amp;lt;b&amp;gt;TARGET 3001! discover&amp;lt;/b&amp;gt; ist beschränkt auf 250 Pins/Pads, 2 Kupferlagen&lt;br /&gt;
und 30 Signale sind simulierbar, die Fläche ist unbeschränkt (1,2m x 1,2m).&lt;br /&gt;
&lt;br /&gt;
Auf der c&#039;t 11/07 CD ist eine &amp;lt;b&amp;gt;SE Version&amp;lt;/b&amp;gt; von TARGET 3001! verfügbar welche 400 Pins/Pads verarbeiten kann. &lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;b&amp;gt;PCB-Pool Edition&amp;lt;/b&amp;gt; hat keine Beschränkungen, speichert aber die Layouts in einem von normalen Target Versionen nicht lesbaren Format. Diese Layouts können dann allerdings nur zum selbst Ätzen ausgedruckt werden oder vom PCB-POOL® produziert werden.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://server.ibfriedrich.com/wiki/ibfwikide Target3001 Homepage]&lt;br /&gt;
* [http://www.pcb-pool.com/ppde/service_downloads.html Target3001 PCB-Pool-Edition]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;TARGET 3001!&amp;lt;/i&amp;gt; bietet ein typisches Windows Look-And-Feel. Eine einfache Einführung findet sich &#039;&#039;&#039;[http://server.ibfriedrich.com/wiki/ibfwikide/index.php?title=Kurzeinführung2 hier]&#039;&#039;&#039;. Wer sich schon mit Eagle auskennt, kann auch &#039;&#039;&#039;[http://server.ibfriedrich.com/wiki/ibfwikide/index.php?title=Eagle hier]&#039;&#039;&#039; schauen. Es gibt kostenlosen direkten Service durch den Hersteller telefonisch oder per E-Mail auch für Einsteiger oder Demo-User.&lt;br /&gt;
&lt;br /&gt;
== TinyCAD ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TinyCAD&#039;&#039;&#039; ist ein weiterer &#039;&#039;Open Source&#039;&#039; Schaltplaneditor für Windows. Mehr Infos gibt es auf der [http://tinycad.sourceforge.net Projektseite]. TinyCAD kann z.&amp;amp;nbsp;B. mit VeeCAD (s.u.) kombiniert werden.&lt;br /&gt;
&lt;br /&gt;
== VeeCAD ==&lt;br /&gt;
&lt;br /&gt;
[http://veecad.com/ VeeCAD] Stripboard Layout Editor ist ein Werkzeug, um [[Lochrasterplatine]]n zu entwerfen. VeeCAD ist als kommerzielle Version und als eingeschränkte Freiversion erhältlich.&lt;br /&gt;
&lt;br /&gt;
== ZenitPCB Suite ==&lt;br /&gt;
&lt;br /&gt;
[http://www.zenitpcb.com/eng/Index_Eng.html ZenitPCB Suite] is directed to all those people who want to make printed circuit board for hobby, or to student and academics from universities or high schools, who want to create their own pcb with a professional approach and particularly without having to pay for expensive licenses. ZenitPCB Layout (part of the ZenitPCB Suite) is completely freeware for personal or semi-professional use, limited to [http://www.zenitpcb.com/images/MainBoard_01_01.gif 800 pins]. (Windows XP, Vista)&lt;br /&gt;
&lt;br /&gt;
Übersetzung: ZenitPCB richtet sich an all diejenigen, welche fürs Hobby, Schule, Studium etc professionelle PCBs erstellen möchten, ohne viel Geld für Lizenzen ausgeben zu müssen. ZenitPCb ist in der eingeschränkten Version mit 800 Pins für den semi-professionellen und privaten Gebrauch kostenfrei benutzbar.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Schaltungssimulation]]&lt;br /&gt;
* [[Dos and don&#039;ts - Platinenlayout]]&lt;br /&gt;
* [[Lochrasterplatine]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Platinen]]&lt;br /&gt;
[[Kategorie:Schaltplaneditoren| ]]&lt;/div&gt;</summary>
		<author><name>Johnjohn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Tasten&amp;diff=60791</id>
		<title>AVR-Tutorial: Tasten</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Tasten&amp;diff=60791"/>
		<updated>2011-09-28T22:17:12Z</updated>

		<summary type="html">&lt;p&gt;Johnjohn: /* Weblinks */  Link aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bisher beschränkten sich die meisten Programme auf reine Ausgabe an einem Port. Möchte man Eingaben machen, so ist der Anschluss von [[AVR-Tutorial: IO-Grundlagen|Tasten]] an einen Port unumgänglich. Dabei erheben sich aber 2 Probleme&lt;br /&gt;
* Wie kann man erreichen, dass ein Tastendruck nur einmal ausgewertet wird?&lt;br /&gt;
* Tasten müssen entprellt werden&lt;br /&gt;
&lt;br /&gt;
==Erkennung von Flanken am Tasteneingang==&lt;br /&gt;
Möchte man eine Taste auswerten, bei der eine Aktion nicht ausgeführt werden soll, &amp;lt;i&amp;gt;solange&amp;lt;/i&amp;gt; die Taste gedrückt ist, sondern nur einmal &amp;lt;i&amp;gt;beim Drücken&amp;lt;/i&amp;gt; einer Taste, dann ist eine Erkennung der Schaltflanke der Weg zum Ziel. Anstatt eine gedrückte Taste zu erkennen, wird bei einer Flankenerkennung der Wechsel des Zustands des Eingangspins detektiert. Dazu vergleicht man in regelmäßigen Zeitabständen den momentanen Zustand des Eingangs mit dem Zustand zum vorhergehenden Zeitpunkt. Unterscheiden sich die beiden, so hat man eine Schaltflanke erkannt und kann darauf reagieren. Solange sich der Tastenzustand nicht ändert, egal ob die Taste gedrückt oder losgelassen ist, unternimmt man nichts.&lt;br /&gt;
&lt;br /&gt;
Die Erkennung des Zustandswechsels kann am einfachsten mit einer [[AVR-Tutorial:_Logik#XOR|XOR]] (Exklusiv Oder) Verknüpfung durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Wahrheitstabelle&amp;amp;nbsp;XOR&#039;&#039;&#039;&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;| A ||width=&amp;quot;30%&amp;quot;| B ||width=&amp;quot;30%&amp;quot;| Ergebnis&lt;br /&gt;
|- &lt;br /&gt;
|  0 ||  0 ||  0&lt;br /&gt;
|- &lt;br /&gt;
|  0 ||  1 ||  1&lt;br /&gt;
|- &lt;br /&gt;
|  1 ||  0 ||  1&lt;br /&gt;
|- &lt;br /&gt;
|  1 ||  1 ||  0&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur dann, wenn sich der Zustand A vom Zustand B unterscheidet, taucht im Ergebnis eine 1 auf. Sind A und B gleich, so ist das Ergebnis 0.&lt;br /&gt;
&lt;br /&gt;
A ist bei uns der vorhergehende Zustand eines Tasters, B ist der jetzige Zustand so wie er vom Port Pin eingelesen wurde. Verknüpft man die beiden mit einem [[AVR-Tutorial:_Logik#XOR|XOR]], so bleiben im Ergebnis genau an jenen Bitpositionen 1en übrig, an denen sich der jetzige Zustand vom vorhergehenden unterscheidet.&lt;br /&gt;
&lt;br /&gt;
Nun ist bei Tastern aber nicht nur der erkannte Flankenwechsel interessant, sondern auch in welchen Zustand die Taste gewechselt hat:&lt;br /&gt;
* Ist dieser 0, so wurde die Taste gedrückt.&lt;br /&gt;
* Ist dieser 1, so wurde die Taste losgelassen.&lt;br /&gt;
&lt;br /&gt;
Eine einfache [[AVR-Tutorial:_Logik#UND|UND]] Verknüpfung der Tastenflags mit dem [[AVR-Tutorial:_Logik#XOR|XOR]] Ergebnis liefert diese Information&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm soll bei jedem Tastendruck eines Tasters am Port D (egal welcher  Pin) eine LED am Port B0 in den jeweils anderen Zustand umschalten:&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def key_old   = r3&lt;br /&gt;
.def key_now   = r4&lt;br /&gt;
&lt;br /&gt;
.def temp1     = r17&lt;br /&gt;
.def temp2     = r18&lt;br /&gt;
&lt;br /&gt;
.equ key_pin   = PIND&lt;br /&gt;
.equ key_port  = PORTD&lt;br /&gt;
.equ key_ddr   = DDRD&lt;br /&gt;
 &lt;br /&gt;
.equ led_port  = PORTB&lt;br /&gt;
.equ led_ddr   = DDRB&lt;br /&gt;
.equ LED       = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      ldi  temp1, 1&amp;lt;&amp;lt;LED&lt;br /&gt;
      out  led_ddr, temp1         ; den LED Port auf Ausgang&lt;br /&gt;
&lt;br /&gt;
      ldi  temp1, $00             ; den Key Port auf Eingang schalten&lt;br /&gt;
      out  key_ddr, temp1&lt;br /&gt;
      ldi  temp1, $FF             ; die Pullup Widerstände aktivieren&lt;br /&gt;
      out  key_port, temp1&lt;br /&gt;
&lt;br /&gt;
      mov  key_old, temp1         ; bisher war kein Taster gedrückt&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
      in   key_now, key_pin       ; den jetzigen Zustand der Taster holen&lt;br /&gt;
      mov  temp1, key_now         ; und in temp1 sichern&lt;br /&gt;
      eor  key_now, key_old       ; mit dem vorhergehenden Zustand XOR&lt;br /&gt;
      mov  key_old, temp1         ; und den jetzigen Zustand für den nächsten&lt;br /&gt;
                                  ; Schleifendurchlauf als alten Zustand merken&lt;br /&gt;
&lt;br /&gt;
      breq loop                   ; Das Ergebnis des XOR auswerten:&lt;br /&gt;
                                  ; wenn keine Taste gedrückt war -&amp;gt; neuer Schleifendurchlauf&lt;br /&gt;
&lt;br /&gt;
      and  temp1, key_now         ; War das ein 1-&amp;gt;0 Übergang, wurde der Taster also&lt;br /&gt;
                                  ; gedrückt (in key_now steht das Ergebnis vom XOR)&lt;br /&gt;
      brne loop                   ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      in   temp1, led_port        ; den Zustand der LED umdrehen&lt;br /&gt;
      com  temp1&lt;br /&gt;
      out  led_port, temp1&lt;br /&gt;
&lt;br /&gt;
      rjmp  loop&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Probiert man diese Implementierung aus, so stellt man fest: Sie funktioniert nicht besonders gut. Es kann vorkommen, dass bei einem Tastendruck die LED zwar kurzzeitig umschaltet aber gleich darauf wieder ausgeht. Genauso gut kann es passieren, dass die LED beim Loslassen einer Taste ebenfalls wieder den Zustand wechselt. Die Ursache dafür ist: Taster prellen.&lt;br /&gt;
&lt;br /&gt;
==Prellen==&lt;br /&gt;
Das Prellen entsteht in der Mechanik der Tasten: Eine Kontaktfeder wird durch das Drücken des Tastelements auf einen anderen Kontakt gedrückt. Wenn die Kontaktfeder das Kontaktfeld berührt, federt sie jedoch nach. Dies kann soweit gehen, dass die Feder wieder vom Feld abhebt und den elektrischen Kontakt kurzzeitig wieder unterbricht. Auch wenn diese Effekte sehr kurz sind, sind sie für einen Mikrocontroller viel zu lang. Für ihn sieht die Situation so aus, dass beim Drücken der Taste eine Folge von: &amp;lt;i&amp;gt;Taste geschlossen&amp;lt;/i&amp;gt;, &amp;lt;i&amp;gt;Taste offen&amp;lt;/i&amp;gt;, &amp;lt;i&amp;gt;Taste geschlossen&amp;lt;/i&amp;gt;, &amp;lt;i&amp;gt;Taste offen&amp;lt;/i&amp;gt; Ereignissen am Port sichtbar sind, die sich dann nach einiger Zeit auf den Zustand &amp;lt;i&amp;gt;Taste geschlossen&amp;lt;/i&amp;gt; einpendelt. Beim Loslassen der Taste dann dasselbe Spielchen in der umgekehrten Richtung.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Entprellen.png|framed|center| Signal eines prellenden Tasters]]&lt;br /&gt;
&lt;br /&gt;
Nun kann es natürlich sein, dass ein neuer Taster zunächst überhaupt nicht prellt. Ist der Taster vom Hersteller nicht explizit als &#039;prellfreier Taster&#039; verkauft worden, besteht aber kein Grund zur Freude. Auch wenn der Taster heute noch nicht prellt, irgendwann wird er es tun. Dann nämlich, wenn die Kontaktfeder ein wenig ihrer Spannung verliert und ausleiert, bzw. wenn sich die Kontaktflächen durch häufige Benutzung abgewetzt haben.&lt;br /&gt;
&lt;br /&gt;
==Entprellung==&lt;br /&gt;
Aus diesem Grund müssen Tasten entprellt werden. Im Prinzip kann eine Entprellung sehr einfach durchgeführt werden. Ein &#039;Tastendruck&#039; wird nicht bei der Erkennung der ersten Flanke akzeptiert, sondern es wird noch eine zeitlang gewartet. Ist nach Ablauf dieser Zeitdauer die Taste immer noch gedrückt, dann wird diese Flanke als Tastendruck akzeptiert und ausgewertet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def key_old   = r3&lt;br /&gt;
.def key_now   = r4&lt;br /&gt;
&lt;br /&gt;
.def temp1     = r17&lt;br /&gt;
.def temp2     = r18&lt;br /&gt;
&lt;br /&gt;
.equ key_pin   = PIND&lt;br /&gt;
.equ key_port  = PORTD&lt;br /&gt;
.equ key_ddr   = DDRD&lt;br /&gt;
 &lt;br /&gt;
.equ led_port  = PORTB&lt;br /&gt;
.equ led_ddr   = DDRB&lt;br /&gt;
.equ LED       = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      ldi  temp1, 1&amp;lt;&amp;lt;LED&lt;br /&gt;
      out  led_ddr, temp1         ; den Led Port auf Ausgang&lt;br /&gt;
&lt;br /&gt;
      ldi  temp1, $00             ; den Key Port auf Eingang schalten&lt;br /&gt;
      out  key_ddr, temp1&lt;br /&gt;
      ldi  temp1, $FF             ; die Pullup Widerstände aktivieren&lt;br /&gt;
      out  key_port, temp1&lt;br /&gt;
&lt;br /&gt;
      mov  key_old, temp1         ; bisher war kein Taster gedrückt&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
      in   key_now, key_pin       ; den jetzigen Zustand der Taster holen&lt;br /&gt;
      mov  temp1, key_now         ; und in temp1 sichern&lt;br /&gt;
      eor  key_now, key_old       ; mit dem vorhergehenden Zustand XOR&lt;br /&gt;
      mov  key_old, temp1         ; und den jetzigen Zustand für den nächsten&lt;br /&gt;
                                  ; Schleifendurchlauf als alten Zustand merken&lt;br /&gt;
&lt;br /&gt;
      breq loop                   ; Das Ergebnis des XOR auswerten:&lt;br /&gt;
                                  ; wenn keine Taste gedrückt war -&amp;gt; neuer Schleifendurchlauf&lt;br /&gt;
&lt;br /&gt;
      and  temp1, key_now         ; War das ein 1-&amp;gt;0 Übergang, wurde der Taster also&lt;br /&gt;
                                  ; gedrückt (in key_now steht das Ergebnis vom XOR)&lt;br /&gt;
      brne loop                   ;&lt;br /&gt;
&lt;br /&gt;
      ldi  temp1, $FF             ; ein bisschen warten ...&lt;br /&gt;
wait1:&lt;br /&gt;
      ldi  temp2, $FF&lt;br /&gt;
wait2:&lt;br /&gt;
      dec  temp2&lt;br /&gt;
      brne wait2&lt;br /&gt;
      dec  temp1&lt;br /&gt;
      brne wait1&lt;br /&gt;
                                  ; ... und nachsehen, ob die Taste immer noch gedrückt ist&lt;br /&gt;
      in   temp1, key_pin&lt;br /&gt;
      and  temp1, key_now&lt;br /&gt;
      brne loop&lt;br /&gt;
&lt;br /&gt;
      in   temp1, led_port        ; den Zustand der LED umdrehen&lt;br /&gt;
      com  temp1&lt;br /&gt;
      out  led_port, temp1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      rjmp  loop&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie lange gewartet werden muss, hängt im wesentlichen von der mechanischen Qualität und dem Zustand des Tasters ab. Neue und qualitativ hochwertige Taster prellen wenig, ältere Taster prellen mehr. Grundsätzlich prellen aber alle mechanischen Taster irgendwann. Man sollte nicht dem Trugschluss verfallen, daß ein Taster nur weil er heute nicht erkennbar prellt, dieses auch in einem halben Jahr nicht tut.&lt;br /&gt;
&lt;br /&gt;
==Kombinierte Entprellung und Flankenerkennung==&lt;br /&gt;
Von Herrn Peter Dannegger stammt eine [[Entprellung|clevere Routine]], die mit wenig Aufwand an einem Port gleichzeitig bis zu 8 Tasten erkennen und zuverlässig entprellen kann. Dazu wird ein Timer benutzt, der mittels Overflow-Interrupt einen Basistakt erzeugt. Die Zeitdauer von einem Interrupt zum nächsten ist dabei ziemlich unkritisch. Sie sollte sich im Bereich von 5 bis 50 Millisekunden bewegen.&lt;br /&gt;
&lt;br /&gt;
In jedem Overflow Interrupt wird der jetzt am Port anliegende Tastenzustand mit dem Zustand im letzten Timer Interrupt verglichen. Nur dann wenn an einem Pin eine Änderung festgestellt werden kann (Flankenerkennung) wird dieser Tastendruck zunächst registriert. Ein clever aufgebauter Zähler zählt danach die Anzahl der Timer Overflows mit, die die Taste nach Erkennung der Flanke im gedrückten Zustand verharrte. Wurde die Taste nach Erkennung der Flanke 4 mal hintereinander als gedrückt identifiziert, so wird der Tastendruck weitergemeldet.&lt;br /&gt;
&lt;br /&gt;
===Einfache Tastenentprellung und Abfrage===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def iwr0      = r1&lt;br /&gt;
.def iwr1      = r2&lt;br /&gt;
 &lt;br /&gt;
.def key_old   = r3&lt;br /&gt;
.def key_state = r4&lt;br /&gt;
.def key_press = r5&lt;br /&gt;
&lt;br /&gt;
.def temp1     = r17&lt;br /&gt;
&lt;br /&gt;
.equ key_pin   = PIND&lt;br /&gt;
.equ key_port  = PORTD&lt;br /&gt;
.equ key_ddr   = DDRD&lt;br /&gt;
&lt;br /&gt;
.def leds      = r16&lt;br /&gt;
.equ led_port  = PORTB&lt;br /&gt;
.equ led_ddr   = DDRB&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
    rjmp    init&lt;br /&gt;
&lt;br /&gt;
.org OVF0addr&lt;br /&gt;
    rjmp    timer_overflow0&lt;br /&gt;
&lt;br /&gt;
timer_overflow0:               ; Timer Overflow Interrupt&lt;br /&gt;
&lt;br /&gt;
    push    r0                 ; temporäre Register sichern&lt;br /&gt;
    in      r0, SREG&lt;br /&gt;
    push    r0&lt;br /&gt;
    push    iwr0&lt;br /&gt;
    push    iwr1&lt;br /&gt;
&lt;br /&gt;
get8key:                       ;/old      state     iwr1      iwr0&lt;br /&gt;
    mov     iwr0, key_old      ;00110011  10101010            00110011&lt;br /&gt;
    in      key_old, key_pin   ;11110000&lt;br /&gt;
    eor     iwr0, key_old      ;                              11000011&lt;br /&gt;
    com     key_old            ;00001111&lt;br /&gt;
    mov     iwr1, key_state    ;                    10101010&lt;br /&gt;
    or      key_state, iwr0    ;          11101011&lt;br /&gt;
    and     iwr0, key_old      ;                              00000011&lt;br /&gt;
    eor     key_state, iwr0    ;          11101000&lt;br /&gt;
    and     iwr1, iwr0         ;                    00000010&lt;br /&gt;
    or      key_press, iwr1    ; gedrückte Taste merken&lt;br /&gt;
;&lt;br /&gt;
;&lt;br /&gt;
    pop     iwr1               ; Register wiederherstellen&lt;br /&gt;
    pop     iwr0&lt;br /&gt;
    pop     r0&lt;br /&gt;
    out     SREG, r0&lt;br /&gt;
    pop     r0&lt;br /&gt;
    reti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
init:&lt;br /&gt;
    ldi      temp1, HIGH(RAMEND)&lt;br /&gt;
    out      SPH, temp1&lt;br /&gt;
    ldi      temp1, LOW(RAMEND)     ; Stackpointer initialisieren&lt;br /&gt;
    out      SPL, temp1&lt;br /&gt;
&lt;br /&gt;
    ldi      temp1, 0xFF&lt;br /&gt;
    out      led_ddr, temp1&lt;br /&gt;
&lt;br /&gt;
    ldi      temp1, 0xFF            ; Tasten sind auf Eingang&lt;br /&gt;
    out      key_port, temp1        ; Pullup Widerstände ein&lt;br /&gt;
&lt;br /&gt;
    ldi      temp1, 1&amp;lt;&amp;lt;CS02 | 1&amp;lt;&amp;lt;CS00   ; Timer mit Vorteiler 1024&lt;br /&gt;
    out      TCCR0, temp1&lt;br /&gt;
    ldi      temp1, 1&amp;lt;&amp;lt;TOIE0            ; Timer Overflow Interrupt einrichten&lt;br /&gt;
    out      TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
    clr      key_old                ; die Register für die Tastenauswertung im&lt;br /&gt;
    clr      key_state              ; Timer Interrupt initialisieren&lt;br /&gt;
    clr      key_press&lt;br /&gt;
&lt;br /&gt;
    sei                             ; und los gehts: Timer frei&lt;br /&gt;
&lt;br /&gt;
    ldi      leds, 0xFF&lt;br /&gt;
    out      led_port, leds&lt;br /&gt;
main:&lt;br /&gt;
    cli                             ; &lt;br /&gt;
    mov      temp1, key_press       ; Einen ev. Tastendruck merken und ...&lt;br /&gt;
    clr      key_press              ; Tastendruck zurücksetzen&lt;br /&gt;
    sei&lt;br /&gt;
&lt;br /&gt;
    cpi      temp1, 0               ; Tastendruck auswerten. Wenn eine von 8 Tasten&lt;br /&gt;
    breq     main                   ; gedrückt worden wäre, wäre ein entsprechendes&lt;br /&gt;
                                    ; Bit in key_press gesetzt gewesen&lt;br /&gt;
&lt;br /&gt;
    eor      leds, temp1            ; Die zur Taste gehörende Led umschalten&lt;br /&gt;
    out      led_port, leds&lt;br /&gt;
    rjmp     main&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tastenentprellung, Abfrage und Autorepeat===&lt;br /&gt;
Gerade bei Zahlenreihen ist oft eine &#039;&#039;&#039;Autorepeat&#039;&#039;&#039; Funktion eine nützliche Einrichtung: Drückt der Benutzer eine Taste wird eine Funktion ausgelöst. Drückt er eine Taste und hält sie gedrückt, so setzt nach kurzer Zeit der &#039;&#039;&#039;Autorepeat&#039;&#039;&#039; ein. Das System verhält sich so, als ob die Taste in schneller Folge immer wieder gedrückt und wieder losgelassen würde.&lt;br /&gt;
&lt;br /&gt;
Leider muss hier für die Wartezeit ein Register im oberen Bereich benutzt werden. Der &#039;&#039;&#039;ldi&#039;&#039;&#039; Befehl macht dies notwendig. Alternativ könnte man die Wartezeiten beim Init in eines der unteren Register laden und von dort das &amp;lt;i&amp;gt;Repeat Timer&amp;lt;/i&amp;gt; Register &#039;&#039;&#039;key_rep&#039;&#039;&#039; jeweils nachladen.&lt;br /&gt;
&lt;br /&gt;
Alternativ wurde in diesem Code auch die Rolle des Registers &#039;&#039;&#039;key_state&#039;&#039;&#039; umgedreht. Ein gesetztes 1 Bit bedeutet hier, dass die zugehörige Taste zur Zeit gedrückt ist.&lt;br /&gt;
&lt;br /&gt;
Insgesamt ist dieser Code eine direkte Umsetzung des von Herrn Dannegger vorgestellten C-Codes. Durch die Möglichkeit eines Autorepeats bei gedrückter Taste erhöhen sich die Möglichkeiten im Aufbau von Benutzereingaben enorm. Das bischen Mehraufwand im Vergleich zum vorher vorgestellten Code, rechtfertigt dies auf jeden Fall.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def iwr0          = r1&lt;br /&gt;
.def iwr1          = r2&lt;br /&gt;
 &lt;br /&gt;
.def key_state     = r4&lt;br /&gt;
.def key_press     = r5&lt;br /&gt;
.def key_rep_press = r6&lt;br /&gt;
.def key_rep       = r16&lt;br /&gt;
&lt;br /&gt;
.def temp1         = r17&lt;br /&gt;
&lt;br /&gt;
.equ KEY_PIN       = PIND&lt;br /&gt;
.equ KEY_PORT      = PORTD&lt;br /&gt;
.equ KEY_DDR       = DDRD&lt;br /&gt;
&lt;br /&gt;
.equ KEY_REPEAT_START = 50&lt;br /&gt;
.equ KEY_REPEAT_NEXT  = 15&lt;br /&gt;
&lt;br /&gt;
.def leds      = r20&lt;br /&gt;
.equ led_port  = PORTB&lt;br /&gt;
.equ led_ddr   = DDRB&lt;br /&gt;
&lt;br /&gt;
.equ XTAL  = 4000000&lt;br /&gt;
&lt;br /&gt;
    rjmp    init&lt;br /&gt;
&lt;br /&gt;
.org OVF0addr&lt;br /&gt;
    rjmp    timer_overflow0&lt;br /&gt;
&lt;br /&gt;
timer_overflow0:               ; Timer Overflow Interrupt&lt;br /&gt;
&lt;br /&gt;
    push    r0                 ; temporäre Register sichern&lt;br /&gt;
    in      r0, SREG&lt;br /&gt;
    push    r0&lt;br /&gt;
&lt;br /&gt;
    push    r16&lt;br /&gt;
    ; TCNT0 so vorladen, dass der nächste Overflow nach 10 ms auftritt.&lt;br /&gt;
    ldi     r16, -( XTAL / 1024 * 10 / 1000)&lt;br /&gt;
    ;                ^      ^     ^^^^^^^^^&lt;br /&gt;
    ;                |      |      = 10 ms&lt;br /&gt;
    ;                |      Vorteiler&lt;br /&gt;
    ;                Quarz-Takt&lt;br /&gt;
    ;&lt;br /&gt;
    out     TCNT0, r16&lt;br /&gt;
    pop     r16&lt;br /&gt;
&lt;br /&gt;
get8key:&lt;br /&gt;
    in      r0, KEY_PIN        ; Tasten einlesen&lt;br /&gt;
    com     r0                 ; gedrückte Taste werden zu 1&lt;br /&gt;
    eor     r0, key_state      ; nur Änderunden berücksichtigen&lt;br /&gt;
    and     iwr0, r0           ; in iwr0 und iwr1 zählen&lt;br /&gt;
    com     iwr0&lt;br /&gt;
    and     iwr1, r0&lt;br /&gt;
    eor     iwr1, iwr0&lt;br /&gt;
    and     r0, iwr0&lt;br /&gt;
    and     r0, iwr1&lt;br /&gt;
    eor     key_state, r0      ;&lt;br /&gt;
    and     r0, key_state&lt;br /&gt;
    or      key_press, r0      ; gedrückte Taste merken&lt;br /&gt;
    tst     key_state          ; irgendeine Taste gedrückt ?&lt;br /&gt;
    breq    get8key_rep        ; Nein, Zeitdauer zurücksetzen&lt;br /&gt;
    dec     key_rep&lt;br /&gt;
    brne    get8key_finish;    ; Zeit abgelaufen?&lt;br /&gt;
    mov     key_rep_press, key_state&lt;br /&gt;
    ldi     key_rep, KEY_REPEAT_NEXT&lt;br /&gt;
    rjmp    get8key_finish&lt;br /&gt;
&lt;br /&gt;
get8key_rep:&lt;br /&gt;
    ldi     key_rep, KEY_REPEAT_START&lt;br /&gt;
&lt;br /&gt;
get8key_finish:&lt;br /&gt;
    pop     r0                 ; Register wiederherstellen&lt;br /&gt;
    out     SREG, r0&lt;br /&gt;
    pop     r0&lt;br /&gt;
    reti&lt;br /&gt;
;&lt;br /&gt;
;&lt;br /&gt;
&lt;br /&gt;
init:&lt;br /&gt;
    ldi      temp1, HIGH(RAMEND)&lt;br /&gt;
    out      SPH, temp1&lt;br /&gt;
    ldi      temp1, LOW(RAMEND)     ; Stackpointer initialisieren&lt;br /&gt;
    out      SPL, temp1&lt;br /&gt;
&lt;br /&gt;
    ldi      temp1, 0xFF&lt;br /&gt;
    out      led_ddr, temp1&lt;br /&gt;
&lt;br /&gt;
    ldi      temp1, 0xFF            ; Tasten sind auf Eingang&lt;br /&gt;
    out      KEY_PORT, temp1        ; Pullup Widerstände ein&lt;br /&gt;
&lt;br /&gt;
    ldi      temp1, 1&amp;lt;&amp;lt;CS00 | 1&amp;lt;&amp;lt;CS02&lt;br /&gt;
    out      TCCR0, temp1&lt;br /&gt;
    ldi      temp1, 1&amp;lt;&amp;lt;TOIE0		; Timer mit Vorteiler 1024&lt;br /&gt;
    out      TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
    clr      key_state&lt;br /&gt;
    clr      key_press&lt;br /&gt;
    clr      key_rep_press&lt;br /&gt;
    clr      key_rep&lt;br /&gt;
&lt;br /&gt;
    ldi      leds, 0xFF&lt;br /&gt;
    out      led_port, leds&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
                                    ; einen einzelnen Tastendruck auswerten&lt;br /&gt;
    cli&lt;br /&gt;
    mov      temp1, key_press&lt;br /&gt;
    clr      key_press&lt;br /&gt;
    sei&lt;br /&gt;
&lt;br /&gt;
    cpi      temp1, 0x01            ; Nur dann wenn Taste 0 gedrückt wurde&lt;br /&gt;
    breq     toggle&lt;br /&gt;
&lt;br /&gt;
                                    ; Tasten Autorepeat auswerten&lt;br /&gt;
    cli&lt;br /&gt;
    mov      temp1, key_rep_press&lt;br /&gt;
    clr      key_rep_press&lt;br /&gt;
    sei&lt;br /&gt;
                                    ; Nur dann wenn Taste 0 gehalten wurde&lt;br /&gt;
    cpi      temp1, 0x01&lt;br /&gt;
    breq     toggle&lt;br /&gt;
&lt;br /&gt;
    rjmp     main                   ; Hauptschleife abgeschlossen&lt;br /&gt;
&lt;br /&gt;
toggle:&lt;br /&gt;
    eor      leds, temp1            ; Die zur Taste gehörende Led umschalten&lt;br /&gt;
    out      led_port, leds&lt;br /&gt;
    rjmp     main&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fallbeispiel==&lt;br /&gt;
Das folgende Programm hat durchaus praktischen Wert. Es zeigt auf dem LCD den ASCII Code dezimal und in hexadezimal an, sowie das zugehörige LCD-Zeichen. An den &#039;&#039;&#039;PORTD&#039;&#039;&#039; werden an den Pins 0 und 1 jeweils 1 Taster angeschlossen. Mit dem einen Taster kann der ASCII Code erhöht werden, mit dem anderen Taster wird der ASCII Code erniedrigt. Auf beiden Tastern liegt jeweils ein Autorepeat, sodass jeder beliebige Code einfach angesteuert werden kann. Insbesondere die ASCII Codes größer als 128 sind interessant :-)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def iwr0          = r1&lt;br /&gt;
.def iwr1          = r2&lt;br /&gt;
 &lt;br /&gt;
.def key_state     = r4&lt;br /&gt;
.def key_press     = r5&lt;br /&gt;
.def key_rep_press = r6&lt;br /&gt;
.def key_rep       = r16&lt;br /&gt;
&lt;br /&gt;
.def temp1         = r17&lt;br /&gt;
&lt;br /&gt;
.equ KEY_PIN       = PIND&lt;br /&gt;
.equ KEY_PORT      = PORTD&lt;br /&gt;
.equ KEY_DDR       = DDRD&lt;br /&gt;
&lt;br /&gt;
.equ KEY_REPEAT_START = 40&lt;br /&gt;
.equ KEY_REPEAT_NEXT  = 15&lt;br /&gt;
&lt;br /&gt;
.def code          = r20&lt;br /&gt;
&lt;br /&gt;
.equ XTAL = 4000000&lt;br /&gt;
&lt;br /&gt;
    rjmp    init&lt;br /&gt;
&lt;br /&gt;
.org OVF0addr&lt;br /&gt;
    rjmp    timer_overflow0&lt;br /&gt;
&lt;br /&gt;
timer_overflow0:               ; Timer Overflow Interrupt&lt;br /&gt;
&lt;br /&gt;
    push    r0                 ; temporäre Register sichern&lt;br /&gt;
    in      r0, SREG&lt;br /&gt;
    push    r0&lt;br /&gt;
&lt;br /&gt;
    push    r16&lt;br /&gt;
    ldi     r16, -( XTAL / 1024 * 10 / 1000 + 1 )&lt;br /&gt;
    out     TCNT0, r16&lt;br /&gt;
    pop     r16&lt;br /&gt;
&lt;br /&gt;
get8key:&lt;br /&gt;
    in      r0, KEY_PIN        ; Tasten einlesen&lt;br /&gt;
    com     r0                 ; gedrückte Taste werden zu 1&lt;br /&gt;
    eor     r0, key_state      ; nur Änderunden berücksichtigen&lt;br /&gt;
    and     iwr0, r0           ; in iwr0 und iwr1 zählen&lt;br /&gt;
    com     iwr0&lt;br /&gt;
    and     iwr1, r0&lt;br /&gt;
    eor     iwr1, iwr0&lt;br /&gt;
    and     r0, iwr0&lt;br /&gt;
    and     r0, iwr1&lt;br /&gt;
    eor     key_state, r0      ;&lt;br /&gt;
    and     r0, key_state&lt;br /&gt;
    or      key_press, r0      ; gedrückte Taste merken&lt;br /&gt;
    tst     key_state          ; irgendeine Taste gedrückt ?&lt;br /&gt;
    breq    get8key_rep        ; Nein, Zeitdauer zurücksetzen&lt;br /&gt;
    dec     key_rep&lt;br /&gt;
    brne    get8key_finish;    ; Zeit abgelaufen?&lt;br /&gt;
    mov     key_rep_press, key_state&lt;br /&gt;
    ldi     key_rep, KEY_REPEAT_NEXT&lt;br /&gt;
    rjmp    get8key_finish&lt;br /&gt;
&lt;br /&gt;
get8key_rep:&lt;br /&gt;
    ldi     key_rep, KEY_REPEAT_START&lt;br /&gt;
&lt;br /&gt;
get8key_finish:&lt;br /&gt;
    pop     r0                 ; Register wiederherstellen&lt;br /&gt;
    out     SREG, r0&lt;br /&gt;
    pop     r0&lt;br /&gt;
    reti&lt;br /&gt;
;&lt;br /&gt;
;&lt;br /&gt;
&lt;br /&gt;
init:&lt;br /&gt;
    ldi      temp1, HIGH(RAMEND)&lt;br /&gt;
    out      SPH, temp1&lt;br /&gt;
    ldi      temp1, LOW(RAMEND)     ; Stackpointer initialisieren&lt;br /&gt;
    out      SPL, temp1&lt;br /&gt;
&lt;br /&gt;
    ldi      temp1, 0xFF            ; Tasten sind auf Eingang&lt;br /&gt;
    out      KEY_PORT, temp1        ; Pullup Widerstände ein&lt;br /&gt;
&lt;br /&gt;
    rcall     lcd_init&lt;br /&gt;
    rcall     lcd_clear&lt;br /&gt;
&lt;br /&gt;
    ldi      temp1, 1&amp;lt;&amp;lt;CS00 | 1&amp;lt;&amp;lt;CS02&lt;br /&gt;
    out      TCCR0, temp1&lt;br /&gt;
    ldi      temp1, 1&amp;lt;&amp;lt;TOIE0		; Timer mit Vorteiler 1024&lt;br /&gt;
    out      TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
    clr      key_state&lt;br /&gt;
    clr      key_press&lt;br /&gt;
    clr      key_rep_press&lt;br /&gt;
    clr      key_rep&lt;br /&gt;
&lt;br /&gt;
    ldi      code, 0x30&lt;br /&gt;
    rjmp     update&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
    cli                            ; normaler Tastendruck&lt;br /&gt;
    mov      temp1, key_press&lt;br /&gt;
    clr      key_press&lt;br /&gt;
    sei&lt;br /&gt;
    cpi      temp1, 0x01           ; Increment&lt;br /&gt;
    breq     increment&lt;br /&gt;
    cpi      temp1, 0x02           ; Decrement&lt;br /&gt;
    breq     decrement&lt;br /&gt;
&lt;br /&gt;
    cli                            ; gedrückt und halten -&amp;gt; repeat&lt;br /&gt;
    mov      temp1, key_rep_press&lt;br /&gt;
    clr      key_rep_press&lt;br /&gt;
    sei&lt;br /&gt;
    cpi      temp1, 0x01           ; Increment&lt;br /&gt;
    breq     increment&lt;br /&gt;
    cpi      temp1, 0x02           ; Decrement&lt;br /&gt;
    breq     decrement&lt;br /&gt;
&lt;br /&gt;
    rjmp     main&lt;br /&gt;
&lt;br /&gt;
increment:&lt;br /&gt;
    inc      code&lt;br /&gt;
    rjmp     update&lt;br /&gt;
&lt;br /&gt;
decrement:&lt;br /&gt;
    dec      code&lt;br /&gt;
&lt;br /&gt;
update:&lt;br /&gt;
    rcall    lcd_home&lt;br /&gt;
    mov      temp1, code&lt;br /&gt;
    rcall    lcd_number&lt;br /&gt;
    ldi      temp1, &#039; &#039;&lt;br /&gt;
    rcall    lcd_data&lt;br /&gt;
    mov      temp1, code&lt;br /&gt;
    rcall    lcd_number_hex&lt;br /&gt;
    ldi      temp1, &#039; &#039;&lt;br /&gt;
    rcall    lcd_data&lt;br /&gt;
    mov      temp1, code&lt;br /&gt;
    rcall    lcd_data&lt;br /&gt;
&lt;br /&gt;
    rjmp     main&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://digital-diy.com/General-Electronics/10-keys-on-one-port-pin.html 10 Keys on One Port Pin?] - Eine ganz andere Art der Tastenerkennung über einen [[ADC]]. Damit lässt sich auch eine von vielen Tasten an nur einem ADC-Eingangspin abfragen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=ADC|&lt;br /&gt;
zurücklink=AVR-Tutorial: ADC|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=PWM|&lt;br /&gt;
vorlink=AVR-Tutorial: PWM}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial]]&lt;/div&gt;</summary>
		<author><name>Johnjohn</name></author>
	</entry>
</feed>