<?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=Tien</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=Tien"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Tien"/>
	<updated>2026-04-10T23:21:29Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=96903</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=96903"/>
		<updated>2017-08-03T17:40:51Z</updated>

		<summary type="html">&lt;p&gt;Tien: If Bedingung geklammert. Grund: bessere Lesbarkeit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
&lt;br /&gt;
Bei einem sogenannten [http://de.wikipedia.org/wiki/Finite_State_Machine Endlichen Zustandsautomaten] (engl. &#039;&#039;&#039;f&#039;&#039;&#039;inite &#039;&#039;&#039;s&#039;&#039;&#039;tate &#039;&#039;&#039;m&#039;&#039;&#039;achine, kurz FSM) handelt es sich um die Realisation eines Steuerungskonzeptes, welches eine abstrahierte Maschine zum Vorbild hat, die eine Reihe von Zuständen besitzt, durch die sich ihr Betriebsablauf definiert. Diese Maschine arbeitet, indem sie von einem Zustand in einen anderen Zustand übergeht und bei derartigen Zustandsübergängen und im Verharren von Zuständen bestimmte Aktionen ausführt. Dabei ergibt sich der Folgezustand aus dem momentanen Zustand und einem externen Ereignis, z. B. einem Tastendruck. Dabei ist die Maschine in verschiedenen Zuständen für ganz bestimmte Ereignisse sensibel.&lt;br /&gt;
&lt;br /&gt;
Die FSM selbst wird fast immer in irgendeiner Weise über einen Takt angetrieben, kann also nicht in beliebig kurzen Zeitspannen auf Ereignisse reagieren und Zustände wechseln. In jedem Takt wird anhand des vorliegenden Zustands und dem Status der Eingabekanäle entschieden, welcher Zustand als nächstes vorliegen soll und welche Aktionen auszuführen sind.&lt;br /&gt;
&lt;br /&gt;
Abstrahierte Formen dieser Maschine werden in vielen elektronischen Geräten eingesetzt, um Bedieneraktivitäten und andere Ereignisse im System zu verarbeiten und autark ablaufende Prozesse geeignet zu beeinflussen. Entsprechend formulierte FSMs können sowohl in Software als auch Hardware aufgebaut werden. &lt;br /&gt;
&lt;br /&gt;
Die Beschreibung einer FSM ist auf mehrere Arten möglich. Zum einen kann sie in Form einer Tabelle beschrieben werden, aber auch eine graphische Darstellung der Zustände und deren Abhängigkeiten in Form eines Zustandsdiagramms ist möglich.&lt;br /&gt;
&lt;br /&gt;
==Darstellung von Zustandsautomaten==&lt;br /&gt;
&lt;br /&gt;
Zustandsautomaten haben den großen Charme, dass es meistens leicht möglich ist, ihre Funktion durch eine Grafik zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es ist eine FSM zu entwerfen, die eine Rollosteuerung übernimmt. Es gibt einen Motor, der sich in 3 Zuständen befinden kann: stop, rauf drehend, runter drehend. Außerdem gibt es Endschalter, welche betätigt werden, wenn das Rollo die jeweilige Endposition erreicht hat. Und es gibt 2 Taster &amp;quot;Up&amp;quot; und &amp;quot;Down&amp;quot; durch welche der Benutzer den Bewegungswunsch an die FSM weitergibt. Irgendwie weiß jeder, wie so eine Rollosteuerung funktioniert, und so recht und schlecht kann das auch jeder in der einen oder anderen Form beschreiben. Aber kann man das ganze auch so &#039;beschreiben&#039;, dass man im Vorfeld, vor der Programmierung tatsächlich alle Eventualitäten erfasst und so darstellt, dass auch ein Nicht-Informatiker die Funktionsweise versteht? Genau an dieser Stelle kommt die graphische Darstellung ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Wie sieht nun eine derartige FSM aus? Jede Wolke im Bild sei ein Zustand, dem man einen Namen gibt. Die Pfeile zwischen den Wolken zeigen die Zustandsübergänge an, wobei am Pfeil vermerkt ist, unter welcher Bedingung dieser Übergang genommen werden kann (in Rot) und welche Aktionen dabei auszuführen sind (in Blau).&lt;br /&gt;
&lt;br /&gt;
[[Datei:StateRollo.jpg|center|framed|Zustandsautomat für eine Rollosteuerung]]&lt;br /&gt;
&lt;br /&gt;
Aus der Zeichnung ist ablesbar:&lt;br /&gt;
Befindet sich die Maschine im Zustand &amp;quot;unten&amp;quot; und wird die Taste &amp;quot;Up&amp;quot; gedrückt, dann folgt als Aktion, daß der Motor auf &amp;quot;rauf drehend&amp;quot; gestellt wird und gleichzeitig wechselt die Maschine in den Zustand &amp;quot;nach oben&amp;quot;. In diesem Zustand verbleibt die Maschine, während der Motor immer weiter dreht, bis der Endschalter meldet, dass das Rollo oben angekommen ist. Dies ist eine Möglichkeit wie die Maschine den Zustand &amp;quot;nach oben&amp;quot; verlassen kann. In diesem Fall wird dann der Motor abgeschaltet und die Maschine wechselt in den Zustand &amp;quot;oben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Man sieht hier schon, dass es mit so einer Grafik relativ einfach ist, sich von der korrekten Logik zu überzeugen. In einfachsten Fall legt man zur Simulation einfach einen Gegenstand in die betreffende Wolke, die den gerade aktiven Zustand symbolisiert. Danach geht man alle Möglichkeiten durch, wie diese Maschine von aussen (Taster, Schalter, etc) beeinflusst werden kann und sieht sich an, ob es dafür in der Grafik einen Pfeil gibt, der von der aktiven Wolke wegführt. Gibt es keinen, dann passiert auch nichts. Gibt es einen, dann verschiebt man den Gegenstand in die betreffende Wolke und führt (in Gedanken) die Aktion aus. Auf die Art kann man ganz leicht einige typische Benutzerszenarien durchspielen aber auch ausprobieren, ob man alle Eventualitäten berücksichtigt hat. Denn gerade diese Evantualitäten, an die man am Anfang gar nicht denkt, die sind es, die einem in weiterer Folge oft Probleme bereiten.&lt;br /&gt;
&lt;br /&gt;
Um bei der Rollosteuerung zu bleiben: Was soll denn passieren, wenn das Rollo gerade hochfährt und der Benutzer ein weiteres mal auf &amp;quot;Up&amp;quot; drückt? Oder wenn er auf &amp;quot;Down&amp;quot; drückt? In der Grafik ist ersichtlich, wie in diesem Fall zu verfahren ist. (Und Hand aufs Herz: Hätten Sie daran gedacht, dass diese Fälle zu berücksichtigen sind, als sie &#039;Rollosteuerung&#039; gelesen haben?)&lt;br /&gt;
&lt;br /&gt;
==Implementierungsvariationen==&lt;br /&gt;
&lt;br /&gt;
Der konkrete softwaremässige Aufbau einer FSM kann in weiten Grenzen variieren. Das grundlegende Konzept, Aktionen an Zustände zu knüpfen und logische Abläufe an die Abfolge von Zuständen zu binden, bleibt dabei in allen Fällen erhalten. Aber je nach Lust und Laune und dem Können des Programmierers gibt es viele unterschiedliche Möglichkeiten eine FSM zu implementieren. Ziel ist es dabei immer, die eigentliche Maschine, also das was in der Zustandstabelle ausgedrückt wird, so einfach und überschaubar wie möglich zu präsentieren. Sie implementiert die Logik und definiert was die Maschine eigentlich macht und warum sie es macht. Ein einfacher Ansatz ist die Verwendung des C-Konstukts switch, in der in jedem case-zweig die einzelnen Zustände kodiert werden. Es ist aber auch durchaus möglich eine universelle FSM zu bauen, bei denen eine generische Funktion die Tabelle in Arrayform bekommt und zusammen mit einigen globalen Variablen die Maschine implementiert. Oft wird auch eine Statemaschine dadurch gebaut, indem das zentrale switch-case Konstukt der Sprache [C] durch einen einzelnen [[Funktionszeiger in C | Funktionszeiger]] ersetzt wird und jeder Zustand nichts anderes als eine Funktion ist. Der Übergang von einem Zustand in einen anderen Zustand ist dann nichts anderes als das Zuweisen einer Funktion an diesen Funktionszeiger. Oder aber man kombiniert Tabelle und Funktionszeiger in ein gemeinsames Konzept.&lt;br /&gt;
&lt;br /&gt;
==Grundlegender Aufbau==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird eine FSM in Software verwirklicht, welche die Ampelsteuerung einer Kreuzung übernimmt.&lt;br /&gt;
[[Bild:Statemachine_Kreuzung.png|center|framed|Ampeln an einer Kreuzung]]&lt;br /&gt;
&lt;br /&gt;
Die Abfolge der Lichtzeichen einer einzelnen Ampel ist dabei&lt;br /&gt;
&amp;lt;br&amp;gt;[[Bild:Statemachine_Ampel.png|center|framed|Zustände einer einzelnen Ampel]]&lt;br /&gt;
&lt;br /&gt;
Die komplette Lichtfolge aller Ampeln in der Kreuzung stellt sich dann wie folgt dar: Es ist dabei ausreichend, nur Ampel 1 und Ampel 2 zu betrachten, da Ampel 3 bzw. Ampel 4 die jeweils gleichen Lichtsignale anzeigen. Dies muss nicht immer so sein! Auf einer Kreuzung kann es durchaus für eine Fahrtrichtung Zusatzampeln geben, die die Lichtfolge der Hauptampel modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustandsnummer ist in diesem Fall einfach die Taktung der FSM. Verfolgt man die Zustände von einem Zustand zum nächsten, dann kann man sich sehr leicht davon überzeugen, daß die Lichtfolge der beiden Ampeln tatsächlich der gewünschten Abfolge entspricht.&lt;br /&gt;
&lt;br /&gt;
Hat man die Funktionalität einer FSM erst mal soweit in Tabellenform festgelegt, dann ist es sehr einfach daraus ein Programm in einer Programmiersprache wie z.B. C abzuleiten, welches diese Statemachine implementiert.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man dabei folgenden Aufbau vornehmen:&lt;br /&gt;
* Es gibt eine globale Variable, die den aktuellen Zustand der Maschine repräsentiert. Die Zustände wurden in obiger Tabelle bereits durchnummeriert, so dass es sich anbietet, Zustände innerhalb der Maschine durch ebendiese Zahlen darzustellen.&lt;br /&gt;
* Die FSM wird als Funktion implementiert, die für jeden einzelnen Takt aufgerufen wird.&lt;br /&gt;
* Jeder Zustand wird innerhalb der Funktion durch einen case innerhalb einer  switch Anweisung dargestellt.&lt;br /&gt;
* Jeder Zustand kann vor verlassen der Funktion den aktuellen Zustand der FSM beim nächsten Aufruf der Funktion festlegen, indem er an die globale Variable die Nummer des nächsten Zustands zuweist.&lt;br /&gt;
* Jegliche Form von Warteschleifen innerhalb der FSM sind verboten. Wenn die FSM auf ein Ereignis warten müsste, dann ist dafür ein eigener Zustand vorzusehen, der auf das Eintreten des Ereignisses prüft und nur dann den nächsten Zustand auswählt, wenn das Ereignis tatsächlich eingetreten ist. Damit erreicht man [[Multitasking]].&lt;br /&gt;
* Es ist sinnvoll, den Ampelfarben Namen in Form eines #define oder enums zu geben, damit wird das Konstrukt deutlich leichter lesbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );  // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );  // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
&lt;br /&gt;
unsigned char state = 1;   // globale Variable, die den Status repräsentiert&lt;br /&gt;
&lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      state = 2;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = 3;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 4;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 4:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 5;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 5:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 6;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 6:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 7;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 7:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = 8;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 8:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = 1;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    stateMachine();&lt;br /&gt;
    delay_ms( 1000 );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird diese Funktion im Sekundentakt aufgerufen, so werden die Funktionen Ampel1() bzw. Ampel2() mit der jeweils richtigen Lichtstellung in der richtigen Reihenfolge aufgerufen um die Lichtwechsel der Ampeln einer Kreuzung zu realisieren. Der Einfachheit halber wird in diesem Beispiel die Funktion delay_ms() verwendet. Praktisch wird man in den meisten Fällen besser einen [[Timer]] benutzen, um die Statemachine periodisch aufzurufen. Wie das geht und was das für Vorteile hat ist im Artikel [[Multitasking#Verbesserter Ansatz mit Timer | Multitasking]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Reaktionen auf äußere Ereignisse==&lt;br /&gt;
&lt;br /&gt;
Obige Statemaschine ist noch sehr primitiv. Angenommen an dieser Ampelkreuzung gibt es eine Induktionsschleife. Diese sei derartig geschaltet, dass die Hauptrichtung über Ampel2/Ampel4 ständig Grün zeigt und nur bei Annäherung eines Fahrzeugs auf der Strecke Ampel1/Ampel3 wird ein Lichtwechselzyklus durchgeführt, um diesem Fahrzeug die geordnete Durchfahrt zu ermöglichen. Die Statemaschine muss daher auf ein äußeres Ereignis reagieren können. Der Übergang von Zustand 1 in Zustand 2 ist von diesem Ereignis abhängig. Nur wenn es auftritt wird dieser Übergang durchgeführt, ansonsten verbleibt die Maschine im Zustand 1. Die Beschreibung der FSM wird also um einen weiteren Tabelleneintrag ergänzt, in dem festgehalten wird, wie mit dem zusätzlichen Eingang verfahren werden soll. In dieserm erweiterten Beispiel sollen die Zustände mit einem aussagekräftigen Namen versehen werden, denn Menschen sind sehr schlecht im Umgang mit abstrakten Zahlen, sie sind viel besser mit Wörtern vertraut. Die x in der Tabellenspalte &amp;quot;Induktionsschleife&amp;quot; besagen, daß dieses Eingangsignal für die Entscheidungen der Statemaschine keine Rolle spielt (engl. don&#039;t care).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!| Zustand ||| Name ||| Ampel 1 || | Ampel 2 ||  Induktionsschleife || | nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || OSTWEST_GRUEN      || rot     ||  grün      || ==1 ? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || OSTWEST_GELB       || rot     ||  gelb      || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || ALLE_ROT_1         || rot     ||  rot       || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || NORDSUED_ROTGELB   ||rot/gelb ||  rot       || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || NORDSUED_GRUEN     || grün    ||  rot       || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|  6 || NORDSUED_GELB      || gelb    ||  rot       || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || ALLE_ROT_2         || rot     ||  rot       || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || OSTWEST_ROTGELB    || rot     ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB, ALLE_ROT_2} state_t ;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLE_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLE_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Warteschleifen==&lt;br /&gt;
&lt;br /&gt;
Das Warten auf ein äußeres Ereignis kann mit dem Verzweigen oder auch nicht Verzweigen in einen anderen Zustand realisiert werden. In obiger Statemaschine soll z.B. die Grünphase der Ampel1 von einem Takt auf 5 Takte angehoben werden. Grundfalsch wäre es, dies jetzt mit einer while-Schleife im Zustand 5 zu realisieren. Warten wird immer über zusätzliche Zustände realisiert. Eine Statemaschine darf innerhalb eines Zustands niemals auf etwas warten, sondern muss so schnell als möglich die Kontrolle wieder abgeben. Geht man naiv an die Sache ran, dann könnte man die 5 Takte über die Einführung von zusätzlichen Zuständen leicht erreichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:20em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Zustand ||width=&amp;quot;20%&amp;quot;| Ampel 1 ||width=&amp;quot;20%&amp;quot;| Ampel 2 ||width=&amp;quot;20%&amp;quot;| Induktionsschleife ||width=&amp;quot;20%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1? || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x ||3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || grün ||  rot  || x || 10&lt;br /&gt;
|-&lt;br /&gt;
| 10 || grün ||  rot  || x || 11&lt;br /&gt;
|-&lt;br /&gt;
| 11 || grün ||  rot  || x || 12&lt;br /&gt;
|-&lt;br /&gt;
| 12 || grün ||  rot  || x || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daß ein derartiges Vorgehen bei längeren Wartezeiten oder gar bei berechneter Wartezeitdauer nicht praktikabel ist, dürfte auf der Hand liegen. Besser ist daher die Einführung eines internen Zählers sowie nur eines einzigen, neuen Wartezustands. Beginnt die Wartezeit wird der Zähler auf einen Wert entsprechend der Wartezeit gestellt. Im neuen Zustand wird der Zähler um 1 verringert und nur dann, wenn der Zähler 0 erreicht hat, wird in den ursprünglichen Folgezustand gewechselt. Der Zähler kann also in ähnlicher Form wie die Induktionsschleife als Ereignislieferant aufgefasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle|min-width:15em;text-align:center;}}&lt;br /&gt;
|+ &#039;&#039;&#039;Zustandstabelle der Ampelanlage mit zusätzlichem Eingang&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Zustand ||width=&amp;quot;10%&amp;quot;| Ampel 1 ||width=&amp;quot;10%&amp;quot;| Ampel 2 ||width=&amp;quot;10%&amp;quot;| Induktionsschleife ||width=&amp;quot;10%&amp;quot;| Wartezeit ||width=&amp;quot;10%&amp;quot;| nächster Zustand&lt;br /&gt;
|-&lt;br /&gt;
|  1 || rot ||  grün || ==1 ? || x || 2&lt;br /&gt;
|-&lt;br /&gt;
|  2 || rot ||  gelb || x || x || 3&lt;br /&gt;
|-&lt;br /&gt;
|  3 || rot ||  rot  || x || x || 4&lt;br /&gt;
|-&lt;br /&gt;
|  4 || rot/gelb ||  rot  || x || x || 5&lt;br /&gt;
|-&lt;br /&gt;
|  5 || grün ||  rot  || x || =4 || 9&lt;br /&gt;
|-&lt;br /&gt;
|  6 || gelb ||  rot  || x || x || 7&lt;br /&gt;
|-&lt;br /&gt;
|  7 || rot ||  rot  || x || x || 8&lt;br /&gt;
|-&lt;br /&gt;
|  8 || rot ||  rot/gelb  || x || x || 1&lt;br /&gt;
|-&lt;br /&gt;
|  9 || x ||  x  || x || dec / ==0 ? || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define ROT_GELB  2&lt;br /&gt;
#define GRUEN     3&lt;br /&gt;
#define GELB      4&lt;br /&gt;
&lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
unsigned char Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
typedef enum { NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB,&lt;br /&gt;
               ALLE_ROT_1,&lt;br /&gt;
               OSTWEST_ROTGELB, OSTWEST_GRUEN, OSTWEST_GELB,&lt;br /&gt;
               ALLE_ROT_2, WARTE_NORDSUED}  state_t;&lt;br /&gt;
 &lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
unsigned char zaehler;&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
  switch( state ) {&lt;br /&gt;
    case OSTWEST_GRUEN:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GRUEN );&lt;br /&gt;
      if( Induktionsschleife() ) {&lt;br /&gt;
        state = OSTWEST_GELB;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_GELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( GELB );&lt;br /&gt;
      state = ALLES_ROT_1;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_1:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_ROTGELB:&lt;br /&gt;
      Ampel1( ROT_GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = NORDSUED_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GRUEN:&lt;br /&gt;
      Ampel1( GRUEN );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      zaehler = 4;&lt;br /&gt;
      state = WARTE_NORDSUED;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case NORDSUED_GELB:&lt;br /&gt;
      Ampel1( GELB );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = ALLES_ROT_2;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case ALLES_ROT_2:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT );&lt;br /&gt;
      state = OSTWEST_ROTGELB;&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
    case OSTWEST_ROTGELB:&lt;br /&gt;
      Ampel1( ROT );&lt;br /&gt;
      Ampel2( ROT_GELB );&lt;br /&gt;
      state = OSTWEST_GRUEN;&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case WARTE_NORDSUED:&lt;br /&gt;
      zaehler = zaehler - 1;&lt;br /&gt;
      if( zaehler == 0 )&lt;br /&gt;
        state = NORDSUED_GELB;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Tabellenform ==&lt;br /&gt;
&lt;br /&gt;
Im letzten Beispiel wollen wir die Ampelsteuerung noch etwas realistischer gestalten. Denn die einzelnen Phasen sind unterschiedlich lang, der Zustand Gelb ist deutlich kürzer als der Zustand Grün. Wenn wir also in fast jedem Zustand eine bestimmte Anzahl Takte warten wollen, erscheint es nicht sinnvoll, dafür jedesmal einen neuen Zustand anzuspringen. Sinnvoller ist die Integration des Wartens direkt in den Zustand, so wie im vorherigen Beispiel der Zustand &amp;quot;WARTE_NORDSUED&amp;quot;. Dabei fallen jedoch zwei Sachen auf.&lt;br /&gt;
&lt;br /&gt;
* In jedem Zustand muss die Wartezeit des &#039;&#039;nächsten&#039;&#039; Zustands zugewiesen werden. Das ist etwas verwirrend.&lt;br /&gt;
* Fast alle Anweisungen sind gleich in den Zuständen, nur die Zahlen und der Wert für den nächsten Zustand ändern sich.&lt;br /&gt;
&lt;br /&gt;
Darum soll hier die FSM von einer großen switch Anweisung auf eine Tabelle geändert werden. Das hat den Vorteil, dass die Zustandstabelle nahezu 1:1 in den Quelltext geschrieben werden kann und sie so sehr kompakt und übersichtlich ist. Die eigentliche FSM wird sehr klein und arbeitet sich durch die Tabelle durch. Zur weiteren Verbesserung der Lesbarkeit (siehe [[Strukturierte Programmierung auf Mikrocontrollern]]) nutzen wir einen Struct, welche den Zustand der State machine mit sinnvollen Variablennamen beschreibt. Bei dieser Methode muss man beachten, dass die Reihenfolge der Zustände in der enum Definition gleich sein muss mit der Reihenfolge der Zustände in der Tabelle, sonst funktioniert es nicht. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ROT       1&lt;br /&gt;
#define GRUEN     2&lt;br /&gt;
#define GELB      4&lt;br /&gt;
#define ROTGELB   5&lt;br /&gt;
 &lt;br /&gt;
void Ampel1( unsigned char Farbe );   // schaltet Ampel1 auf eine Farbe&lt;br /&gt;
void Ampel2( unsigned char Farbe );   // schaltet Ampel2 auf eine Farbe&lt;br /&gt;
int Induktionsschleife();   // fragt die Induktionsschleife ab&lt;br /&gt;
 &lt;br /&gt;
typedef enum { OSTWEST_GRUEN=0, OSTWEST_GELB, ALLE_ROT_1,&lt;br /&gt;
               NORDSUED_ROTGELB, NORDSUED_GRUEN, NORDSUED_GELB, ALLE_ROT_2,&lt;br /&gt;
               OSTWEST_ROTGELB }  state_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int Ampel1;&lt;br /&gt;
    int Ampel2;&lt;br /&gt;
    int I_Schleife;&lt;br /&gt;
    int Wartezeit;&lt;br /&gt;
    int Naechster;&lt;br /&gt;
} ampel_state_t;&lt;br /&gt;
&lt;br /&gt;
state_t state = ALLE_ROT_1;&lt;br /&gt;
int zaehler=1;&lt;br /&gt;
 &lt;br /&gt;
// Tabelle fuer state machine&lt;br /&gt;
 &lt;br /&gt;
ampel_state_t state_table[8] = {&lt;br /&gt;
 &lt;br /&gt;
// AMPEL1 AMPEL2   Induktionsschleife ? &lt;br /&gt;
// |         |       |   Wartezeit in s&lt;br /&gt;
// |         |       |   |&lt;br /&gt;
// |         |       |   |   naechster Zustand     Name&lt;br /&gt;
//----------------------------------------------------------------------&lt;br /&gt;
{ROT     , GRUEN   , 1, 10,  OSTWEST_GELB},        // OSTWEST_GRUEN&lt;br /&gt;
{ROT     , GELB    , 0,  1,  ALLE_ROT_1},          // OSTWEST_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  NORDSUED_ROTGELB},    // ALLE_ROT_1&lt;br /&gt;
{ROTGELB , ROT     , 0,  1,  NORDSUED_GRUEN},      // NORDSUED_ROTGELB&lt;br /&gt;
{GRUEN   , ROT     , 0, 10,  NORDSUED_GELB},       // NORDSUED_GRUEN&lt;br /&gt;
{GELB    , ROT     , 0,  1,  ALLE_ROT_2},          // NORDSUED_GELB&lt;br /&gt;
{ROT     , ROT     , 0,  3,  OSTWEST_ROTGELB},     // ALLE_ROT_2&lt;br /&gt;
{ROT     , ROTGELB , 0,  1,  OSTWEST_GRUEN}};      // OSTWEST_ROTGELB&lt;br /&gt;
 &lt;br /&gt;
void stateMachine()&lt;br /&gt;
{&lt;br /&gt;
    Ampel1(state_table[state].Ampel1);&lt;br /&gt;
    Ampel2(state_table[state].Ampel2);&lt;br /&gt;
 &lt;br /&gt;
    if (zaehler&amp;gt;0) {&lt;br /&gt;
        zaehler--;    &lt;br /&gt;
    } else {&lt;br /&gt;
        if ( ((state_table[state].I_Schleife == 1) &amp;amp;&amp;amp; Induktionsschleife() ) ||&lt;br /&gt;
             (state_table[state].I_Schleife == 0) )&lt;br /&gt;
        {&lt;br /&gt;
            state =   state_table[state].Naechster;&lt;br /&gt;
            zaehler = state_table[state].Wartezeit;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierung einer objektorientierten Finite State Machine in C++==&lt;br /&gt;
&lt;br /&gt;
* Notation von Endlichen Automaten in UML&lt;br /&gt;
* Praktisches Beispiel, anhand dessen die Funktionsweise eines Toasters erklärt wird. Dazu wird die Notation in UML verwendet. &lt;br /&gt;
* Implementation des Beispiels in C++ auf einem AVR-Controller&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Möglichkeit bzw. das Beispiel sollte als Denkanstoss verstanden werden und nicht als Referenzimplementation. Es wurden bewusst bestimmte Feinheiten von endlichen Automaten verzichtet, um das Beispiel auf gut verständlichem Niveau zu halten. &lt;br /&gt;
&lt;br /&gt;
* Dokumentation im PDF Format [http://www.mikrocontroller.net/attachment/137066/ImplementierungEinerFiniteStateMachine_V1.1.pdf ImplementierungEinerFiniteStateMachine_V1.1.pdf]&lt;br /&gt;
* LaTeX Source der Dokumentation [http://www.mikrocontroller.net/attachment/137067/Dokumentation_Source_V1.1.zip Dokumentation_Source_V1.1.zip]&lt;br /&gt;
* Beispielcode für AVR-Studio 4 [http://www.mikrocontroller.net/attachment/135434/AVR_Beispiel_Source.zip AVR_Beispiel_Source.zip]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/248837#2556592 Forumsbeitrag]: Eine objektorientierte State Machine in C++&lt;br /&gt;
&lt;br /&gt;
== Grafische Modellierung einer Finite State Machine ==&lt;br /&gt;
Das Open Source Werkzeug Yakindu Statechart Tools (http://www.statecharts.org) ermöglicht es Zustandsautomaten grafisch zu modellieren, deren Verhalten zu simulieren und Code für verschiedene Sprachen (C/C++, Java) zu generieren.&lt;br /&gt;
Die grafischen Modellelemente entsprechen denen der UML2 und werden durch eine einfache und zweckmäßige Expression-Language ergänzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfaches Ampel Modell&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Modell einer einfachen Ampel wie oben beschrieben sieht in Yakindu SCT wie folgt aus: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1.jpg|center|framed|Einfaches Ampel Modell]]&lt;br /&gt;
&lt;br /&gt;
Wie erwartet hat die Ampel vier Zustände, die wiederum mit Übergangs-Pfeilen (Transitionen) verbunden sind. Jede Transition verfügt über einen Auslöser, in diesem Fall mit dem Namen &#039;&#039;tick&#039;&#039;    &lt;br /&gt;
Mit Hilfe der Yakindu DSL wird im linken Teil des Editors ein internes Event mit dem Name &amp;quot;tick&amp;quot; definiert, das entsprechend der Taktung des Zustandsautomaten &amp;quot;gefeuert&amp;quot; werden soll. Der Ausdruck &#039;&#039;every 1s / raise tick&#039;&#039; sorgt dafür, dass das Event &#039;&#039;tick&#039;&#039; jede Sekunde einmal gefeuert wird.&lt;br /&gt;
Da Yakindu SCT es erlaubt Zustandsautomaten zu simulieren, ist es jederzeit überprüfbar ob das modellierte Verhalten den Erwartungen entspricht. Über &#039;&#039;Run as... --&amp;gt; YAKINDU Statechart&#039;&#039; lässt sich in die &#039;&#039;Simulation View&#039;&#039; wechseln. Der jeweils aktive Zustand wird nun rot hinterlegt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel1b.jpg|center|framed|Simulation View]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einfache Kreuzung mit Zwei Ampel-Gruppen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im zweiten Beispiel soll eine einfache Ampelkreuzung modelliert werden. Es wird davon ausgegangen, dass die Ampeln in zwei Gruppen geschaltet werden. Ampel 1 und 3 bilden die nord_süd – Gruppe, während die übrigen Ampeln die ost-west – Gruppe bilden. Der Einfachheit halber werden Ampeln einer Gruppe immer gleich geschaltet. Wie oben darf eine Ampel-Gruppe nur dann den Zustand &#039;&#039;rot&#039;&#039; verlassen, wenn die jeweils andere Gruppe sich im Zustand &#039;&#039;rot&#039;&#039; befindet. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel2.jpg|800px|center|Ampelkreuzung]]&lt;br /&gt;
&lt;br /&gt;
Im Yakindu SCT Modell gibt es nun für jede Ampel-Gruppe eine eigene Region. Wird der Zustandsautomat betreten so wird nun parallel der Zustand &#039;&#039;rot&#039;&#039; in der &#039;&#039;nord_sued&#039;&#039; Region und der Zustand &#039;&#039;gruen&#039;&#039; in der &#039;&#039;ost_west&#039;&#039; Region aktiv. Wie bereits im ersten Beispiel wird der Zustandsautomat über das &#039;&#039;tick&#039;&#039; Ereignis angetrieben, das jede Sekunde einmal auftritt. &lt;br /&gt;
Um das gewünschte Ampel-Verhalten zu modellieren wird nun die Transition von &#039;&#039;rot&#039;&#039; zu &#039;&#039;rot-gelb&#039;&#039; mit einem &#039;&#039;Guard&#039;&#039;, also einer Bedingung geschützt. Zwar wird der Übergang weiterhin mit dem Ereignis &#039;&#039;tick&#039;&#039; angestoßen, allerdings wird der Übergang nur ausgeführt wenn die in eckigen Klammern formulierte Boolesche-Bedingung erfüllt ist. Die Funktion &#039;&#039;active()&#039;&#039; gehört zu den Bordmitteln von Yakindu SCT und prüft ob ein bestimmter Zustand aktiv ist. In diesem Beispiel kann in der Region &#039;&#039;nord_sued&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; nur verlassen werden, wenn in der Region &#039;&#039;ost-west&#039;&#039; der Zustand &#039;&#039;rot&#039;&#039; aktiv ist. Wie auch im vorhergegangenen Beispiel lässt sich das Verhalten simulieren, so das überprüft werden kann ob das Verhalten den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ampel mit Induktionsschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Verhalten der Ampelanlage aus Beispiel 2 soll um eine Induktionsschleife erweitert werden. Der Verkehr an der Ampelanlage fließt normalerweise in &#039;&#039;ost_west&#039;&#039; – Richtung, daher die Ampel in dieser Richtung immer den Zustand &#039;&#039;grün&#039;&#039; haben, es sei denn die Induktionsschleife in &#039;&#039;nord-süd&#039;&#039; - Richtung wird ausgelöst.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_beispiel3.jpg|800px|center|Ampelkreuzung mit Induktionsschleife]]&lt;br /&gt;
&lt;br /&gt;
Um dieses Verhalten in das SCT-Modell zu integrieren muss zunächst ein neues Ereignis definiert werden. Dieses Ereignis wird als Teil des &#039;&#039;Interface-Scopes&#039;&#039; definiert, da es außerhalb des Zustandsautomaten erzeugt werden soll. Ereignisse die Teil einer externen Schnittstelle sind werden mit einer Richtung (in / out) deklariert, die angibt ob das Ereignis den Zustandsautomat betritt, oder verlässt. &lt;br /&gt;
&lt;br /&gt;
Nach dem das neue Ereignis definiert ist,  muss nur noch der Auslöser für den Übergang von &#039;&#039;gruen&#039;&#039; zu &#039;&#039;gelb&#039;&#039; geändert werden. Statt wie bisher durch das &#039;&#039;tick&#039;&#039; Event, wird nun das &#039;&#039;induktionsSignal&#039;&#039; als Auslöser verwendet. In der Simulations-Ansicht kann das neue Ereignis manuell mit einem Klick ausgelöst werden, so dass das korrekte Verhalten wieder getestet werden kann.   &lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct_simView.jpg|center|framed|Induktionsschleife auslösen]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warteschleife&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es soll die Grün-Phase verlängert werden, so dass erst nach dem 5. &#039;&#039;tick&#039;&#039; der Übergang in den &#039;&#039;gelb&#039;&#039; Zustand erfolgt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sct beispiel4.jpg|800px|center|Ampelkreuzung mit Warteschleife]]&lt;br /&gt;
&lt;br /&gt;
Um eine Warteschleife zu realisieren wird dem &#039;&#039;Internal-Scope&#039;&#039; zuerst eine neue Variable hinzugefügt. Da während des Wartens der &#039;&#039;grün&#039;&#039; Zustand nicht verlassen wird, lässt sich das Herunterzählen der Wartezeit mittels eines zusammengesetzten Zustands darstellen. Wird der Zustand &#039;&#039;grün&#039;&#039; betreten, wird zunächst einen Eintritts-Aktion ausgeführt, die den Wert von &#039;&#039;wartezeit&#039;&#039; auf 5 setzt. Außerdem wird ebenfalls der Zustand &#039;&#039;Warten&#039;&#039; aktiv. Erfolgt nun ein &#039;&#039;tick&#039;&#039; wird ohne &#039;&#039;grün&#039;&#039; zu verlassen in &#039;&#039;WartezeitVerringern&#039;&#039; gewechselt und der Wert von &#039;&#039;wartezeit&#039;&#039; um 1 verringert. &lt;br /&gt;
Der Übergang zu &#039;&#039;gelb&#039;&#039; ist wieder durch einen Guard geschützt und kann nur erfolgen wenn die  Bedingung &#039;&#039;wartezeit == 0&#039;&#039; erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Code aus dem Modell generieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um nun Code aus dem Modell zu generieren muss zuerst eine GeneratorModel-Datei erzeugt werden, in der unter anderem die Ziel-Sprache angegeben wird.&lt;br /&gt;
Um den Zustandsautomaten abzubilden verwendet die konkrete Implementierung ein &#039;&#039;switch case&#039;&#039; Konstrukt, das dem oben Gezeigten ähnelt. Außerdem wurde ein &#039;&#039;code-only&#039;&#039; Ansatz verfolgt, so dass keine externen Bibliotheken oder Frameworks benötigt werden. Das komplette Eclipse Projekt kann [http://statecharts.org/Examples/ampel.zip hier] runtergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Realisation von FSMs in Hardware ==&lt;br /&gt;
=== Aufbau einer FSM in digitalen Chips ===&lt;br /&gt;
&lt;br /&gt;
Sollen sehr schnelle Steuerungen und Entscheider aufgebaut werden, wurden und werden digitale Bausteine mit Logikgattern verdrahtet, die steuerbare Zähler enthalten. Damit lassen sich effektive Taktgeschwindigkeiten im Bereich von mehreren MHz erreichen, die in Sicherheitsbereichen eingesetzt werden. Oft werden solche Schaltungen auch zur Überwachung von anderen Schaltungsteilen eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Früher wurden fast alle logischen Schaltungen auf diese Weise entworfen, z.B. auch die ersten Computer von IBM.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung von FSMs in programmierbarer Hardware ===&lt;br /&gt;
&lt;br /&gt;
Da heute digitale Hardware vielfach in Form programmierter PLD- und [[FPGA]]-Bausteine eingesetzt wird, verlagert sich der Entwurf der FSM mehr zu Softwareentwicklung hin. Dabei besteht je nach Vorliegen der funktionellen Beschreibung und eventueller Primärinformation die Möglichkeit, ein Abbild der digitalen Schaltung in VHDL zu formulieren und zu importieren, bzw. ein klassisches state diagram neu zu entwerfen oder die Zustandswechsel in Tabellenform zu importieren und das Erzeugerwerkzeug die FSM generieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Letztendlich kann in Hardware jede sequentielle Logikschaltung, welche [[FlipFlop]]s und Dekoder enthält als FSM betrachtet werden, egal ob es ein einfaches Schieberegister oder eine komplexe ALU einer CPU ist. Die einfachste, denkbare FSM ist ein Toggle-FlipFlop, welches mit jedem Takt seinen Ausgangszustand wechselt.&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsvergleich ==&lt;br /&gt;
In Software realisierte state machines erreichen unter C++ in Windows auch bei hoher Prozessauslastung selten niedrigere Reaktionszeiten als im ms-Bereich. Die damit in Echtzeit erfassbaren und prozessierbaren externen Ereignisse bewegen sich üblicherweise im Bereich von einigen 100Hz. Mit Microcontrollern und DSPs erreicht man mit Nicht-Multi-tasking-FSMs Abtastraten bis einige 100kHz.&lt;br /&gt;
&lt;br /&gt;
In VHDL realisierte state machines besitzen je nach Taktfrequenz des FPGAs, Art der Codierung und Zyklustiefe typische Reaktionsgeschwindigkeiten von 10...100MHz.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.aqdi.com/state.htm Using State Machines In Your Designs] (C) 2003 Hank Wallace&lt;br /&gt;
* [http://qfsm.sourceforge.net/ Qfsm] - A graphical tool for designing finite state machines (GPL)&lt;br /&gt;
* [https://www.itemis.com/en/yakindu/statechart-tools/ YAKINDU Statechart Tools] Ein Werkzeug zum Modellieren und Simulieren von Statecharts sowie Code-Generatoren für Java, C und C++. &lt;br /&gt;
* [http://www.sinelabore.com www.sinelabore.com] Ein Werkzeug das aus UML State Machines C-Code speziell für eingebettete Systeme erzeugt.&lt;br /&gt;
* [http://smc.sourceforge.net SMC The State Machine Compiler]&lt;br /&gt;
* [http://block-net.de/Programmierung/cpp/fsm/fsm.html C/C++ event driven FSM] Open source Werkzeug zur Generierung von C++ FSM Code und UML Diagramm mittels Transitionstabelle. &lt;br /&gt;
* http://astade.tigris.org/ -&amp;gt; http://wiki.astade.de/dokuwiki/doku.php (https://www.mikrocontroller.net/search?query=astade)&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Tien</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Platinenherstellung_mit_der_Tonertransfermethode&amp;diff=88427</id>
		<title>Platinenherstellung mit der Tonertransfermethode</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Platinenherstellung_mit_der_Tonertransfermethode&amp;diff=88427"/>
		<updated>2015-04-27T10:54:28Z</updated>

		<summary type="html">&lt;p&gt;Tien: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohne die Zwischenschritte des Belichtens und Entwickelns können [[Platine]]n schneller und günstiger hergestellt werden, indem der Toner eines Laserdruckers oder Kopierers als Ätzmaske verwendet wird. Der Toner wird beim Erhitzen weich und haftet so am Kupfer der Platine.&lt;br /&gt;
&lt;br /&gt;
Die erreichte Qualität hängt - wie auf dem konventionellen Wege auch - von vielen Faktoren ab, ist daher nicht unbedingt reproduzierbar, und meistens nicht so hoch wie die durch die optische Methode erreichte. 0,2 mm Leiterbahnbreite sind möglich (KM FS-1020D), durch den minimalen Tonerauftrag kommt es dabei allerdings u.U. zu kleinsten Löchern, die in dieser Größenordnung schon schaden können.&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
* Laserdrucker oder Kopierer&lt;br /&gt;
* Transfer-Medium (Zeitschriftenpapier, Reichelt-Katalogseite, glänzende Seite Geschenkpapier, Spezialpapier)&lt;br /&gt;
* kupferbeschichtete Platine (ohne! Fotolack und sonstige Beschichtungen)&lt;br /&gt;
* Stahlwolle oder Glitzi-Schwamm zum mechanischen Reinigen der Platine&lt;br /&gt;
* Aceton zum Entfetten der Platine&lt;br /&gt;
* Handelsübliches Bügeleisen, Laminator (ca. 180°C)&lt;br /&gt;
* Temperaturunempfindliche, glatte Oberfläche&lt;br /&gt;
* Ätzmittel&lt;br /&gt;
&lt;br /&gt;
== Vorgehen ==&lt;br /&gt;
&lt;br /&gt;
=== Drucken ===&lt;br /&gt;
Das Layout wird mit einem Laserdrucker (hier: Samsung ML4600) auf ein geeignetes Transfer-Medium (hier: Reichelt-Katalogseite) gedruckt. Am besten für den Transfer eignen sich beschichtete Hochglanzpapiersorten aus Katalogen oder Zeitschriften.&lt;br /&gt;
&lt;br /&gt;
Bei SMD-Projekten (Leiterbahnen auf der Bestückungsseite) muß darauf geachtet werden, daß spiegelverkehrt gedruckt wird. Sollen sich die Leiterbahnen auf der Rückseite befinden, müßte 2x gespiegelt werden, was sich wieder aufhebt. Nur eventueller Text für die Rückseite muß dann gespiegelt werden. Zur Kontrolle kann der Vordruck durch Auflegen auf die Platine geprüft werden.&lt;br /&gt;
&lt;br /&gt;
=== Platine reinigen ===&lt;br /&gt;
Die Platine ist ausgiebig zu reinigen. Dazu eignen sich Scheuermilch, ein Stahlwolle-Topfreiniger und am Ende Aceton zum Entfetten (Brennspiritus geht im Prinzip auch, hinterläßt aber immer einen (sehr) dünnen Fettfilm). Der Stahlwolle-Topfreiniger eignet sich auch sehr gut dazu, die Toner-Reste bei einem Fehlschlag wieder von der Platine herunter zu bekommen. Ein Glitzi-Schwamm ist weniger effektiv, geht aber auch (Glitzi-Schwamm = Küchen-Schwamm mit einseitiger Scheuerbeschichtung).&lt;br /&gt;
&lt;br /&gt;
Es ist wichtig, eventuelle Verunreinigungen zu entfernen bis das Kupfer gleichmäßig glänzt, jedoch sollte man keinesfalls zu kräftig schrubben. Zu tiefe Furchen in der Kupferfläche führen beim Übertragen des Toners dazu, dass dieser in die Furchen verläuft. Leiterbahnen fransen dann aus, schmale Leiterbahnen könnten unterbrochen werden. Ein kurzes anätzen in der Ätzlösung mattiert die Oberfläche zusätzlich und sorgt für den Toner für besseren halt, er verläuft nicht so leicht.&lt;br /&gt;
&lt;br /&gt;
=== Übertragen ===&lt;br /&gt;
Ein einfaches Bügeleisen bringt ausreichende Hitze. Die nötige Bügelzeit liegt bei etwa 5 Minuten, aber je nach Toner können auch bereits nach kürzerer Zeit (Bügeleisen max!) gute Ergebnisse erreicht werden. Zu langes Bügeln führt zu zunehmendem Verfließen des Toners.&lt;br /&gt;
&lt;br /&gt;
Entscheidend ist, daß auf alle Bereiche Druck ausgeübt wird. Da Bügeleisen-Unterseite, Platine und Unterlage nie ganz eben sind, reicht es nicht, das Bügeleisen nur auf den Stapel draufzustellen und darauf zu drücken. Auch untergelegte Stoffe verteilen den Druck erfahrungsgemäß nicht ganz gleichmäßig. &lt;br /&gt;
&lt;br /&gt;
Der Toner verklebt Blatt und Platine nach kurzer Zeit ausreichend gut (ggf. einen Rahmen um das gesamte Projekt drucken) so daß man nach kurzer Zeit den Stapel vorsichtig bewegen kann.&lt;br /&gt;
&lt;br /&gt;
Bewährt hat es sich, den Stapel aus einer Lage Alufolie (als Gleithilfe), der Platine, dem Papier und dem Bügeleisen mehrfach über die Kante eines auf einer glatten Oberfläche (hier: Ceran-Kochfeld) liegenden Küchenhandtuchs gleiten zu lassen. Bei zu hohem Druck können die Leiterbahnen aber in die Breite gehen und natürlich darf der Stapel dabei nicht verrutschen!&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tonertransfer0.jpg|thumb|center|Übertragen]]&lt;br /&gt;
&lt;br /&gt;
Laminiergeräte sind zum Aufbringen des Toners auf die Platine möglicherweise auch geeignet. Siehe dazu den Artikel [[Platinenlaminator]].&lt;br /&gt;
&lt;br /&gt;
=== Papier abwaschen ===&lt;br /&gt;
Katalogpapiere können durch Einweichen in warmem Seifenwasser und sanftes Abreiben mit den Fingern entfernt werden, so dass nur der Toner auf der Platine verbleibt. Der Toner verbindet sich in der Regel bei gleichmäßigem Druck sehr gut mit der Kupferschicht, man kann überraschend beherzt vorgehen.&lt;br /&gt;
&lt;br /&gt;
Mit handelsüblichen Badreiniger und einer Zahnbürste kann man die noch verbliebenden Papierfasern gut lösen. Das ist besonders dann wichtig, wenn man die &amp;quot;drill-aid.ulp&amp;quot; verwendet, weil Papierfasern häufig die kleinen Poren, die beim Zentrieren des Bohrers auf dem Pad helfen, verstopfen. Um dies zu korrigieren sprüht man die Platine mit Badreiniger ein und schrubbt mit der Zahnbürste, bis alle Papierfasern entfernt werden konnten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tonertransfer1.jpg|thumb|center|Nach dem Aufbügeln]]&lt;br /&gt;
&lt;br /&gt;
=== Korrekturen ===&lt;br /&gt;
&lt;br /&gt;
Man kann Fehler (z.&amp;amp;nbsp;B. Löcher in Leiterbahnen) im Aufdruck auf der Platine beheben. Mit einem wasserfesten Edding oder wasserfesten Folienstift kann man die betreffende Stelle bemalen. Die dünne Partikelschicht reicht aus, um das Kupfer vor dem Ätzmittel zu schützen.&lt;br /&gt;
&lt;br /&gt;
Kleine Löcher (besonders in größeren Flächen) kann man möglicherweise durch &amp;quot;Einbrennen&amp;quot; schließen, wie auf [http://thomaspfeifer.net/platinen_aetzen.htm http://thomaspfeifer.net/platinen_aetzen.htm] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Ätzen ===&lt;br /&gt;
&lt;br /&gt;
Nach dem Ätzen mit Eisen(III)-chlorid (FeCl&amp;lt;small&amp;gt;3&amp;lt;/small&amp;gt;) oder Natriumpersulfat (Na&amp;lt;small&amp;gt;2&amp;lt;/small&amp;gt;S&amp;lt;small&amp;gt;2&amp;lt;/small&amp;gt;O&amp;lt;small&amp;gt;8&amp;lt;/small&amp;gt;) (einzelne Papierfasern stören nicht, können aber feine Löcher verstopfen und verhindern, dass dort geätzt wird) sieht die Platine aus wie auf dem Bild. Die Kupferschicht verschwindet nach einiger Ätzzeit überall recht zügig. Man erkennt gut, wo noch Kupfer weggeätzt werden muss. Lieber ewtas länger als etwas zu kurz ätzen!&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tonertransfer2.jpg|thumb|center|Nach dem Ätzen]]&lt;br /&gt;
&lt;br /&gt;
Danach wird der Toner mit Aceton entfernt. Ungiftiges mechanisches Entfernen des Toners funktioniert auch. Dazu rubbelt man mit der rauhen Seite eines Glitzi-Schwammes oder einem Stahlwolle-Topfreiniger (wirkungsvoller!) so lange auf der Platine herum, bis keine Tonerreste mehr zu sehen sind. Alternativ zum Schwamm eignet sich auch super ein &amp;quot;Schleifpad&amp;quot; aus dem Bau-/Sanitärmarkt, welches normalerweise zur Lötstellenreinigung von Kupferrohren verwendet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tonertransfer3.jpg|thumb|center|Gereinigte Platine]]&lt;br /&gt;
&lt;br /&gt;
Aceton gibt es im Baumarkt (unbedingt Sicherheitsvorschriften beachten!)&lt;br /&gt;
&lt;br /&gt;
=== Bestückungsdruck ===&lt;br /&gt;
&lt;br /&gt;
Übrigens eignet sich die Tonertransfermethode auch hervorragend, um einen Bestückungsdruck auf der anderen Seite der Platine herzustellen. Dazu wird der Plan spiegelverkehrt gedruckt und auf die Platinenoberseite gebügelt. Am Besten gelingt die Positionierung auf einer bereits gebohrten Platine, die mit dem Papier gegen das Licht gehalten und auf die Bohrlöcher fixiert wird.&lt;br /&gt;
&lt;br /&gt;
Der Toner hält auch auf der Vorderseite der Platine sehr gut (Epoxydharzplatinen), die Bestückung sollte der Druck auf jeden Fall überstehen. Man kann den Bestückungsdruck auch mit Lack vor Beschädigung schützen. &amp;quot;Plastik 70 - Schutzlack&amp;quot; eignet sich dazu beispielsweise hervorragend. Durch den Lack fallen zudem etwaige Papierfasern nicht mehr auf und die Platine glänzt schön.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bestueckungsdruck.jpg|thumb|center|lackierter Bestückungsdruck]]&lt;br /&gt;
&lt;br /&gt;
Tip: Nach dem ersten Bügeldurchlauf abkühlen lassen und ein zweites mal darüber bügeln. Das macht dem Toner beständiger (gilt auch für den Toner auf der Kupferschicht).&lt;br /&gt;
&lt;br /&gt;
Es ist u.U. auch möglich, das Einweichen in Wasser zu umgehen, indem man in Graustufen druckt - durch die Rasterung des Laserdruckers ist die Verbindung des Transfermediums mit der Leiterplatte auf Tonerpunkte begrenzt, die beim Abziehen eher auf der Platine verbleiben, als auf dem Transfermedium.&lt;br /&gt;
&lt;br /&gt;
== Getestete Folien und Papiere ==&lt;br /&gt;
&lt;br /&gt;
* Transparente Folie für Laserdrucker von NOBO (z.B. bei Staples, 13,99€ = ca. 28 Cent pro Folie)&lt;br /&gt;
** keine Papierrückstände nach dem Bügeln&lt;br /&gt;
** sehr gut zu positionieren bei doppelseitigen Platinenlayouts&lt;br /&gt;
** Bügeleiseneinstellung genau zwischen Baumwolle und Seide bringt beste Ergebnisse&lt;br /&gt;
* Seiten aus einem Reichelt-Katalog gehen super!!!&lt;br /&gt;
* Pollin-Katalog (Das Format lässt sich gut direkt bedrucken)&lt;br /&gt;
* Avery Zweckform Laser A4&lt;br /&gt;
* Injet Glossy Paper (Lidl) (Hochglanzfotopapier für Tintenstrahler) ist super gut!&lt;br /&gt;
* Papier aus einem ELV-Katalog/Focus/Spiegel (möglichst schwarz/weiße Seiten nehmen)&lt;br /&gt;
* Laminierfolie - http://www.mikrocontroller.net/topic/39028#288853&lt;br /&gt;
* Thermo-Papier (Fax-Papier) auf der glatten Seite&lt;br /&gt;
* Werbung/Heft, das es beim EDEKA an der Kasse umsonst gibt - top Ergebnis, keine Papierrückstände beim Abziehen!&lt;br /&gt;
* TPI Fotopapier, 5014, 10 x 15 cm, 240 g/m², Hochglanz, 100 Blatt (Conrad 4€)&lt;br /&gt;
** sehr gute Deckung&lt;br /&gt;
** braucht &amp;gt; 45min im Wasserbad&lt;br /&gt;
** keine Papierreste&lt;br /&gt;
** Bügeleisen auf MAX&lt;br /&gt;
* Spiegel-Papier, am besten nur mit Text, nur abziehen kein rubbeln nötig&lt;br /&gt;
&lt;br /&gt;
== Notizen zu Druckern ==&lt;br /&gt;
&lt;br /&gt;
Kyocera-Mita FS-1020D mit Reichelt-Katalogpapier&lt;br /&gt;
Kyocera-Mita FS-820 schluckt kein Reichelt-Papier, ist zu dünn.&lt;br /&gt;
Brother HL-1230 auch nicht, was sich aber umgehen lässt, indem man ein Seite Normalpapier unter die Katalogseite legt und den Durchzug des Druckers nutzt.&lt;br /&gt;
&lt;br /&gt;
An sich gut geeignet ist der LBP3010, da dieser den Toner nicht sonderlich gründlich einbrennt. Bei Hochglanzpapier lässt sich der Toner sogar weitgehend vom Papier abwischen. Für einen besseren Einzug kann daher das Hochglanzpapier mit (original) Tesafilm auf einem normalen Blatt Papier fixiert werden, ohne dass der Drucker dadurch schaden nimmt*.&lt;br /&gt;
&lt;br /&gt;
(*Angabe ohne Gewähr; für etwaige Schaden ist jeder selbst verantwortlich)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Hier den unformatierten Text eingeben&amp;lt;/nowiki&amp;gt;== Druckerdatenbank ==&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;HP:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 4:&#039;&#039;&#039; Mit Reicheltpapier alleine bekommt man Papierstau.&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 4100:&#039;&#039;&#039; Mit Reicheltpapier auf Papier geklebt funktioniert alles recht problemlos (Direkteinzug von Reichelt-Papier noch nicht ausprobiert).&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 5MP:&#039;&#039;&#039; Reicheltpapier aus manueller Papierzufur geht problemlos&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 6P:&#039;&#039;&#039; Ersatztoner von Reichelt, Druck auf (fast) DinA-4 Seiten aus Pollin Katalog - Problemfrei wenn man die hintere Umlenkklappe des Drucker (Gitter) öffnet und das Papier hier entnimmt!&lt;br /&gt;
* &#039;&#039;&#039;ColorJet 2550N:&#039;&#039;&#039; Toner haftet nur sehr schlecht auf Reicheltpapier. Selbe Einzugsprobleme wie der LJ4, doch mit einem A4 Papier als &amp;quot;Träger&amp;quot; umgehbar. Dazu einfach mit Prittstift an den oberen Ecken der kleineren Reicheltseite auf der A4 Kopierpapierseite fixieren. &#039;&#039;&#039;Kein Tesafilm - Drucker wird sonst beschädigt!&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Color LaserJet 2605dn:&#039;&#039;&#039; Toner haftet gut auf Reicheltpapier. Keine Einzugsprobleme wenn man verfährt wie beim 2550N.&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 2200D:&#039;&#039;&#039; Zerknittert Reicheltpapier beim Einzug, lässt sich aber durch aufkleben auf ein DIN A4 Blatt trotzdem bedrucken.Druckergebnisse sind gut.&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 1018:&#039;&#039;&#039; Geht mit aufgeklebter Reichelt Seite auf DINA4 Blatt&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 1320:&#039;&#039;&#039; Schluckt eine Seite Reichelt Katalogpapier ohne Probleme. Bei größeren schwarzen Flächen leider unzureichende Deckkraft. Papiersorte &amp;quot;Rau&amp;quot; in den Druckereinstellungen bringt zwar Verbesserung, Tonerdichte jedoch immer noch nicht perfekt. Leiterbahnen jedoch sind kein Problem.&lt;br /&gt;
&lt;br /&gt;
Manche Laser-Drucker (HP Laserjet 5MP) sparen (auch im nicht-Econo-Mode) bei großen Flächen offenbar stark an Toner. Große schwarze Flächen konnte ich nicht zuverlässig transferieren, Leiterbahnen in deren Nähe auch nicht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Epson:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;AcuLaser C2000:&#039;&#039;&#039; Reichelt Papier auf Din A4 (mit Kreppklebeband) oder als Din A5 zurecht geschnitten ist kein Problem. Sehr gute Deckung, große Masseflächen sind kein Problem. Auch detaillierte farbige Zeichnungen lassen sich sehr gut transferieren (Alu Platten). Alles mit billig Toner.&lt;br /&gt;
* &#039;&#039;&#039;EPL-3000:&#039;&#039;&#039; Reichelt Papier geht direkt(Treiber HP-LJ4L), Hörzu (auf Din A4 geklebt) ist kein Problem. Sehr gute Deckung. Allerdings hat der Drucker nur 300dpi, daher sind feine Strukturen ein wenig problematisch.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AcuLaser C4000:&#039;&#039;&#039; verwendet wurde 100g Papier auf Din A4 Das Papier ist schwerer aber auch sehr viele stabieler als das Papier aus einem Katalog. &lt;br /&gt;
Auch mit Katalog-Papier habe ich meine Erfahrungen gamacht. Leider waren die auf Papierstaus begrenzt. &lt;br /&gt;
Bei den ersten Tests hatte ich das Gefühl, das nicht genügend Toner auf´s Papier gebracht wurde und ein unterätzen eigesetzt hat. Darauf hin habe ich den selben Ausdruck zwei bzw. derei mal auf das selbe Blatt gebracht. &lt;br /&gt;
Wichtig ist dabei, das man das Papier auch beim ersten Ausdruck über einen gut justierten Einzelplatteinzug zuführt. So ist gewährleistet, dass das Papier genau auf die selbe Stelle in den Drucker führt wird und sich keine Schattenbilder ausbilden. So habe ich auch sehr feine Strukturen auf die Platine gebracht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Minolta:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;PagePro 1200W:&#039;&#039;&#039; Reichelt Papier mit einem normalen Din A5 Papier als Träger (angeklebt) und über den manuellen Einzug, funktioniert ohne Probleme mit Nachfülltoner. Auf Backpapier haftet der Toner allerdings kaum&lt;br /&gt;
* &#039;&#039;&#039;KM bizhub C253:&#039;&#039;&#039; Verknittert das Reichelt-Papier recht gern, mit etwas Geduld kann man aber auch brauchbare Vorlagen produzieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Lexmark:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Optra S 1650:&#039;&#039;&#039; Reichelt Papier auf Din A4 Träger: Druckt sehr dicht (Deckung auf Max. stellen), lässt sich gut auf die Platine übertragen. Super Ergebnisse.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;E120N:&#039;&#039;&#039; Sehr gute Erfolge mit Reichelt Papier auf Din A4 Träger: Druckt sehr dicht (Deckung auf Max. stellen), lässt sich gut auf die Platine übertragen. Super Ergebnisse. (Original Toner)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Kyocera:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;FS-400 / FS-400A:&#039;&#039;&#039; Reicheltpapier aus manueller Papierzufur geht, lässt sich gut auf die Platine übertragen. Super Ergebnisse. (Original Toner)&lt;br /&gt;
* &#039;&#039;&#039;FS-1000+&#039;&#039;&#039; Reicheltpapier vorher auf eine A4 Seite kleben am besten nur an der einzugseite befestigen sonst wellt es Poligone werden in mittleren teil sehr dünn gedruckt da am besten das Papier nicht abrubbeln. Hinterher noch die Platine mit der unbedruckten seite 5min aufs Bügeleisen legen dann werdenden die Polygone auch dicht.&lt;br /&gt;
*&#039;&#039;&#039;FS-3800&#039;&#039;&#039; Reicheltpapier alleine wickelt sich um die Tonertransferrolle, und verfängt sich in der Reinigungsmechanik. Tonertransfereinheit ist danach Schrott. DinA4-Träger habe ich dann nichtmehr probiert.&lt;br /&gt;
*&#039;&#039;&#039;FS-1800&#039;&#039;&#039; Reicheltpapier alleine wickelt sich um die Tonertransferrolle, entfernung nur mit massivem Aufwand und Gefahr des Defektes der Trommel möglich. Reichelt-Papier mit einem Klebestift der oberen Kante des Papiers (in Druckrichtung obere Kante ist gemeint) auf normales Papier kleben und manuell zuführen funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Brother:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HL-5250DN:&#039;&#039;&#039; Reichelt-Papier ohne Träger in der manuellen Papierzufuhr führt zu einem Papierstau. Mit DIN A4-Träger lässt sich das Layout jedoch problemlos mit Originaltoner drucken. Ergebnisse nach dem Bügeln sind erstaunlich gut. Leiterbahnen mit 6 mil Breite ließen sich ohne Unterbrechung herstellen.&lt;br /&gt;
* &#039;&#039;&#039;HL-1030:&#039;&#039;&#039; Mit Reichelt- oder Pollin-Papier kriegt man sehr gute Ergebnisse, der Toner ist bereits nach 2-3 mal Drübergehen mit nem Bügeleisen auf Stufe 2,5 sauber auf der Platine, Papier löst sich unter gewöhnlichem Wasser sehr leicht ab. Dünnes Katalogpapier kann man nur über den manuellen Papiereinzug verwenden, mit normalem Papier als Unterlage, das Katalog- und normale Papier müssen jedoch nicht verklebt werden. Toner gut abwaschbar mit Universalverdünnung.&lt;br /&gt;
* &#039;&#039;&#039;HL-1430:&#039;&#039;&#039; Sehr gute Ergebnisse mit Reicheltkatalogpapier, das mit Klebestift auf der Einzugseite auf normales Druckerpapier aufgeklebt ist. Der Toner läßt sich sehr gut mit &amp;quot;Solvent 50&amp;quot; entfernen.&lt;br /&gt;
* &#039;&#039;&#039;HL-2035:&#039;&#039;&#039; Getestet mit Fotopapier für Inkjets. Keine Probleme, eng beieinander liegende Strukturen müssen aber per Zahnstocher oder einer feinen Nadel von hängengebliebender Beschichtung befreit werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Samsung:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;ML-1520:&#039;&#039;&#039; Reichelt-Papier mit manuellen Einzug funktioniert wunderbar. Gute Ergebnisse mit Originaltoner.&lt;br /&gt;
* &#039;&#039;&#039;ML-1710:&#039;&#039;&#039; Reichelt-Papier mit manuellen Einzug funktioniert wunderbar. Gute Ergebnisse mit Originaltoner.&lt;br /&gt;
* &#039;&#039;&#039;ML-1915:&#039;&#039;&#039; Reichelt-Papier mit manuellen Einzug funktioniert wunderbar. Gute Ergebnisse mit Originaltoner.&lt;br /&gt;
*    3185FN:     Reichelt-Papier Akzeptable Ergebnisse Besser wird es mit einem dicken glänzendem Papier. (Sühac Katalog)&lt;br /&gt;
 Siehe auch http://www.heringshome.de/tutorials/aetzen-mit-der-direct-toner-methode.html&lt;br /&gt;
* &#039;&#039;&#039;ML-2250:&#039;&#039;&#039; Orginaltoner; Spiegel-Papier in A5 auf eine A4 Seite geklebt, Papier 5min einweichen,abziehen rubbeln nicht notwendig, Masse manchmal mit Löcher sonst 16mil kein Problem&lt;br /&gt;
* &#039;&#039;&#039;xpress C1810w:&#039;&#039;&#039; Toner von Ampertec. 100g/m² schweres, hochweißes, hochsatiniertes Papier (bei mir von Neusiedler) geht sehr gut. Mit etwas längere Einweichzeit in kaltem! Wasser direkt nach dem Laminieren bleibt kein Toner am Papier hängen. Einstellungen: manuell auf höchste Qualität. Reichelt Papier oder ähnliches geht nicht, Drucker hat damit ständig Papierstau. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;IBM:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;PagePrinter 3116:&#039;&#039;&#039; Mit Reichelt-Papier gibt&#039;s Papierstau, aufkleben auf normales Papier funktioniert aber einwandfrei. 4mil Leiterbahn mit 8mil Abstand sind reproduzierbar, selbst riesige Masseflächen satt schwarz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Tektronix:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Phaser 740P:&#039;&#039;&#039; Mit Reichelt-Papier aufgeklebt (mit Klebestift) auf 80g/m^2 Papier und Originaltoner geht wunderbar, gibt aber manchmal Falten je nachdem wie man es angeklebt hat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Canon:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;LBP2900:&#039;&#039;&#039; Mit Reichelt-Papier aufgeklebt (Tesa-Film, manchmal auch Iso-Band) auf 80g/m^2 Papier und Originaltoner. Eco-Mode aus, Kontrast voll aufgedreht. Helligkeit auf dunkelste Einstellung. Qualität reichte für TQFP100 aus. Dichte war in Ordnung. Auch größere Flächen meist ohne Probleme im Bezug auf Tonerdichte gedruckt und geätzt.&lt;br /&gt;
* &#039;&#039;&#039;IR1018:&#039;&#039;&#039; Mit Reichelt Papier im seitlichen Einzug. ECO Mode aus, Orginaltoner. Sehr gute Ergebnisse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039; OKI &#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MC342:&#039;&#039;&#039; TPI Fotopapier, 5014, 10 x 15 cm, 240 g/m², Hochglanz, manueller Einzug. Originaltoner, Sehr fein, Toner Sparen = aus. Sehr gutes Ergebniss&lt;br /&gt;
* &#039;&#039;&#039;B4250:&#039;&#039;&#039; relativ dickes Plakatpapier, Hochglanz, manueller Einzug. Originaltoner, Toner Sparen = ohne, angelaufene Platine mit Metallpolitur und Aceton gereinigt&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* Ausführliche Diskussion verschiedener Varianten in [http://www.mikrocontroller.net/forum/read-6-40012.html diesem Thread] im Mikrocontroller.net-Forum.&lt;br /&gt;
* http://myweb.cableone.net/wheedal/pcb.htm (hier sieht man, dass QFP und ein pitch von 0,5 mm realisierbar ist!)&lt;br /&gt;
* http://www.fullnet.com/u/tomg/gooteepc.htm&lt;br /&gt;
* http://www.roboternetz.de/wissen/index.php/Platinenherstellung&lt;br /&gt;
* http://thomaspfeifer.net/platinen_aetzen.htm (Die Methode Schritt für Schritt erklärt mit Bildern und Video) + Regelung für Laminiergerät&lt;br /&gt;
* [http://comwebnet.weimars.net/index.php?option=com_content&amp;amp;task=view&amp;amp;id=18&amp;amp;Itemid=50 Platinenherstellung mit Klebefolien für bessere Ergebnisse]&lt;br /&gt;
* http://www.der-selbermacher.net/platine.php (Tonermethode schnell und einfach mit Bildern und Text erklärt)&lt;br /&gt;
* http://www.die-wuestens.de/dindex.htm?/platine.htm (spezielle Drucktransferfolie)&lt;br /&gt;
* http://wiesi.dyndns.org/tt/tonertransfermethode-0_4.pdf&lt;br /&gt;
* [http://www.pbase.com/mark10970/direct_laser_pcbs Direct PCB Printing with a Laser Printer] (Umbau des Laserdruckers, zu bedruckendes PCB wird elektrisch negativ aufgeladen)&lt;br /&gt;
* http://www.storm.ca/~rheslip/pcbfuser.htm&lt;br /&gt;
&lt;br /&gt;
=== Im Forum ===&lt;br /&gt;
*http://www.mikrocontroller.net/forum/read-6-40012.html&lt;br /&gt;
*http://www.mikrocontroller.net/forum/read-6-261025.html - Umbau Laminiergerät&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-6-284891.html Forum - Tonertransfer mit Reichelt-Katalog 2006]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/335876#new   Tonertransfer - so geht es! ]&lt;br /&gt;
[[Category:Platinen]]&lt;/div&gt;</summary>
		<author><name>Tien</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Platinenherstellung_mit_der_Tonertransfermethode&amp;diff=88426</id>
		<title>Platinenherstellung mit der Tonertransfermethode</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Platinenherstellung_mit_der_Tonertransfermethode&amp;diff=88426"/>
		<updated>2015-04-27T10:53:09Z</updated>

		<summary type="html">&lt;p&gt;Tien: Samsung xpress C1810w hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohne die Zwischenschritte des Belichtens und Entwickelns können [[Platine]]n schneller und günstiger hergestellt werden, indem der Toner eines Laserdruckers oder Kopierers als Ätzmaske verwendet wird. Der Toner wird beim Erhitzen weich und haftet so am Kupfer der Platine.&lt;br /&gt;
&lt;br /&gt;
Die erreichte Qualität hängt - wie auf dem konventionellen Wege auch - von vielen Faktoren ab, ist daher nicht unbedingt reproduzierbar, und meistens nicht so hoch wie die durch die optische Methode erreichte. 0,2 mm Leiterbahnbreite sind möglich (KM FS-1020D), durch den minimalen Tonerauftrag kommt es dabei allerdings u.U. zu kleinsten Löchern, die in dieser Größenordnung schon schaden können.&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
* Laserdrucker oder Kopierer&lt;br /&gt;
* Transfer-Medium (Zeitschriftenpapier, Reichelt-Katalogseite, glänzende Seite Geschenkpapier, Spezialpapier)&lt;br /&gt;
* kupferbeschichtete Platine (ohne! Fotolack und sonstige Beschichtungen)&lt;br /&gt;
* Stahlwolle oder Glitzi-Schwamm zum mechanischen Reinigen der Platine&lt;br /&gt;
* Aceton zum Entfetten der Platine&lt;br /&gt;
* Handelsübliches Bügeleisen, Laminator (ca. 180°C)&lt;br /&gt;
* Temperaturunempfindliche, glatte Oberfläche&lt;br /&gt;
* Ätzmittel&lt;br /&gt;
&lt;br /&gt;
== Vorgehen ==&lt;br /&gt;
&lt;br /&gt;
=== Drucken ===&lt;br /&gt;
Das Layout wird mit einem Laserdrucker (hier: Samsung ML4600) auf ein geeignetes Transfer-Medium (hier: Reichelt-Katalogseite) gedruckt. Am besten für den Transfer eignen sich beschichtete Hochglanzpapiersorten aus Katalogen oder Zeitschriften.&lt;br /&gt;
&lt;br /&gt;
Bei SMD-Projekten (Leiterbahnen auf der Bestückungsseite) muß darauf geachtet werden, daß spiegelverkehrt gedruckt wird. Sollen sich die Leiterbahnen auf der Rückseite befinden, müßte 2x gespiegelt werden, was sich wieder aufhebt. Nur eventueller Text für die Rückseite muß dann gespiegelt werden. Zur Kontrolle kann der Vordruck durch Auflegen auf die Platine geprüft werden.&lt;br /&gt;
&lt;br /&gt;
=== Platine reinigen ===&lt;br /&gt;
Die Platine ist ausgiebig zu reinigen. Dazu eignen sich Scheuermilch, ein Stahlwolle-Topfreiniger und am Ende Aceton zum Entfetten (Brennspiritus geht im Prinzip auch, hinterläßt aber immer einen (sehr) dünnen Fettfilm). Der Stahlwolle-Topfreiniger eignet sich auch sehr gut dazu, die Toner-Reste bei einem Fehlschlag wieder von der Platine herunter zu bekommen. Ein Glitzi-Schwamm ist weniger effektiv, geht aber auch (Glitzi-Schwamm = Küchen-Schwamm mit einseitiger Scheuerbeschichtung).&lt;br /&gt;
&lt;br /&gt;
Es ist wichtig, eventuelle Verunreinigungen zu entfernen bis das Kupfer gleichmäßig glänzt, jedoch sollte man keinesfalls zu kräftig schrubben. Zu tiefe Furchen in der Kupferfläche führen beim Übertragen des Toners dazu, dass dieser in die Furchen verläuft. Leiterbahnen fransen dann aus, schmale Leiterbahnen könnten unterbrochen werden. Ein kurzes anätzen in der Ätzlösung mattiert die Oberfläche zusätzlich und sorgt für den Toner für besseren halt, er verläuft nicht so leicht.&lt;br /&gt;
&lt;br /&gt;
=== Übertragen ===&lt;br /&gt;
Ein einfaches Bügeleisen bringt ausreichende Hitze. Die nötige Bügelzeit liegt bei etwa 5 Minuten, aber je nach Toner können auch bereits nach kürzerer Zeit (Bügeleisen max!) gute Ergebnisse erreicht werden. Zu langes Bügeln führt zu zunehmendem Verfließen des Toners.&lt;br /&gt;
&lt;br /&gt;
Entscheidend ist, daß auf alle Bereiche Druck ausgeübt wird. Da Bügeleisen-Unterseite, Platine und Unterlage nie ganz eben sind, reicht es nicht, das Bügeleisen nur auf den Stapel draufzustellen und darauf zu drücken. Auch untergelegte Stoffe verteilen den Druck erfahrungsgemäß nicht ganz gleichmäßig. &lt;br /&gt;
&lt;br /&gt;
Der Toner verklebt Blatt und Platine nach kurzer Zeit ausreichend gut (ggf. einen Rahmen um das gesamte Projekt drucken) so daß man nach kurzer Zeit den Stapel vorsichtig bewegen kann.&lt;br /&gt;
&lt;br /&gt;
Bewährt hat es sich, den Stapel aus einer Lage Alufolie (als Gleithilfe), der Platine, dem Papier und dem Bügeleisen mehrfach über die Kante eines auf einer glatten Oberfläche (hier: Ceran-Kochfeld) liegenden Küchenhandtuchs gleiten zu lassen. Bei zu hohem Druck können die Leiterbahnen aber in die Breite gehen und natürlich darf der Stapel dabei nicht verrutschen!&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tonertransfer0.jpg|thumb|center|Übertragen]]&lt;br /&gt;
&lt;br /&gt;
Laminiergeräte sind zum Aufbringen des Toners auf die Platine möglicherweise auch geeignet. Siehe dazu den Artikel [[Platinenlaminator]].&lt;br /&gt;
&lt;br /&gt;
=== Papier abwaschen ===&lt;br /&gt;
Katalogpapiere können durch Einweichen in warmem Seifenwasser und sanftes Abreiben mit den Fingern entfernt werden, so dass nur der Toner auf der Platine verbleibt. Der Toner verbindet sich in der Regel bei gleichmäßigem Druck sehr gut mit der Kupferschicht, man kann überraschend beherzt vorgehen.&lt;br /&gt;
&lt;br /&gt;
Mit handelsüblichen Badreiniger und einer Zahnbürste kann man die noch verbliebenden Papierfasern gut lösen. Das ist besonders dann wichtig, wenn man die &amp;quot;drill-aid.ulp&amp;quot; verwendet, weil Papierfasern häufig die kleinen Poren, die beim Zentrieren des Bohrers auf dem Pad helfen, verstopfen. Um dies zu korrigieren sprüht man die Platine mit Badreiniger ein und schrubbt mit der Zahnbürste, bis alle Papierfasern entfernt werden konnten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tonertransfer1.jpg|thumb|center|Nach dem Aufbügeln]]&lt;br /&gt;
&lt;br /&gt;
=== Korrekturen ===&lt;br /&gt;
&lt;br /&gt;
Man kann Fehler (z.&amp;amp;nbsp;B. Löcher in Leiterbahnen) im Aufdruck auf der Platine beheben. Mit einem wasserfesten Edding oder wasserfesten Folienstift kann man die betreffende Stelle bemalen. Die dünne Partikelschicht reicht aus, um das Kupfer vor dem Ätzmittel zu schützen.&lt;br /&gt;
&lt;br /&gt;
Kleine Löcher (besonders in größeren Flächen) kann man möglicherweise durch &amp;quot;Einbrennen&amp;quot; schließen, wie auf [http://thomaspfeifer.net/platinen_aetzen.htm http://thomaspfeifer.net/platinen_aetzen.htm] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Ätzen ===&lt;br /&gt;
&lt;br /&gt;
Nach dem Ätzen mit Eisen(III)-chlorid (FeCl&amp;lt;small&amp;gt;3&amp;lt;/small&amp;gt;) oder Natriumpersulfat (Na&amp;lt;small&amp;gt;2&amp;lt;/small&amp;gt;S&amp;lt;small&amp;gt;2&amp;lt;/small&amp;gt;O&amp;lt;small&amp;gt;8&amp;lt;/small&amp;gt;) (einzelne Papierfasern stören nicht, können aber feine Löcher verstopfen und verhindern, dass dort geätzt wird) sieht die Platine aus wie auf dem Bild. Die Kupferschicht verschwindet nach einiger Ätzzeit überall recht zügig. Man erkennt gut, wo noch Kupfer weggeätzt werden muss. Lieber ewtas länger als etwas zu kurz ätzen!&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tonertransfer2.jpg|thumb|center|Nach dem Ätzen]]&lt;br /&gt;
&lt;br /&gt;
Danach wird der Toner mit Aceton entfernt. Ungiftiges mechanisches Entfernen des Toners funktioniert auch. Dazu rubbelt man mit der rauhen Seite eines Glitzi-Schwammes oder einem Stahlwolle-Topfreiniger (wirkungsvoller!) so lange auf der Platine herum, bis keine Tonerreste mehr zu sehen sind. Alternativ zum Schwamm eignet sich auch super ein &amp;quot;Schleifpad&amp;quot; aus dem Bau-/Sanitärmarkt, welches normalerweise zur Lötstellenreinigung von Kupferrohren verwendet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tonertransfer3.jpg|thumb|center|Gereinigte Platine]]&lt;br /&gt;
&lt;br /&gt;
Aceton gibt es im Baumarkt (unbedingt Sicherheitsvorschriften beachten!)&lt;br /&gt;
&lt;br /&gt;
=== Bestückungsdruck ===&lt;br /&gt;
&lt;br /&gt;
Übrigens eignet sich die Tonertransfermethode auch hervorragend, um einen Bestückungsdruck auf der anderen Seite der Platine herzustellen. Dazu wird der Plan spiegelverkehrt gedruckt und auf die Platinenoberseite gebügelt. Am Besten gelingt die Positionierung auf einer bereits gebohrten Platine, die mit dem Papier gegen das Licht gehalten und auf die Bohrlöcher fixiert wird.&lt;br /&gt;
&lt;br /&gt;
Der Toner hält auch auf der Vorderseite der Platine sehr gut (Epoxydharzplatinen), die Bestückung sollte der Druck auf jeden Fall überstehen. Man kann den Bestückungsdruck auch mit Lack vor Beschädigung schützen. &amp;quot;Plastik 70 - Schutzlack&amp;quot; eignet sich dazu beispielsweise hervorragend. Durch den Lack fallen zudem etwaige Papierfasern nicht mehr auf und die Platine glänzt schön.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bestueckungsdruck.jpg|thumb|center|lackierter Bestückungsdruck]]&lt;br /&gt;
&lt;br /&gt;
Tip: Nach dem ersten Bügeldurchlauf abkühlen lassen und ein zweites mal darüber bügeln. Das macht dem Toner beständiger (gilt auch für den Toner auf der Kupferschicht).&lt;br /&gt;
&lt;br /&gt;
Es ist u.U. auch möglich, das Einweichen in Wasser zu umgehen, indem man in Graustufen druckt - durch die Rasterung des Laserdruckers ist die Verbindung des Transfermediums mit der Leiterplatte auf Tonerpunkte begrenzt, die beim Abziehen eher auf der Platine verbleiben, als auf dem Transfermedium.&lt;br /&gt;
&lt;br /&gt;
== Getestete Folien und Papiere ==&lt;br /&gt;
&lt;br /&gt;
* Transparente Folie für Laserdrucker von NOBO (z.B. bei Staples, 13,99€ = ca. 28 Cent pro Folie)&lt;br /&gt;
** keine Papierrückstände nach dem Bügeln&lt;br /&gt;
** sehr gut zu positionieren bei doppelseitigen Platinenlayouts&lt;br /&gt;
** Bügeleiseneinstellung genau zwischen Baumwolle und Seide bringt beste Ergebnisse&lt;br /&gt;
* Seiten aus einem Reichelt-Katalog gehen super!!!&lt;br /&gt;
* Pollin-Katalog (Das Format lässt sich gut direkt bedrucken)&lt;br /&gt;
* Avery Zweckform Laser A4&lt;br /&gt;
* Injet Glossy Paper (Lidl) (Hochglanzfotopapier für Tintenstrahler) ist super gut!&lt;br /&gt;
* Papier aus einem ELV-Katalog/Focus/Spiegel (möglichst schwarz/weiße Seiten nehmen)&lt;br /&gt;
* Laminierfolie - http://www.mikrocontroller.net/topic/39028#288853&lt;br /&gt;
* Thermo-Papier (Fax-Papier) auf der glatten Seite&lt;br /&gt;
* Werbung/Heft, das es beim EDEKA an der Kasse umsonst gibt - top Ergebnis, keine Papierrückstände beim Abziehen!&lt;br /&gt;
* TPI Fotopapier, 5014, 10 x 15 cm, 240 g/m², Hochglanz, 100 Blatt (Conrad 4€)&lt;br /&gt;
** sehr gute Deckung&lt;br /&gt;
** braucht &amp;gt; 45min im Wasserbad&lt;br /&gt;
** keine Papierreste&lt;br /&gt;
** Bügeleisen auf MAX&lt;br /&gt;
* Spiegel-Papier, am besten nur mit Text, nur abziehen kein rubbeln nötig&lt;br /&gt;
&lt;br /&gt;
== Notizen zu Druckern ==&lt;br /&gt;
&lt;br /&gt;
Kyocera-Mita FS-1020D mit Reichelt-Katalogpapier&lt;br /&gt;
Kyocera-Mita FS-820 schluckt kein Reichelt-Papier, ist zu dünn.&lt;br /&gt;
Brother HL-1230 auch nicht, was sich aber umgehen lässt, indem man ein Seite Normalpapier unter die Katalogseite legt und den Durchzug des Druckers nutzt.&lt;br /&gt;
&lt;br /&gt;
An sich gut geeignet ist der LBP3010, da dieser den Toner nicht sonderlich gründlich einbrennt. Bei Hochglanzpapier lässt sich der Toner sogar weitgehend vom Papier abwischen. Für einen besseren Einzug kann daher das Hochglanzpapier mit (original) Tesafilm auf einem normalen Blatt Papier fixiert werden, ohne dass der Drucker dadurch schaden nimmt*.&lt;br /&gt;
&lt;br /&gt;
(*Angabe ohne Gewähr; für etwaige Schaden ist jeder selbst verantwortlich)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Hier den unformatierten Text eingeben&amp;lt;/nowiki&amp;gt;== Druckerdatenbank ==&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;HP:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 4:&#039;&#039;&#039; Mit Reicheltpapier alleine bekommt man Papierstau.&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 4100:&#039;&#039;&#039; Mit Reicheltpapier auf Papier geklebt funktioniert alles recht problemlos (Direkteinzug von Reichelt-Papier noch nicht ausprobiert).&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 5MP:&#039;&#039;&#039; Reicheltpapier aus manueller Papierzufur geht problemlos&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 6P:&#039;&#039;&#039; Ersatztoner von Reichelt, Druck auf (fast) DinA-4 Seiten aus Pollin Katalog - Problemfrei wenn man die hintere Umlenkklappe des Drucker (Gitter) öffnet und das Papier hier entnimmt!&lt;br /&gt;
* &#039;&#039;&#039;ColorJet 2550N:&#039;&#039;&#039; Toner haftet nur sehr schlecht auf Reicheltpapier. Selbe Einzugsprobleme wie der LJ4, doch mit einem A4 Papier als &amp;quot;Träger&amp;quot; umgehbar. Dazu einfach mit Prittstift an den oberen Ecken der kleineren Reicheltseite auf der A4 Kopierpapierseite fixieren. &#039;&#039;&#039;Kein Tesafilm - Drucker wird sonst beschädigt!&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Color LaserJet 2605dn:&#039;&#039;&#039; Toner haftet gut auf Reicheltpapier. Keine Einzugsprobleme wenn man verfährt wie beim 2550N.&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 2200D:&#039;&#039;&#039; Zerknittert Reicheltpapier beim Einzug, lässt sich aber durch aufkleben auf ein DIN A4 Blatt trotzdem bedrucken.Druckergebnisse sind gut.&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 1018:&#039;&#039;&#039; Geht mit aufgeklebter Reichelt Seite auf DINA4 Blatt&lt;br /&gt;
* &#039;&#039;&#039;LaserJet 1320:&#039;&#039;&#039; Schluckt eine Seite Reichelt Katalogpapier ohne Probleme. Bei größeren schwarzen Flächen leider unzureichende Deckkraft. Papiersorte &amp;quot;Rau&amp;quot; in den Druckereinstellungen bringt zwar Verbesserung, Tonerdichte jedoch immer noch nicht perfekt. Leiterbahnen jedoch sind kein Problem.&lt;br /&gt;
&lt;br /&gt;
Manche Laser-Drucker (HP Laserjet 5MP) sparen (auch im nicht-Econo-Mode) bei großen Flächen offenbar stark an Toner. Große schwarze Flächen konnte ich nicht zuverlässig transferieren, Leiterbahnen in deren Nähe auch nicht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Epson:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;AcuLaser C2000:&#039;&#039;&#039; Reichelt Papier auf Din A4 (mit Kreppklebeband) oder als Din A5 zurecht geschnitten ist kein Problem. Sehr gute Deckung, große Masseflächen sind kein Problem. Auch detaillierte farbige Zeichnungen lassen sich sehr gut transferieren (Alu Platten). Alles mit billig Toner.&lt;br /&gt;
* &#039;&#039;&#039;EPL-3000:&#039;&#039;&#039; Reichelt Papier geht direkt(Treiber HP-LJ4L), Hörzu (auf Din A4 geklebt) ist kein Problem. Sehr gute Deckung. Allerdings hat der Drucker nur 300dpi, daher sind feine Strukturen ein wenig problematisch.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AcuLaser C4000:&#039;&#039;&#039; verwendet wurde 100g Papier auf Din A4 Das Papier ist schwerer aber auch sehr viele stabieler als das Papier aus einem Katalog. &lt;br /&gt;
Auch mit Katalog-Papier habe ich meine Erfahrungen gamacht. Leider waren die auf Papierstaus begrenzt. &lt;br /&gt;
Bei den ersten Tests hatte ich das Gefühl, das nicht genügend Toner auf´s Papier gebracht wurde und ein unterätzen eigesetzt hat. Darauf hin habe ich den selben Ausdruck zwei bzw. derei mal auf das selbe Blatt gebracht. &lt;br /&gt;
Wichtig ist dabei, das man das Papier auch beim ersten Ausdruck über einen gut justierten Einzelplatteinzug zuführt. So ist gewährleistet, dass das Papier genau auf die selbe Stelle in den Drucker führt wird und sich keine Schattenbilder ausbilden. So habe ich auch sehr feine Strukturen auf die Platine gebracht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Minolta:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;PagePro 1200W:&#039;&#039;&#039; Reichelt Papier mit einem normalen Din A5 Papier als Träger (angeklebt) und über den manuellen Einzug, funktioniert ohne Probleme mit Nachfülltoner. Auf Backpapier haftet der Toner allerdings kaum&lt;br /&gt;
* &#039;&#039;&#039;KM bizhub C253:&#039;&#039;&#039; Verknittert das Reichelt-Papier recht gern, mit etwas Geduld kann man aber auch brauchbare Vorlagen produzieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Lexmark:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Optra S 1650:&#039;&#039;&#039; Reichelt Papier auf Din A4 Träger: Druckt sehr dicht (Deckung auf Max. stellen), lässt sich gut auf die Platine übertragen. Super Ergebnisse.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;E120N:&#039;&#039;&#039; Sehr gute Erfolge mit Reichelt Papier auf Din A4 Träger: Druckt sehr dicht (Deckung auf Max. stellen), lässt sich gut auf die Platine übertragen. Super Ergebnisse. (Original Toner)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Kyocera:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;FS-400 / FS-400A:&#039;&#039;&#039; Reicheltpapier aus manueller Papierzufur geht, lässt sich gut auf die Platine übertragen. Super Ergebnisse. (Original Toner)&lt;br /&gt;
* &#039;&#039;&#039;FS-1000+&#039;&#039;&#039; Reicheltpapier vorher auf eine A4 Seite kleben am besten nur an der einzugseite befestigen sonst wellt es Poligone werden in mittleren teil sehr dünn gedruckt da am besten das Papier nicht abrubbeln. Hinterher noch die Platine mit der unbedruckten seite 5min aufs Bügeleisen legen dann werdenden die Polygone auch dicht.&lt;br /&gt;
*&#039;&#039;&#039;FS-3800&#039;&#039;&#039; Reicheltpapier alleine wickelt sich um die Tonertransferrolle, und verfängt sich in der Reinigungsmechanik. Tonertransfereinheit ist danach Schrott. DinA4-Träger habe ich dann nichtmehr probiert.&lt;br /&gt;
*&#039;&#039;&#039;FS-1800&#039;&#039;&#039; Reicheltpapier alleine wickelt sich um die Tonertransferrolle, entfernung nur mit massivem Aufwand und Gefahr des Defektes der Trommel möglich. Reichelt-Papier mit einem Klebestift der oberen Kante des Papiers (in Druckrichtung obere Kante ist gemeint) auf normales Papier kleben und manuell zuführen funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Brother:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HL-5250DN:&#039;&#039;&#039; Reichelt-Papier ohne Träger in der manuellen Papierzufuhr führt zu einem Papierstau. Mit DIN A4-Träger lässt sich das Layout jedoch problemlos mit Originaltoner drucken. Ergebnisse nach dem Bügeln sind erstaunlich gut. Leiterbahnen mit 6 mil Breite ließen sich ohne Unterbrechung herstellen.&lt;br /&gt;
* &#039;&#039;&#039;HL-1030:&#039;&#039;&#039; Mit Reichelt- oder Pollin-Papier kriegt man sehr gute Ergebnisse, der Toner ist bereits nach 2-3 mal Drübergehen mit nem Bügeleisen auf Stufe 2,5 sauber auf der Platine, Papier löst sich unter gewöhnlichem Wasser sehr leicht ab. Dünnes Katalogpapier kann man nur über den manuellen Papiereinzug verwenden, mit normalem Papier als Unterlage, das Katalog- und normale Papier müssen jedoch nicht verklebt werden. Toner gut abwaschbar mit Universalverdünnung.&lt;br /&gt;
* &#039;&#039;&#039;HL-1430:&#039;&#039;&#039; Sehr gute Ergebnisse mit Reicheltkatalogpapier, das mit Klebestift auf der Einzugseite auf normales Druckerpapier aufgeklebt ist. Der Toner läßt sich sehr gut mit &amp;quot;Solvent 50&amp;quot; entfernen.&lt;br /&gt;
* &#039;&#039;&#039;HL-2035:&#039;&#039;&#039; Getestet mit Fotopapier für Inkjets. Keine Probleme, eng beieinander liegende Strukturen müssen aber per Zahnstocher oder einer feinen Nadel von hängengebliebender Beschichtung befreit werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Samsung:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;ML-1520:&#039;&#039;&#039; Reichelt-Papier mit manuellen Einzug funktioniert wunderbar. Gute Ergebnisse mit Originaltoner.&lt;br /&gt;
* &#039;&#039;&#039;ML-1710:&#039;&#039;&#039; Reichelt-Papier mit manuellen Einzug funktioniert wunderbar. Gute Ergebnisse mit Originaltoner.&lt;br /&gt;
* &#039;&#039;&#039;ML-1915:&#039;&#039;&#039; Reichelt-Papier mit manuellen Einzug funktioniert wunderbar. Gute Ergebnisse mit Originaltoner.&lt;br /&gt;
*    3185FN:     Reichelt-Papier Akzeptable Ergebnisse Besser wird es mit einem dicken glänzendem Papier. (Sühac Katalog)&lt;br /&gt;
 Siehe auch http://www.heringshome.de/tutorials/aetzen-mit-der-direct-toner-methode.html&lt;br /&gt;
* &#039;&#039;&#039;ML-2250:&#039;&#039;&#039; Orginaltoner; Spiegel-Papier in A5 auf eine A4 Seite geklebt, Papier 5min einweichen,abziehen rubbeln nicht notwendig, Masse manchmal mit Löcher sonst 16mil kein Problem&lt;br /&gt;
* &#039;&#039;&#039;xpress C1810w:&#039;&#039;&#039; Toner von Ampertec. 100g/m² schweres, hochweißes, hochsatiniertes Papier (bei mir von Neusiedler) geht sehr gut. Mit etwas längere Einweichzeit in kaltem! Wasser direkt nach dem Laminieren bleibt kein Toner am Papier hängen. Einstellungen: manuell auf höchste Qualität.&lt;br /&gt;
Reichelt Papier oder ähnliches geht nicht, Drucker hat damit ständig Papierstau. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;IBM:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;PagePrinter 3116:&#039;&#039;&#039; Mit Reichelt-Papier gibt&#039;s Papierstau, aufkleben auf normales Papier funktioniert aber einwandfrei. 4mil Leiterbahn mit 8mil Abstand sind reproduzierbar, selbst riesige Masseflächen satt schwarz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Tektronix:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Phaser 740P:&#039;&#039;&#039; Mit Reichelt-Papier aufgeklebt (mit Klebestift) auf 80g/m^2 Papier und Originaltoner geht wunderbar, gibt aber manchmal Falten je nachdem wie man es angeklebt hat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Canon:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;LBP2900:&#039;&#039;&#039; Mit Reichelt-Papier aufgeklebt (Tesa-Film, manchmal auch Iso-Band) auf 80g/m^2 Papier und Originaltoner. Eco-Mode aus, Kontrast voll aufgedreht. Helligkeit auf dunkelste Einstellung. Qualität reichte für TQFP100 aus. Dichte war in Ordnung. Auch größere Flächen meist ohne Probleme im Bezug auf Tonerdichte gedruckt und geätzt.&lt;br /&gt;
* &#039;&#039;&#039;IR1018:&#039;&#039;&#039; Mit Reichelt Papier im seitlichen Einzug. ECO Mode aus, Orginaltoner. Sehr gute Ergebnisse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039; OKI &#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MC342:&#039;&#039;&#039; TPI Fotopapier, 5014, 10 x 15 cm, 240 g/m², Hochglanz, manueller Einzug. Originaltoner, Sehr fein, Toner Sparen = aus. Sehr gutes Ergebniss&lt;br /&gt;
* &#039;&#039;&#039;B4250:&#039;&#039;&#039; relativ dickes Plakatpapier, Hochglanz, manueller Einzug. Originaltoner, Toner Sparen = ohne, angelaufene Platine mit Metallpolitur und Aceton gereinigt&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* Ausführliche Diskussion verschiedener Varianten in [http://www.mikrocontroller.net/forum/read-6-40012.html diesem Thread] im Mikrocontroller.net-Forum.&lt;br /&gt;
* http://myweb.cableone.net/wheedal/pcb.htm (hier sieht man, dass QFP und ein pitch von 0,5 mm realisierbar ist!)&lt;br /&gt;
* http://www.fullnet.com/u/tomg/gooteepc.htm&lt;br /&gt;
* http://www.roboternetz.de/wissen/index.php/Platinenherstellung&lt;br /&gt;
* http://thomaspfeifer.net/platinen_aetzen.htm (Die Methode Schritt für Schritt erklärt mit Bildern und Video) + Regelung für Laminiergerät&lt;br /&gt;
* [http://comwebnet.weimars.net/index.php?option=com_content&amp;amp;task=view&amp;amp;id=18&amp;amp;Itemid=50 Platinenherstellung mit Klebefolien für bessere Ergebnisse]&lt;br /&gt;
* http://www.der-selbermacher.net/platine.php (Tonermethode schnell und einfach mit Bildern und Text erklärt)&lt;br /&gt;
* http://www.die-wuestens.de/dindex.htm?/platine.htm (spezielle Drucktransferfolie)&lt;br /&gt;
* http://wiesi.dyndns.org/tt/tonertransfermethode-0_4.pdf&lt;br /&gt;
* [http://www.pbase.com/mark10970/direct_laser_pcbs Direct PCB Printing with a Laser Printer] (Umbau des Laserdruckers, zu bedruckendes PCB wird elektrisch negativ aufgeladen)&lt;br /&gt;
* http://www.storm.ca/~rheslip/pcbfuser.htm&lt;br /&gt;
&lt;br /&gt;
=== Im Forum ===&lt;br /&gt;
*http://www.mikrocontroller.net/forum/read-6-40012.html&lt;br /&gt;
*http://www.mikrocontroller.net/forum/read-6-261025.html - Umbau Laminiergerät&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-6-284891.html Forum - Tonertransfer mit Reichelt-Katalog 2006]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/335876#new   Tonertransfer - so geht es! ]&lt;br /&gt;
[[Category:Platinen]]&lt;/div&gt;</summary>
		<author><name>Tien</name></author>
	</entry>
</feed>