<?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=84.191.221.238</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=84.191.221.238"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/84.191.221.238"/>
	<updated>2026-04-10T23:46:30Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=96560</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=96560"/>
		<updated>2017-06-06T10:55:16Z</updated>

		<summary type="html">&lt;p&gt;84.191.221.238: /* Weblinks */&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>84.191.221.238</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=USB&amp;diff=96499</id>
		<title>USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=USB&amp;diff=96499"/>
		<updated>2017-06-01T11:02:23Z</updated>

		<summary type="html">&lt;p&gt;84.191.221.238: /* Allgemeine Informationen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;B&#039;&#039;&#039;us.&lt;br /&gt;
&lt;br /&gt;
Serieller Bus, der heutzutage an jedem neuen PC zu finden ist und langsam aber sicher die RS-232- und Parallelport-Anschlüsse ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Übertragungsgeschwindigkeiten:&lt;br /&gt;
* Low Speed: 1,5 MBit/s (USB 1.1 und 2.0)&lt;br /&gt;
* Full Speed: 12 MBit/s (USB 1.1 und 2.0)&lt;br /&gt;
* High Speed: 480 MBit/s (nur USB 2.0)&lt;br /&gt;
* SuperSpeed: 5 GBit/s (nur USB 3.0)&lt;br /&gt;
Die in Datenblättern oder Verpackungen gern verwendete Angabe &amp;quot;USB 2.0 Full Speed&amp;quot; darf man also nicht wörtlich verstehen, das sind trotz USB 2.0 nur 12 Mbit/s.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass es bei USB im Gegensatz zu [[RS-232]] zwei Arten von Controllern gibt: Host- und Devicecontroller. Host bezeichnet dabei die steuernde Seite und ist z.&amp;amp;nbsp;B. in PCs zu finden; Devices sind die USB-Geräte, z.&amp;amp;nbsp;B. USB-Webcams. Diese Unterscheidung ist ziemlich wichtig, weil die meisten USB-Lösungen für [[Mikrocontroller]] USB-Devices darstellen und man deswegen dort weder Webcams noch USB-Speichersticks anschließen kann. Mit der letzten Ergänzung des Standards (USB On-The-Go) gibt es die begrenzte Möglichkeit, dass Geräte Host-Funktionalität zur Kommunikation mit ausgewählten Peripheriegeräten erhalten.&lt;br /&gt;
&lt;br /&gt;
Benutzt man ein USB-Device am PC, dann braucht man auch noch passende Treiber. Die aktuellen Betriebssysteme bringen meist eine Reihe von Treibern für Standardanwendungen (z.&amp;amp;nbsp;B. USB-Festplatte) mit. Gibt es keinen passenden Standardtreiber, dann muss man eben einen erstellen. Dazu werden bei manchen Chips kostenlose Treiber mitgeliefert, bei anderen muss man sie kaufen oder (aufwendig) selbst erstellen.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Informationen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.usb.org/home USB-Hauptseite] Die Homepage des USB Implementers Forum, Inc., creators of USB technology.&lt;br /&gt;
* [http://libusb.sourceforge.net/ libusb] Allgemein ist die Treiberprogrammierung für USB das Hauptproblem. Die plattformübergreifende libusb ([http://libusb-win32.sourceforge.net/ Win32-Port (nicht Vista!)]) ermöglicht die Kommunikation mit USB-Geräten unter Verwendung eines Universaltreibers. Ein deutschsprachiges Projekt, erstellt von [http://www.weinga-unity.at.tt Weichinger Klaus], das libusb verwendet, findet man unter [http://www.ime.jku.at/tusb/] (Programmiersprache C mit MINGW; Dokumentation, Sourcecode und Binärdateien).&lt;br /&gt;
* [http://halvar.at/elektronik/usb/arnold_da.pdf Diplomarbeit von Eik Arnold] Viele Informationen über USB (Vergleich mit anderen Bussystemen, Elektrisches Interface, Transferarten, Übersicht über die verschiedenen USB Chips, ...)&lt;br /&gt;
* [http://www.beyondlogic.org/usbnutshell/usb1.htm USB in a NutShell] Eine kleine Wanderung durch die USB-Spezifikation&lt;br /&gt;
* [http://www.b-redemann.de Steuern und Messen mit USB - FT232, 245 und 2232] &amp;quot;Das aktuelle Buch zu den USB-Controllern von FTDI. Viele Beispielprogramme in C, zwei Projektbeschreibungen: I2C-Bus mit LM75A und ein Web-Projekt. Bauteilesatz und USB-Modul mit dem FT2232 zum schnellen Einstieg in die Thematik. Buch / Teilesatz über Segor oder dieser Seite erhältlich.&amp;quot;&lt;br /&gt;
* [http://www.netzmafia.de/skripten/hardware/PC-Schnittstellen/usb.html Universal Serial Bus] Eine gute Einführung und detaillierte Beschreibung.&lt;br /&gt;
* [http://www.b-kainka.de/MSRUSB.pdf Buch: Messen, Steuern, Regeln mit USB] von B. Kainka.&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Universal_Serial_Bus Wikipedia-Artikel: Universal Serial Bus]&lt;br /&gt;
&lt;br /&gt;
== USB-Hostcontroller ==&lt;br /&gt;
=== Host-Controller im Mikrocontroller ===&lt;br /&gt;
Es gibt eine erfreuliche Anzahl geeigneter Schaltkreise, nur für den Amateur unschön beschaffbar. Entsprechend der USB-Spezifikation kann jeder Full-Speed-Hostcontroller auch mit Low-Speed arbeiten.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
!Hersteller&lt;br /&gt;
!IC&lt;br /&gt;
!Speed&lt;br /&gt;
!Pins&lt;br /&gt;
!Ucc/Uio&lt;br /&gt;
!CPU&lt;br /&gt;
!Takt&lt;br /&gt;
!Flash&lt;br /&gt;
!RAM&lt;br /&gt;
!ADU&lt;br /&gt;
!DAU/PWM&lt;br /&gt;
!Async&lt;br /&gt;
!Sync&lt;br /&gt;
!Extras&lt;br /&gt;
!Bezug&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB96F338U&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3-5 V&lt;br /&gt;
| 16bit / 16FX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 544Kbyte &lt;br /&gt;
| 32Kbyte &lt;br /&gt;
| 36x10bit&lt;br /&gt;
| 20xPWM, 12xOCU&lt;br /&gt;
| 8&lt;br /&gt;
| 8&lt;br /&gt;
| 3xCAN, 2xI²C&lt;br /&gt;
| [http://www.glyn.de/ Glyn], [http://www.ebv.com/ EBV]&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB90F334&lt;br /&gt;
| Full&lt;br /&gt;
| 120&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit / 16LX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 384Kbyte &lt;br /&gt;
| 24Kbyte &lt;br /&gt;
| 16x10bit&lt;br /&gt;
| 6xPWM, 4xOCU&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 3xI²C&lt;br /&gt;
| Glyn, EBV&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB90F337&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit / 16LX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 64Kbyte &lt;br /&gt;
|  4Kbyte &lt;br /&gt;
| -&lt;br /&gt;
| 4xPWM&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 1xI²C&lt;br /&gt;
| Glyn, EBV&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CY7C67300&lt;br /&gt;
| Full&lt;br /&gt;
| 100&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit RISC&lt;br /&gt;
| 48 MHz&lt;br /&gt;
| 4K x 16bit OTP&lt;br /&gt;
| 8K x 16bit&lt;br /&gt;
| -&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/ Atmel]&lt;br /&gt;
| AT90USB647&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3 - 5 V&lt;br /&gt;
| AVR&lt;br /&gt;
| 16 MHz&lt;br /&gt;
| 64 K&lt;br /&gt;
| 4 K&lt;br /&gt;
| 8 x 10 bit&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 11,42 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/ Atmel]&lt;br /&gt;
| AT32UC3B0128&lt;br /&gt;
| Full/OTG&lt;br /&gt;
| 64 (40)&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| AVR32&lt;br /&gt;
| 60 MHz&lt;br /&gt;
| 128 K&lt;br /&gt;
| 32 K&lt;br /&gt;
| 8 x 10 bit&lt;br /&gt;
| (7+6) x PWM&lt;br /&gt;
| 2 (1x full)&lt;br /&gt;
| I²C, SPI, SSC&lt;br /&gt;
| Kernspannungsregler 1,8 V&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 6 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/ Microchip]&lt;br /&gt;
| PIC24FJ256GB106&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| PIC24&lt;br /&gt;
| 16 MHz&lt;br /&gt;
| 64 KB&lt;br /&gt;
| 16 KB&lt;br /&gt;
| 10bit&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
| Spannungsregler&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 5,70 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/ Microchip]&lt;br /&gt;
| PIC32MX420FxxxH&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| MIPS32&lt;br /&gt;
| 80 MHz&lt;br /&gt;
| ab 32 KB&lt;br /&gt;
| 8 - 32 KB&lt;br /&gt;
| 16 x 10bit&lt;br /&gt;
| -&lt;br /&gt;
| 1 mit IRDA&lt;br /&gt;
|&lt;br /&gt;
| Spannungsregler, JTAG&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 4,83 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.nxp.com/ Philips/NXP]&lt;br /&gt;
| LPC2388&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 32KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
| 1 x 10bit, 6 PWM&lt;br /&gt;
| 2 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| SD/MMC, Ethernet 10 Mbit, Businterface, JTAG&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 8 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F10x&lt;br /&gt;
| Full&lt;br /&gt;
| 36..144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M3&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 64KB&lt;br /&gt;
| 21 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 5 USART, 1 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.farnell.com/ Farnell] ab ca. 5 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F4xx&lt;br /&gt;
| Full + Hi&lt;br /&gt;
| 64..176&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M4&lt;br /&gt;
| 168MHz&lt;br /&gt;
| 1024KB&lt;br /&gt;
| 192KB&lt;br /&gt;
| 24 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 6 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.mouser.com/ Mouser] ab ca. 7 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alle mit „USB OTG“ beworbenen Schaltkreise sind als Host-Controller&lt;br /&gt;
&#039;&#039;und&#039;&#039; Device-Controller verwendbar. Mikrocontroller mit High-Speed-USB sind selten.&lt;br /&gt;
&lt;br /&gt;
=== Implementierung in Software auf Atmel AVR ===&lt;br /&gt;
Solche Hostcontroller sind nur für Low-Speed-Geräte geeignet, in der Regel Tastaturen, Mäuse und ggf. Joysticks oder ähnliche HID-Geräte.&lt;br /&gt;
&lt;br /&gt;
* [http://www.asahi-net.or.jp/~qx5k-iskw/robot/usbhost.html Reine Softwarelösung, kann nur USB Low Speed] (Seite auf japanisch, mit [http://babelfish.altavista.com/ Babelfish] übersetzen lassen). &lt;br /&gt;
* [http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2007/blh36_cdl28_dct23/blh36_cdl28_dct23/index.html SIAM32 USB HC] - Software Implemented Atmel Mega32 Universal Serial Bus Host Controller (Atmega32, GPL)&lt;br /&gt;
&amp;lt;!-- * [http://obdev.at/products/avrusb/index-de.html OpenSource Lösung] OpenSource Lösung auf http://obdev.at (Nur USB Device, kein USB Host) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Software-Implementierungen auf anderen Mikrocontrollern scheitern wegen zu geringer Taktfrequenzen bzw. Durchsatzraten, oder – bei leistungsstärkeren Controllern – wegen Sinnlosigkeit durch Verfügbarkeit von Mikrocontrollern mit USB (siehe oben).&lt;br /&gt;
&lt;br /&gt;
=== Spezielle Schaltkreise ===&lt;br /&gt;
&lt;br /&gt;
USB-Schaltkreise, die vorzugsweise für den Anschluss an ein „Externes Businterface“ eines Mikrocontrollers oder per [[SPI]] vorgesehen sind.&lt;br /&gt;
&lt;br /&gt;
* [http://www.nxp.com/products/connectivity/usb/products/index.html#hostc Produkte von NXP] (ehem.Philips), bspw. ISP1760&lt;br /&gt;
* SL811HST von [http://www.cypress.com/ Cypress] (Host/Device/OTG möglich)&lt;br /&gt;
* VNC1L von [http://www.vinculum.com/ Vinculum]&lt;br /&gt;
* [http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3639 MAX3421E] z.&amp;amp;nbsp;B. verwendet im [http://www.circuitsathome.com/category/mcu/arduino/usb-shield Arduino USB Host Shield] von Circuits@Home&lt;br /&gt;
* [http://www.ghielectronics.com/catalog/product/340 ALFAT SoC Processor] - A seamless way to access files on SD &amp;amp; MMC cards and on USB memory drives. Simple commands are used on [[UART]] (serial), [[SPI]] or [[I2C]] to access files at high rates. &lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es eine Reihe Schaltkreise, die einen PCI-Bus haben. Diese sind für Mikrocontrollerprojekte in der Regel nicht zu gebrauchen.&lt;br /&gt;
&lt;br /&gt;
=== USB HOST taugliche Stacks ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/75254 Freier USB-Stack für Embedded Systeme (LGPL)] von Benedikt Sauter (Treiber für SL811HS von Cypress). Source auf [http://svn.berlios.de/svnroot/repos/usbport/trunk/ svn.berlios.de]&lt;br /&gt;
* [https://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2007/blh36_cdl28_dct23/blh36_cdl28_dct23/index.html SIAM32 USB HC] - Software Implemented Atmel Mega32 Universal Serial Bus Host Controller (Atmega32)&lt;br /&gt;
&lt;br /&gt;
=== Fertige Module mit einem USB-Host ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.vinculum.com/prd_vdip1.html VDIP1] von FTDI (UART, SPI und parallel)&lt;br /&gt;
* [http://www.elv.de/output/controller.aspx?cid=74&amp;amp;detail=10&amp;amp;detail2=20659 STI 100] von elv (UART und SPI)&lt;br /&gt;
* [http://www.rz-robotics.de/z-module/z-usb/ Z-USB] von rz-robotics (UART und SPI, kann auch stehend montiert werden)&lt;br /&gt;
* [http://www.fischl.de/usbsticklogger/ USBStickLogger] OpenSource-Projekt, Bausatz verfügbar (UART)&lt;br /&gt;
&lt;br /&gt;
== USB-Devices ==&lt;br /&gt;
&lt;br /&gt;
===Implementierung in Software===&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm IgorPlug-USB - Reine Softwarelösung. Kann nur USB Low Speed (theoretisch 1.5Mbit/s).]&lt;br /&gt;
* [http://www.obdev.at/vusb/ V-USB] - gleiches Prinzip wie IgorPlug, aber Entwickler-Schnittstellen in C, englisch kommentierter Code. Projekt von [http://www.obdev.at/ Objective Development]. Viele Folgeprojekte. Beispielsweise:&lt;br /&gt;
** [http://www.recursion.jp/avrcdc/ AVR-CDC] – Ein USB-RS232C-Interface mittels CDC-Protokoll (Communication Device Class) bspw. mit ATtiny45. Kein Treiber erforderlich, nur .INF-Datei. Von Osamu Tamura.&lt;br /&gt;
** [http://www.recursion.jp/avrcdc/ CDC-IO] Ein experimentelles 18-bit Parallelport mittels AVR-Mikrocontroller (ATmega8/48/88). Von Osamu Tamura.&lt;br /&gt;
** [http://1010.co.uk/avrhid.html AVR-HID] - Low budget USB sensor input into Pure Data/Supercollider and other free softwares based around the ATmega8 microcontroller. This allows for very fast, multiple sensor input at high resolutions on a range of platforms (GNU/Linux, MAC OS X, Windows). Based on workshops with Derek Holzer.&lt;br /&gt;
* [http://www.xs4all.nl/~dicks/avr/usbtiny/ USBtiny] - Programmiergerät für AVR, Lizenz: GPL&lt;br /&gt;
* [http://www.elektor.de/Default.aspx?tabid=27&amp;amp;art=5551005&amp;amp;PN=On AVR steuert USB] und [http://www.elektor.de/Default.aspx?tabid=27&amp;amp;art=5551006&amp;amp;PN=On Universeller USB-Treiber] in der Zeitschrift [http://www.elektor.de Elektor] März 2007. Reine Softwarelösung für ein USB-I/O-Board mit einem ATmega32 und einem [http://libusb-win32.sourceforge.net/ &#039;&#039;open source&#039;&#039; USB Treiber].&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/projekte/usb4all/usb4all.htm USB Client für universelle Steuerungsaufgaben mit PIC18F2455 oder PIC18F2550]&lt;br /&gt;
* Für MSP430 gibt es mittlerweile eine Implementation [http://mecrisp.sourceforge.net/mecrimus-b.htm] und einen darauf aufbauenden Bootloader [https://github.com/simpleavr/boot430].&lt;br /&gt;
&lt;br /&gt;
===Spezielle USB-µC===&lt;br /&gt;
&lt;br /&gt;
* Diverse µCs von [http://www.cypress.com/ Cypress], siehe unten&lt;br /&gt;
* TUSBxxxx-Serie von [http://www.ti.com/ Texas Instruments] ebenfalls mit [[8051]]-kompatiblem Mikrocontroller ([http://www.ime.jku.at/tusb/ Beispiel Projekt] von [http://www.weinga-unity.at.tt Weichinger Klaus] (EXPL_DHTML.C  Virus ?))&lt;br /&gt;
* PIC18F2455/2550/4455/4550/67J50/67J55/87J50/87J55 sowie alle PIC24FXXXGBXXX von [http://www.microchip.com/ Microchip], &amp;amp;uuml;ppig ausgestattet mit USB, seriellem Port (RS232/SPI), PWM-Ausg&amp;amp;auml;ngen, A/D-Wandler und vielen IO-Pins&lt;br /&gt;
* [http://www.freescale.com/ Freescale]&lt;br /&gt;
** 69HC908JB8 - 20 Pin DIP . . . MC6&#039;&#039;&#039;8&#039;&#039;&#039;HC908JB8 ?&lt;br /&gt;
** 69HC908JB16 - Mehr Peripherie u.a. RS232&lt;br /&gt;
** 69HC908JG16 - Mit A/D wandler&lt;br /&gt;
** 69HC908JW32 - Mehr Speicher, mehr Ports&lt;br /&gt;
* [[LPC2000]]/3000-Reihe von NXP (LPC2888: High Speed USB 480Mbps)&lt;br /&gt;
* C8051F320 &amp;amp; C8051F340 von Silicon Laboratories (USB, UART, SPI, SMBus, 10-Bit-ADC, Komperator, integr. Spannungsregler &amp;amp; Oszillator)&lt;br /&gt;
* [[AT91SAM]] Familie von Atmel, ARM7-basiert, nicht OTG-fähig&lt;br /&gt;
* [[AVR32]] ([http://www.atmel.com/products/avr/uc3.asp?category_id=163&amp;amp;family_id=607 AT32UC3]A/B) Familie von Atmel mit AVR32-Kern ohne MMU für einfachere Firmware, OTG-fähig, auch High-Speed, Externes Businterface, Ethernet. Alle AT32UC3A or -B&#039;s haben vorprogrammierten USB Device Firmware Upgrade (DFU) bootloader.&amp;lt;ref&amp;gt;http://www.atmel.com/dyn/resources/prod_documents/doc7818.pdf&amp;lt;/ref&amp;gt; &lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607#1761 AT90USB Familie] von Atmel. &lt;br /&gt;
** Eine Experimentierplatine und eine [http://www.ssalewski.de/Misc.html.de GPL Library für den AT90USB1287] gibt es von Dr. Stefan Salewski. Siehe auch Forenbeitrag [http://www.mikrocontroller.net/topic/61499#483966 Anwendersoftware (Generic HID Demo) für den AT90USBKEY].&lt;br /&gt;
** [http://www.fourwalledcubicle.com/LUFA.php LUFA] (Lightweight USB Framework for AVRs) is an open source USB library for the USB-enabled AVR microcontrollers. It is written from scratch and provides an easy to use, clean interface for rapid firmware development (MIT). Alter Name: MyUSB&lt;br /&gt;
** [http://freaklabs.org/index.php/FreakUSB-Open-Source-USB-Device-Stack.html FreakUSB Open Source USB Device Stack] (mod. BSD Lizenz)&lt;br /&gt;
* Atmel&lt;br /&gt;
** ATmega(8|16|32)U2 - &lt;br /&gt;
** ATmega(16|32)U4 - 1x USB 2.0 full-speed/low speed device&lt;br /&gt;
** (USB Appnotes AVR270..273, 282, 287, 293)&lt;br /&gt;
&lt;br /&gt;
Alle hier genannten Mikrocontroller haben keinen USB-Host (nur Client)!&lt;br /&gt;
&lt;br /&gt;
Eine Auswahl:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! Hersteller&lt;br /&gt;
! IC&lt;br /&gt;
! Speed&lt;br /&gt;
! Pins&lt;br /&gt;
! Ucc/Uio&lt;br /&gt;
| CPU Takt&lt;br /&gt;
! Quarz&lt;br /&gt;
! Flash&lt;br /&gt;
! RAM&lt;br /&gt;
! ADU&lt;br /&gt;
! DAU/PWM&lt;br /&gt;
! Async&lt;br /&gt;
! Sync&lt;br /&gt;
! Extras&lt;br /&gt;
! Bezug&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| AN2131&amp;lt;br&amp;gt;AN2135&lt;br /&gt;
| Full&lt;br /&gt;
| 44&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| 8051 24MHz&lt;br /&gt;
| 12MHz&lt;br /&gt;
| 0&lt;br /&gt;
| 4KB&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| UART&lt;br /&gt;
| I²C&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;&#039;veraltet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CY7C68013A&lt;br /&gt;
| High&lt;br /&gt;
| 56,100,128&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| 8051 48MHz&lt;br /&gt;
| 24MHz Grundton&lt;br /&gt;
| 0&lt;br /&gt;
| 16KB&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 2 UART&amp;lt;br&amp;gt;(ab 100 Pin)&lt;br /&gt;
| I²C&lt;br /&gt;
| GPIF (State Machine)&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 11,28 €, [http://www.trade-shop.de/catalog/index.php?cPath=72_173 Air Electronics] ca. 9 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CYUSB3014&lt;br /&gt;
| Super&lt;br /&gt;
| 121 (BGA)&lt;br /&gt;
| 1,8V&lt;br /&gt;
| ARM9&lt;br /&gt;
| ?&lt;br /&gt;
| 0&lt;br /&gt;
| 256KB?&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 2 UART&lt;br /&gt;
| I²C&lt;br /&gt;
| GPIF II (State Machine)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| Microchip&lt;br /&gt;
| PIC18F2550&lt;br /&gt;
| Full&lt;br /&gt;
| 28&lt;br /&gt;
|&lt;br /&gt;
| PIC&lt;br /&gt;
| 12MHz&lt;br /&gt;
| 16K x 16bit&lt;br /&gt;
| 2KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [http://www.reichelt.de/ Reichelt] ca. 7,95 €&lt;br /&gt;
|-&lt;br /&gt;
| Atmel&lt;br /&gt;
| AT91SAM7S64&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7 55MHz&lt;br /&gt;
| für Bootloader: 18,432MHz&lt;br /&gt;
| 64KB&lt;br /&gt;
| 16KB&lt;br /&gt;
| -&lt;br /&gt;
| 4 PWM&lt;br /&gt;
| 2 USART&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| größere Chips auch mit Ethernet&lt;br /&gt;
| [http://www.reichelt.de/ Reichelt] ca. 6,25 €&lt;br /&gt;
|-&lt;br /&gt;
| Philips/NXP&lt;br /&gt;
| LPC2378&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7 72MHz&lt;br /&gt;
| bspw. 12MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 32KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
| 1 x 10bit, 6 PWM&lt;br /&gt;
| 2 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| SD/MMC, Ethernet 10 Mbit, Businterface&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 7,85 €&lt;br /&gt;
|-&lt;br /&gt;
| Texas Instruments&lt;br /&gt;
| MSP430F55xx&lt;br /&gt;
| Full&lt;br /&gt;
| bis 80&lt;br /&gt;
| 3,3V&lt;br /&gt;
| MSP430 25MHz&lt;br /&gt;
| bspw. 24MHz&lt;br /&gt;
| bis 128KB&lt;br /&gt;
| bis 8+2KB&lt;br /&gt;
| 8 x 12bit&lt;br /&gt;
| PWM&lt;br /&gt;
| 2 USART&lt;br /&gt;
| SPI, I²C&lt;br /&gt;
| verschiedene Ausbaustufen&lt;br /&gt;
| [http://www.ti.com/ TI] zurzeit als Muster&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F10x&lt;br /&gt;
| Full&lt;br /&gt;
| 36..144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M3&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 64KB&lt;br /&gt;
| 21 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 5 USART, 1 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.farnell.com/ Farnell] ab ca. 5 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.silabs.com/ Silicon Laboratories]&lt;br /&gt;
| C8051T3xx, -T6xx, -F3xx, -F6xx&lt;br /&gt;
| Full&lt;br /&gt;
| 24 28 32 48&lt;br /&gt;
| 1,8..5,25V&lt;br /&gt;
| 8051&lt;br /&gt;
| 25/48MHz&lt;br /&gt;
| 8KB..64KB&lt;br /&gt;
| 1,25..256KB&lt;br /&gt;
| 1 x 10bit, 500 ksps, 23 ins&lt;br /&gt;
| 5 x PWM&lt;br /&gt;
| 2 x UART&lt;br /&gt;
| SPI, I²C&lt;br /&gt;
| Temperatursensor, Komparator, 4 x 16bit timer&lt;br /&gt;
| [http://de.mouser.com/Search/Refine.aspx?Keyword=C8051+usb&amp;amp;FS=True&amp;amp;Ns=Pricing Mouser] OTP ab 0,81 €, Flash ab 1,11 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/products/microcontrollers/arm/sam3u.aspx Atmel]&lt;br /&gt;
| SAM3U&lt;br /&gt;
| High&lt;br /&gt;
| 100 144&lt;br /&gt;
| 1,62..3,6V&lt;br /&gt;
| Cortex M3&lt;br /&gt;
| 96MHz&lt;br /&gt;
| 64..256KB&lt;br /&gt;
| 20..52KB&lt;br /&gt;
| 8-channel 12-bit 1MSPS, 8-channel 10-bit &lt;br /&gt;
| bis zu 7 x PWM&lt;br /&gt;
| bis zu 4 x UART&lt;br /&gt;
| SPI, I²C, I2S, 1 HSMCI (SDIO/SD/MMC)&lt;br /&gt;
| 3 x 16bit timer, 32-bit Real Time Timer, bis zu 96 IO-Pins&lt;br /&gt;
| [http://de.mouser.com/Semiconductors/Embedded-Processors-Controllers/_/N-6hpef?Keyword=sam3u&amp;amp;Ns=Pricing Mouser] ab 4,09 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ucc/Uio&#039;&#039;&#039; gibt die maximale Betriebsspannung und die maximale Eingangsspannung an Eingabeports an. 3,3V/3,3V heißt: nicht 5V-verträglich!&lt;br /&gt;
* &#039;&#039;&#039;Takt:&#039;&#039;&#039; CPU-Taktfrequenz, bei Microchip ehrlicherweise durch 4 geteilt&lt;br /&gt;
* &#039;&#039;&#039;Async:&#039;&#039;&#039; Anzahl und Art der asynchron-seriellen Schnittstellen (also mit Startbit operierend)&lt;br /&gt;
* &#039;&#039;&#039;Sync:&#039;&#039;&#039; Anzahl und Art der synchron-seriellen Schnittstellen (also mit einer Taktleitung, also auch I²C)&lt;br /&gt;
* &#039;&#039;&#039;SSC:&#039;&#039;&#039; Serielles Interface besonders für Audiochips, verschiedene Namen bei den Mikrocontroller-Herstellern&lt;br /&gt;
&lt;br /&gt;
===Via µC ansteuerbare USB-Controller===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! IC&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Host oder Device&lt;br /&gt;
! IC-Pins&lt;br /&gt;
! Interface&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Bezugs-Quelle(n)&lt;br /&gt;
! Sonstiges&lt;br /&gt;
|-&lt;br /&gt;
| FT232&amp;lt;br&amp;gt;FT245&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 28-32&lt;br /&gt;
| RS232&amp;lt;br&amp;gt;parallel 8 bit &lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 1,95 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| FT232R&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 28-32&lt;br /&gt;
| RS232/Bitbang/CBUS&lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 3,15 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT2232D&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 48&lt;br /&gt;
| RS232 / parallel 8 bit / I2C, SPI, JTAG&lt;br /&gt;
| 2 bidirektionale FIFOs **&lt;br /&gt;
| [[Elektronikversender#csd-electronics|csd-electronics]] [[Elektronikversender#Watterott electronic|Watterott electronic]]&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT2232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 64&lt;br /&gt;
| RS232 / (synchron/asynchron) parallel 8 bit / I2C, SPI, JTAG&lt;br /&gt;
| 2 bidirektionale FIFOs, HS **&lt;br /&gt;
| &lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT4232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 64&lt;br /&gt;
| RS232 / I2C, SPI, JTAG (2 Kanäle)&lt;br /&gt;
| 4 bidirektionale FIFOs, HS **&lt;br /&gt;
| &lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 48&lt;br /&gt;
| RS232 / (synchron/asynchron) parallel 8 bit /I2C, SPI, JTAG/CBUS&lt;br /&gt;
| 1 bidirektionale FIFOs, HS **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 3,20 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| PDIUSBD11&lt;br /&gt;
| [http://www.semiconductors.philips.com Philips]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| I²C&lt;br /&gt;
| USB-Device Controller&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;b&amp;gt;abgekündigt&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDIUSBD12&lt;br /&gt;
| [http://www.semiconductors.philips.com Philips]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| parallel 8 bit&lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 2,65 €&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| MAX3420E&lt;br /&gt;
| [http://www.maxim-ic.com Maxim]&lt;br /&gt;
| Device&lt;br /&gt;
| 24-32&lt;br /&gt;
| SPI&lt;br /&gt;
| Fullspeed-Controller, 4 Endpoints&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[USBN960x]]&lt;br /&gt;
| National&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| Datenbus 8 bit, SPI&lt;br /&gt;
| Fullspeed-Controller, 7 Endpoints, 3,3-V-Längsregler enthalten&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 4,65 €&lt;br /&gt;
| Siehe [[USBN960x]], &amp;lt;b&amp;gt;NRND&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.silabs.com/tgwWebApp/public/web_content/products/Microcontrollers/Interface/en/interface_documentation.htm CP210x]&lt;br /&gt;
| [http://www.silabs.com Silabs]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| UART&lt;br /&gt;
| USB2.0 kompatibler (arbeitet Fullspeed) UART-USB Umsetzer.&lt;br /&gt;
| &lt;br /&gt;
| Sehr kompakt, Intel MAC OSX: [http://www.mikrocontroller.net/topic/67398#542129 Forenbeitrag] beachten&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.silabs.com/products/interface/usbtouart/Pages/usb-to-uart-bridge.aspx CP2110]&lt;br /&gt;
| [http://www.silabs.com Silabs]&lt;br /&gt;
| Device&lt;br /&gt;
| 24-28&lt;br /&gt;
| UART&lt;br /&gt;
| UART-USB ohne Treiber (HID-Klasse)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.silabs.com/products/interface/usbtouart/Pages/HID-USB-to-SMBus-Bridge.aspx CP2112]&lt;br /&gt;
|[http://www.silabs.com Silabs]&lt;br /&gt;
|Device&lt;br /&gt;
|24&lt;br /&gt;
|SMBUS&lt;br /&gt;
|SMBUS-USB HID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prolific.com.tw/eng/Products.asp?ID=59 PL2303]&lt;br /&gt;
| [http://www.prolific.com.tw/ Prolific]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| RS232&lt;br /&gt;
| „USB CDC 1.1“-konform&lt;br /&gt;
| &lt;br /&gt;
| Im Gegensatz zum FT232 sollte kein Treiber erforderlich sein: Von wegen!&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.oti.com.tw/oti-6858.html OTI-6858]&lt;br /&gt;
| [http://www.oti.com.tw/ Ours Technology Inc.]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| UART&lt;br /&gt;
| USB to RS232 Bridge Controller - USB2.0 bis 12MB&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.arkmicro.com/en/products/view.php?id=10 ARK3116T]&lt;br /&gt;
| [http://www.arkmicro.com/ Arkmicro]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| UART&lt;br /&gt;
| USB-to-UART Controller - USB2 bis 3MB)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| TUSB3410&lt;br /&gt;
| [http://focus.ti.com/ Texas Instruments]&lt;br /&gt;
| Device&lt;br /&gt;
| &lt;br /&gt;
| UART&lt;br /&gt;
| USB to Serial Port Controller &lt;br /&gt;
| [[Elektronikversender#Digi-Key|Digi-Key]], ca. 5,60 €&lt;br /&gt;
| USB 2.0 full Speed, Basis 8052 µC&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ftdichip.com/Products/ICs/VNC1L.htm VNC1L]&lt;br /&gt;
| [http://www.vinculum.com/ Vinculum]&lt;br /&gt;
| 2x Host&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Dual USB Host-Controller&lt;br /&gt;
| [[Elektronikversender#Watterott electronic|Watterott electronic]]&lt;br /&gt;
| [http://freshmeat.net/projects/lvprog/?branch_id=71957&amp;amp;release_id=265079 LVProg] is an (X11/Qt)application for programming a ROM file into a Vinculum USB host controller from FTDI. (GPL v2)&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
[[USB-Stick am Mikrocontroller]]&lt;br /&gt;
|-&lt;br /&gt;
| SL811HST&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| 1x beides&lt;br /&gt;
| 48&lt;br /&gt;
| Datenbus 8 bit&lt;br /&gt;
| Controller 1 Port&lt;br /&gt;
| [[Elektronikversender#Digikey|Digikey]], [http://www.trade-shop.de/catalog/index.php?cPath=72_173 Air Electronics] ca. 8 €&lt;br /&gt;
| für OTG viel Außenbeschaltung erforderlich&lt;br /&gt;
|-&lt;br /&gt;
| ISP1160&lt;br /&gt;
| [http://www.nxp.com/ Philips/NXP]&lt;br /&gt;
| 2x Host&lt;br /&gt;
| 64&lt;br /&gt;
| Datenbus 16 bit&lt;br /&gt;
| Host-Controller 2 Ports&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ca. 6,85 €&lt;br /&gt;
| für ATmega unzweckmäßig, eher für ARM-Prozessoren&lt;br /&gt;
|-&lt;br /&gt;
| MCP2210&lt;br /&gt;
| [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556614 Microchip]&lt;br /&gt;
| Device&lt;br /&gt;
| 20 SOIC, SSOP&lt;br /&gt;
| USB nach SPI (Master) Bridge, GPIO&lt;br /&gt;
| USB SPI Bridge (HID-Klasse) + 9 GPIO / SPI CS &lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ca. 1,75 €&lt;br /&gt;
| Durch HID simpel anzusteuern, aber in der Praxis nur (sehr) langsame SPI (ca. 80 kbit/s @ 12Mbit/s SPI). HW Ansteuerung sehr simpel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Reine FIFO-Schaltkreise sind nicht für benutzerspezifische&lt;br /&gt;
Deskriptoren geeignet.&lt;br /&gt;
Damit lassen sich nahezu keine klassenspezifische Geräte-Interfaces&lt;br /&gt;
realisieren.&lt;br /&gt;
Folglich kann man damit bspw. kein HID-Gerät bauen.&lt;br /&gt;
&lt;br /&gt;
NRND = Not recommended for new designs = wird alsbald abgekündigt&lt;br /&gt;
&lt;br /&gt;
UART: Gemeint sind die Signale RxD und TxD sowie Flusskontrolle /RTS und /CTS&lt;br /&gt;
&lt;br /&gt;
RS232: Gemeint ist eine UART mit den 4 Modemsteuersignalen /DTR, /DSR, /DCD und /RI&lt;br /&gt;
&lt;br /&gt;
Tipp: USB-Handy-Datenkabel arbeiten oft mit FT232-ähnlichen Chips!&lt;br /&gt;
&lt;br /&gt;
===USB-Transceiver===&lt;br /&gt;
USB-Transceiver können nur verwendet werden für:&lt;br /&gt;
* speziell dafür ausgelegte Mikrocontroller (PIC 18F2455/2550/4455/4550 u.ä.)&lt;br /&gt;
* FPGAs (wenn diese nicht selbst über geeignete Portpins verfügen)&lt;br /&gt;
* [http://www.obdev.at/vusb/ V-USB] (Software-Anpassungen erforderlich)&lt;br /&gt;
Vorteil: Zwischen Transceiver und Mikrocontroller kann eine galvanische Trennstufe angeordnet werden.&lt;br /&gt;
&lt;br /&gt;
Heutzutage ist es besser, einen seriell ansteuerbaren USB-Controller (siehe oben) zu verwenden und dazwischen eine maßgeschneiderte galvanische Trennung.&lt;br /&gt;
Daher sind Transceiver heutzutage eher obsolet.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! IC&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Speed&lt;br /&gt;
! IC-Pins&lt;br /&gt;
! Interface&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Bezugs-Quelle(n)&lt;br /&gt;
|-&lt;br /&gt;
| MAX345xE&lt;br /&gt;
| [http://www.maxim-ic.com Maxim]&lt;br /&gt;
| ?&lt;br /&gt;
| 14-16&lt;br /&gt;
| -&lt;br /&gt;
| Transceiver&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ISP1106&lt;br /&gt;
| [http://www.nxp.com Philips/NXP]&lt;br /&gt;
| Low, Full&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Transceiver&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ca. 1,15 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===USB-Converter===&lt;br /&gt;
Es exisitieren eine Reihe von Adaptern, mit denen man ausgehend vom USB-Bus viele Standards und Protokolle emulieren und treiben kann, darunter RS-232, RS-422, RS-485, [[MODBUS]] und [[I2C]].&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
* Selbstgebastelte USB-Hardware an den PC nur über einen anständig konstruierten self-powered Hub anschließen - [http://www.mikrocontroller.net/topic/97331#841881 Forumbeitrag von Rufus t. Firefly]&lt;br /&gt;
* Es ist sinnvoll eigene Entwicklungen mit den Tools von usb.org zu testen, usbcv kann z.B. Fehler in USB-Deskriptoren oder bei der Enumeration aufdecken: [http://www.usb.org/developers/tools/usb20_tools/ usb20cv] [http://www.usb.org/developers/tools/ usb30cv]&lt;br /&gt;
* Eine [[Galvanische Trennung | galvanische Trennung]] von USB selbstzubauen ist sehr aufwändig [http://www.electronics-shop.dk/usb_isolation.htm?currency=EUR aber hier für 31,76€ zu haben].&lt;br /&gt;
Herausforderung bei USB ist&lt;br /&gt;
** das USB-Signal bidirektional ist&lt;br /&gt;
** USB keine Steuerleitungen hat, man kann nur aus der vollständigen Dekodierung der Daten erfahren, in welche Richtung die Daten jetzt gehen müssen. Dieses Problem betrifft V-USB-basierte Projekte nicht, eine solche Leitung lässt sich leicht nachrüsten.&lt;br /&gt;
** es sehr kurze Antwortzeiten von den USB-ICs verlangt (im Bereich von ~10 Bitzeiten!)&lt;br /&gt;
*Es gibt auf dem Markt einige wenige, aufwändige und damit teure Lösungen. Wer also ein galvanisch getrennte Schnittstelle braucht, sollte &#039;&#039;&#039;nicht&#039;&#039;&#039; USB nehmen. Allerdings ist es leicht möglich, einen USB-RS232/RS485 Wandler galvanisch auf der RS232/RS485 Seite zu trennen. &lt;br /&gt;
*Eine einfache Lösung wäre einen FT232 zu verwenden und diesen auf der TTL-Seite mit Optokopplern zu trennen.&lt;br /&gt;
*Die zur Zeit einfachste und kostengünstigste Möglichkeit zur galvanischen Trennung ist der ADUM3160BRWZ oder der ADuM4160 von Analog Devices.&lt;br /&gt;
**Einschränkungen: nur Full- und Low-Speed, keine automatische Erkennung der Übertragungsrate.&lt;br /&gt;
** ADuM3160 im AD Newsletter: [http://www.analog.com/en/interface/digital-isolators/adum3160/products/product.html]&lt;br /&gt;
** [https://www.it-wns.de/themes/kategorie/detail.php?artikelid=979&amp;amp;kategorieid=53&amp;amp;source=1 Leerplatine] für ADuM4160 im IT-WNS Webshop&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/114555?goto=2065917#2065236 Forumsbeitrag] mit Eagle 3D Bild und Schaltplan&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=%2BUSB+%2Bgalvanisch&amp;amp;forums%5B%5D=1&amp;amp;forums%5B%5D=19&amp;amp;forums%5B%5D=9&amp;amp;forums%5B%5D=10&amp;amp;forums%5B%5D=2&amp;amp;forums%5B%5D=4&amp;amp;forums%5B%5D=3&amp;amp;forums%5B%5D=6&amp;amp;forums%5B%5D=17&amp;amp;forums%5B%5D=11&amp;amp;forums%5B%5D=8&amp;amp;forums%5B%5D=14&amp;amp;forums%5B%5D=12&amp;amp;forums%5B%5D=7&amp;amp;forums%5B%5D=5&amp;amp;forums%5B%5D=18&amp;amp;forums%5B%5D=15&amp;amp;forums%5B%5D=13&amp;amp;forums%5B%5D=16&amp;amp;max_age=-&amp;amp;sort_by_date=0 Suche nach USB und galvanischer Trennung im Forum]&lt;br /&gt;
&lt;br /&gt;
== Analysetools ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcausa.com/Utilities/UsbSnoop/default.htm Sniff USB] - USB Sniffer - freeware - Windows&lt;br /&gt;
* [http://www.openvizsla.org/ OpenVizsla] ([http://www.kickstarter.com/projects/bushing/openvizsla-open-source-usb-protocol-analyzer/posts/62083 OpenVizsla auf kickstarter.com]) - OpenSource USB sniffer, basierend auf XMOS und FPGA (under dev. right now)&lt;br /&gt;
* [http://www.wireshark.org/ Wireshark] - Eigentlich Netzwerk Sniffer, kann aber in neueren Versionen auch USB (insbesondere unter Linux)  [http://wiki.wireshark.org/CaptureSetup/USB Wireshark Wiki, USB]&lt;br /&gt;
* [http://www.basic.io/ ALogic Analyzer] - Protokoll-Dekoder für USB, UART, I2C und SPI. Software mit Demos zum Download.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://janaxelson.com/usbchips.htm Links to USB Host and Device Controller Chips] by Jan Axelson.&lt;br /&gt;
* [http://www.eltima.com/products/usb-over-ethernet/ USB over Network]&lt;br /&gt;
* [http://replay.waybackmachine.org/20090210000605/http://g.fondeville.free.fr/usb_host_en.html Mass storage host USB example] - The purpose of this article is to introduce a host USB Full Speed implementation. This host is designed to control MASS storage peripherals like USB key, cameras, hard drive... ([[PIC]]18F452, Cypress SL811HS)&lt;br /&gt;
* [http://chaosradio.ccc.de/cre086.html ChaosradioExpress #86 USB] - Der Universal Serial Bus im Detail. Podcast mit Tim Pritlove (Moderation) und Daniel Mack &lt;br /&gt;
* [http://hackaday.com/2008/11/19/how-to-the-bus-pirate-universal-serial-interface/ Bus Pirate (hackaday.com)] - How-to: The Bus Pirate, universal serial interface USB &amp;lt;-&amp;gt; [[I2C]], [[SPI]], Async. Seriell [[UART]]. Firmware-Update für die [http://hackaday.com/2008/12/01/bus-pirate-firmware-update-v0c-jtag-and-more/ Ergänzung] u.a. für [[JTAG]]. Das Herzstück ist ein PIC24FJ64GA002.&lt;br /&gt;
* [http://www.sourceforge.net/projects/easyusb EasyUSB] - Generischer USB Treiber für Windows&lt;br /&gt;
* [http://www.eltima.com/products/usb-port-monitor/ USB Port Monitor]&lt;br /&gt;
* [http://www.embedded24.net AHID.DLL] - Noch ein generischer USB Treiber für Windows (C++/C#/VB/MinGW/wxWidgets)&lt;br /&gt;
* [http://www.embedded.com/design/219400265 Simple circuit prevents USB current overshoot during insertion] von Luciano Bordogna (MAXIM) auf www.embedded.com&lt;br /&gt;
* [http://www.circuitsathome.com/mcu/usb/usb-isolator USB-Isolator]&lt;br /&gt;
* [http://events.linuxfoundation.org/sites/events/files/slides/understand_usb_in_linux_krzysztof_opasiak.pdf Vortragsfolien von Krzysztof Opasiak (auf Seite 16 gibt es eine Übersicht der USB-Descriptor-Hierarchie) ]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:USB| ]]&lt;/div&gt;</summary>
		<author><name>84.191.221.238</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Schrittmotoren&amp;diff=95942</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Schrittmotoren&amp;diff=95942"/>
		<updated>2017-04-18T12:25:32Z</updated>

		<summary type="html">&lt;p&gt;84.191.221.238: /* Beschleunigungsrampen richtig wählen und berechnen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schrittmotoren eignen sich als Stellmotoren. Sie können eine vorherbestimmte Anzahl von Schritten drehen und dann stehen bleiben. Ein Positionsgeber für die Rückmeldung, ob die gewünschte Position erreicht ist wird nicht zwingend benötigt. Einsatzgebiete sind Robotik und Stellantriebe. Man findet sie auch in alten 5,25 Zöllern (Floppy-Laufwerken), in sehr alten Festplatten, in Faxgeräten, Druckern und Plottern. Die größeren Motoren erreichen teils sehr hohe Drehmomente, die ein Untersetzungsgetriebe unnötig machen.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
===Mechanischer Aufbau===&lt;br /&gt;
Schrittmotoren bestehen aus einem (magnetisierten) Ankerkonstrukt und einem Spulensystem, wodurch bei Stromfluss eine Bewegung generiert werden kann. Kohlebürsten oder Schleifringe braucht der Motor nicht. Der Anker (Innenläufer) kann z. B. aus einem gezahnten Permanentmagneten bestehen. Durch diesen geschickten Aufbau wird erreicht, dass je Motorumdrehung mehrere Schrittpositionen geschaffen werden, in die der Motor einrasten kann. So gibt es Motoren mit 200 Vollschritten je Umdrehung. Aufgrund der Magnetisierung besitzt der Motor Ruhepunkte, in denen ein Haltemoment vorliegt.&lt;br /&gt;
&lt;br /&gt;
===Elektrischer Aufbau===&lt;br /&gt;
Es gibt aus elektrischer Sicht zwei grundlegende Typen von Schrittmotoren. Unipolare und bipolare Schrittmotoren. Die einfachsten Typen haben zwei getrennte Wicklungen, auch Phasen genannt. Der Unterschied besteht in der Ansteuerung der Wicklungen:&lt;br /&gt;
&lt;br /&gt;
==== Unipolare Schrittmotoren ====&lt;br /&gt;
Unipolare Schrittmotoren haben Wicklungen mit Mittelanzapfungen. Die Mittelanzapfungen sind mit der Versorgungsspannung verbunden, die Spulenendanschlüsse über Leistungstransistoren auf Masse. Durch das Einschalten der Transistoren kann man die Spulen jeweils zur Hälfte mit Strom durchfluten.&lt;br /&gt;
&lt;br /&gt;
Vorteil&lt;br /&gt;
* einfache Ansteuerung durch Transistoren (Low Side Driver)&lt;br /&gt;
* kann auch wie ein bipolarer Schrittmotor angesteuert werden, erreicht dann aber nicht ganz das Drehmoment eines vergleichbaren Bipolartyps&lt;br /&gt;
&lt;br /&gt;
Nachteil&lt;br /&gt;
* verringertes Drehmoment, da immer nur eine halbe Spule vom Strom durchflossen ist&lt;br /&gt;
&lt;br /&gt;
==== Bipolare Schrittmotoren ====&lt;br /&gt;
Bipolare Schrittmotoren haben einfache Wicklungen. Die Spulen werden über H-Brücken angesteuert, um sie umpolen zu können. Dadurch fließt der Strom immer durch die ganzen Spulen. Änderung der Drehrichtung von Linearachsen kann durch vertauschen der Spulenanschlüsse am Motortreiber erreicht werden: A -&amp;gt; B, #A -&amp;gt; #B, B -&amp;gt; A, #B -&amp;gt; A#. &lt;br /&gt;
&lt;br /&gt;
Vorteil&lt;br /&gt;
* hohes Drehmoment&lt;br /&gt;
* hohe Präzision&lt;br /&gt;
&lt;br /&gt;
Nachteil&lt;br /&gt;
* erhöhter Ansteuerungsaufwand durch H-Brücken&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung ==&lt;br /&gt;
Durch passendes Anlegen der Spannungen an die Wicklungen wird ein Drehfeld erzeugt, dem der Motor folgt. Bevor der Motor die durch das Feld vorgegebene Position erreicht, muss es weitergeführt werden, um die Drehung zu erhalten. Der Motor wird dadurch hinter dem Feld her geführt. Die Winkeldifferenz zwischen Feld und Position ist ein Maß für die Belastung des Motors und die Beschleunigung.&lt;br /&gt;
&lt;br /&gt;
Es ist etwas Logik und ein Leistungstreiber nötig, damit sich ein Schrittmotor in Bewegung setzt. Bekannteste Vertreter sind die ICs L297 (Ansteuerlogik) und L293/L298 (2fache H-Brücke). Alternativ zur Kombination aus L297/L298 gibt es auch leistungsfähige DMOS ICs wie z.B. [http://www.allegromicro.com/en/Products/Motor-Driver-And-Interface-ICs/Bipolar-Stepper-Motor-Drivers/A4988.aspx Allegromicro A4988] &lt;br /&gt;
===Betriebsarten===&lt;br /&gt;
====Vollschrittbetrieb====&lt;br /&gt;
Die einfachste Betriebsart ist die des Vollschrittbetriebs, bei der das Drehfeld immer um 90 Grad vorgeschoben werden muss, was durch wechselseitiges Ansteuern der Spulen sowie Negation der Ströme nach dem Muster + + - - sowie  - + + - erfolgt. Es sind dabei immer beide Spulen aktiv.&lt;br /&gt;
&lt;br /&gt;
====Halbschrittbetrieb====&lt;br /&gt;
Zeitweises Abschalten jeweils einer Spule entstehen Zwischenstufen, die gegenüber dem Vollschritt um (elektrisch) 45 Grad gedreht sind, da der Motor z.B. gleichzeit in Nord- als auch in Ostrichtung gezogen wird. Werden beide Betriebsarten gemischt, entsteht das Halbschrittverfahren. Dadurch entstehen 45 Grad-Schritte. Das Bestromungsmuster sieht wie folgt aus: + + 0 - - - 0 +   sowie  0 + + + 0 - - -  für die andere Spule, wobei man wieder eine 90 Grad-Verschiebung der beiden Ströme erkennt.&lt;br /&gt;
&lt;br /&gt;
====Micro-Step-Betrieb====&lt;br /&gt;
Bei weiterer Verfeinerung der Methode entsteht der sogenannte microstep Betrieb, bei dem die beiden Wicklungen mit Sinus/Cosinus-Strömen angesteuert werden. Dennoch bleiben bei Schrittmotoren jeweils die Ruhepunkte pro Vollschritt erhalten, in die sie bei Abschalten des Stromes hineinfallen. In diesen Punkten ist das magnetische Haltemoment vergleichsweise gering (theoretisch null), wächst aber bei infinitisimaler Motordrehung rasch an, um dann wieder abzuflachen, sodass es bei 90 Grad, wenn der Anker gerade zwischen zwei magentischen Positionen steht, wieder Null ist. Vereinfacht kann man sich dies durch einen sinusförmigen Kurvenverlauf, wie im Diagramm rot dargestellt, vorstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:schrittmotor-ansteuerung-sin-con-js.gif|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Den beiden ansteuernden Strömen Sinus/Cosinus kann nun ein dem Haltemoment eitgegengesetzter Strom aufaddiert werden, der dem Anker dort, wo er am stärksten Widerstand erfährt, mehr Drehmoment von aussen zuführt. Dazu muss eine Welle mit 4facher Frequenz, die immer exakt 90 Grad Vorlauf zur Ankerstellung hat, hinzuaddiert werden.&lt;br /&gt;
&lt;br /&gt;
In Realität ist das Moment nicht sinusförmig und dessen Maximum leicht nach vorne verschoben. Unter der Annahme, dass der Vorlauf des Drehfeldes für den Motor günstig ist, kann vereinfachend eine leichte Abflachung der Kurven in den Maxima von Sinus und Cosinus vorgenommen werden. Dies ist bei der einfachen Methode [[Digitale_Sinusfunktion#Sinus-Approximation_1]] bereits ansatzweise berücksichtigt, da die Kurve im Bereich 30 und 150 Grad steiler verläuft, als der ideale Sinus.&lt;br /&gt;
&lt;br /&gt;
=== Schrittverlust ===&lt;br /&gt;
Das Hauptziel einer sinnvollen Ansteuerung ist neben dem schnellen Erreichen der Endposition bei möglichst geringem Stromaufwand die Vermeidung des so genannten Schrittverlustes, der auftritt, wenn der Motor dem Drehfeld nicht folgen kann. Der Motor schwingt dann in die Position des letzten Vollschritts zurück, teilweise sogar darüber hinaus, wenn schwere Mechanik über Getriebe angetrieben wird und hohe Torsionsmomente gespeichert waren. Damit wird die Sollvorgabe nicht erreicht.&lt;br /&gt;
&lt;br /&gt;
==== Erkennung ====&lt;br /&gt;
Eine Möglichkeit ist, auf der Achse des Motors einen Winkelsensor (Encoder) zu montieren und die Schritte permanent mitzuzählen und später nachzufahren. Eine echte Erkennung vor Eintreten eines Verlustes mit der Möglichkeit der Vermeidung gibt es hier meist nicht.  Eine weitere Möglichkeit besteht in der Messung des Gegenmagnetmoments des Motors. Bei einem Schrittverlust entstehen bestimmte Oberwellen, insbesondere die dritte Harmonische ist sichtbar. Damit ist es möglich, bereits einen drohenden Verlust im Vorhinein zu erkennen und gegenzusteuern, denn besser, als die Erkennung des erfolgten Verlustes ist dessen Vermeidung.&lt;br /&gt;
&lt;br /&gt;
==== Vermeidung ====&lt;br /&gt;
Entscheidend ist, das Drehfeld des Motors zum richtigen Zeitpunkt und im Idealfall kontinuierlich so weiterzuführen, dass immer ein optimaler Lastwinkel besteht. Bei gepulstem Betrieb darf das Weiterführen nicht zu früh passieren. Der kritischste Fall ist der des Starts. Der Motor sieht noch kein Lastmoment, das Drehfeld beginnt sich aber gfs schon, schnell zu bewegen. Daher kommt der richtigen Wahl der Beschleunigungskurve eine grosse Bedeutung zu.&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsrampen richtig wählen und berechnen===&lt;br /&gt;
Dazu ein kurzer Ausflug zu meinen ersten Schrittmotor-Untersuchungen:&amp;lt;br&amp;gt;&lt;br /&gt;
In einem Matrix-Nadeldrucker der stabilen Bauart (1980: ca. 70 kg) wird der Druckkopf mittels Stepper und Zahnriemen angetrieben. Auf der Welle des Motors sitzt ein Drehgeber (Zahnrad mit Hallsensor). Dieser gibt zum Einen den Takt für die Nadeln, zum Anderen den Zeitpunkt für den nächsten Schritt vor. Das ist ideal, denn der neue Schritt wird im günstigsten Moment ausgeführt und der Motor beschleunigt mit seiner vollen Leistung, auch bei dynamischer Belastung. Der Drehgeber ist natürlich zusätzlicher Aufwand, den man gerne einsparen wollte. Später wurden typische Beschleunigungskurven aufgezeichnet und in SW nachgebildet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Einfache Rampen wie lineares Dekrementieren der Periode von Schritt zu Schritt sind bestenfalls für kleine Beschleunigungen von sagen wir mal 1 bis 2 kHz ausreichend. Will man auf 5 bis 8 kHz drehen, muss vieles bedacht werden:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. Das größte Manko vorneweg: Das sinkende Drehmoment bei hoher Drehzahl bedingt durch den Abfall der Stromanstiegsgeschwindigkeit und durch steigende Verluste in Eisen und Wicklung (Wirbelstrom).&amp;lt;br&amp;gt;&lt;br /&gt;
Daher muss die Kurve oben flacher verlaufen, da weniger Kraft zum Beschleunigen zur Verfügung steht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2. Obwohl im unteren Drehzahlbereich viel Kraft zur Verfügung steht, ist es aus dynamisch-mechanischen Überlegungen manchmal nicht wünschenswert, voll loszubeschleunigen: Eine plötzlich einsetzende oder ausbleibende Kraft (Ruck) kann mechanische Resonanzen in der restlichen Mechanik (Getriebe, Motoraufhängung, Rahmen...) auslösen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wünschenswert ist ein sin(0..2pi)-förmiger Verlauf der Kraft, also der Beschleunigung. Da diese die erste Ableitung der Geschwindigkeit nach der Zeit ist, ist der Verlauf der Geschwindigkeit 1-cos(0..2pi) = 1+cos(pi..3pi)&amp;lt;br&amp;gt;&lt;br /&gt;
Nachteil: Maximale Beschleunigung in der Mitte 55% höher als bei linear.&amp;lt;br&amp;gt;&lt;br /&gt;
Kompromiss: Quadratische Rampe (Beschleunigung steigt linear an): 33% höheres Drehmoment erforderlich.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Atmel bietet für Steppermotoren eine Application Note (AVR446) und ein entsprechendes Demoprogramm für lineare Rampen:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.atmel.com/dyn/resources/prod_documents/doc8017.pdf&amp;lt;br&amp;gt;http://www.atmel.com/images/avr446.zip&amp;lt;br&amp;gt;&lt;br /&gt;
Den fertigen Funktionen kann die Beschleunigung, Verlangsamung, gewünschte Geschwindigkeit und Anzahl der zu fahrenden Schritte übergeben werden. Es werden automatisch die Rampen berechnet und die Timersteuerung für 16-bit Timer berechnet.&lt;br /&gt;
Das Programm ist sehr ausführlich dokumentiert (u.a. mit Doxygen) und kann fast komplett in eigene Applikationen übernommen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Achtung:&amp;lt;/b&amp;gt; Das Programm ist für den IAR-Compiler und muss ggf. leicht abgeändert werden.&lt;br /&gt;
&lt;br /&gt;
====Häufigster Fehler====&lt;br /&gt;
&lt;br /&gt;
Die Rampe wird unter der Prämisse erstellt, die Zeit zwischen den Einträgen sei konstant, man könne also die linear berechneten Frequenz- oder Timerwerte einfach so eintragen. DEM IST NICHT SO. Die Mitte der Liste ist bei Weitem nicht nach der halben Rampenzeit erreicht, da Schritte am Anfang wesentlich langsamer ausgeführt werden. Die Liste muss bei niedrigen Geschwindigkeiten grobe, bei hohen Geschwindigkeiten feine Abstufungen haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Richtig&amp;lt;/b&amp;gt; ist: Nach jedem Step die &amp;lt;b&amp;gt;Zeit seit Beschleunigungsbeginn&amp;lt;/b&amp;gt; (einfach die Timer-Werte aufaddieren), daraus die &amp;lt;b&amp;gt;gewünschte Frequenz&amp;lt;/b&amp;gt; und daraus den benötigten &amp;lt;b&amp;gt;Timer-Wert&amp;lt;/b&amp;gt; berechnen.&lt;br /&gt;
&lt;br /&gt;
====Tipps zur Rampe====&lt;br /&gt;
&lt;br /&gt;
Eine einfache Methode ist es, kontinuierlich steigende Werte auf die Sollfrequenz zu geben. Damit ergibt sich ein beschleunigter Zeitverlauf.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;Veraltet&#039;&#039;! Treibermodule==&lt;br /&gt;
&lt;br /&gt;
===Oriental Motor: Vexta AlphaStep ASD16AC und ASD20AC (230 VAC -&amp;gt; 324 VDC, Preisklasse 220-700 Euro)===&lt;br /&gt;
&lt;br /&gt;
* Vorteile&lt;br /&gt;
**verhält sich wie ein Servo, regelt Schlupf und auch statische Laständerungen aus&lt;br /&gt;
** neue AlphaStepPlus sind frei programmierbar; ist extrem gutmütig, läuft ohne mechanische Last auch mal mit 50 kHz (!) Schrittfrequenz = 6000 1/min&lt;br /&gt;
** Drehmomentverlauf über Drehzahl sehr gut wegen hoher Spannung&lt;br /&gt;
** Opto-Trennung&lt;br /&gt;
** Error-Ausgang&lt;br /&gt;
** Enable-Eingang&lt;br /&gt;
** 500, 1000, 5000 oder 10000 Schritte pro Umdrehung einstellbar&lt;br /&gt;
** hoher Wirkungsgrad&lt;br /&gt;
** Strom in 16 Stufen einstellbar&lt;br /&gt;
&lt;br /&gt;
*Nachteile&lt;br /&gt;
**passender Motor (Preis~100-200 Euro) mit Resolver nötig&lt;br /&gt;
**eingebauter v-Filter kann zwar beschleunigen, aber nicht abbremsen, das müßte er ja vorher wissen, leider macht er deshalb zu viel gemachte Schritte nicht zurück -&amp;gt; Rampen müssen doch selbst programmiert werden&lt;br /&gt;
**teuer&lt;br /&gt;
**Motorspannung netzgekoppelt -&amp;gt; VDE&lt;br /&gt;
&lt;br /&gt;
===3 und 4 Achsen blaue TB6560 Schrittmotorplatinen von hyu68.com, wie sie auf eBay angeboten werden (Preisklasse 50 Euro)===&lt;br /&gt;
&lt;br /&gt;
*Vorteile&lt;br /&gt;
**sehr günstig&lt;br /&gt;
**state of the art Schrittmotor-IC (TB6564AHQ ist jedoch der bessere Nachfolger)&lt;br /&gt;
**Mikroschritt bis 16&lt;br /&gt;
**eigener Spannungsregler, benötigt nur die Motorspannung&lt;br /&gt;
**Optokoppler&lt;br /&gt;
**Enable-Eingang&lt;br /&gt;
**Strom in 3 Stufen, 100%, 75%, 50% vom Nennstrom, einstellbar&lt;br /&gt;
**Bedienteil ansteckbar&lt;br /&gt;
&lt;br /&gt;
*Nachteile&lt;br /&gt;
**nur die blanke Platine mit Kühlkörper, ohne Gehäuse&lt;br /&gt;
**trotz Optokoppler nicht galvanisch getrennt&lt;br /&gt;
**wegen der Optokoppler nur langsame Pulse, langsamer als Mach3 überhaupt einstellbar ist. Entfernt man die Optokoppler (überbrücken mit jeweils 1 Draht, unterschiedlich bei DIR/STEP und ENABLE), geht das Handbedienteil nicht mehr.&lt;br /&gt;
**Chopperfrequenz und Nennstrom nur durch Austausch von Bauelementen veränderbar&lt;br /&gt;
**Freilaufdiode am Relais fehlt&lt;br /&gt;
**offiziell darf die Spannung der ICs nicht aus der Motorspannung abgeleitet werden, weil damit die Einschaltsequenz des TB6560 nicht eingehalten wird. Dennoch ist bisher keiner kaputt gegangen.&lt;br /&gt;
**obwohl viele Dioden auf dem Board verbaut sind, haben die Ausgänge nur nach Masse Freilaufdioden (der TB6560A benötigt laut Hersteller keine Freilaufdioden) die anderen entkoppeln die Versorgungsspannung der 3 oder 4 Kanäle und dienen als Verpolschutz. &lt;br /&gt;
**wenn die Schrittmotoren gedreht werden, ohne dass das Board an Versorgungsspannung liegt, können die ICs gehimmelt werden.&lt;br /&gt;
**die Fähigkeiten des TB6560, wie Bremstempo, Umschalten der Mikroschritte während der Fahrt, Fehlermeldungen wie Übertemp, können nicht genutzt werden, werden aber von Mach3 sowieso nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
===3 und 4 Achsen rote TB6560 Schrittmotorplatinen, wie sie auf eBay angeboten werden (Preisklasse 50 Euro)===&lt;br /&gt;
&lt;br /&gt;
Wesentlich besser als die blauen aber etwas grösser. Tatsächlich galvanisch per (ausreichend schnellem) Optokoppler getrennt dank DC/DC Wandler. Aber auch diese Karten erfordern in MACH3 den Sherline Mode damit die vom TB6560 benötigte Impulslänge eingehalten wird.&lt;br /&gt;
&lt;br /&gt;
===RTA Deutschland / Italy: GMD03, HGD06 (32-85 V, Preisklasse 140-180 Euro)===&lt;br /&gt;
&lt;br /&gt;
*Vorteile&lt;br /&gt;
**sehr günstig&lt;br /&gt;
**wenig EMV-Probleme&lt;br /&gt;
** kann auch 8tel-Schritt&lt;br /&gt;
** HGD-Ein-und Ausgänge über Optokoppler&lt;br /&gt;
** automatische Ruhestromabsenkung&lt;br /&gt;
** Enable-Eingang&lt;br /&gt;
** Error-Ausgang&lt;br /&gt;
** Strom in 8 Stufen einstellbar&lt;br /&gt;
&lt;br /&gt;
*Nachteile&lt;br /&gt;
**nur die blanke Platine mit Kühlkörper, ohne Gehäuse (gibt es vermutlich als Zubehör)&lt;br /&gt;
&lt;br /&gt;
===IMS IB104, IB106, IB110 (Preisklasse 160-300 Euro)===&lt;br /&gt;
&lt;br /&gt;
*Vorteile&lt;br /&gt;
**mechanisch geschickt gelöst&lt;br /&gt;
**Digitaleingänge opto-isoliert&lt;br /&gt;
&lt;br /&gt;
*Nachteile&lt;br /&gt;
**analoger StromSet nicht galvanisch getrennt&lt;br /&gt;
**schlechte EMV&lt;br /&gt;
**weder home noch reset des eingebauten L297 sind herausgeführt, sodass man z.&amp;amp;nbsp;B. zum Umschalten in den Wave-Mode nicht weiß, ob er in einem geraden oder ungeraden Schritt ist&lt;br /&gt;
**Ruhe-Verlustleistung zu hoch (bei 60 V, 150 mA, 9 W, Linearregler)&lt;br /&gt;
**teurer als RTA&lt;br /&gt;
**IB106 und IB110 wesentlich teurer als IB104, obwohl nur ein paar Bauteile andere Werte haben&lt;br /&gt;
&lt;br /&gt;
=== Anregungen ===&lt;br /&gt;
&lt;br /&gt;
*Hohe Versorgungsspannung erforderlich&lt;br /&gt;
*Abbremsrampe ist schneller möglich wg. mechanischer Verluste (Reibung).&lt;br /&gt;
*Besonderheiten der Last (Drehmomentverlauf über Drehzahl) beachten.&lt;br /&gt;
*Startfrequenz knapp oberhalb der Hauptresonanzfrequenz. Nicht so hoch wie es möglich wäre, wg. Ruck beim Starten / Stoppen.&lt;br /&gt;
*Effekte bei Resonanz: kein Drehmoment, sogar Rückwärtslauf.&lt;br /&gt;
*Leistungsverbrauch sehr wohl lastabhängig.&lt;br /&gt;
&lt;br /&gt;
== Alternative Stellantriebe ==&lt;br /&gt;
&lt;br /&gt;
Eine preiswerte Alternative zu Schrittmotoren sind die [[Servo|Modellbau-Servos]], die es schon ab 5,- &amp;amp;#8364; gibt. Sie sind im Vergleich geradezu spielend einfach auch von µC anzusteuern und ermöglichen das exakte Anfahren bestimmter (speicherbarer) Winkel. Da sie nicht den Schrittmotor-typischen Schlupf haben, der gerne beim Anfahren unter mechanischer Last auftritt, eignen sie sich auch gut für größere Kräfte. Das integrierte Getriebe und die Stellautomatik blockieren die angefahrene Position, was bei kleineren Schrittmotoren mitunter problematischer ist. Für höhere Genauigkeit sollte man sogenannte digitale Servos nehmen. Eine Sonderform sind die Servowinden, mit denen man auch mehrere Umdrehungen erreichen kann. (&amp;quot;Segelwinden&amp;quot; bei Modellsegelbooten).&lt;br /&gt;
&lt;br /&gt;
== Diskussionsthreads ==&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/51534&lt;br /&gt;
* http://www.mikrocontroller.net/topic/232355&lt;br /&gt;
* http://www.mikrocontroller.net/topic/215261&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-113751.html#new Bipolare Schrittmotoren] Forumsbeitrag zum Thema&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/262652#new G-Code-Interpreter und 3-Achs Schrittmotorsteuerung mit ATMega644 und Trinamic TMC260]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Schrittmotoren Ausführlicher Grundlagenartikel auf roboternetz.de]&lt;br /&gt;
* Folgende 2 Beiträge beziehen sich auf http://www.mikrocontroller.net/forum/read-1-309923.html?reload=yes#310455&lt;br /&gt;
* [http://de.nanotec.com/support/tutorials/schrittmotor-und-bldc-motoren-animation Onlinetool zur Darstellung verschiedener Ansteuerungsarten von Nanotec.de] (Flash erforderlich)&lt;br /&gt;
* [http://de.nanotec.com/support/motorauswahl-assistent Motor-Assistent] - Onlinetool zur Berechnung von Motorkennzahlen anhand von Drehzahl und Drehmoment von Nanotec.de .&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/00907a.pdf Microchip AN907: Stepping Motors Fundamentals] - Gute und allgemeine Einführung zum Thema Schrittmotoren.&lt;br /&gt;
* [http://www.schrittmotor-blog.de/ Schrittmotor-blog.de] - Blog mit technischen Hintergrundinformationen und Detailwissen zum Schrittmotor&lt;br /&gt;
* [[Schrittmotor-Controller (Stepper)]] Mikrocontrollerprojekt für die Anwendung von (unipolaren) Schrittmotoren als Strahlschalter&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Motoren]]&lt;/div&gt;</summary>
		<author><name>84.191.221.238</name></author>
	</entry>
</feed>