<?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=172.26.38.125</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=172.26.38.125"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/172.26.38.125"/>
	<updated>2026-04-10T14:54:36Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entprellung&amp;diff=104951</id>
		<title>Entprellung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entprellung&amp;diff=104951"/>
		<updated>2022-01-25T11:15:29Z</updated>

		<summary type="html">&lt;p&gt;172.26.38.125: /* Problembeschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problembeschreibung ==&lt;br /&gt;
Mechanische stromführende Komponenten wie [[Schalter]] und [[Taster/Knopf]] neigen beim Ein- und Ausschalten zum sogenannten &#039;&#039;&#039;Prellen&#039;&#039;&#039;, d.h sie schalten schnell mehrfach aus und ein, was durch mechanische Vibrationen des Schaltkontaktes verursacht wird, sofern sie nicht mit aufwändigen mechanischen Maßnahmen dagegen geschützt sind. Besonders die [[Drehgeber]] sind aufgrund der Raststellungen und der Bewegung des Bedieners dafür empfindlich. Auch optoelektronische Bauelemente und chemische Kontaktschalter, sowie Flüssigkeitsschalter haben das Problem.&lt;br /&gt;
&lt;br /&gt;
Vereinfacht dargestellt, sieht eine von einem prellenden Schalter oder Taster geschaltete Spannung wie folgt aus:&lt;br /&gt;
[[Bild:Entprellen.png]]&lt;br /&gt;
&lt;br /&gt;
Es existieren also mehrere kurze Einschaltimpulse, welche bei Tastern als Mehrfachbefehl und bei Drehgebern als falsche Winkelbewegung interpretiert werden kann. Bei Schaltern wiederum, kommt es in der elektronischen Baugruppe zu mehreren Resets und Einschaltvorgängen, die unnötig Strom ziehen oder im schlechtesten Fall die Schaltung stressen oder beschädigen können. Wichtige Schalter und solche, die hohe Ströme führen sollen, werden dazu mit geeigneten Maßnahmen wie Redundanz, Stufenschaltkonzepten oder bei Gas- und Flüssigkeitschaltern durch elektrochemische Maßnahmen abgesichert. Bei einfachen Schaltern spart man sich dies jedoch.&lt;br /&gt;
&lt;br /&gt;
Da es bei diesen einfachen, ungeschützten Schaltern keine sichere Möglichkeit gibt, diese Effekte zu vermeiden, muss das falsche Signal durch die Elektronik sinnvoll ausgewertet werden. Dafür gibt es verschiedene Ansätze:&lt;br /&gt;
&lt;br /&gt;
== Hardwareentprellung ==&lt;br /&gt;
&lt;br /&gt;
===Prellfreie Schalter===&lt;br /&gt;
&lt;br /&gt;
Wie bereits angedeutet, hält die elektromechanische Industrie für Spezialanwendungen verschiedene Sonderkonstruktionen bereit, die saubere Schaltzustände nach Aussen generieren, indem sie entweder eine mechanische Dämpfung in Form eines selbsthemmenden Federmechanismus oder eine integrierte elektronische Signalverzögerung benutzen. Solche Systeme sind jedoch teuer und werden meist nur im Leistungsbereich eingesetzt. Zudem sind sie nicht 100% sicher und fallen alterungsbedingt aus. Wo immer es geht, werden daher weitere Maßnahmen getroffen, ein Prellen zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
===Wechselschalter===&lt;br /&gt;
&lt;br /&gt;
Für die Entprellung von Wechselschaltern (engl. Double Throw Switch) kann ein klassisches RS-[[Flipflop]] genutzt werden. Bei dieser Variante werden neben zwei NAND-Gattern nur noch zwei Pull-Up Widerstände benötigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NAND_debouncer.png|thumb|left|350px|&#039;&#039;&#039;Taster entprellen mit NAND-RS-Flipflop&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der gezeigten Schalterstellung liegt an der Position /S der Pegel 0 an. Damit ist das Flipflop gesetzt und der Ausgang auf dem Pegel 1. Schließt der Schalter zwischen den Kontakten 2 und 3, liegt an der Postion /R der Pegel 0 an. Dies bedeutet, dass der Ausgang des Flipflops auf den Pegel 0 geht. Sobald der Schalter von einem zum anderen Kontakt wechselt, beginnt er in der Regel zu prellen. Während des Prellens wechselt der Schalter zwischen den beiden Zuständen &amp;quot;Schalter berührt Kontakt&amp;quot; und &amp;quot;Schalter ist frei in der Luft&amp;quot;. Der Ausgang des Flipflops bleibt in dieser Prellzeit aber stabil, da der Schalter während des Prellens nie den gegenüberliegenden Kontakt berührt und das RS-Flipflop seinen Zustand allein halten kann. Die Prellzeit ist stark vom Schaltertyp abhängig und liegt zwischen 0,1 und 10ms. Die Dimensionierung der Widerstände ist relativ unkritisch. Als Richtwert können hier 100kOhm verwendet werden.&lt;br /&gt;
&lt;br /&gt;
====Wechselschalter ohne Flip-Flop====&lt;br /&gt;
&lt;br /&gt;
Wenn man mal gerade kein Flip-Flop zur Hand hat, kann man sich auch mit dieser Schaltung behelfen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:WechselEntprellC.PNG|thumb|left|350px|&#039;&#039;&#039;Wechsler entprellen mit Kondensator&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Funktionsweise:&lt;br /&gt;
Beim Umschalten wird der Kondensator immer sofort umgeladen.&lt;br /&gt;
Während der Kontakt prellt, befindet er sich in der Luft und hat keinerlei Verbindung. Während dieser Zeit übernimmt der Kondensator das halten des Pegels.&lt;br /&gt;
&lt;br /&gt;
Dimensionierung:&lt;br /&gt;
Ist der entprellte Taster an ein IC Angeschlossen, ist der &#039;&#039;Input Leakage Current&#039;&#039; der ausschlaggebende Strom. Falls weitere Ströme fließen sind diese mit zu berücksichtigen. Bei einem Mikrocontroller von Atmel sind 1µA typisch.&lt;br /&gt;
Es gilt:&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{dU}{dt} = \frac{I}{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
Da eine Prellung ca. 10ms dauert und die Spannung in dieser Zeit beispielsweise um maximal 0,5V fallen soll kommt man auf folgende Kapazität:&lt;br /&gt;
:&amp;lt;math&amp;gt; C = \frac{I \cdot dt}{dU} = \frac{1\mu A \cdot 10ms}{0,5V} = 20nF &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Stromspitzen zu verringern kann ein Widerstand mit eingefügt werden. Eine Zeitkonstante von 1µs bis 1ms scheint sinnvoll. Also 500 Ohm bis 500kOhm sind nutzbar, wobei bei niedrigem Widerstand die Stromspitzen höher sind, und bei 500kOhm der Pinstrom störend wird.&lt;br /&gt;
&lt;br /&gt;
===Einfacher Taster===&lt;br /&gt;
&lt;br /&gt;
Auch wenn das RS-Flipflop sehr effektiv ist, wird diese Variante der Entprellung nur selten angewendet. Grund dafür ist, dass in Schaltungen häufiger einfache Taster eingesetzt werden. Diese sind oft kleiner und preisgünstiger. Um einfache Taster (engl. push button / momentary switch) zu entprellen, kann ein einfacher RC-Tiefpass eingesetzt werden. Hierbei wird ein Kondensator über einen Widerstand je nach Schalterstellung auf- oder entladen. Das RC-Glied bildet einen Tiefpass, sodass die Spannung über den Kondensator nicht von einen Pegel auf den anderen springen kann.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RC_debouncer.png|thumb|left|300px|Taster entprellen mit RC-Entpreller]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Entprellen1a.png|thumb|350px| Entstehender Spannungsverlauf]]&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Wenn der Schalter geöffnet ist, lädt sich der Kondensator langsam über die beiden Widerstände R&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; auf V&amp;lt;sub&amp;gt;cc&amp;lt;/sub&amp;gt; auf. Beim Erreichen der Umschaltschwelle springt der Ausgang auf den Pegel 0. Wird der Schalter geschlossen, entlädt sich der Kondensator langsam über den Widerstand R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. Demnach ändert sich der Ausgang des Inverters auf den Pegel 1. Während der Taster prellt, kann sich die Spannung über dem Kondensator nicht sprunghaft ändern, da das Auf- und Entladen eher langsam über die Widerstände erfolgt. Außerdem sind die Schaltschwellen für den Übergang LOW-&amp;gt;HIGH und HIGH-&amp;gt;LOW stark verschieden (Hysterese, siehe Artikel [[Schmitt-Trigger]]). Bei richtiger Dimensionierung der Bauelemente wird somit der Ausgang des Inverters prellfrei.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Inverter &#039;&#039;&#039;unbedingt&#039;&#039;&#039; einer mit [[Schmitt-Trigger]]-Eingängen sein muss, weil bei Standard-Logikeingängen im Bereich von üblicherweise 0,8V - 2,0V der Ausgang nicht definiert ist. Als Inverter kann zum Beispiel der 74HC14 oder der CD40106 (pinkompatibel) eingesetzt werden. Alternativ kann auch ein CD4093 eingesetzt werden. Bei dem CD4093 handelt es sich um NAND-Gatter mit Schmitt-Trigger-Eingängen. Um aus einem NAND-Gatter einen Inverter zu machen, müssen einfach nur die beiden Eingänge verbunden werden oder ein Eingang fest auf HIGH gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für eine geeignete Dimensionierung muss man etwas mit den Standardformeln für einen Kondensator jonglieren. Die Spannung über den Kondensator beim Entladen berechnet sich nach:&lt;br /&gt;
:&amp;lt;math&amp;gt;U_C(t) = U_0 \cdot e^{\frac{-t}{R_2 C_1}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit der Ausgang des Inverters stabil ist, muss die Spannung über den Kondensator und damit die Spannung am Eingang des Inverters über der Spannung bleiben, bei welcher der Inverter umschaltet. Diese Schwellwertspannung ist genau die zeitabhängige Spannung über den Kondensator.&lt;br /&gt;
:&amp;lt;math&amp;gt;U_C(t)\!\ = U_{th}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch Umstellen der Formel ergibt sich nun:&lt;br /&gt;
:&amp;lt;math&amp;gt;R_2=\frac{-t}{C_1 \cdot ln\left(\frac{U_{th}}{U_0} \right)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Taster prellt üblicherweise etwa 10ms. Zur Sicherheit kann bei der Berechnung des Widerstandes eine Prellzeit von 20ms angenommen werden. U_0 ist die Betriebsspannung also Vcc. Die Schwellwertspannung muss aus dem Datenblatt des eingesetzten Schmitt-Triggers abgelesen werden. Beim 74HC14 beträgt der gesuchte Wert 2,0V. Nimmt man für den Kondensator 1µF und beträgt die  Betriebsspannung 5V, ergibt sich für den Widerstand ein Wert von etwa 22kOhm.&lt;br /&gt;
&lt;br /&gt;
Wird der Schalter geöffnet, lädt sich der Kondensator nach folgender Formel auf:&lt;br /&gt;
:&amp;lt;math&amp;gt;U_C(t) = U_0 \cdot \left( 1-e^{\frac{-t}{(R_1+R_2)\cdot C_1}} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit U_th=U_C ergibt das Umstellen nach (R_1+R_2):&lt;br /&gt;
:&amp;lt;math&amp;gt;R_1+R_2 = \frac{-t}{C_1 \cdot ln\left(1-\frac{U_{th}}{U_0} \right)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die Schwellspannung lässt sich aus dem Datenblatt ein Wert von 2,3V ablesen. Mit diesem Wert und den Annahmen von oben ergibt sich für R_1+R_2 ein Wert von 32kOhm. Somit ergibt sich für R_1 ein Wert von etwa 10kOhm.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Beim 74LS14 von Hitachi z.&amp;amp;nbsp;B. sind die oberen und unteren Schaltschwellwerte unterschiedlich. Es muss darauf geachtet werden, dass U_{th} beim Entladen die untere Schwelle und U_{th} beim Laden die obere Schwelle einnimmt.&lt;br /&gt;
&lt;br /&gt;
== Softwareentprellung ==&lt;br /&gt;
&lt;br /&gt;
In den Zeiten der elektronischen Auswertung von Tastern und Schaltern ist das softwaretechnische Entprellen oft billiger, als die Benutzung eines teuren Schalters. Daher werden heute z.B. auch Computertastaturen nicht mehr mit prellarmen Tasten oder Entprellkondensatoren ausgestattet.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des in den meisten Geräten ohnehin vorhandenen Mikrocontrollers z.B., kann man sich die zusätzliche Hardware sparen, da die Entprellung in Software praktisch genauso gut funktioniert. Dabei ist nur zu beachten, dass zusätzliche Rechenleistung und je nach Umsetzung auch einige Hardwareressourcen (z.B. Timer) benötigt werden. Dafür hat man aber den Vorteil, kurze Pulse, die offensichtlich keine Tastenbetätigung sein können sondern z. B. durch Einstreuungen hervorgerufen werden, einfach ausfiltern zu können.&lt;br /&gt;
&lt;br /&gt;
=== Flankenerkennung ===&lt;br /&gt;
Bei einem Taster gibt es insgesamt 4 theoretische Zustände:&lt;br /&gt;
&lt;br /&gt;
* 1. war nicht gedrückt und ist nicht gedrückt&lt;br /&gt;
* 2. war nicht gedrückt und ist gedrückt (steigende Flanke)&lt;br /&gt;
* 3. war gedrückt und ist immer noch gedrückt&lt;br /&gt;
* 4. war gedrückt und ist nicht mehr gedrückt (fallende Flanke)&lt;br /&gt;
&lt;br /&gt;
Diese einzelnen Zustände lassen sich jetzt bequem abfragen/durchlaufen. Die Entprellung geschieht dabei durch die ganze Laufzeit des Programms. Die Taster werden hierbei als Active-Low angeschlossen, um die internen Pull-Ups zu nutzen.&lt;br /&gt;
&lt;br /&gt;
Diese Routine gibt für den Zustand &amp;quot;steigende Flanke&amp;quot; den Wert &amp;quot;1&amp;quot; zurück, sonst &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define TASTERPORT PINC&lt;br /&gt;
#define TASTERBIT PINC1&lt;br /&gt;
&lt;br /&gt;
char taster(void)&lt;br /&gt;
{&lt;br /&gt;
    static unsigned char zustand;&lt;br /&gt;
    char rw = 0;&lt;br /&gt;
&lt;br /&gt;
    if(zustand == 0 &amp;amp;&amp;amp; !(TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster wird gedrueckt (steigende Flanke)&lt;br /&gt;
    {&lt;br /&gt;
        zustand = 1;&lt;br /&gt;
        rw = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else if (zustand == 1 &amp;amp;&amp;amp; !(TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster wird gehalten&lt;br /&gt;
    {&lt;br /&gt;
         zustand = 2;&lt;br /&gt;
         rw = 0;&lt;br /&gt;
    }&lt;br /&gt;
    else if (zustand == 2 &amp;amp;&amp;amp; (TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster wird losgelassen (fallende Flanke)&lt;br /&gt;
    {&lt;br /&gt;
        zustand = 3;&lt;br /&gt;
        rw = 0;&lt;br /&gt;
    }&lt;br /&gt;
    else if (zustand == 3 &amp;amp;&amp;amp; (TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster losgelassen&lt;br /&gt;
    {&lt;br /&gt;
        zustand = 0;&lt;br /&gt;
        rw = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return rw;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Erweiterung, damit beliebig lange das Halten einer Taste erkannt wird kann man ganz einfach so implementieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    // zustand kann entweder zum ersten mal als gehalten detektiert werden oder aber jedes weitere mal&lt;br /&gt;
    else if (((zustand == 1) || (zustand == 2)) &amp;amp;&amp;amp; !(TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster wird gehalten&lt;br /&gt;
    {&lt;br /&gt;
         zustand = 2;&lt;br /&gt;
         rw = 0;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Warteschleifen-Verfahren ===&lt;br /&gt;
&lt;br /&gt;
Soll nun mit einem Mikrocontroller gezählt werden, wie oft ein Kontakt oder ein Relais geschaltet wird, muss das Prellen des Kontaktes exakt berücksichtigt - und von einem gewollten Mehrfachschalten abgegrenzt werden, da sonst  möglicherweise Fehlimpulse gezählt- oder andererseits echte Schaltvorgänge übersprungen werden. Dies muss beim Schreiben des Programms hinsichtlich des Abtastens des Kontaktes unbedingt Rechnung getragen werden.&lt;br /&gt;
&lt;br /&gt;
Beim folgenden einfachen Beispiel für eine Entprellung ist zu beachten, dass der AVR im Falle eines Tastendrucks 200ms wartet, also brach liegt. Bei zeitkritischen Anwendungen sollte man ein anderes Verfahren nutzen (z.&amp;amp;nbsp;B. Abfrage der Tastenzustände in einer Timer-Interrupt-Service-Routine).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 3686400 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;     /* bei alter avr-libc: #include &amp;lt;avr/delay.h&amp;gt; */      &lt;br /&gt;
&lt;br /&gt;
/* Einfache Funktion zum Entprellen eines Tasters */&lt;br /&gt;
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)&lt;br /&gt;
{&lt;br /&gt;
    if ( !(*port &amp;amp; (1 &amp;lt;&amp;lt; pin)) )&lt;br /&gt;
    {&lt;br /&gt;
        /* Pin wurde auf Masse gezogen, 100ms warten   */&lt;br /&gt;
        _delay_ms(50);   // Maximalwert des Parameters an _delay_ms &lt;br /&gt;
        _delay_ms(50);   // beachten, vgl. Dokumentation der avr-libc&lt;br /&gt;
        if ( *port &amp;amp; (1 &amp;lt;&amp;lt; pin) )&lt;br /&gt;
        {&lt;br /&gt;
            /* Anwender Zeit zum Loslassen des Tasters geben */&lt;br /&gt;
            _delay_ms(50);&lt;br /&gt;
            _delay_ms(50); &lt;br /&gt;
            return 1;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRB &amp;amp;= ~( 1 &amp;lt;&amp;lt; PB0 );        /* PIN PB0 auf Eingang Taster)  */&lt;br /&gt;
    PORTB |= ( 1 &amp;lt;&amp;lt; PB0 );        /* Pullup-Widerstand aktivieren */&lt;br /&gt;
    ...&lt;br /&gt;
    if (debounce(&amp;amp;PINB, PB0))&lt;br /&gt;
    {&lt;br /&gt;
        /* Falls Taster an PIN PB0 gedrueckt     */&lt;br /&gt;
        /* LED an Port PD7 an- bzw. ausschalten: */&lt;br /&gt;
        PORTD = PORTD ^ ( 1 &amp;lt;&amp;lt; PD7 );&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die obige Routine hat leider mehrere Nachteile:&lt;br /&gt;
* sie detektiert nur das Loslassen (unergonomisch)&lt;br /&gt;
* sie verzögert die Mainloop immer um 100ms bei gedrückter Taste&lt;br /&gt;
* sie verliert Tastendrücke, je mehr die Mainloop zu tun hat.&lt;br /&gt;
&lt;br /&gt;
Eine ähnlich einfach zu benutzende Routine, aber ohne all diese Nachteile findet sich im Forenthread&lt;br /&gt;
[http://www.mikrocontroller.net/topic/164194#new Entprellung für Anfänger]&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;DEBOUNCE&#039;&#039; Befehl in dem BASIC-Dialekt BASCOM für AVR ist ebenfalls nach dem Warteschleifen-Verfahren programmiert. Die Wartezeit beträgt standardmäßig 25 ms, kann aber vom Anwender überschrieben werden. Vgl.  [http://avrhelp.mcselec.com/bascom-avr.html?DEBOUNCE BASCOM Online-Manual zu DEBOUNCE].&lt;br /&gt;
&lt;br /&gt;
Eine C-Implementierung für eine Tastenabfrage mit Warteschleife ist im Artikel [[AVR-GCC-Tutorial#IO-Register_als_Parameter_und_Variablen|AVR-GCC-Tutorial: IO-Register als Parameter und Variablen]] angeben.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil dieses Verfahrens ist, dass der Controller durch die Warteschleife blockiert wird. Günstiger ist die Implementierung mit einem Timer-Interrupt.&lt;br /&gt;
&lt;br /&gt;
==== Warteschleifenvariante mit Maske und Pointer (nach Christian Riggenbach) ====&lt;br /&gt;
&lt;br /&gt;
Hier eine weitere Funktion, um Taster zu entprellen: Durch den zusätzlichen Code kann eine Entprellzeit von durchschnittlich 1-3ms (mindestens 8*150µs = 1ms) erreicht werden. Grundsätzlich prüft die Funktion den Pegel der Pins auf einem bestimmten Port. Wenn die/der Pegel 8 Mal konstant war, wird die Schleife verlassen. Diese Funktion kann sehr gut eingesetzt werden, um in einer Endlosschleife Taster anzufragen, da sie, wie erwähnt, eine kurze Wartezeit hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void entprellung( volatile uint8_t *port, uint8_t maske ) {&lt;br /&gt;
  uint8_t   port_puffer;&lt;br /&gt;
  uint8_t   entprellungs_puffer;&lt;br /&gt;
&lt;br /&gt;
  for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) {&lt;br /&gt;
    entprellungs_puffer&amp;lt;&amp;lt;=1;&lt;br /&gt;
    port_puffer = *port;&lt;br /&gt;
    _delay_us(150);&lt;br /&gt;
    if( (*port &amp;amp; maske) == (port_puffer &amp;amp; maske) )&lt;br /&gt;
      entprellungs_puffer |= 0x01;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion wird wie folgt aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  // Bugfix 20100414&lt;br /&gt;
  // http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass&lt;br /&gt;
  entprellung( &amp;amp;PINB, (1&amp;lt;&amp;lt;PINB2) ); // ggf. Prellen abwarten &lt;br /&gt;
  if( PINB &amp;amp; (1&amp;lt;&amp;lt;PINB2) )           // dann stabilen Wert einlesen&lt;br /&gt;
  {&lt;br /&gt;
    // mach was&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    // mach was anderes&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als Maske kann ein beliebiger Wert übergeben werden. Sie verhindert, dass nichtverwendete Taster die Entprellzeit negativ beeinflussen.&lt;br /&gt;
&lt;br /&gt;
==== Debounce-Makro von Peter Dannegger ====&lt;br /&gt;
&lt;br /&gt;
Peter Dannegger hat in [http://www.mikrocontroller.net/topic/164194#1566921 &amp;quot;Entprellen für Anfänger&amp;quot;] folgende vereinfachtes Entprellverfahren beschrieben. Das Makro arbeitet in der Originalversion mit &#039;&#039;active low&#039;&#039; geschalteten Tastern, kann aber einfach für  &#039;&#039;active high&#039;&#039; geschaltete Taster angepasst werden ([[Pollin Funk-AVR-Evaluationsboard#Tasty Reloaded|Tasty Reloaded]]). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*                      Not so powerful Debouncing Example              */&lt;br /&gt;
/*                      No Interrupt needed                             */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*              Author: Peter Dannegger                                 */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
// Target: ATtiny13&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#define F_CPU 9.6e6&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define debounce( port, pin )                                         \&lt;br /&gt;
({                                                                    \&lt;br /&gt;
  static uint8_t flag = 0;     /* new variable on every macro usage */  \&lt;br /&gt;
  uint8_t i = 0;                                                      \&lt;br /&gt;
                                                                      \&lt;br /&gt;
  if( flag ){                  /* check for key release: */           \&lt;br /&gt;
    for(;;){                   /* loop ... */                         \&lt;br /&gt;
      if( !(port &amp;amp; 1&amp;lt;&amp;lt;pin) ){  /* ... until key pressed or ... */     \&lt;br /&gt;
        i = 0;                 /* 0 = bounce */                       \&lt;br /&gt;
        break;                                                        \&lt;br /&gt;
      }                                                               \&lt;br /&gt;
      _delay_us( 98 );         /* * 256 = 25ms */                     \&lt;br /&gt;
      if( --i == 0 ){          /* ... until key &amp;gt;25ms released */     \&lt;br /&gt;
        flag = 0;              /* clear press flag */                 \&lt;br /&gt;
        i = 0;                 /* 0 = key release debounced */        \&lt;br /&gt;
        break;                                                        \&lt;br /&gt;
      }                                                               \&lt;br /&gt;
    }                                                                 \&lt;br /&gt;
  }else{                       /* else check for key press: */        \&lt;br /&gt;
    for(;;){                   /* loop ... */                         \&lt;br /&gt;
      if( (port &amp;amp; 1&amp;lt;&amp;lt;pin) ){   /* ... until key released or ... */    \&lt;br /&gt;
        i = 0;                 /* 0 = bounce */                       \&lt;br /&gt;
        break;                                                        \&lt;br /&gt;
      }                                                               \&lt;br /&gt;
      _delay_us( 98 );         /* * 256 = 25ms */                     \&lt;br /&gt;
      if( --i == 0 ){          /* ... until key &amp;gt;25ms pressed */      \&lt;br /&gt;
        flag = 1;              /* set press flag */                   \&lt;br /&gt;
        i = 1;                 /* 1 = key press debounced */          \&lt;br /&gt;
        break;                                                        \&lt;br /&gt;
      }                                                               \&lt;br /&gt;
    }                                                                 \&lt;br /&gt;
  }                                                                   \&lt;br /&gt;
  i;                           /* return value of Macro */            \&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
   Testapplication&lt;br /&gt;
 */&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB  &amp;amp;= ~(1&amp;lt;&amp;lt;PB0);&lt;br /&gt;
  PORTB |=   1&amp;lt;&amp;lt;PB0;&lt;br /&gt;
  DDRB  |=   1&amp;lt;&amp;lt;PB2;&lt;br /&gt;
  DDRB  &amp;amp;= ~(1&amp;lt;&amp;lt;PB1);&lt;br /&gt;
  PORTB |=   1&amp;lt;&amp;lt;PB1;&lt;br /&gt;
  DDRB  |=   1&amp;lt;&amp;lt;PB3;&lt;br /&gt;
  for(;;){&lt;br /&gt;
    if( debounce( PINB, PB1 ) )&lt;br /&gt;
      PORTB ^= 1&amp;lt;&amp;lt;PB2;&lt;br /&gt;
    if( debounce( PINB, PB0 ) )&lt;br /&gt;
      PORTB ^= 1&amp;lt;&amp;lt;PB3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Makro für die gleiche Taste (Pin) an mehreren Stellen aufgerufen werden soll, muss eine Funktion angelegt werden, damit beide Aufrufe an die gleiche Zustandsvariable &#039;&#039;flag&#039;&#039; auswerten [http://www.mikrocontroller.net/topic/195914#1918727]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Hilfsfunktion&lt;br /&gt;
uint8_t debounce_C1( void )&lt;br /&gt;
{&lt;br /&gt;
  return debounce(PINC, PC1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Beispielanwendung&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB  |=   1&amp;lt;&amp;lt;PB2;&lt;br /&gt;
  DDRB  |=   1&amp;lt;&amp;lt;PB3;&lt;br /&gt;
  DDRC  &amp;amp;= ~(1&amp;lt;&amp;lt;PC1);&lt;br /&gt;
  PORTC |=   1&amp;lt;&amp;lt;PC1; // Pullup für Taster&lt;br /&gt;
&lt;br /&gt;
  for(;;){&lt;br /&gt;
    if( debounce_C1() )  // nicht: debounce(PINC, PC1)&lt;br /&gt;
      PORTB ^= 1&amp;lt;&amp;lt;PB2;&lt;br /&gt;
    if( debounce_C1() )  // nicht: debounce(PINC, PC1)&lt;br /&gt;
      PORTB ^= 1&amp;lt;&amp;lt;PB3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer-Verfahren (nach Peter Dannegger) ===&lt;br /&gt;
&lt;br /&gt;
==== Grundroutine (AVR Assembler) ====&lt;br /&gt;
&lt;br /&gt;
Siehe dazu: [http://www.mikrocontroller.net/forum/read-4-20435.html#new Forum] &lt;br /&gt;
&lt;br /&gt;
Vorteile&lt;br /&gt;
* besonders kurzer Code&lt;br /&gt;
* schnell&lt;br /&gt;
&lt;br /&gt;
Außerdem können 8 Tasten (aktiv low) gleichzeitig bearbeitet werden, es dürfen also&lt;br /&gt;
alle exakt zur selben Zeit gedrückt werden. Andere Routinen können z.&amp;amp;nbsp;B. nur eine Taste verarbeiten, d.h. die zuerst oder zuletzt gedrückte gewinnt, oder es kommt Unsinn heraus.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Einlese- und Entprellroutine ist nur 8 Instruktionen&lt;br /&gt;
kurz. Der entprellte Tastenzustand ist im Register &#039;&#039;key_state&#039;&#039;. Mit nur 2 weiteren Instruktionen wird dann der Wechsel von &#039;&#039;Taste offen&#039;&#039; zu&lt;br /&gt;
&#039;&#039;Taste gedrückt&#039;&#039; erkannt und im Register &#039;&#039;key_press&#039;&#039; abgelegt. Im Beispielcode werden dann damit 8 LEDs ein- und ausgeschaltet. Jede Taste entspricht einem Bit in den Registern, d.h. die Verarbeitung erfolgt bitweise mit logischen Operationen. Zum Verständnis empfiehlt es sich daher, die Logikgleichungen mit Gattern für ein Bit = eine Taste aufzumalen. Die Register kann man sich als Flipflops denken, die mit der Entprellzeit als Takt arbeiten. D.h. man kann das auch so z.&amp;amp;nbsp;B. in einem GAL22V10 realisieren.&lt;br /&gt;
&lt;br /&gt;
Als Kommentar sind neben den einzelnen Instruktionen alle 8 möglichen&lt;br /&gt;
Kombinationen der 3 Signale dargestellt.&lt;br /&gt;
&lt;br /&gt;
Beispielcode für AVR (Assembler):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.nolist&lt;br /&gt;
.include &amp;quot;c:\avr\inc\1200def.inc&amp;quot;&lt;br /&gt;
.list&lt;br /&gt;
.def  save_sreg         = r0&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  leds              = r16&lt;br /&gt;
.def  wr0               = r17&lt;br /&gt;
&lt;br /&gt;
.equ  key_port          = pind&lt;br /&gt;
.equ  led_port          = portb&lt;br /&gt;
&lt;br /&gt;
      rjmp   init&lt;br /&gt;
.org OVF0addr		;timer interrupt 24ms&lt;br /&gt;
      in     save_sreg, SREG&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_port         ;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           ;store key press detect&lt;br /&gt;
;&lt;br /&gt;
;			insert other timer functions here&lt;br /&gt;
;&lt;br /&gt;
      out    SREG, save_sreg&lt;br /&gt;
      reti&lt;br /&gt;
;-------------------------------------------------------------------------&lt;br /&gt;
init:&lt;br /&gt;
      ldi    wr0, 0xFF&lt;br /&gt;
      out    ddrb, wr0&lt;br /&gt;
      ldi    wr0, 1&amp;lt;&amp;lt;CS02 | 1&amp;lt;&amp;lt;CS00    ;divide by 1024 * 256&lt;br /&gt;
      out    TCCR0, wr0&lt;br /&gt;
      ldi    wr0, 1&amp;lt;&amp;lt;TOIE0             ;enable timer interrupt&lt;br /&gt;
      out    TIMSK, wr0&lt;br /&gt;
&lt;br /&gt;
      clr    key_old&lt;br /&gt;
      clr    key_state&lt;br /&gt;
      clr    key_press&lt;br /&gt;
      ldi    leds, 0xFF&lt;br /&gt;
main: cli&lt;br /&gt;
      eor    leds, key_press           ;toggle LEDs&lt;br /&gt;
      clr    key_press                 ;clear, if key press action done&lt;br /&gt;
      sei&lt;br /&gt;
      out    led_port, leds&lt;br /&gt;
      rjmp   main&lt;br /&gt;
;-------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Komfortroutine (C für AVR) ====&lt;br /&gt;
&lt;br /&gt;
Siehe dazu: [http://www.mikrocontroller.net/forum/read-4-310276.html Forum]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung&#039;&#039;&#039; Wenn statt active-low (Ruhezustand High) active-high (Ruhezustand Low) verwendet wird muss eine Zeile geändert werden siehe:&lt;br /&gt;
[http://www.mikrocontroller.net/forum/read-4-310276.html gesamter Beitrag im Forum], &lt;br /&gt;
[http://www.mikrocontroller.net/topic/48465#606555 Stelle 1 im Beitrag], ([http://www.mikrocontroller.net/topic/48465#2306398 Stelle 2 im Beitrag] muss *nicht* geändert werden, da hier die Polarität gar keinen Einfluß hat).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 2&#039;&#039;&#039; Zur Initialisierung siehe [http://www.mikrocontroller.net/topic/48465#3572793 Forum]&lt;br /&gt;
&lt;br /&gt;
Funktionsprinzip wie oben plus zusätzliche Features:  &lt;br /&gt;
* Kann Tasten sparen durch unterschiedliche Aktionen bei kurzem oder langem Drücken&lt;br /&gt;
* Wiederholfunktion, z.&amp;amp;nbsp;B. für die Eingabe von Werten&lt;br /&gt;
&lt;br /&gt;
Das Programm ist für avr-gcc/avr-libc geschrieben, kann aber mit ein paar Anpassungen auch mit anderen Compilern und Mikrocontrollern verwendet werden. Eine Portierung für den AT91SAM7 findet man [http://www.google.com/codesearch?q=show:ac2viP-2E2Y:pzkOO5QRsoc:RPICuprYy-A&amp;amp;sa=N&amp;amp;cd=1&amp;amp;ct=rc&amp;amp;cs_p=svn://mikrocontroller.net/mp3dec/trunk&amp;amp;cs_f=keys.c#a0 hier] (aus dem Projekt [[ARM MP3/AAC Player]]).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*                      Debouncing 8 Keys                               */&lt;br /&gt;
/*                      Sampling 4 Times                                */&lt;br /&gt;
/*                      With Repeat Function                            */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*              Author: Peter Dannegger                                 */&lt;br /&gt;
/*                      danni@specs.de                                  */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU           1000000                   // processor clock frequency&lt;br /&gt;
#warning kein F_CPU definiert&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
#define KEY_DDR         DDRB&lt;br /&gt;
#define KEY_PORT        PORTB&lt;br /&gt;
#define KEY_PIN         PINB&lt;br /&gt;
#define KEY0            0&lt;br /&gt;
#define KEY1            1&lt;br /&gt;
#define KEY2            2&lt;br /&gt;
#define ALL_KEYS        (1&amp;lt;&amp;lt;KEY0 | 1&amp;lt;&amp;lt;KEY1 | 1&amp;lt;&amp;lt;KEY2)&lt;br /&gt;
 &lt;br /&gt;
#define REPEAT_MASK     (1&amp;lt;&amp;lt;KEY1 | 1&amp;lt;&amp;lt;KEY2)       // repeat: key1, key2&lt;br /&gt;
#define REPEAT_START    50                        // after 500ms&lt;br /&gt;
#define REPEAT_NEXT     20                        // every 200ms&lt;br /&gt;
&lt;br /&gt;
#define LED_DDR         DDRA&lt;br /&gt;
#define LED_PORT        PORTA&lt;br /&gt;
#define LED0            0&lt;br /&gt;
#define LED1            1&lt;br /&gt;
#define LED2            2&lt;br /&gt;
 &lt;br /&gt;
volatile uint8_t key_state;                                // debounced and inverted key state:&lt;br /&gt;
                                                  // bit = 1: key pressed&lt;br /&gt;
volatile uint8_t key_press;                                // key press detect&lt;br /&gt;
 &lt;br /&gt;
volatile uint8_t key_rpt;                                  // key long press and repeat&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
ISR( TIMER0_OVF_vect )                            // every 10ms&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t ct0 = 0xFF, ct1 = 0xFF, rpt;&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
 &lt;br /&gt;
  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms&lt;br /&gt;
 &lt;br /&gt;
  i = key_state ^ ~KEY_PIN;                       // key changed ?&lt;br /&gt;
  ct0 = ~( ct0 &amp;amp; i );                             // reset or count ct0&lt;br /&gt;
  ct1 = ct0 ^ (ct1 &amp;amp; i);                          // reset or count ct1&lt;br /&gt;
  i &amp;amp;= ct0 &amp;amp; ct1;                                 // count until roll over ?&lt;br /&gt;
  key_state ^= i;                                 // then toggle debounced state&lt;br /&gt;
  key_press |= key_state &amp;amp; i;                     // 0-&amp;gt;1: key press detect&lt;br /&gt;
 &lt;br /&gt;
  if( (key_state &amp;amp; REPEAT_MASK) == 0 )            // check repeat function&lt;br /&gt;
     rpt = REPEAT_START;                          // start delay&lt;br /&gt;
  if( --rpt == 0 ){&lt;br /&gt;
    rpt = REPEAT_NEXT;                            // repeat delay&lt;br /&gt;
    key_rpt |= key_state &amp;amp; REPEAT_MASK;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
// check if a key has been pressed. Each pressed key is reported&lt;br /&gt;
// only once&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_press( uint8_t key_mask )&lt;br /&gt;
{&lt;br /&gt;
  cli();                                          // read and clear atomic !&lt;br /&gt;
  key_mask &amp;amp;= key_press;                          // read key(s)&lt;br /&gt;
  key_press ^= key_mask;                          // clear key(s)&lt;br /&gt;
  sei();&lt;br /&gt;
  return key_mask;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
// check if a key has been pressed long enough such that the&lt;br /&gt;
// key repeat functionality kicks in. After a small setup delay&lt;br /&gt;
// the key is reported being pressed in subsequent calls&lt;br /&gt;
// to this function. This simulates the user repeatedly&lt;br /&gt;
// pressing and releasing the key.&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_rpt( uint8_t key_mask )&lt;br /&gt;
{&lt;br /&gt;
  cli();                                          // read and clear atomic !&lt;br /&gt;
  key_mask &amp;amp;= key_rpt;                            // read key(s)&lt;br /&gt;
  key_rpt ^= key_mask;                            // clear key(s)&lt;br /&gt;
  sei();&lt;br /&gt;
  return key_mask;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
// check if a key is pressed right now&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_state( uint8_t key_mask )&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  key_mask &amp;amp;= key_state;&lt;br /&gt;
  return key_mask;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_short( uint8_t key_mask )&lt;br /&gt;
{&lt;br /&gt;
  cli();                                          // read key state and key press atomic !&lt;br /&gt;
  return get_key_press( ~key_state &amp;amp; key_mask );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_long( uint8_t key_mask )&lt;br /&gt;
{&lt;br /&gt;
  return get_key_press( get_key_rpt( key_mask ));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
  LED_PORT = 0xFF;&lt;br /&gt;
  LED_DDR = 0xFF;                     &lt;br /&gt;
&lt;br /&gt;
  // Configure debouncing routines&lt;br /&gt;
  KEY_DDR &amp;amp;= ~ALL_KEYS;                // configure key port for input&lt;br /&gt;
  KEY_PORT |= ALL_KEYS;                // and turn on pull up resistors&lt;br /&gt;
&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;CS02)|(1&amp;lt;&amp;lt;CS00);         // divide by 1024&lt;br /&gt;
  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms&lt;br /&gt;
  TIMSK |= 1&amp;lt;&amp;lt;TOIE0;                   // enable timer interrupt&lt;br /&gt;
&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
    if( get_key_short( 1&amp;lt;&amp;lt;KEY1 ))&lt;br /&gt;
      LED_PORT ^= 1&amp;lt;&amp;lt;LED1;&lt;br /&gt;
 &lt;br /&gt;
    if( get_key_long( 1&amp;lt;&amp;lt;KEY1 ))&lt;br /&gt;
      LED_PORT ^= 1&amp;lt;&amp;lt;LED2;&lt;br /&gt;
 &lt;br /&gt;
    // single press and repeat&lt;br /&gt;
 &lt;br /&gt;
    if( get_key_press( 1&amp;lt;&amp;lt;KEY2 ) || get_key_rpt( 1&amp;lt;&amp;lt;KEY2 )){&lt;br /&gt;
      uint8_t i = LED_PORT;&lt;br /&gt;
 &lt;br /&gt;
      i = (i &amp;amp; 0x07) | ((i &amp;lt;&amp;lt; 1) &amp;amp; 0xF0);&lt;br /&gt;
      if( i &amp;lt; 0xF0 )&lt;br /&gt;
        i |= 0x08;&lt;br /&gt;
      LED_PORT = i;      &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das single-press-und-repeat-Beispiel geht nicht in jeder Beschaltung; folgendes Beispiel sollte universeller sein (einzelne LED an/aus):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// single press and repeat&lt;br /&gt;
if( get_key_press( 1&amp;lt;&amp;lt;KEY2 ) || get_key_rpt( 1&amp;lt;&amp;lt;KEY2 ))&lt;br /&gt;
    LED_PORT ^=0x08;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neuere Variante, die einer Taste folgende Funktionen erlaubt:&lt;br /&gt;
https://www.mikrocontroller.net/topic/48465?goto=1753367#1753367&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
- get_key_press()&lt;br /&gt;
- get_key_rpt()&lt;br /&gt;
- get_key_press() mit get_key_rpt()&lt;br /&gt;
- get_key_short() mit get_key_long()&lt;br /&gt;
- get_key_short() mit get_key_long_r() und get_key_rpt_l()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erweiterung für die Erkennung von zwei gleichzeitig gedrückten Tasten:&lt;br /&gt;
https://www.mikrocontroller.net/topic/48465?goto=1753367#1753367&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
- get_key_common()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Funktionsweise =====&lt;br /&gt;
Der Code basiert auf 8 parallelen vertikalen Zählern, die über die Variablen ct0 und ct1 aufgebaut werden&lt;br /&gt;
&lt;br /&gt;
[[Bild:VertCount.png|framed|center|&#039;&#039;&#039;8 vertikale Zähler in 2 8-Bit Variablen&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
wobei jeweils ein Bit in ct0 mit dem gleichwertigen Bit in ct1 zusammengenommen einen 2-Bit-Zähler bildet.&lt;br /&gt;
Der Code der sich um die 8 Zähler kümmert, ist so geschrieben, daß er alle 8 Zähler gemeinsam parallel behandelt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = key_state ^ ~KEY_PIN;                       // key changed ?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
i enthält an dieser Stelle für jede Taste, die sich im Vergleich mit dem vorhergehenden entprellten Zustand (keystate) verändert hat, ein 1 Bit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  ct0 = ~( ct0 &amp;amp; i );                             // reset or count ct0&lt;br /&gt;
  ct1 = ct0 ^ (ct1 &amp;amp; i);                          // reset or count ct1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese beiden Anweisungen erniedrigen den 2-Bit Zähler ct0/ct1 für jedes Bit um 1, welches in i gesetzt ist. Liegt an der entsprechenden Stelle in i ein 0 Bit vor (keine Änderung des Zustands), so wird der Zähler ct0/ct1 für dieses Bit auf 1 gesetzt.&lt;br /&gt;
Der Grundzustand des Zählers ist als ct0 == 1 und ct1 == 1 (Wert 3). Der Zähler zählt daher mit jedem ISR Aufruf, bei dem die Taste im Vergleich zu keystate als verändert erkannt wurde&lt;br /&gt;
&lt;br /&gt;
   ct1   ct0&lt;br /&gt;
     1    1   // 3&lt;br /&gt;
     1    0   // 2&lt;br /&gt;
     0    1   // 1&lt;br /&gt;
     0    0   // 0&lt;br /&gt;
     1    1   // 3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i &amp;amp;= ct0 &amp;amp; ct1;                                 // count until roll over ?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
in i bleibt nur dort ein 1-Bit erhalten, wo sowohl in ct1 als auch in ct0 ein 1 Bit vorgefunden wird, der betreffende Zähler also bis 3 zählen konnte. Durch die zusätzliche Verundung mit i wird der Fall abgefangen, dass ein konstanter Zählerwert von 3 in i ein 1 Bit hinterlässt. Im Endergebnis bedeutet dass, dass nur ein Zählerwechsel von 0 auf 3 zu einem 1 Bit an der betreffenden Stelle in i führt, aber auch nur dann, wenn in i an dieser Bitposition ebenfalls ein 1 Bit war (welches wiederrum deswegen auf 1 war, weil an diesem Eingabeport eine Veränderung zum letzten bekannten entprellten Zustand festgestellt wurde). Alles zusammengenommen heißt das, dass ein Tastendruck dann erkannt wird, wenn die Taste 4 mal hintereinander in einem anderen Zustand vorgefunden wurde als dem zuletzt bekannten entprellten Tastenzustand.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle ist i daher ein Vektor von 8 Bits, von denen jedes einzelne der Bits darüber Auskunft gibt, ob die entsprechende Taste mehrmals hintereinander im selben Zustand angetroffen wurde, der nicht mit dem zuletzt bekannten Tastenzustand übereinstimmt. Ist das der Fall, dann wird eine entsprechende Veränderung des Tastenzustands in key_state registriert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  key_state ^= i;                                 // then toggle debounced state&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und wenn sich in key_state das entsprechende Bit von 0 auf 1 verändert hat, wird dieses Ereignis als &#039;Taste wurde niedergedrückt&#039; gewertet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  key_press |= key_state &amp;amp; i;                     // 0-&amp;gt;1: key press detect&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist der Tasteneingang entprellt. Und zwar sowohl beim Drücken einer Taste als auch beim Loslassen (damit Tastenpreller beim Loslassen nicht mit dem Niederdrücken einer Taste verwechselt werden). Der weitere Code beschäftigt sich dann nur noch damit, diesen entprellten Tastenzustand weiter zu verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Codeteil sieht durch die Verwendung der vielen bitweisen Operationen relativ komplex aus. Behält man aber im Hinterkopf, dass einige der bitweisen wie ein &#039;paralles If&#039; gleichzeitig auf allen 8 Bits eingesetzt werden, dann vereinfacht sich vieles. Ein&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    key_press |= key_state &amp;amp; i;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist nichts anderes als ein&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    // teste ob Bit 0 sowohl in key_state als auch in i gesetzt ist&lt;br /&gt;
    // und setze Bit 0 in key_press, wenn das der Fall ist&lt;br /&gt;
    if( ( key_state &amp;amp; ( 1 &amp;lt;&amp;lt; 0 ) ) &amp;amp;&amp;amp;&lt;br /&gt;
        ( i &amp;amp; ( 1 &amp;lt;&amp;lt; 0 ) )&lt;br /&gt;
       key_press |= ( 1 &amp;lt;&amp;lt; 0 );&lt;br /&gt;
&lt;br /&gt;
    // Bit 1&lt;br /&gt;
    if( ( key_state &amp;amp; ( 1 &amp;lt;&amp;lt; 1 ) ) &amp;amp;&amp;amp;&lt;br /&gt;
        ( i &amp;amp; ( 1 &amp;lt;&amp;lt; 1 ) )&lt;br /&gt;
       key_press |= ( 1 &amp;lt;&amp;lt; 1 );&lt;br /&gt;
&lt;br /&gt;
    // Bit 2&lt;br /&gt;
    if( ( key_state &amp;amp; ( 1 &amp;lt;&amp;lt; 2 ) ) &amp;amp;&amp;amp;&lt;br /&gt;
        ( i &amp;amp; ( 1 &amp;lt;&amp;lt; 2 ) )&lt;br /&gt;
       key_press |= ( 1 &amp;lt;&amp;lt; 2 );&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
nur als wesentlich kompaktere Operation ausgeführt und für alle 8 Bits gleichzeitig.&lt;br /&gt;
Die Kürze und Effizienz dieser paar Codezeilen ergibt sich aus dem Umstand, dass jedes Bit in den Variablen für eine Taste steht und alle 8 (maximal möglichen) Tasten gleichzeitig die Operationen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Funktionsweisen der verschienden Modi anhand von Zeitstrahlen erklärt:&lt;br /&gt;
https://www.mikrocontroller.net/topic/48465?goto=1753367#1844458&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Walkthrough&amp;quot; der verschiedenen Zuständer der Einzelnen Variablen anhand eines Tastendrucks (avrfreaks.net)&lt;br /&gt;
http://www.avrfreaks.net/comment/726676#comment-726676&lt;br /&gt;
&lt;br /&gt;
===== Reduziert auf lediglich 1 Taste =====&lt;br /&gt;
Diskussionen im Forum zeigen immer wieder, dass viele eine Abneigung gegen diesen Code haben, weil er ihnen sehr kompliziert vorkommt.&lt;br /&gt;
&lt;br /&gt;
Der Code ist nicht leicht zu analysieren und er zieht alle Register dessen, was möglich ist, um sowohl Laufzeit als auch Speicherverbrauch einzusparen. Oft hört man auch das Argument: Ich benötige ja nur eine Entprellung für 1 Taste, gibt es da nichts Einfacheres?&lt;br /&gt;
&lt;br /&gt;
Hier ist die &#039;Langform&#039; des Codes, so wie man das für lediglich 1 Taste schreiben würde, wenn man exakt dasselbe Entprellverfahren einsetzen würde. Man sieht: Da ist keine Hexerei dabei: In key_state wird der letzte bekannte entprellte Zustand der Taste gehalten. Der Pin-Eingang wird mit diesem Zustand verglichen und wenn sich die beiden unterscheiden, dann wird ein Zähler heruntergezählt. Produziert dieses herunterzählen einen Unterlauf des Zählers, dann gilt die Taste als entprellt und wenn dann auch noch die Taste gerade gedrückt ist, dann wird dieses in key_press entsprechend vermerkt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t key_state;&lt;br /&gt;
uint8_t key_counter;&lt;br /&gt;
volatile uint8_t key_press;&lt;br /&gt;
&lt;br /&gt;
ISR( ... Overflow ... )&lt;br /&gt;
{&lt;br /&gt;
  uint8_t input = KEY_PIN &amp;amp; ( 1 &amp;lt;&amp;lt; KEY0 );&lt;br /&gt;
&lt;br /&gt;
  if( input != key_state ) {&lt;br /&gt;
    key_counter--;&lt;br /&gt;
    if( key_counter == 0xFF ) {&lt;br /&gt;
      key_counter = 3;&lt;br /&gt;
      key_state = input;&lt;br /&gt;
      if( input )&lt;br /&gt;
        key_press = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
    key_counter = 3;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t get_key_press()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t result;&lt;br /&gt;
&lt;br /&gt;
  cli();&lt;br /&gt;
  result = key_press;&lt;br /&gt;
  key_press = FALSE;&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der vollständige Entprellcode, wie weiter oben gelistet, besticht jetzt aber darin, dass er compiliert kleiner ist als diese anschaulichere Variante für lediglich 1 Taste. Und das bei gleichzeitig erhöhter Funktionalität. Denn zb. ein Autorepeat ist in diesem Code noch gar nicht eingebaut. Und spätestens wenn man dann eine 2.te Taste entprellen möchte, dann ist auch der SRAM-Speicherverbrauch dieser Langform höher als der des Originals für 8 Tasten. Daraus folgt: Selbst für lediglich 1 Taste ist die Originalroutine die bessere Wahl.&lt;br /&gt;
&lt;br /&gt;
Und wegen der Komplexität mal eine Frage: Sind Sie selbst in der Lage eine entsprechend effiziente sqrt() Funktion zu schreiben, wie die, die sie in der Standard-C-Bibliothek vorfinden? Nein? Dann dürften Sie eigentlich Ihrer Argumentation nach die Bibliotheksfunktion sqrt() nicht verwenden, sondern müssten sich statt dessen selbst eine Wurzel-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Selbstsättigendes Filter (nach Jürgen Schuhmacher) ===&lt;br /&gt;
Durch die Nutzung der diskreten Signalanalyse in Software kann die Funktionalität einer einfachen Entprellung mit einem Widerstand, einem Kondensator und einem Schmitttrigger wie in Hardware nachgebildet werden, indem ein abstraktes IIR-Filter benutzt wird, der eine Kondensatorladekurve emuliert. Mit der Vorschrift Y(t) = k Y(t-1) + Input wird ein einfaches Filter erzeugt, dass dem Eingangswert träge folgt. Bei Überschreiten eines bestimmten Wertes erfolgt mit einer einfachen Abfrage das Schalten des Ausgangssignals.&lt;br /&gt;
&lt;br /&gt;
Für Assembler und VHDL bei FPGAs eignet sich aufgrund der leicht zu implementierenden binären Operationen folgende Darstellung mit einer Auflösung des Filterwertspeichers von nur 8 bit: Wert_Neu = Wert_Alt - Wert_Alt/16 + 16*(Taste = True). Der Filterwert bildet dann den gedämpften Verlauf des Eingangs (flankenverschliffen) ab und kann Prellen bis nahe an den Grenzbereich zum schnellen Tasten unterdrücken. Der Ausgangswert ist dann einfach das höchstwertige Bit des Filterwertes.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Entprellung mit IIR-Filter.gif]]&lt;br /&gt;
&lt;br /&gt;
Dazu muss das Signal des Tasters idealerweise um den Faktor 10-20 schneller abgetastet werden, als die höchste gewünschte Tippgeschwindigkeit vorgibt. Noch schneller abzutasten ist möglich, führt aber zu mehr Bedarf an Bits beim Filter. Die Schmittriggerfunktion kann dadurch gebildet werden, dass eine 1 am Ausgang bei z.B. Überschreiten einer 55% Grenze und eine 0 bei Unterschreitung der 45%-Grenze ausgeben wird. Im Zwischenbereich wird der alte Wert gehalten. Die realen Grenzen dieser [[Hysterese]] müssen an die Applikation angepasst werden, da zu enge Grenzen sonst zu empfindlich gegenüber Störungen wären.&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Mittelwertfilter (nach Lothar Miller) ===&lt;br /&gt;
Für digitale Schaltungen oder PLDs empfiehlt sich ein FIR-Filter mit aneinandergereihten FlipFlops. Man schiebt das Eingangssignal in eine FlipFlop-Kette und schaltet oberhalb der Mitte um:&lt;br /&gt;
&lt;br /&gt;
SignalInput -&amp;gt; FF1 -&amp;gt; FF2 -&amp;gt; FF3 -&amp;gt; FF4 -&amp;gt; FF5 -&amp;gt; FF6 -&amp;gt; FF7 -&amp;gt; FF8&lt;br /&gt;
&lt;br /&gt;
Wenn alle FFs = 1 (Summe der FFs=8) dann SignalOutput = 1&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn alle FFs = 0 (Summe der FFs=0) dann SignalOutput = 0&lt;br /&gt;
&lt;br /&gt;
Dieses Verfahren kann sehr einfach in Logik abgebildet werden, weil für die Berechnung des Ausgangs nur ein NOR bz. ein AND Gatter nötig ist.&lt;br /&gt;
&lt;br /&gt;
Das reale Signal muss dazu aber genügend langsam abgetastet werden, sodaß die Filterperiode die Prelldauer übersteigt, um zu verhindern, daß nicht inmitten einer passiven Phase eines Prellvorgangs ein 8fach 1 gesehen wird. Damit wird die Interetation vergleichsweise langsam.&lt;br /&gt;
&lt;br /&gt;
== Gegenüberstellung der Verfahren ==&lt;br /&gt;
* HW - &amp;quot;entprellte Schalter&amp;quot;: Sehr teuer, grosse Bauform, verschleissbelastet, geringe Haltbarkeit&lt;br /&gt;
* HW - &amp;quot;Umschalter&amp;quot; : benötigt aufwändigeren Schalter, benötigt Elektronik&lt;br /&gt;
* HW - &amp;quot;Umschalter ohne FF&amp;quot; : benötigt aufwändigeren Schalter und kleinen Kondensator&lt;br /&gt;
* HW - &amp;quot;Kondensatorentprellung&amp;quot; : benötigt etwas mehr Platz, kommt mit schlechten Schaltern zurecht&lt;br /&gt;
&lt;br /&gt;
* SW - Flankenverfahren:&lt;br /&gt;
* SW - Warteschleife: Durch die Warteschleifen eine nicht zu vernachlässigende Verzögerung im Code. Speziell wenn mehrere Tasten zu überwachen sind, nicht unproblematisch&lt;br /&gt;
* SW - Timer: Universalfunktionalität, die durch geringen Speicherverbrauch, geringen Rechenzeitverbrauch und gute Funktion besticht. Der &#039;Verbrauch&#039; eines Timers sieht auf den ersten Blick schlimmer aus, als er ist, denn in den meisten Programmen hat man sowieso einen Basistimer für die Zeitsteuerung des Programms im Einsatz, der für die Tastenentprellung mitbenutzt werden kann.&lt;br /&gt;
* SW - Filter: sehr geringer Platzbedarf in FPGAs, relativ gute Wirkung&lt;br /&gt;
* SW - Filter 2: sehr geringer Platzbedarf, gute Wirkung&lt;br /&gt;
&lt;br /&gt;
== Links zum Thema ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.edn.com/design/analog/4324067/Contact-debouncing-algorithm-emulates-Schmitt-trigger Contact-debouncing algorithm (Artikel)],  [http://www.edn.com/Pdf/ViewPdf?contentItemId=4324067 als PDF]&lt;br /&gt;
* [[AVR-Tutorial: Tasten]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#.28Tasten-.29Entprellung|AVR-GCC-Tutorial Tastenentprellung]]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-20435.html Beitrag im Forum, AVR Assembler]&lt;br /&gt;
* [http://www.ganssle.com/debouncing.pdf A guide to debouncing (engl.), praktische Erläuterungen zum Entprellen in Soft- und Hardware]&lt;br /&gt;
* [http://www.pololu.com/docs/0J16/all Understanding Destructive LC Voltage Spikes]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>172.26.38.125</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=104946</id>
		<title>Erweiterung von digitalen IO-Ports</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=104946"/>
		<updated>2022-01-23T03:24:59Z</updated>

		<summary type="html">&lt;p&gt;172.26.38.125: /* Schieberegister mir Dämpfung */ t&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für manche Aufgaben in Microcontrollern und digitalen Bausteinen werden oftmals digitale Steuersignale oder analoge Ausgangspannungen benötigt, die nur relativ langsam geändert werden müssen. Sollen dafür keine zusätzlichen Chips oder unnötig viele Pins am Controller verwendet werden, lässt sich die Zahl der Ports erweitern indem folgende Schaltungen eingesetzt werden:&lt;br /&gt;
&lt;br /&gt;
== Schieberegister mit Dämpfung==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 1.png|thumb|right|320px|Multiplex-PWM als Port-Erweiterung für FPGAs]]&lt;br /&gt;
Die Schaltung besteht aus einem Schieberegister, das mit einem schnellen Taktsignal getrieben wird. Es erzeugt am Ausgang 4 unabhängige digitale Signale, die sich infolge der Dämpfungsglieder nicht direkt auswirken können. Bei einer geringen Zeitkonstante werden so glitches vermieden und es entstehen in der Flankensteilheit einstellbare digitale Signale. Wichtig ist, dass das zeitliche Verhältnis zwischen Umschaltphasen und statischen Signalen günstig genug ist. Bei sehr hohen Zeitkonstanten werden auf diese Weise multiplexte PWM-Ausgänge geschaffen, die mit bis zu etwa einem 1/4-tel der Taktfrequenz arbeiten können. Die kurzzeitig fehlerhaften Schaltungszustände, die beim Durchtakten eines neuen Musters entstehen, werden so bereits gut gedämpft, sodass quasi analoge Signale entstehen. Ferner können die Umschalteffekte bei der PWM-Generation berücksichtigt werden. Um sie als echte digitale Ausgänge nutzen zu können, kann ein Buffer mit Schmitt-Trigger nachgeschaltet werden, der auch als Leistungstreiber agieren kann.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Schieberegister mit Latch==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 2.png|thumb|right|320px|Stabile Zusatzports mit Latch]]&lt;br /&gt;
Werden reine digitale Ausgänge mit hoher Qualität benötigt, die nicht zittern / glitchen dürfen, sollte ein Latch eingesetzt werden, das dann sogar mit einem der künstlich erzeugten Bits getaktet werden kann. Dazu muessen aber doppelt soviele Befehlssequenzen ausgegeben werden, damit das Latch-enable eine 0/1 sehen und schalten kann. Es sollte ein Latch mit Schmitt-Trigger-Eingängen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Sicherer ist natürlich die Methode, den Takt zu trennen und insgesamt 3 Pins des Controllers oder FPGAs zu verwenden.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Dafür eignen sich die Bausteine HC165 und HC595.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Artikel zur PWM-Glättung: [[Glättungsfilter für 1-Bit DA-Wandlung|1-Bit Digital-Analog-Wandlung]]&lt;br /&gt;
* Porterweiterung mit SPI : [[Porterweiterung mit SPI]]&lt;br /&gt;
* Porterweiterung mit Standard-Chips : [[Porterweiterungen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Portexpander]]&lt;/div&gt;</summary>
		<author><name>172.26.38.125</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=104945</id>
		<title>Erweiterung von digitalen IO-Ports</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=104945"/>
		<updated>2022-01-23T03:24:42Z</updated>

		<summary type="html">&lt;p&gt;172.26.38.125: /* Schieberegister mit Latch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für manche Aufgaben in Microcontrollern und digitalen Bausteinen werden oftmals digitale Steuersignale oder analoge Ausgangspannungen benötigt, die nur relativ langsam geändert werden müssen. Sollen dafür keine zusätzlichen Chips oder unnötig viele Pins am Controller verwendet werden, lässt sich die Zahl der Ports erweitern indem folgende Schaltungen eingesetzt werden:&lt;br /&gt;
&lt;br /&gt;
== Schieberegister mir Dämpfung==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 1.png|thumb|right|320px|Multiplex-PWM als Port-Erweiterung für FPGAs]]&lt;br /&gt;
Die Schaltung besteht aus einem Schieberegister, das mit einem schnellen Taktsignal getrieben wird. Es erzeugt am Ausgang 4 unabhängige digitale Signale, die sich infolge der Dämpfungsglieder nicht direkt auswirken können. Bei einer geringen Zeitkonstante werden so glitches vermieden und es entstehen in der Flankensteilheit einstellbare digitale Signale. Wichtig ist, dass das zeitliche Verhältnis zwischen Umschaltphasen und statischen Signalen günstig genug ist. Bei sehr hohen Zeitkonstanten werden auf diese Weise multiplexte PWM-Ausgänge geschaffen, die mit bis zu etwa einem 1/4-tel der Taktfrequenz arbeiten können. Die kurzzeitig fehlerhaften Schaltungszustände, die beim Durchtakten eines neuen Musters entstehen, werden so bereits gut gedämpft, sodass quasi analoge Signale entstehen. Ferner können die Umschalteffekte bei der PWM-Generation berücksichtigt werden. Um sie als echte digitale Ausgänge nutzen zu können, kann ein Buffer mit Schmitt-Trigger nachgeschaltet werden, der auch als Leistungstreiber agieren kann.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Schieberegister mit Latch==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 2.png|thumb|right|320px|Stabile Zusatzports mit Latch]]&lt;br /&gt;
Werden reine digitale Ausgänge mit hoher Qualität benötigt, die nicht zittern / glitchen dürfen, sollte ein Latch eingesetzt werden, das dann sogar mit einem der künstlich erzeugten Bits getaktet werden kann. Dazu muessen aber doppelt soviele Befehlssequenzen ausgegeben werden, damit das Latch-enable eine 0/1 sehen und schalten kann. Es sollte ein Latch mit Schmitt-Trigger-Eingängen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Sicherer ist natürlich die Methode, den Takt zu trennen und insgesamt 3 Pins des Controllers oder FPGAs zu verwenden.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Dafür eignen sich die Bausteine HC165 und HC595.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Artikel zur PWM-Glättung: [[Glättungsfilter für 1-Bit DA-Wandlung|1-Bit Digital-Analog-Wandlung]]&lt;br /&gt;
* Porterweiterung mit SPI : [[Porterweiterung mit SPI]]&lt;br /&gt;
* Porterweiterung mit Standard-Chips : [[Porterweiterungen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Portexpander]]&lt;/div&gt;</summary>
		<author><name>172.26.38.125</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=104943</id>
		<title>Erweiterung von digitalen IO-Ports</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=104943"/>
		<updated>2022-01-23T03:19:50Z</updated>

		<summary type="html">&lt;p&gt;172.26.38.125: so macht das Sinn - das sind 2 verschiedene Dinge&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für manche Aufgaben in Microcontrollern und digitalen Bausteinen werden oftmals digitale Steuersignale oder analoge Ausgangspannungen benötigt, die nur relativ langsam geändert werden müssen. Sollen dafür keine zusätzlichen Chips oder unnötig viele Pins am Controller verwendet werden, lässt sich die Zahl der Ports erweitern indem folgende Schaltungen eingesetzt werden:&lt;br /&gt;
&lt;br /&gt;
== Schieberegister mir Dämpfung==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 1.png|thumb|right|320px|Multiplex-PWM als Port-Erweiterung für FPGAs]]&lt;br /&gt;
Die Schaltung besteht aus einem Schieberegister, das mit einem schnellen Taktsignal getrieben wird. Es erzeugt am Ausgang 4 unabhängige digitale Signale, die sich infolge der Dämpfungsglieder nicht direkt auswirken können. Bei einer geringen Zeitkonstante werden so glitches vermieden und es entstehen in der Flankensteilheit einstellbare digitale Signale. Wichtig ist, dass das zeitliche Verhältnis zwischen Umschaltphasen und statischen Signalen günstig genug ist. Bei sehr hohen Zeitkonstanten werden auf diese Weise multiplexte PWM-Ausgänge geschaffen, die mit bis zu etwa einem 1/4-tel der Taktfrequenz arbeiten können. Die kurzzeitig fehlerhaften Schaltungszustände, die beim Durchtakten eines neuen Musters entstehen, werden so bereits gut gedämpft, sodass quasi analoge Signale entstehen. Ferner können die Umschalteffekte bei der PWM-Generation berücksichtigt werden. Um sie als echte digitale Ausgänge nutzen zu können, kann ein Buffer mit Schmitt-Trigger nachgeschaltet werden, der auch als Leistungstreiber agieren kann.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Schieberegister mit Latch==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 2.png|thumb|right|320px|Stabile Zusatzports mit Latch]]&lt;br /&gt;
Ist ein reiner digitaler Ausgang benötigt, der nicht zittern darf, sollte ein Latch eingesetzt werden, das dann mit nur einem der künstlich erzeugten Bits getaktet werden muss. Dazu muessen doppelt soviele Befehlssequenzen ausgegeben werden, wobei das Latch-enable eine 0/1 sehen muss. Es sollte ein Latch mit Schmitt-Trigger-Eingängen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Dafür eignen sich die Bausteine HC165 und HC595.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Artikel zur PWM-Glättung: [[Glättungsfilter für 1-Bit DA-Wandlung|1-Bit Digital-Analog-Wandlung]]&lt;br /&gt;
* Porterweiterung mit SPI : [[Porterweiterung mit SPI]]&lt;br /&gt;
* Porterweiterung mit Standard-Chips : [[Porterweiterungen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Portexpander]]&lt;/div&gt;</summary>
		<author><name>172.26.38.125</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Absolute_Beginner&amp;diff=104924</id>
		<title>Absolute Beginner</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Absolute_Beginner&amp;diff=104924"/>
		<updated>2022-01-13T06:09:17Z</updated>

		<summary type="html">&lt;p&gt;172.26.38.125: /* Sinnvolles Wissen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Grundlagen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Gestern tat es einen Schlag,&amp;lt;br/&amp;gt;&lt;br /&gt;
wovon ich hier berichten mag.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drosselspulen, Widerstände,&amp;lt;br/&amp;gt;&lt;br /&gt;
alles fällt mir in die Hände.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da bau ich eine Schaltung auf.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ein Kühlblech kommt da auch noch drauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
An Einstellreglern rumgedreht,&amp;lt;br/&amp;gt;&lt;br /&gt;
bis dann plötzlich nichts mehr geht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Elkos hab ich nicht gebraucht,&amp;lt;br/&amp;gt;&lt;br /&gt;
Widerstände abgeraucht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jetzt ist die Bude voller Qualm,&amp;lt;br/&amp;gt;&lt;br /&gt;
zum Himmel schick ich einen Psalm.&amp;lt;br/&amp;gt;&lt;br /&gt;
Transistoren an den Ohren.&amp;lt;br/&amp;gt;&lt;br /&gt;
Dioden an den Hoden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Kabel am Nabel.&amp;lt;br/&amp;gt;&lt;br /&gt;
Phase an der Nase!&amp;lt;br/&amp;gt;&lt;br /&gt;
Herzkammer flimmert; kann nur noch fluchen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Muß mir ein neues Hobby suchen!&amp;lt;br/&amp;gt;&lt;br /&gt;
MfG Paul&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Damit dieses von Paul so plastisch dargestellte Anfängerszenario gar nicht erst eintritt, werden auf dieser Artikelseite von http://www.mikrocontroller.net einige Dinge aufgeführt, die unbedingt notwendig sind, wenn man sich mit Elektronikbasteleien auseinandersetzt. Die Seite richtet sich bewusst an den absoluten Anfänger um so interessierten Leuten den Einstieg in die Welt der Elektronik und damit auch zum Programmieren von Mikrocontrollern möglichst einfach zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Natürlich ist das Programmieren von Mikrocontrollern auch ohne Elektronikkenntnisse machbar, aber die Aussenanbindung eines Mikrocontrollers zu verstehen ist häufig sinnvoll, so z.&amp;amp;nbsp;B. wenn man ein Signal auswerten möchte.&lt;br /&gt;
&lt;br /&gt;
Die Grundlage für diesen Artikel bildet dieser [http://www.mikrocontroller.net/forum/read-1-344257.html#new Thread] aus dem Forum.&lt;br /&gt;
&lt;br /&gt;
==Sicherheit==&lt;br /&gt;
&lt;br /&gt;
Bleibt gesund! Denkt daran, dass nicht nur Strom und  Spannung bei dem neuen interessanten Hobby gefährlich sein können, sondern auch Hitze, Licht (Laser), Schall, Chemikalien (Entwickler, Ätzbäder, Lötrauch) usw. Lieber einmal mehr fragen, als einmal zu wenig. Und vielleicht bewahrt eure Frage euch und den Nächsten vor Schaden!&lt;br /&gt;
&lt;br /&gt;
===Versuchsaufbauten &amp;gt;60V (DC)===&lt;br /&gt;
Tipp aus dem Forum [http://www.mikrocontroller.net/topic/181266#1750311]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Diplomand schrieb:&lt;br /&gt;
&amp;gt; Oder wie geht es auf&#039;er Arbeit zu in Puncto &lt;br /&gt;
&amp;gt; Versuchsaufbauten?&lt;br /&gt;
&lt;br /&gt;
Alles was über 60V (DC) ist muß bei anliegender Spannung&lt;br /&gt;
mindestens unter 1 cm dickes Plexiglas.&lt;br /&gt;
&lt;br /&gt;
Gruß Anja&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
Ohne Lektüre (egal ob in Papierform oder im Internet) wird das mit der Elektronik in Eigenregie nix. &lt;br /&gt;
Möchte man sich ernsthaft mit der Materie beschäftigen, so kommt man nicht umhin, sich mit den Grundlagen der Elektronik zu beschäftigen. Während man im Internet viele Schaltungen findet, die einfach nachzubauen sind, bietet sich für das Grundlagenstudium eher ein Buch an. Da gute Elektronikbücher häufig teuer sind, will ich Dir folgenden Tipp geben: Schau einfach mal in die nächste größere Bibliothek. Wenn Dir ein Buch dort gefällt, kannst Du es jederzeit noch kaufen. Wer sich nicht irgendwann mit den Grundlagen beschäftigt, wird nie über das Stadium herauskommen, in dem er Schaltungen aus dem Internet kopiert. Aber unser aller Ziel ist es doch, auch zu verstehen, weshalb hier jetzt genau der rot-rot-schwarze Widerstand rein muss und was er tut...&lt;br /&gt;
*&#039;&#039;&#039;Fachzeitschriften&#039;&#039;&#039; am Kiosk&lt;br /&gt;
*&#039;&#039;&#039;Internet&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;[http://www.elektronik-kompendium.de/ Das Elektronik Kompendium]&#039;&#039;&#039; Ziel von das ELKO ist es die Themen Elektronik, Computertechnik, Kommunikationstechnik und Netzwerktechnik allgemeinverständlich zu erklären und der Allgemeinheit zu präsentieren. Die Zielgruppe sind vor allem Schüler und Auszubildende, die sich mit Elektronik näher beschäftigen müssen oder wollen. Weiterhin sollen alle privat und beruflich an Elektronik interessierte angesprochen werden.&lt;br /&gt;
**&#039;&#039;&#039;http://www.dse-faq.elektronik-kompendium.de/&#039;&#039;&#039; Es gibt zwar von der Startseite des ELKO einen Link zum FAQ, aber es schadet sicher nicht, es hier explizit aufzuführen.&lt;br /&gt;
**&#039;&#039;&#039;http://www.b-kainka.de/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;http://www.dieelektronikerseite.de/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;http://www.howstuffworks.com/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;Datenblatt (Datasheet)&#039;&#039;&#039; zu den meisten Bauteilen, wird vom Hersteller ein Datasheet angeboten. Es ist sinnvoll, dies wenigstens einmal durchzulesen, auch wenn man am Anfang wenig mit den ganzen Fachbegriffen anfangen kann.  &lt;br /&gt;
**Diverse Application Notes der großen Halbleiterhersteller sind auch immer eine gute Informationsquelle und beschäftigen sich teilweise auch mit sehr grundlegenden Problemen&lt;br /&gt;
*&#039;&#039;&#039;Bücher&#039;&#039;&#039;   --- (letzte Änderung: 10.2.2020)&lt;br /&gt;
**&#039;&#039;&#039;[https://www.amazon.de/Art-Electronics-Paul-Horowitz/dp/0521809266/ref=sr_1_1?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;keywords=the+art+of+electronics&amp;amp;qid=1581325802&amp;amp;sr=8-1 The Art of Electronics]&#039;&#039;&#039; Third Edition, von P.Horowitz, W.Hill - ISBN 978-0-521-80926-9 - Bitte nur die englische Version nutzen, da die Übersetzung nicht gut gelungen ist.&lt;br /&gt;
** &#039;&#039;&#039;[http://www.amazon.de/exec/obidos/ASIN/3426037920/qid=1146692611/sr=8-1/ref=sr_8_xs_ap_i1_xgl/302-0461878-1759243 Elektronik ohne Geheimnisse]&#039;&#039;&#039; Von der Anfängerschaltung bis zum Radio, Franzis-Verlag, ISBN 3-426-03792-0&lt;br /&gt;
**&#039;&#039;&#039;[https://www.thalia.de/shop/home/artikeldetails/ID30574703.html Elemente der angewandten Elektronik]&#039;&#039;&#039; von E.Böhmer, D.Ehrhardt, W.Oberschelp, Springer Vieweg, ISBN 978-3-8348-1496-8 &lt;br /&gt;
**&#039;&#039;&#039;[https://www.thalia.de/shop/home/artikeldetails/ID143929448.html Halbleiter-Schaltungstechnik]&#039;&#039;&#039;, von U.Tietze, Ch.Schenk, E.Gamm, Springer Vieweg, ISBN 978-3-662-48553-8 - ältere Auflagen können günstig antiquarisch erworben werden, z.B. bei: [https://www.medimops.de/produkte-C0/?listorder=asc&amp;amp;listorderby=oxvarminprice&amp;amp;searchparam=Halbleiter-Schaltungstechnik Medimops.de]&lt;br /&gt;
**&#039;&#039;&#039;Schaltkreisbastelbuch&#039;&#039;&#039; von H.Jakubaschk und das&lt;br /&gt;
**&#039;&#039;&#039;Radiobastelbuch&#039;&#039;&#039; von K.H. Schubert. Das sind sehr alte DDR-Bücher. Aber die sind für Einsteiger äußerst nahrhaft.&lt;br /&gt;
**&#039;&#039;&#039;Tabellenbuch&#039;&#039;&#039; ein beliebiges Elektronik Tabellenbuch, hier findest Du die  mathematischen Grundlagen als Formelsammlung. Es wird Dich als Nachschlagewerk bis zur Rente begleiten.&lt;br /&gt;
** [http://www.generalatomic.com/teil1/index.html Das Telekosmos-Praktikum (Teil 1)]&lt;br /&gt;
** &#039;&#039;&#039;[http://www.amazon.de/Elektronik-nicht-schwer-Experimente-Gleichstrom/dp/3921608325 Elektronik - gar nicht schwer]&#039;&#039;&#039; Es gibt davon verschiedene Bände. Band 1 ist für den absoluten Einstieg gut, allerdings sind die Schaltungen darin für etwas Fortgeschrittene nicht mehr besonders interesssant. Band 2 hingegen ist sowohl für Einsteiger als auch für Fortgeschrittene empfehlenswert!&lt;br /&gt;
** &#039;&#039;&#039;[http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] PDF&lt;br /&gt;
&lt;br /&gt;
==Grundausstattung für das Elektroniklabor==&lt;br /&gt;
In der folgenden Liste werden die wichtigsten Bauteile aufgeführt, die in keinem Elektroniklabor fehlen dürfen. Da es eine Unmenge an Angeboten der einzelnen Bauteile gibt, wird auf der Seite [[Standardbauelemente]] darauf hingewiesen, welche Bauteile sich im Laufe der Zeit als sinnvoll dargestellt haben.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;[[Steckbrett]]&amp;lt;/b&amp;gt; Mit dem Steckbrett (Breadboard) kann man schnell und ohne Lötkolben eine Schaltung zum Testen aufbauen. &lt;br /&gt;
* &amp;lt;b&amp;gt;[[Steckbrücken und Kabel]]&amp;lt;/b&amp;gt; Ein farbcodiertes Steckbrückenset [http://www.ebay.de/sch/items/?_nkw=Steckbr%C3%BCcken+Set] macht das Verkabeln einfacher. Dazu noch ein Sortiment an Kabeln [http://www.ebay.de/sch/items/?_nkw=Jumper+Wires]. Zur Auswahl des richtigen Drahts fürs Steckbrett sind in folgendem Thread nützliche Informationen zu finden: [http://www.mikrocontroller.net/forum/read-1-350462.html#new].&lt;br /&gt;
*&#039;&#039;&#039;Widerstände:&#039;&#039;&#039; 330 Ω, 1 kΩ, 3.3 kΩ, 10 kΩ, 100 kΩ, 1 MΩ (lies: &amp;quot;Ohm&amp;quot;/&amp;quot;Kilo-Ohm&amp;quot;/&amp;quot;Mega-Ohm&amp;quot;). Ob man sich Kohleschicht- oder Metallfilmwiderstände kauft, ist zunächst unerheblich.&lt;br /&gt;
*&#039;&#039;&#039;Potentiometer:&#039;&#039;&#039; 1 kΩ, 10 kΩ, 100 kΩ&lt;br /&gt;
*&#039;&#039;&#039;Elektrolytkondensatoren&#039;&#039;&#039; (&amp;quot;Elkos&amp;quot;): 1 µF, 10 µF, 100 µF, 470 µF, 1000 µF, 2200 µF (lies: &amp;quot;Mikro-Farad&amp;quot;). Eine Spannungsfestigkeit von 25 Volt ist für den Anfang ausreichend.&lt;br /&gt;
*&#039;&#039;&#039;Keramikkondensatoren:&#039;&#039;&#039; 100 nF; 22 pF (letztere für Quarze)&lt;br /&gt;
*&#039;&#039;&#039;Dioden:&#039;&#039;&#039; 1N4148, 1N4007; BAT43 oder BAT85 (Schottky)&lt;br /&gt;
*&#039;&#039;&#039;[[LED]]s&#039;&#039;&#039; verschiedenfarbig, je nach Geschmack. Man sollte zumindest einige Farben haben, um unterschiedliche Betriebszustände u.ä. anzuzeigen.&lt;br /&gt;
*&#039;&#039;&#039;[[Transistor]]en:&#039;&#039;&#039; BC547, BC557 (Dies sind die beiden Standard npn- bzw. pnp-Transistortypen) und  BC327, BC337 (höherer Kollektorstrom, trotzdem Standard)&lt;br /&gt;
*&#039;&#039;&#039;Operationsverstärker (&amp;quot;OPV&amp;quot; oder &amp;quot;OpAmp&amp;quot;):&#039;&#039;&#039; LM324 (der LM741 ist weniger gut geeignet)&lt;br /&gt;
*&#039;&#039;&#039;Universal-Timer-IC:&#039;&#039;&#039; NE555. Wenn man mit 3,3V Mikrocontrollern arbeitet, dann eventuell die nur wenige Cent teureren CMOS-Version wie LM&#039;&#039;&#039;C&#039;&#039;&#039;555, I&#039;&#039;&#039;C&#039;&#039;&#039;M7555, TS555, TM&#039;&#039;&#039;C&#039;&#039;&#039;555, usw. Diese lassen sich mit niedrigeren Betriebsspannungen betreiben (Datenblatt checken!), während der bipolare NE555 etwa mindestens 4,5V benötigt.&lt;br /&gt;
*&#039;&#039;&#039;[[AVR-Tutorial:_Equipment#Spannungsversorgung|Spannungsregler]]:&#039;&#039;&#039; Ein  7805-Festspannungsregler für die Bereitstellung von 5 V ist sinnvoll, wenn man mal eine Schaltung autark betreiben will. Dann benötigt man in den meisten Fällen noch einen geeigneten Trafo mit einem Brückengleichrichter und einem Glättungskondensator oder ein kleines Steckernetzteil als Basisversorgung für den Spannungsregler. Ein regelbares Netzteil mit Anzeige ist ebenfalls einsetzbar, birgt aber eine Gefahr in sich. Einige ICs, darunter Mikrocontroller, haben enge Betriebsgrenzen, in denen sie funktionieren bzw. oberhalb denen sie sterben (siehe unter &#039;&#039;Absolute Maximum Ratings&#039;&#039; im Datenblatt). Irgendwann ist der Stellknopf am Labornetzteil dann doch höhergestellt, als es dem Chip gut tut... &lt;br /&gt;
*&#039;&#039;&#039;Schalter&#039;&#039;&#039; einfache Schiebeschalter (EIN/AUS)&lt;br /&gt;
*&#039;&#039;&#039;Taster: &#039;&#039;&#039; Bedrahtet oder SMD Kurzhubtaster (billiger). Für Verwendung mit einem Mikrocontroller müssen diese softwareseitig [[Entprellung|entprellt]] werden.&lt;br /&gt;
*&#039;&#039;&#039;Lötnägel&#039;&#039;&#039; Sind dazu gedacht, auf Platinen eingelötet zu werden.  Auf Breadboards haben sie nichts verloren, weil sie mit einem Durchmesser von 1 mm dafür zu dick sind.&lt;br /&gt;
* &#039;&#039;&#039;Jumperpins&#039;&#039;&#039;: gibt es als 40polige Leiste, die man mit dem Seitenschneider kürzen kann.&lt;br /&gt;
* &#039;&#039;&#039;Ein Satz Schnellverbinder-Kabel&#039;&#039;&#039; mit Krokodilklemmen an beiden Enden&lt;br /&gt;
*&#039;&#039;&#039;Draht&#039;&#039;&#039;&lt;br /&gt;
** dünne Litze,&lt;br /&gt;
** dünner isolierter Draht (je dünner desto besser), ideal: Wrap-Draht ca. AWG30, leider etwas schwer erhältlich und teuer, (alte 80-polige IDE-Kabel sind meist AWG30)&lt;br /&gt;
** dünner blanker verzinnter Draht (möglichst &amp;lt; 0,5mm, leider etwas schwer erhältlich) oder lötbarer Silberdraht,&lt;br /&gt;
* Ein paar &#039;&#039;&#039;Lochraster-Platinen&#039;&#039;&#039; mit Lötpunkten, falls man doch nicht nur stecken und nachher auseinanderbauen will. &#039;&#039;&#039;Streifenraster-Platinen&#039;&#039;&#039; sparen ein paar Löt- oder Drahtbrücken.&lt;br /&gt;
&lt;br /&gt;
Installationskabel, dicke 230V-Litze oder Klingeldraht sollte man zum Aufbau von Lochraster-Schaltungen nicht verwenden. Leitungen mit größerem Querschnitt kommen nur zum Einsatz, wenn hohe Ströme fließen sollen.&lt;br /&gt;
&lt;br /&gt;
Zur Aufbewahrung der Kleinteile ist ein Kleinteilemagazin oder einige Sortimentkästen sehr zu empfehlen. Man muss sich nicht von vornherein auf spezielle Bauteile festlegen.&lt;br /&gt;
&lt;br /&gt;
Eine weiterreichende Liste von Standard-Bauelementen findet sich [[Standardbauelemente|hier]].&lt;br /&gt;
&lt;br /&gt;
==Werkzeug==&lt;br /&gt;
* Eine eigene &#039;&#039;&#039;Bastelecke&#039;&#039;&#039;, in der ein Aufbau auch mal ein, zwei Wochen [http://www.mikrocontroller.net/topic/15027#104245 liegenbleiben] kann, bis man wieder Lust oder Zeit hat, was daran zu machen. Bau Dir den Schreibtisch vorm PC nicht zu – Du brauchst den Zugang hierher ;-)&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;stabile Unterlage&#039;&#039;&#039;, die nicht leitend ist, z. B. eine Holzplatte. Die nimmt es im Gegensatz zum Wohnzimmertisch nicht übel, wenn der Lötkolben mal umfällt und einen Brandfleck hinterlässt, oder wenn abgeknipste, scharfe Drahtspitzen (Platinenunterseiten!) kratzen. Eine Anti-Statik-Matte (mit angeschlossener Erdung!!) ist auch eine Überlegung wert, sie bewahrt evtl vor unangenehmen Überraschungen und langer Fehlersuche. &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Halterung&#039;&#039;&#039; um Dinge fixieren zu können. Anfangs tut&#039;s die [http://www.ebay.de/sch/items/?_nkw=Dritte+Hand dritte Hand]. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;kleiner Schraubendreher&#039;&#039;&#039; als Allzweckwerkzeug zum Drücken, Klopfen, Justieren, ICs-aus-dem-Sockel-hebeln, Kabel beim Löten Fixieren.  Ach ja, Schrauben drehen kann man damit auch.&lt;br /&gt;
&lt;br /&gt;
* Eine gute, spitze &#039;&#039;&#039;Pinzette&#039;&#039;&#039; zum Greifen und Richten kleiner Bauteile, Drähte einstecken usw. Außerdem eine Klemmpinzette mit flacher Spitze zum Fixieren von Bauteilen.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Seitenschneider&#039;&#039;&#039;, klein, zum Durchtrennen von Drähten. Opas Kneifzange ist ungeeignet, Omas Handarbeitsschere auch.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Spitzzange&#039;&#039;&#039;, klein, für alles, wofür die Pinzette nicht kräftig genug ist. &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Abisolierzange&#039;&#039;&#039;, Bauform vgl. Wasserrohrzange. Die symmetrischen mit dem Loch vorne sind eher für Starkstromleitungen gedacht.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Skalpell&#039;&#039;&#039; als Allzweckwaffe. Wenn man es einmal hat, will man es nicht mehr missen.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Cuttermesser&#039;&#039;&#039; für alles grobe wofür das Skalpell zu schade ist und wo die Abisolierzange und der Seitenschneider versagt.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Grundausrüstung zum Löten&#039;&#039;&#039;. Detaillierte Informationen zum Löten findest Du im Artikel [[Löten_(praktisch)]].&lt;br /&gt;
** &#039;&#039;&#039;Lötkolben&#039;&#039;&#039; 30 Watt ungeregelt oder mehr als 30 Watt mit Regelung&lt;br /&gt;
** &#039;&#039;&#039; Lötzinn&#039;&#039;&#039; 1 mm&lt;br /&gt;
** &#039;&#039;&#039;Lötschwamm &#039;&#039;&#039;. Ein gut mit Wasser angefeuchteter Baumwoll-Lumpen (gefaltete &amp;quot;Jute-Tasche&amp;quot;) tut es auch. Destillierte Wasser ist auf Dauer besser als Leitungswasser.&lt;br /&gt;
** Eine &#039;&#039;&#039;Entlötpumpe&#039;&#039;&#039; oder &#039;&#039;&#039;Entlötlitze&#039;&#039;&#039; zum Fehler auszubessern. &lt;br /&gt;
&lt;br /&gt;
* Eine kleine &#039;&#039;&#039;(LED-) Taschenlampe&#039;&#039;&#039; und eine Lupe, um Bauteile wie Dioden oder schwach bedruckte IC&#039;s zu beleuchten und um deren Beschriftung erkennen zu können. Das  Tageslicht kann gelegentlich zu &amp;quot;dunkel&amp;quot; sein.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Crimpzange&#039;&#039;&#039; und die entsprechenden Crimp-Kontakte und Leergehäuse. Macht das Basteln auf Dauer einfacher, da sich Kabel mit passender Länge und passendem Ende (Pin oder Buchse) schnell und ohne Löten herstellen lassen. Ausserdem scheiden irgendwelche Verlängerungen oder Isolierbandkonstruktionen als Fehlerquelle aus. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Netzteil mit Strombegrenzung&#039;&#039;&#039; hilft zu verhindern, dass Dir ständig die Bauteile flöten gehen. Oder Du nimmst deine Schaltungen zunächst mit Batterien oder Akkus in Betrieb, dann kostet es &amp;quot;nur&amp;quot; die Schaltung. Denn bei Batterien/Akkus ist auch darauf zu achten, dass bei einem Kurzschluss sehr hohe Ströme fließen können! Als Strombegrenzung für die Schaltung kann bei kleinen Aufbauten eine 6 V/100 mA Glühlampe in Serie benutzt werden ([http://www.mikrocontroller.net/topic/61119#480376 Forenbeitrag]). Bei einem Kurzschluss heizt sich durch den hohen Strom der Faden auf, die Lampe wird hell, der Widerstand des Fadens nimmt zu, und es können nur die 100 mA zur Schaltung kommen. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;[http://de.wikipedia.org/wiki/Multimeter Multimeter]&#039;&#039;&#039; zum Messen von Spannungen, Strömen und Widerständen. Eine Überlegung wert ist der Kauf zweier Multimeter, weil man dann z. B. gleichzeitig Strom und Spannung messen kann. Prüfspitzen in Klemmausführung haben den Vorteil, dass man die Hände frei hat für wichtigere Dinge. [http://de.wikipedia.org/wiki/Digitalmultimeter Digitale Multimeter] sind in der Regel günstiger als die analogen (Beispiel: 4,95 € bei [http://www.pollin.de pollin]). Für den Anfang reicht normalerweise ein günstiges Gerät, später könnte aber dessen mangelnde Genauigkeit doch einigen Frust erzeugen - das ggf gleich ein paar Euro mehr ausgeben. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;[[Oszilloskop]]&#039;&#039;&#039; ist zu Beginn noch nicht unbedingt notwendig, schadet aber nicht. Ein &#039;&#039;&#039;[[Logikanalysator]]&#039;&#039;&#039; ist für Digital-Schaltungen auch schon hilfreich und ggf. billiger. Wenn man sich eine Weile mit der Materie beschäftigt, kommt die Wünsche von ganz alleine. Ein kleiner Ratgeber zur Auswahl von Geräten findet sich hier im Wiki. &#039;&#039;Tip:&#039;&#039;Für I2C, SPI und UART reicht bei niedrigen Raten (bis so 16kHz) oft ein PC-Oszilloskop mit einem etwas veränderten Mikrofonkabel. Das Selber-Bauen eines Logikanalysators ist ein interessantes Projekt (siehe [[Logic_Analyzer]]), erreicht aber oft nicht die gewünschten Funktionen und Bandbreite - oder scheitert schon an dem grundlegenden [http://de.wikipedia.org/wiki/Henne-Ei-Problem Henne-Ei Problem].&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
* Ein &#039;&#039;&#039;Simulationstool&#039;&#039;&#039; ist nützlich. Mit Simulationsprogrammen kann man sich viel Zeit und Frust ersparen. Man weiß bereits vor dem Aufbau, ob eine Schaltung NICHT funktionieren wird. Der Umkehrschluss (&amp;quot;Das funktioniert dann auch in Echt&amp;quot;) ist leider nicht immer möglich.&lt;br /&gt;
:Viele kommerzielle, aber auch kostenlos erhältliche Simulationsprogramme sind Abkömmlinge eines Programms namens &#039;&#039;&#039;[[SPICE]]&#039;&#039;&#039;. Z.B. enthalten die folgenden Programme nicht ganz zufällig je einen SPICE-Kern für die eigentliche Berechnung. Im Gegensatz zum Original-SPICE bieten sie jedoch den Vorteil einer grafischen Benutzeroberfläche. &lt;br /&gt;
&lt;br /&gt;
**Mit Hilfe von [https://www.tinkercad.com/learn/circuits &#039;&#039;&#039;Tinkercad Circuits&#039;&#039;&#039; ]  kannst Du Schaltungen am Computer planen und sogar ohne Arduino testen. Viel mehr noch könnte man sagen, dass Tinkercad einen kompletten Arduino(Atmega328P) simuliert. Tinkercad besitzt standardmäßig einen Atmega328P womit man im Browser programmiert und ein paar Standard-Bauteile(Liste kann ausgeklappt werden) besitzt.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt; &lt;br /&gt;
***DC-Motoren&lt;br /&gt;
***Servomotoren&lt;br /&gt;
***Widerstände&lt;br /&gt;
***ICs&lt;br /&gt;
***Kondensatoren&lt;br /&gt;
***Spulen&lt;br /&gt;
***Taster/Schalter&lt;br /&gt;
***Potentiometer&lt;br /&gt;
***Lichtsensoren&lt;br /&gt;
***Bewegungs-/Näherungsensoren&lt;br /&gt;
***Gas-Sensoren&lt;br /&gt;
***Zahlenfeld&lt;br /&gt;
***Dipswitches (Mäuseklavier)&lt;br /&gt;
***Dioden&lt;br /&gt;
***LED Ringe&lt;br /&gt;
***Piezo&lt;br /&gt;
***IR Fernbedienung&lt;br /&gt;
***LED- und LCD-Displays&lt;br /&gt;
***Batterien&lt;br /&gt;
***Breadboards&lt;br /&gt;
***Arduino&lt;br /&gt;
***Multimeter&lt;br /&gt;
***Labornetzteil&lt;br /&gt;
***Oscilloscope&lt;br /&gt;
***Integrierte Schaltkreise (ICs)&lt;br /&gt;
***Transistoren&lt;br /&gt;
***Relais&lt;br /&gt;
***W-LAN-Modul &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** Die &#039;&#039;&#039;[http://www.electronicsworkbench.com/ Electronic Workbench]&#039;&#039;&#039; (aktuelle Versionen heißen &#039;&#039;&#039;NI Multisim&#039;&#039;&#039;, nachdem der Hersteller von National Instruments übernommen wurde) ist in einigen Fachbüchern (s. Franzis Verlag) als abgespeckte Version mit einem geringeren Umfang an simulierbaren Bauteilen beigelegt und als [http://digital.ni.com/worldwide/germany.nsf/web/all/23834AA0D635C68586257124004EF1C9#3 Studentenversion günstiger erhältlich].&lt;br /&gt;
** &#039;&#039;&#039;[http://www.linear.com/designtools/software/#Spice SwitcherCAD III/LTspice]&#039;&#039;&#039; wird vom Hersteller Linear Technology kostenlos abgegeben. Eigentlich zur Unterstützung bei der Entwicklung von Anwendungen mit Linear Technology Produkten gedacht, enthält es doch einen kompletten SPICE-Kern.&lt;br /&gt;
** Das früher sehr populäre &#039;&#039;&#039;PSpice&#039;&#039;&#039; (erste PC SPICE Version, von der es eine kostenlose &#039;&#039;Student Edition&#039;&#039; gab) wurde mittlerweile von Cadence übernommen und in die OrCAD-Produktlinie integriert. Dabei ist die Student Edition weggefallen. Es gibt statt dessen eine &#039;&#039;&#039;[http://www.cadence.com/products/orcad/downloads/orcad_demo/index.aspx OrCAD PCB Demo-CD]&#039;&#039;&#039;, auf der auch eine eingeschränkte PSpice-Version enthalten ist.&lt;br /&gt;
** &#039;&#039;&#039;[http://ngspice.sourceforge.net/screens.html ngspice]&#039;&#039;&#039; ist eine mit diversen Erweiterungen versehene Freie-Software Version von SPICE für diverse Unix Systeme (Solaris, Linux, Mac OS X, etc.) und Windows XP. Es enthält eine graphische Ausgabe, jedoch selber keine graphische, sondern nur eine Texteingabe. Es ist Teil von &#039;&#039;&#039;[http://www.geda.seul.org/ gEDA]&#039;&#039;&#039;, einer Sammlung von freien &#039;&#039;Electronic Design Automation&#039;&#039;-Werkzeugen, zu denen auch &#039;&#039;&#039;gschem&#039;&#039;&#039; als Schaltplan-Editor gehört. Was zur nächsten Kategorie führt:  &lt;br /&gt;
** &#039;&#039;&#039;[http://qucs.sourceforge.net QUCS]&#039;&#039;&#039; ist ein gutes Simulationsprogramm, welches sich nicht nur zu Lernzwecken eignet, sondern auch zur Simulation von &amp;quot;echten&amp;quot; Schaltungen (Bauteilkatalog mit Strg-4 abrufen). Nützlich ist die Einbindung der Graphen direkt in den Schaltungseditor, da man so &amp;quot;alles auf einem Blick hat&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;[http://ktechlab.org/ KTechLab]&#039;&#039;&#039; ist eine Echtzeitsimulation von analogen und digitalen Bauelementen in Kombination mit PIC-Mikrocontrollern.&lt;br /&gt;
** &#039;&#039;&#039;[http://www.falstad.com/circuit/ P. Falstads Circuit Simulator]&#039;&#039;&#039; ist ein Java-Applet, das man direkt aus dem Browser heraus ausführen kann. Die Möglichkeiten sind zwar nicht ganz so umfangreich wie bei den anderen genannten Simulatoren, trotzdem lässt sich mit dem Applet schnell und einfach eine Schaltung simulieren (Vorteil: Programm muss nicht erst installiert werden)&lt;br /&gt;
So kann das gesamte Mikrocontrollerprojekt simuliert werden. Aber auch in die Transistor/Operationsverstärker/Logiktechnik kann man sich mit dem Programm gut&lt;br /&gt;
einarbeiten.&lt;br /&gt;
* Ein &#039;&#039;&#039;Schaltplaneditor&#039;&#039;&#039; (&#039;&#039;schematic capturer&#039;&#039;) ist nützlich z.&amp;amp;nbsp;B. &lt;br /&gt;
** &#039;&#039;&#039;[http://www.abacom-online.de/html/splan.html sEdit ]&#039;&#039;&#039; Software für Windows auch als Freewareversion geeignet.&lt;br /&gt;
**&#039;&#039;&#039;[http://www.cadsoft.de/ Eagle von Cadsoft]&#039;&#039;&#039; Der Quasi-Standard für Hobbyanwender. Es ist zwar etwas gewöhnungsbedürftig in der Bedienung, aber wenn  man erstmal dahintergekommen ist, was sich Cadsoft dabei gedacht hat, kann man damit leben. Und mit der Freeware-Version, Light- oder auch Non-Profit-Version kann man schon einiges machen. Früher oder später wirst eh nicht darum herumkommen, auch Platinen zu machen, und dann kannst Du schon auf eine Basis von Schaltplänen zurückgreifen, die Du vorher nur z.&amp;amp;nbsp;B. auf Lochraster aufgebaut hast und brav vorher wenigstens einen Schaltplan davon gezeichnet hast.&lt;br /&gt;
** Die bereits erwähnte &#039;&#039;&#039;[http://www.cadence.com/products/orcad/downloads/orcad_demo/index.aspx OrCAD PCB Demo-CD]&#039;&#039;&#039; enthält eine Demo-Version von &#039;&#039;&#039;OrCADE Capture&#039;&#039;&#039;.&lt;br /&gt;
** Das schon erwähnte &#039;&#039;&#039;[http://www.geda.seul.org/tools/gschem/index.html gschem]&#039;&#039;&#039; aus der gEDA-Sammlung.&lt;br /&gt;
** Die freie Software &#039;&#039;&#039;[http://www.lis.inpg.fr/realise_au_lis/kicad/ KiCad]&#039;&#039;&#039; für Linux und Windows (siehe auch den Artikel [[KiCAD]]).&lt;br /&gt;
:Siehe den Artikel [[Schaltplaneditoren]] für weitere Informationen zu Schaltplaneditoren.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Layout-Editor&#039;&#039;&#039; ist nützlich, um den Schaltplan dann in eine Vorlage zum Selbstätzen umzusetzen oder die Platine als Datei zum Leiterplattenhersteller zu senden.&lt;br /&gt;
** Das bereits erwähnte &#039;&#039;&#039;[http://www.cadsoft.de/ Eagle von Cadsoft]&#039;&#039;&#039; gilt auch hier als der Standard im Hobbybereich.&lt;br /&gt;
**&#039;&#039;&#039;[http://www.ibfriedrich.com TARGET 3001! ]&#039;&#039;&#039; vom Ing.-Büro Friedrich ist eine komplette Software vom Schaltplan bis zum Layout, inkl. Simulation oder Isolationsfräsen. Die kostenlose [http://www.ibfriedrich.com/download.htm Discover-Version] geht bis 250 Pins. Einen einfachen Einstieg findet man &#039;&#039;&#039;[http://ibfriedrich.dyndns.org/wiki/ibfwikide/index.php?title=Kurzeinführung2 hier]&#039;&#039;&#039;.&lt;br /&gt;
** In der gEDA-Sammlung für Linux findet man &#039;&#039;&#039;[http://www.geda.seul.org/tools/pcb/index.html PCB]&#039;&#039;&#039;, das allerdings noch Ecken und Kanten hat. &lt;br /&gt;
** Das bereits erwähnte &#039;&#039;&#039;[http://www.lis.inpg.fr/realise_au_lis/kicad/ KiCad]&#039;&#039;&#039; ermöglicht ebenfalls die Erstellung von Platinen-Layouts.&lt;br /&gt;
&lt;br /&gt;
* Zum Aufbau auf Platinen mit &#039;&#039;&#039;Lochraster&#039;&#039;&#039; oder &#039;&#039;&#039;Lochstreifen&#039;&#039;&#039; gibt es die Tools&lt;br /&gt;
** [http://www.geocities.com/stripboarddesigner/ Stripboard Designer] (Shareware)&lt;br /&gt;
** [http://veecad.com/ VeeCAD] Stripboard Layout Editor&lt;br /&gt;
** [http://www.abacom-online.de/html/lochmaster.html Lochmaster] (ca. 40€)&lt;br /&gt;
** [http://blackboard.serverpool.org/Home/News.html Blackboard], das kommt [http://www.mikrocontroller.net/topic/open-source-lochraster-layout hier aus dem Forum], ist opensource und kostenlos. Auf [http://www.sebulli.com/BlackBoard/index.html Sebulli] gibt es ein paar ergänzende Bauteil-Libraries.&lt;br /&gt;
** mit einem Zeichenprogramm ([http://www.mikrocontroller.net/topic/112889 Forenbeitrag])&lt;br /&gt;
** Alternativ kann man mit (Kästchen-)Papier und Stift entwerfen...&lt;br /&gt;
&lt;br /&gt;
==Baukästen== &lt;br /&gt;
Elektronikbaukästen bieten die Möglichkeit, das was man gelernt hat, gleich praktisch anzuwenden. Sie beinhalten die notwendigen Bauteile und sind oft didaktisch sinnvoll aufgebaut.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Kosmos XN&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;XN1000&#039;&#039;&#039; Bereits für Kinder geeignet. Prof. Armstrong und der kleine Roboter Robert führen spielend in die Welt der Elektronik ein.&lt;br /&gt;
** &#039;&#039;&#039;XN2000&#039;&#039;&#039; Die Erweiterung. &lt;br /&gt;
** &#039;&#039;&#039;XN3000&#039;&#039;&#039; Nicht mehr auf Kinder, sondern auf Jugendliche ausgerichtet. Relativ anspruchsvoll, aber verständlich.   &lt;br /&gt;
** &#039;&#039;Nachteil:&#039;&#039; relativ teuer&lt;br /&gt;
*&#039;&#039;&#039;Busch-Elektronik-Kästen (Conrad)&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Nachteil:&#039;&#039; Weil die Bauteile auf kleinen Platten befestigt sind, kann man mit ihnen keine eigenen Schaltungen aufbauen.&lt;br /&gt;
*&#039;&#039;&#039;Polytronic A B C ... (ex. DDR)&#039;&#039;&#039; aber nicht um jeden Preis im Kaufhaus kaufen - also Vorstufe zum Steckbrett&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Elektronik 2006 (amazon)&#039;&#039;&#039;  Sehr gut geeignet, da echte ungesockelte Bauelemente die überall nachgekauft werden können.&lt;br /&gt;
**&#039;&#039;Nachteil:&#039;&#039; Steckbrett wird schnell &amp;quot;zu klein&amp;quot;&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Elektronik mit ICs (Franzis)&#039;&#039;&#039;  Ausgezeichnetes Lernpaket für Theorie und Praxis: &#039;&#039;&#039;[http://www.franzis.de/elo-das-magazin/literatur-und-software/experimente/lernpaket-elektronik-mit-ics Lernpaket Elektronik mit ICs]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Besonders schön:&#039;&#039; Es liegt ein großes Breadboard bei&lt;br /&gt;
**&#039;&#039;Und dazu:&#039;&#039; Es werden nur kommerzielle Bauelemente eingesetzt, alles ist also nachbestellbar, Erweiterungen sind kein Problem.&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Sensortechnik (Franzis)&#039;&#039;&#039;  Hervorragendes Lernpaket für angewandte Sensorelektronik: &#039;&#039;&#039;[http://www.elo-web.de/elektronik-lernpakete/mechatronik/elektrotechnik-industrielle-elektronik/lernpaket-sensortechnik Lernpaket Sensortechnik]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Inhalt:&#039;&#039; Alle gängigen Sensoren, Opto-, Thermo-, Hall-Sensor etc.&lt;br /&gt;
**&#039;&#039;Weiterhin:&#039;&#039; Interessante ICs: LM386, 555, Bargraph-Treiber, LEDs etc. etc.&lt;br /&gt;
*&#039;&#039;&#039;NerdKit&#039;&#039;&#039; Steckbrett, AVR Microcontroller, LCD Screen, Temperatursensor, Piezo-Summer und weitere Bauteile. Interessante Projekte finden sich auf der &#039;&#039;&#039;[http://www.nerdkits.com/ Nerdkits Webseite]&#039;&#039;&#039;. &#039;&#039;Die Dokumentation ist englischsprachig.&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Einsteigerbox Elektronik I:&#039;&#039;&#039; &#039;&#039;&#039;[http://www.ehajo.de/starterkits/einsteigerbox-elektronik-1.html/eHaJo Link: Einsteigerbox von EhaJo]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Kleines aber gut durchdachtes Einsteigerpaket&#039;&#039; &lt;br /&gt;
**&#039;&#039;Inklusive hochwertigem Breadboard, Transistoren, Widerständen, Kondensatoren, Batterieclip etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Sinnvolles Wissen ==&lt;br /&gt;
* Es schadet nicht, wenn man das [http://de.wikipedia.org/wiki/Ohmsches_Gesetz  ohmsche Gesetz] und die [http://de.wikipedia.org/wiki/Kirchhoffsche_Regeln kirchhoffschen Regeln] kennt.&lt;br /&gt;
* [http://www.electronic-weblessons.de Electronic Weblessons] - Multimedial aufbereitetes Basiswissen zum Thema Elektronik in Form von WebLessons von Wis-Con (Multimedia, Sprache Deutsch)&lt;br /&gt;
* http://www.tldp.org/HOWTO/html_single/Coffee/ ;)&lt;br /&gt;
&lt;br /&gt;
== Was tun, wenn es brennt? ==&lt;br /&gt;
&lt;br /&gt;
Hier ist eine Liste der üblichen Anfängerfragen. Bitte überprüfe doch all diese Punkte. Falls Du zu einem der Punkte detaillierte Fragen hast, kannst Du Dich auch an die Experten im Forum wenden. Viel Glück bei der Suche!&lt;br /&gt;
*&#039;&#039;&#039;Anschlüsse vergessen&#039;&#039;&#039; Bevor Du die Schaltung das erste Mal an die Spannungsquelle hängst, überprüfe doch folgendes:&lt;br /&gt;
**&#039;&#039;&#039;VCC&#039;&#039;&#039; und &#039;&#039;&#039;GND&#039;&#039;&#039; Wurden die Bauteile mit der Versorgungsspannung verbunden? In aller Eile vergisst man dies leicht.&lt;br /&gt;
**&#039;&#039;&#039;Abblockkondensatoren&#039;&#039;&#039; Für sichere Funktion die Abblockkondensatoren (oft 100nF) nahe an den Pins anschließen. Sie sollen Störungen abfangen.&lt;br /&gt;
*&#039;&#039;&#039;Bauteile richtig herum eingesetzt?&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Wackelkontakt&#039;&#039;&#039; am Breadboard. Die Steckbretter haben leider häufig die Eigenschaft, dass die Kontakte nicht perfekt sind.&lt;br /&gt;
*&#039;&#039;&#039;korrekte Werte&#039;&#039;&#039; Gelegentlich liest man von Newbies, die etwas von 100µF am Quarz schreiben und sich ernsthaft wundern, weshalb nichts schwingt...&lt;br /&gt;
&lt;br /&gt;
===Probleme beim Mikrocontroller===&lt;br /&gt;
*&#039;&#039;&#039;Quarz schwingt nicht&#039;&#039;&#039;. Ein Anzeichen hierfür ist, wenn die Spannung zwischen XTAL1 und GND nicht ungefähr 1/2  VCC beträgt.&lt;br /&gt;
*&#039;&#039;&#039;Steckkontakte&#039;&#039;&#039; sind nicht ok -  Steckbretter haben manchmal schlechte Kontakte. Aus diesem Grund ist es sinnvoll, Mikrocontroller mit Sockel auf eine Platine zu löten.&lt;br /&gt;
*&#039;&#039;&#039;falsche Kondensatoren&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Bauteil beschädigt&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Weblinks ===&lt;br /&gt;
* [http://warmcat.com/milksop/prototypes.html Numbnut&#039;s guide to debugging prototypes] (engl.)&lt;br /&gt;
(Seite ist leider nicht mehr online und auch nicht in web.archive.org. Es gibt eine Kopie auf einer chinesischen Seite =&amp;gt; Selbersuchen)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
*&#039;&#039;&#039;http://www.csd-electronics.de&#039;&#039;&#039; Günstiger Anbieter, führt vieles, was man als Einsteiger braucht, dazu oft günstig. Versandkosten 3,85 bis 4,85 €.&lt;br /&gt;
*&#039;&#039;&#039;http://www.reichelt.de&#039;&#039;&#039; Mittel-günstiger Anbieter, führt leider nicht alles, was das Elektronikerherz begehrt. Der Grund hierfür ist, dass er sich hauptsächlich auf Mainstreamprodukte stützt, die einen großen Absatz finden. Nur so ist der günstige Preis möglich. Mindestbestellwert und Versandkosten nach Deutschland und Österreich sind gewichtabhängig, ab 5,60 oder 11,20 €.&lt;br /&gt;
* &#039;&#039;&#039;http://www.pollin.de&#039;&#039;&#039; Diverse Restposten, sehr günstige Preise aber keine große Auswahl an Standardbauteilen.&lt;br /&gt;
* &#039;&#039;&#039;http://www.conrad.de&#039;&#039;&#039; Filialen in vielen Städten, oft relativ hohe Preise - aber nicht immer. Vergleichen lohnt.&lt;br /&gt;
* &#039;&#039;&#039;http://www.ELV.de&#039;&#039;&#039; Versandkosten 6,95 € (inklusive Zustellgebühr)&lt;br /&gt;
* &#039;&#039;&#039;http://www.segor.de&#039;&#039;&#039; Hat manchmal Teile, die man bei Reichelt, Conrad nicht bekommt. Versandkosten 6,00 € (bei Kleinmengen jedoch 10,00 €)&lt;br /&gt;
* &#039;&#039;&#039;http://www.digikey.de&#039;&#039;&#039; Recht hohe Versandkosten dafür aber fast alles erhältlich auch in grossen Mengen. &lt;br /&gt;
* &#039;&#039;&#039;http://www.guloshop.de&#039;&#039;&#039; nur wenige Artikel, aber fast immer der günstigste Anbieter bei AVR-Standard-Mikrocontrollern. Versandkosten 2,40 bis 4,80 €.&lt;br /&gt;
* &#039;&#039;&#039;http://www.batterie24.de/Lithium-Batterien.html&#039;&#039;&#039; Für Schaltungen/Stromversorgung hochwertige Lithium-Batterien von Saft &amp;amp; Ultralife sowie FGS-Bleiakkus zu günstigen Preisen (z.B. 1 x Saft Lithium-Batterie LS14500 3,6V Mignon AA für 4,40 €).&lt;br /&gt;
&lt;br /&gt;
Der Artikel [[Elektronikversender]] zählt viele weitere Versender auf. Doch sollte man darauf achten, dass gerade sogenannte Distributoren in Deutschland normalerweise nicht an Privatleute verkaufen wollen (eine merkwürdige deutsche Spezialität) und mit Privatleuten auch mal sehr ruppig umgehen. Eine Ausnahme machen einige Distributoren für Studenten, da man sich so erhofft, frühzeitig Kontakt zu späteren gewerblichen Kunden zu bekommen. Eine andere Ausnahme sind normale Versender, die sich zusätzlich als Distributoren betätigen.&lt;/div&gt;</summary>
		<author><name>172.26.38.125</name></author>
	</entry>
</feed>