<?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=Alesi</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=Alesi"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Alesi"/>
	<updated>2026-04-04T06:28:21Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=107882</id>
		<title>Statemachine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Statemachine&amp;diff=107882"/>
		<updated>2026-02-12T16:34:46Z</updated>

		<summary type="html">&lt;p&gt;Alesi: /* 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 ihre Funktion definiert. Diese Maschine arbeitet, indem sie von einem Zustand in einen anderen übergeht und bei den Zustandsübergängen oder dem Verharren in Zuständen bestimmte Aktionen ausführt. Dabei ergibt sich der Folgezustand aus der Kombination des momentanen Zustands und einem externen Ereignis, z. B. einem Tastendruck oder einem Signal aus anderen Bereichen der Software. Dabei wird die Maschine oftmals in verschiedenen Zuständen nur für ganz bestimmte Ereignisse sensibel gemacht.&lt;br /&gt;
&lt;br /&gt;
Die FSM selbst wird immer in irgendeiner Weise über einen Takt angetrieben, kann also nicht in beliebig kurzen Zeitspannen auf Ereignisse reagieren und Zustände wechseln. Der aktive Takt definiert dabei, ob gerade ein Zustandswechsel stattfindet, oder ob in Zuständen verharrt wird. Mit jedem Takt wird anhand des vorliegenden Zustands und dem Status der Eingabekanäle entschieden, welcher Zustand als nächstes vorliegen soll und welche Aktionen dabei 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 sowie autark ablaufende Prozesse geeignet zu beeinflussen. Entsprechend formulierte FSMs können sowohl in Software auf Prozessoren als auch als eletronische 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:15em;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&amp;lt;br&amp;gt;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:50em;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&amp;lt;br&amp;gt;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:35em;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;| Induktions-&amp;lt;br&amp;gt;schleife ||width=&amp;quot;20%&amp;quot;| nächster&amp;lt;br&amp;gt;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|width:40em; 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;17%&amp;quot; | Zustand&lt;br /&gt;
! width=&amp;quot;17%&amp;quot; | Ampel 1&lt;br /&gt;
! width=&amp;quot;17%&amp;quot; | Ampel 2&lt;br /&gt;
! width=&amp;quot;20%&amp;quot; | Induktions-&amp;lt;br&amp;gt;schleife&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Wartezeit&lt;br /&gt;
! nächster&amp;lt;br&amp;gt;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 von programmierter PLD- und [[FPGA]]-Bausteine realisiert ist, gleicht der Entwurfsprozess der FSMs dem in der klassischen Softwareentwicklung. Dabei besteht je nach Vorliegen der funktionellen Beschreibung und anderer Randbedingungen 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, was besonders bei umfangreichen FMSs praktiziert wird.&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++ auf Windows-PCs trotz hoher Prozessorleistung selten niedrigere Reaktionszeiten als im Millisekundenbereich. Die damit in Echtzeit erfassbaren und prozessierbaren externen Ereignisse bewegen sich üblicherweise im Bereich von einigen 100Hz. Ein Extrembeispiel ist der USB-3.0-Bus im Zusammenspiel mit HW-IO-Karten: Die Bandbreite lässt ein Laden von Daten mit über 3Gbit im streaming-Modus zu, während im Regelungsbetrieb in der Schleife typische Latenzen von bis zu 10ms auftreten, bis die Reaktion der PC-Software auf eine äußeree Signaländerung auch ausgegeben wurde&lt;br /&gt;
* Mit einem Echtzeitbetriebssystem auf einem PC, z. B. Linux mit Preempt-RT Patch, werden ungefähr 35 µs Zykluszeit erreicht, also circa 30 kHz. Trotz des stark verbesserten Treiberssystems unter Linux sind auf PCs auch hier mehrere Millisekunden Latenz zu beobachten.&lt;br /&gt;
* Mit Microcontrollern und DSPs erreicht man mit Nicht-Multi-tasking-FSMs Abtastraten bis einige 100kHz. Mit Assembler programmierte Signalprozessoren erreichen Abtastraten bis hin zu 20% ihrer Taktfrequenz, wenn sie direkt auf externe Port-Pins zugreifen.&lt;br /&gt;
* In VHDL realisierte state machines besitzen je nach FPGA-Familie, Art der Codierung typische Taktfrequenzen von bis zu 400MHz. Je nach Zyklustiefe laufen damit realisierte FSMs auf bis zu 100MHz und anders als bei DSPs und PCs senkt die Hinzunahme weiterer FMSs nicht deren Schleifen-Frequenz.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch==&lt;br /&gt;
* [[Multitasking]]&lt;br /&gt;
*[https://www.mikrocontroller.net/topic/583475?goto=8007826#8007780 Forumsbeitrag]: Statemachine: Toller Artikel&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://statecharts.online statecharts.online] Comprehensive and interactive tutorial on statecharts and state machines&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/products/itemis-create/ itemis CREATE] 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;
* [http://stefanfrings.de/multithreading_arduino/index.html Multithreading in C und Arduino] von Stefan Frings&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
* [https://galileo.phys.virginia.edu/classes/551.jvn.fall01/fsm.html Finite State Machines in Forth von J.V. Noble]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR&amp;diff=107881</id>
		<title>AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR&amp;diff=107881"/>
		<updated>2026-02-11T18:20:43Z</updated>

		<summary type="html">&lt;p&gt;Alesi: /* Literatur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die AVR-[[Mikrocontroller]] von [https://www.microchip.com/ Atmel (jetzt Microchip Technology Inc.)] sind wegen ihrer übersichtlichen internen Struktur, der [[ISP | In-System-Programmierbarkeit]], und der Vielzahl von kostenlosen Programmen zur Softwareentwicklung (Assembler, Compiler) beliebt. Diese Eigenschaften und der Umstand, dass viele Typen in einfach handhabbaren DIL-Gehäusen (DIP) verfügbar sind, machen den AVR zum idealen Mikrocontroller für Anfänger. &lt;br /&gt;
&lt;br /&gt;
Über die Bedeutung des Namens &amp;quot;AVR&amp;quot; gibt es verschiedene Ansichten; manche meinen er sei eine Abkürzung für &#039;&#039;&#039;A&#039;&#039;&#039;dvanced &#039;&#039;&#039;V&#039;&#039;&#039;irtual [[RISC|&#039;&#039;&#039;R&#039;&#039;&#039;ISC]], andere vermuten dass der Name aus den Anfangsbuchstaben der Namen der Entwickler (&#039;&#039;&#039;A&#039;&#039;&#039;lf Egil Bogen und &#039;&#039;&#039;V&#039;&#039;&#039;egard Wollan &#039;&#039;&#039;R&#039;&#039;&#039;ISC) zusammengesetzt wurde. Laut Atmel ist der Name bedeutungslos.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Die Architektur ist eine 8-Bit-[[Harvard-Architektur]], das heißt, es gibt getrennte Busse zum Programmspeicher ([[Speicher#Flash-ROM |Flash-ROM]], dieser ist 16 bit breit) und Schreib-Lese-Speicher ([[Speicher#RAM |RAM]]). Programmcode kann ausschließlich aus dem Programmspeicher ausgeführt werden. Weiterhin sind die Adressräume unabhängig (d.h. beide Speicher besitzen eigene Adressbereiche, die sich wertemäßig überschneiden können). Bei der Programmierung in Assembler und einigen C-Compilern bedeutet dies, dass sich Konstanten aus dem ROM nicht mit dem gleichen Code laden lassen wie Daten aus dem RAM. Abgesehen davon ist der Aufbau des Controllers recht übersichtlich und birgt wenige Fallstricke.&lt;br /&gt;
&lt;br /&gt;
* 32 größtenteils gleichwertige Register&lt;br /&gt;
* davon 1–3 16-bit-Zeigerregister (paarweise)&lt;br /&gt;
* ca. 110 Befehle, die meist 1–2 Taktzyklen dauern&lt;br /&gt;
* Taktfrequenz bis 32 MHz&lt;br /&gt;
* Betriebsspannung von 1,8 – 5,5 V&lt;br /&gt;
* Speicher&lt;br /&gt;
**1–256 kB [[Speicher#Flash-ROM | Flash-ROM]]&lt;br /&gt;
**0–4 kB [[Speicher#EEPROM | EEPROM]]&lt;br /&gt;
**0–16 kB [[speicher#RAM | RAM]]&lt;br /&gt;
* Peripherie: [[AD-Wandler]] 10 bit, 8- und 16-Bit-[[Timer]] mit [[PWM]], [[SPI]], [[I²C]] (TWI), [[UART]], Analog-[[Komparator]], [[Watchdog]]&lt;br /&gt;
* [[Speicher#Mit_XMEM-Interface | 64kB Externer SRAM]] (ATmega128, ATmega64,  ATmega8515/162); (Bei den XMEGAs bis zu 16 MB (128 Mbit) externer SDRAM)&lt;br /&gt;
* [[JTAG]] bei den größeren ATmegas&lt;br /&gt;
* [[debugWire]] bei den neueren AVRs&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
* [[AVR-Studio]]: Kostenlose Enwicklungsumgebung mit Simulator&lt;br /&gt;
* [http://www.microchip.com/avr-support/atmel-studio-7 Atmel Studio 7]: Kostenlose Enwicklungsumgebung mit Simulator&lt;br /&gt;
* [http://sourceforge.net/projects/kontrollerlab/ KontrollerLab]: Kostenlose Entwicklungsumgebung für KDE&lt;br /&gt;
* [http://corpsman.de/index.php?doc=projekte/klab Klab] [https://github.com/PascalCorpsman/mini_projects/tree/main/miniprojects/KLab Source]: Kostenlose Entwicklungsumgebung für KDE/GTK2/Win32 (als FPC/Lazarus Quellcode verfügbar, Nachbau von KontrollerLab)&lt;br /&gt;
* [http://www.microsoft.com/germany/Express/product/visualcplusplusexpress.aspx Microsoft Visual C++ Express]: Kostenlose Enwicklungsumgebung (Win),über makefile&lt;br /&gt;
* [http://netbeans.org Netbeans]: Plugin-basierte, kostenlose Entwicklungsumgebung (Windows, Mac, Linux, und Solaris). [http://mattzz.dyndns.org/wiki/bin/view/Projects/ArduinoAndNetbeans  Hier] findet sich ein Howto für das Setup von AVR (z.B. für Arduino)&lt;br /&gt;
* [[AVR Eclipse]]: Plugin-basierte kostenlose Entwicklungsumgebung (Win, Linux, Mac)&lt;br /&gt;
* [[Code::Blocks]]: Freie Entwicklungsumgebung (Win, Linux, Mac), die auch für AVR-Projekte Unterstützung anbietet&lt;br /&gt;
* [[AVR-GCC]]: freier und kostenloser C-Compiler&lt;br /&gt;
* [http://www.mikroe.com/mikropascal/avr Mikropascal] mit einer eingeschränkten kostenlosen Testversion&lt;br /&gt;
* [[LunaAVR]]: Kostenlose, objektbasierte Basic/Pascal-ähnliche Programmiersprache und Entwicklungsumgebung mit Compiler/Assembler und Disassembler (Win, Linux, Mac). http://avr.myluna.de&lt;br /&gt;
* [http://sourceforge.net/projects/avra/ AVRA]: freier und kostenloser AVR-Assembler&lt;br /&gt;
* [http://www.mcselec.com/bascom-avr.htm Bascom AVR] beliebter Basic-Compiler&lt;br /&gt;
* [http://www.e-lab.de AVRCo Pascal Compiler]&lt;br /&gt;
* [http://sourceforge.net/projects/avr-ada/ AVR-Ada]: freier und kostenloser Ada-Compiler mit einigen Treibern und (sehr) knapper Laufzeitbibliothek (RTS)&lt;br /&gt;
* [http://amforth.sourceforge.net/ amforth]:  interaktiver und erweiterbarer Kommandointerpreter für AVR unter GNU Lizenz (Open Source)&lt;br /&gt;
* [[SJC]]: Experimenteller Java-Compiler unter GPL mit AVR-Unterstützung&lt;br /&gt;
* [http://gcbasic.sourceforge.net/Typesetter/index.php/Home Great Cow BASIC Compiler]: Open Source Basic Compiler für AVR und PIC Controller. Verfügbar für Windows, Linux und Apple&lt;br /&gt;
&lt;br /&gt;
== Programmiergeräte ==&lt;br /&gt;
&lt;br /&gt;
Siehe Hauptartikel [[AVR In System Programmer]].&lt;br /&gt;
&lt;br /&gt;
== Boards &amp;amp; Starterkits ==&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch die Artikel in der [[:Kategorie:AVR-Boards|Kategorie AVR-Boards]] und den Artikel zur [[AVR_In_System_Programmer|AVR Programmierung]].&lt;br /&gt;
&lt;br /&gt;
* [[STK200]]&lt;br /&gt;
* [[STK500]]&lt;br /&gt;
* [[STK600]]&lt;br /&gt;
* AVR-ISP / [[AVR_In_System_Programmer#Atmel_AVRISP_MKII|AVRISP mkII]]&lt;br /&gt;
* [[AVR Dragon]]&lt;br /&gt;
* [[AVR Butterfly]]&lt;br /&gt;
* [[AVR Raven]]&lt;br /&gt;
* AVR JTAG-ICE&lt;br /&gt;
&lt;br /&gt;
* [[AVR-ISP-Stick]]&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=64&amp;amp;products_id=126 RN-Control]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/791564/Set-C-Control-PRO-AVR32-Bit-Unit-Applicationboard?ref=list C-Control PRO] (AVR32)&lt;br /&gt;
* [http://shop.myavr.de/Systemboards%20und%20Programmer/myAVR%20Board%20MK3%2064K.htm?sp=article.sp.php&amp;amp;artID=100064 myAVR Board]&lt;br /&gt;
* [http://www.pollin.de/shop/dt/NTE5OTExOTk-/Bausaetze_Module/Lernpakete_Elektronik/Lernpaket_AVR_Mikrocontroller_in_C_programmieren.html Pollin-Starterkit]&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/aTeVaL aTeVaL-Board] – Nachfolger des bekannten Pollin Evalboards. ISP-mkii-Klon &amp;amp; Seriell/USB-Wandler via USB. Testhardware auf der Platine: Taster, LED, Summer, Potis, ...&lt;br /&gt;
* [http://www.lochraster.org/rumpus Rumpus von lochraster.org] ist ein günstiges und gut dokumentiertes Starterkit mit Atmega 168&lt;br /&gt;
* [http://www.das-labor.org/wiki/Laborboard  Laborboard von das-labor.org] – Bauplan Lochrasterplatine mit Atmega32&lt;br /&gt;
* [http://nibo.nicai-systems.de Roboterbausatz NIBO 2] – autonomer Roboter mit einem ATmega128 und einem ATmega88 / [http://nibobee.nicai-systems.de Roboterbausatz NIBObee] – Roboter für Einsteiger mit ATmega16 und integriertem USB-Programmer&lt;br /&gt;
* [http://www.nerdkits.com Nerdkit – Starterkit inkl. Doku]&lt;br /&gt;
* [http://www.bob3.org BOB3] - Board mit ATmega88 zum Einstieg in die Programmierung, mit [http://www.progbob.org ausführlichem Online-Tutorial], speziell für Schüler&lt;br /&gt;
* [http://arduino.cc/ Arduino] – Ein modulares System mit verschiedenen Entwicklungsboards (insbesondere auch eins mit ATmega1280, dem mit den vielen dünnen Beinchen), das aufgrund der Nutzung einer JAVA-IDE und &amp;quot;Wiring&amp;quot; besonders einfach zu nutzen ist. Es gibt verschiedene Clones unter Namen wie Freeduino, Seeeduino etc., auch den Lilypad zum Einnähen in Kleidung und Verschaltung mittels leitender Fäden. Die neueren Versionen können über einen standardmäßig mit ausgelieferten Bootloader ohne sonstige Hardware direkt über USB bespielt werden.&lt;br /&gt;
* [[Modulares Board]]&lt;br /&gt;
* [http://www.aevum-mechatronik.de/shop/shop/USER_ARTIKEL_HANDLING_AUFRUF.php?von_suchresultat=true&amp;amp;Ziel_ID=805&amp;amp;Kategorie_ID=148 Modularis-Einsteigerset]&lt;br /&gt;
* [http://weigu.lu/b/mices2 mices2] – Entwicklungsboard zum [http://www.weigu.lu/a Gratis Assembler Kurs]. Integriertes Programmiergerät (USB, avrisp mk2 kompatibel). Spannungsvrsorgung über USB. Platine einseitig, leicht zu bestücken. Viele Schnittstellen (1-Wire, I2C, EIA232 ...), D/A-Wandler, Mikrofonschaltung., Audioverstärker ...&lt;br /&gt;
* [https://guloshop.de/shop/Mikrocontroller-Programmierung/::45.html gulostart] – [[Steckbrett|Steckplatinen]]-basiertes Lernpaket / Einsteiger-Set mit ausführlicher Anleitung. Verwendet ausschließlich [http://de.wikipedia.org/wiki/Open_source Open-Source-Software], kann fast alle DIP-ATtiny/ATmega programmieren. Für USB-Schnittstelle.&lt;br /&gt;
* [http://corpsman.de/index.php?doc=atmel/atmegaboard Atmegaboard] Eagle Daten für ein Testboard zur Nutzung 2er Atmegas gleichzeitig. Weitere Adapterplatinen sowie Source Code sind ebenfalls verfügbar.&lt;br /&gt;
* [http://matrixstorm.com/avr/tinyusbboard/ tinyUSBboard] – Ein sehr sehr preiswertes, Arduino und BASCOM kompatibles Board mit onboard USB Interface und [http://matrixstorm.com/avr/tinyusbboard/#firmwaresotherbootloader auswechelbarem Bootloader].&lt;br /&gt;
* [https://www.olimex.com/Products/AVR/ verschiedene Boards von Olimex]&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
Siehe dazu auch die Artikel in der [[:Kategorie:AVR-Projekte|Kategorie AVR-Projekte]].&lt;br /&gt;
&lt;br /&gt;
* [http://www.electronicsplanet.ch/mikrocontroller/source-code/ATmega8/ATmega8-index.htm 20 C-Code Beispiele für den ATmega8]&lt;br /&gt;
* [[PWM_foxlight]] – LED Lampe mit PWM&lt;br /&gt;
* [[Digitaler Funktionsgenerator]]&lt;br /&gt;
* [[Midi Rekorder mit MMC/SD-Karte]]&lt;br /&gt;
* [[Schrittmotor-Controller (Stepper)]]&lt;br /&gt;
* [[Pulsuhrempfänger mit AVR Butterfly]]&lt;br /&gt;
* [[DCF77-Funkwecker mit AVR]]&lt;br /&gt;
* [[Fahrradcomputer]]&lt;br /&gt;
* [[Einfacher und billiger Webserver mit AtMega32]]&lt;br /&gt;
* [[AVR RFM12]]&lt;br /&gt;
* [[RF SOAP]] USB / AtMega88 / RFM12, optional LiPo Akku mit Lader&lt;br /&gt;
* [http://www.andreadrian.de/schach/#Selbstbau_Schachcomputer_SHAH Selbstbau Schachcomputer SHAH mit ATMega88V]&lt;br /&gt;
* [[Giess-o-mat]] – vollautomatische Blumengießanlage&lt;br /&gt;
* [http://www.zipfelmaus.com/led-flitzer/ POV-LED mit ATmega8, USB und Beschleunigungssensor]&lt;br /&gt;
* [http://g-heinrichs.de/attiny/ ATtiny-Mikrokontroller für Schulbedarf]&lt;br /&gt;
* [http://www.weigu.lu/b Kleine USB-Bibliothek (C, BASCOM und Assembler) für ATMEL-USB-AVRs]&lt;br /&gt;
* [http://volkszaehler.org/ Ein tolles Smartmeter mit kompletter Middleware!]&lt;br /&gt;
* [http://youtu.be/FoUycAYQEzM Snake auf einer LED Matrix]&lt;br /&gt;
* [[AVR_Transistortester]] - Universeller Bauteiletester&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* http://www.avr-asm-tutorial.net&lt;br /&gt;
* http://www.electronicsplanet.ch/mikrocontroller/avr-tutorial-c/avr-tutorial-c.htm Kurzanleitung zum Einrichten des STK500 und dem AVR Studio 4&lt;br /&gt;
* https://www.weigu.lu/tutorials/avr_assembler/index.html: Gratis Assembler Kurs (pdf). Mehrere hundert Seiten mit vielen neuen Grafiken. Besonders zum Selbststudium geeignet. Es existiert auch ein [http://www.weigu.lu/b/mices2 Entwicklungsboard] zum Kurs.&lt;br /&gt;
* http://www.modelleisenbahn-steuern.de/controller/index.htm Datenbuch ATmega8 und Xmega384 mit Beispielen in Assembler (alles deutsch).&lt;br /&gt;
* http://www.tu-chemnitz.de/~heha/hs/ATmegaX8.chm/ = Datenblatt ATmega48/88/168/328 in deutsch, auch als CHM-Datei herunterladbar und damit offline lesbar&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
 	&lt;br /&gt;
* I.Klöckl AVR - Mikrocontroller. MegaAVR® - Entwicklung, Anwendung und Peripherie ISBN 978-3-11-040768-6 (De Gruyter 2015) [http://www.degruyter.com/view/product/449202 Verlags-Webseite]&lt;br /&gt;
* C.Kühnel Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR ISBN 3898119378 (2000) ISBN 3907857046 (2.Aufl.2004) ISBN 978-3-907857-14-4 (3. überarbeitete und erweiterte Auflage 2010)&lt;br /&gt;
* R.Mittermayr AVR-RISC: Embedded Software selbst entwickeln Franzis 2008 ISBN 3772341071&lt;br /&gt;
* F.Schäffer AVR: Hardware und C-Programmierung in der Praxis Elektor 2008 ISBN 3895762008 [http://www.blafusel.de/books/avr.html Webseite des Autors, Codebeispiele und Leseprobe]&lt;br /&gt;
* G.Schmitt Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie...Oldenbourg 4.Aufl.2008  ISBN 3486587900 ISBN 3486580167 (2006) ISBN 3486577174 (2005) [http://www.oldenbourg-wissenschaftsverlag.de/olb/de/1.c.1495224.de Verlags-Webseite mit Buchauszügen]&lt;br /&gt;
* M.Schwabl-Schmidt Programmiertechniken für AVR-Mikrocontroller Elektor 2008 ISBN 3895761761 [http://www.schwabl-schmidt.de/index.php/buecher Webseite des Autors]&lt;br /&gt;
* M.Schwabl-Schmidt Systemprogrammierung für AVR-Mikrocontroller Elektor 2009 ISBN 3895762180&lt;br /&gt;
* W.Trampert Messen,Steuern und Regeln mit AVR Mikrocontrollern Franzis 2004 ISBN 3772342981&lt;br /&gt;
* W.Trampert AVR-RISC Mikrocontroller Franzis ISBN 3772354769 (2003) ISBN 3772354742 (2002) ISBN 3772354750 (2000)&lt;br /&gt;
* P.Urbanek Embedded Systems: Ein umfassendes Grundlagenwerk ... (2007) ISBN 3981123018 [http://www.ulb.tu-darmstadt.de/tocs/188146911.pdf Inhaltsverzeichnis]&lt;br /&gt;
* S./F.Volpe AVR-Mikrocontroller-Praxis Elektor 2001 ISBN 3895760633&lt;br /&gt;
* R.Walter AVR-Mikrocontroller-Lehrbuch 3. Auflage Denkholz 2009 ISBN 9783981189445 [http://www.rowalt.de/mc/avr/avrbuch/index.htm Webseite des Autors, Buch-Download in geringer Auflösung]&lt;br /&gt;
* Jim Fiore Embedded Controllers Using C and Arduino [https://www2.mvcc.edu/users/faculty/jfiore/books/EmbeddedControllers.pdf Embedded Controllers (pdf)] [https://www2.mvcc.edu/users/faculty/jfiore/et283.html ET 283 Microprocessor Fundamentals (Internetseite)]&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Hinweise ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR Typen]] – Die verschiedenen Typen (AT90S, ATmega, ATtiny)&lt;br /&gt;
* [[AVR Checkliste]] – Liste mit Hinweisen zur Lösung üblicher Probleme&lt;br /&gt;
* [http://blog.coldtobi.de/1_coldtobis_blog/archive/87_little_endianess_guide_for_atmel_avr.html (Little) Endianess Guide for Atmel AVR] Übersicht über die Endianess der AVR und AVR32&lt;br /&gt;
* [[AVR Fuses|Fuse-Bits]] – Das Setzen der Fuse-Bits ist ein berüchtigter Fallstrick bei den AVRs; vor dem Rumspielen damit unbedingt diese Hinweise lesen!&lt;br /&gt;
* [[AVR In System Programmer]] – Programmierhardware&lt;br /&gt;
* [[Pony-Prog Tutorial]] – Hinweise zur Programmiersoftware PonyProg&lt;br /&gt;
* [[AVRDUDE]] – Programmiersoftware für die Kommandozeile&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]] – Wie man mehr aus dem Controller herausholen kann, ohne ein Assembler-Guru sein zu muessen.&lt;br /&gt;
* [[AVR Softwarepool]] – Verschiedene Softwaremodule und Codeschnippsel aus der Codesammlung&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
Verweise (Links) auf externe Informationen und Projekte finden sich in der &#039;&#039;&#039;[[Linksammlung#AVR|Linksammlung]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Anmerkungen ===&lt;br /&gt;
&amp;lt;!-- Dieser Teil sollte in einen anderen Artikel --&amp;gt;&lt;br /&gt;
Es gibt nur wenige Typen mit D/A-Wandler (z.B. AT90PWM2); hierfür benutze man PWM oder externe Bausteine.&lt;br /&gt;
&lt;br /&gt;
Die Takterzeugung ist bei AVRs recht einfach gehalten. So gibt es bei den meisten Modellen keine internen PLLs um „krumme“ Prozessor- oder Peripherietaktfrequenzen zu erzeugen, noch ist der Peripherie-Takt vom Prozessortakt abkoppelbar. Einige AVR verfügen über eine PLL, um damit z.B. einen Timer mit Frequenzen über der Systemfrequenz zu takten oder höhere Systemfrequenz aus niederfrequenteren Taktquellen zu erzeugen (vgl. u.a. Datenblätter ATtiny85 und ATtiny861). Die Baudrate serieller Schnittstellen lässt sich nicht gebrochen einstellen, so dass gegebenenfalls ein zur Baudrate passender Quarz oder Resonator zu verwenden ist.&lt;br /&gt;
&lt;br /&gt;
Für die serielle Programmierung des Flash-Speichers sind 4 Datenleitungen erforderlich und die Taktversorgung muss sicher gestellt sein. Es ist darauf zu achten, dass bei Einstellung der Taktquelle (Fuses) auch die vorhandene Taktquelle ausgewählt wird. Für die Hochvolt-Programmierung (so genannt wegen 12 V am RESET-Anschluss) werden je nach Chip nur 3 Signalleitungen (kleinere ATtinys) oder sehr viele Leitungen benötigt (ATmegas und große ATtinys). Einige Modelle verfügen über eine Debugwire-Schnittstelle, für die im Betrieb zwei Leitungen ausreichen.&lt;br /&gt;
&lt;br /&gt;
Nicht zu verwechseln ist die 8-bit-AVR-Serie mit AVR32. Letztere ist eine 32-bit-Architektur mit recht viel Ähnlichkeit zu Controllern auf Basis eines ARM-Cores. Controller der ATxmega-Serie verfügen über mehr Funktionen als die &amp;quot;traditionellen&amp;quot; AVR (z.B. DMA- und Eventsystem, 12Bit A-D-Wandler). ATxmega sind jedoch für 3,3V-Betrieb ausgelegt und ausschließlich in SMD-Bauform erhältlich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;br /&gt;
[[Category:AVR| ]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Linksammlung&amp;diff=107763</id>
		<title>Linksammlung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Linksammlung&amp;diff=107763"/>
		<updated>2025-11-05T18:18:07Z</updated>

		<summary type="html">&lt;p&gt;Alesi: /* Tutorials und Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite werden Links zu anderen interessanten Mikrocontroller- und Elektronikseiten gesammelt. Die alte Linkseite findet man [http://www.mikrocontroller.net/en/links hier].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: diese Liste wird nicht mehr aktiv gepflegt. Viele der Links sind leider mittlerweile ungültig.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hinzufügen von Links:&lt;br /&gt;
# [http://www.mikrocontroller.net/wikisoftware/index.php?title=Linksammlung&amp;amp;action=edit Bearbeiten] anklicken&lt;br /&gt;
# Link unter der entsprechenden Kategorie eintragen&lt;br /&gt;
# &amp;quot;Artikel speichern&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
== Suchen &amp;amp; Finden ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Verkauf einem hungrigen Mann einen Fisch und du hast ein Geschäft gemacht, bring ihm das Angeln bei und du hast einen Kunden verloren! (asmo)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://www.supplyframe.com/ SupplyFrame] - Datasheet and Electronic Spec Search Engine&lt;br /&gt;
* [http://www.globalspec.com/ GlobalSpec] - The Engineering Search Engine&lt;br /&gt;
* [http://www.alldatasheet.com/ alldatasheet] - Datasheet Search&lt;br /&gt;
* [http://www.datasheetarchive.com/ datasheetarchive] - Datasheet Search&lt;br /&gt;
* [http://www.datasheetcatalog.com/ datasheetcatalog] - Datasheet Search&lt;br /&gt;
* [http://www.msarnoff.org/chipdb/ ChipDB] - Pinouts von gängigen µCs.&lt;br /&gt;
* [http://www.dcdcselector.com/de/] - Parametrische Produkt Suche für Analog IC&lt;br /&gt;
&amp;lt;!-- SPAM&lt;br /&gt;
* [http://www.TechTour.net] - Angebote und Technische Beratung von mehreren Anbietern gleichzeitig einholen. Von der Elektronik Entwicklung über Leiterplatten Bestückung, von Leiterplatten über Folientastaturen, Gehäusen bis zur Kabelkonfektion.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[AVR]] ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/products/avr/ Atmel.com] Herstellerseiten&lt;br /&gt;
* [http://www.atmel.com/dyn/products/product_whatchanged.asp?category_id=163&amp;amp;family_id=607 Atmel.com updates] Liste der letzten Änderungen in Datenblättern und Beispielcode für AVR(8) und AVR32&lt;br /&gt;
* [http://www.msc-ge.com/de/produkte/elekom/mc/atmel/avr_start.html AVR Produktinfos] AVR Infos vom Atmel Distributor MSC Vertriebs GmbH&lt;br /&gt;
* [http://www.siebert-group.com/ Siebert Group] Siebert Group Industrie Electronik&lt;br /&gt;
&lt;br /&gt;
=== Information (Foren, Mailinglisten, Linksammlungen) ===&lt;br /&gt;
* [http://progforum.com Batronix Elektronik Forum] Gut besuchtes Forum für allgemeine Elektronik, Mikrocontroller und Programmierung&lt;br /&gt;
* [http://www.avrfreaks.net/ AVR Freaks] AVR Forum, Samples, Tutorials, User-Projekte, GCC für AVR (Registrierung empfohlen)&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.mikrocontroller.net Mikrocontroller.net] - AVR Tutorials, Examples, LINKS, Forum (D)&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://www.openavr.org/ Openavr.org] &amp;quot;central repository of information for the various open source tools available for the development of software for Atmel&#039;s AVR family of 8-bit RISC microcontrollers&amp;quot;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://www.omegav.ntnu.no/avr/resources.php3 Omega V&#039;s AVR Resource List]&lt;br /&gt;
* [http://www.omegav.ntnu.no/avr/newresources.php3 Omega V&#039;s AVR NEW Resource List]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [http://www.ipass.net/hammill/newavr.htm Atmel AVR Embedded Microcontroller Resources]&lt;br /&gt;
* [http://members.tripod.com/Stelios_Cellar/AVR/AVR%20Info.html Stelios Cellar Atmel AVR Info Page] - Samples, Links&lt;br /&gt;
* [http://www.elektronik-projekt.de Elektronik Projekt] - Hauptthemen sind AVR und Roboter&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://www.microschematic.com/ AVR Microcontroller inside] (nett gemacht, Engl. Seite am 07-09-2008 nicht erreichbar)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://electrons.psychogenic.com/avr/ Intro To AVR Microcontrollers] (noch(?) sehr wenig Information)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [http://popularmicrocontrollers.com/ AVR Microcontrollers] - A web site about AVR microcontrollers&lt;br /&gt;
&amp;lt;!-- Dieser Unterabschnitt ist für AVR. Für PIC gibt es einen eigenen Unterabschnitt weiter unten. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungswerkzeuge (Compiler/Assembler/Debugger/Tools/Libraries) ===&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
* [http://sourceforge.net/projects/winavr WinAVR] (pronounced &amp;quot;whenever&amp;quot;) is a suite of executable, open source software development tools for the Atmel AVR series [for the] Windows platform&amp;quot; (includes GNU GCC) &lt;br /&gt;
* [http://sourceforge.net/projects/kontrollerlab KontrollerLab] is a free GPL open-source development environment based on KDE, using the avr-gcc, UISP and AVRDUDE&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/ avr-libc] avr-gcc&#039;s &amp;quot;standard&amp;quot;-library&lt;br /&gt;
&amp;lt;!-- * [http://hubbard.engr.scu.edu/embedded/avr/avrlib/ Procyon AVRlib] a lot of device drivers and Visual-Studio link for avr-gcc --&amp;gt;&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib/ Procyon AVRlib] a lot of device drivers and Visual-Studio link for avr-gcc&lt;br /&gt;
* [http://rod.info/avr.html rod.info on AVR] esp. for AVR GNU development tools setup under Linux&lt;br /&gt;
* [http://www.sisy.de SiSy AVR] - graphische Entwicklungsumgebung mit C/C++ Codegenerierung aus Struktogrammen und Klassendiagrammen&lt;br /&gt;
* [http://shop.embedit.de/product__206.php AtmanAVR C/C++ IDE]&lt;br /&gt;
* [http://www.iar.com IAR Embedded Workbench]&lt;br /&gt;
* [http://www.hpinfotech.com CodeVisionAVR] C-Compiler für AVRs mit Terminal&lt;br /&gt;
* [http://www.myAVR.de myAVRWorkpad] kompakte Entwicklungsumgebung für AVRs mit Terminal&lt;br /&gt;
* [http://www.amctools.com/vmlab.htm VMLab] komplette IDE mit Debugger und Simulator (auch Peripheriehardware)&lt;br /&gt;
* [http://www.forestmoon.com/Software/AvrIoDesigner/ AVR IO Designer] is a utility to generate initialization source code in C/C++ for the various devices, ports and registers of Atmel AVR processors. The intent is to allow the user to explore the devices specific to a selected processor and experiment with settings thru a user interface that assists in understanding the complexities involved. The user can also assign custom variable names to PORT IO pins thereby keeping track of the IO resources in use. These names are emitted in the generated code for use in the user’s program. (Windows .NET 2.0 erforderlich)&lt;br /&gt;
* [http://www.piconomic.co.za/avrlib/index.html Piconomic AVRLIB] is a collection of firmware for Atmel AVR microcontrollers. The aim is to share source code, experience and expertise (in the eye of the beholder) with the community of engineers, scientists and enthusiasts.&lt;br /&gt;
* [http://www.imagecraft.com/devtools_AVR.html Imagecraft] Der ICCAVR C Compiler fuer AVR von Imagecraft.&lt;br /&gt;
&lt;br /&gt;
==== Assembler ====&lt;br /&gt;
&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.tavrasm.org/ tavrasm] - Toms Linux (Atmel) AVR Assembler&lt;br /&gt;
* [http://www.avr-asm-tutorial.net/gavrasm/index_de.html gavrasm] - Gerds Linux/Win/DOS AVR Assembler &lt;br /&gt;
* [http://avra.sourceforge.net/ avra] - avra ATMEL AVR Assembler für Linux, FreeBSD, AmigaOS und Win32&lt;br /&gt;
* [http://algrom.net/english.html Algorithm Builder] - graphische Makro-Assembler Entwicklungsumgebung&lt;br /&gt;
* [http://www.sisy.de SiSy AVR] - graphische Entwicklungsumgebung mit Assembler Codegenerierung aus Programmablaufplänen&lt;br /&gt;
* [http://www.sbprojects.com/sbasm/sbasm.htm SB-Assembler] - Freeware Cross-Assembler unter DOS. (6502, 6800, 6801, 6804, 6805, 6809, 68HC08, 68HC11, Z8, Z80, Z180, 8080, 8085, 8021, 8041, 8048, 8051, AVR, PIC1684,...)&lt;br /&gt;
* [http://www.myAVR.de myAVRWorkpad] kompakte Entwicklungsumgebung für AVRs mit Terminal&lt;br /&gt;
* [http://john.ccac.rwth-aachen.de:8000/as/ Macro Assembler AS] - AS is a portable macro cross assembler for a variety of microprocessors and -controllers&lt;br /&gt;
* [http://shop-pdp.kent.edu/ashtml/asxxxx.htm ASxxxx Cross Assemblers] - The ASxxxx assemblers are a series of microprocessor assemblers written in the C programming language. (1802, S2650, C/MP, MSP430, 61860, 6500, 6800(6802/6808), 6801(6803/HD6303), 6804, 6805, 68HC(S)08, 6809, 68HC11, 68HC(S)12, 68HC16, 740, 8048(8041/8022/8021) 8051, 8085(8080), DS8xCxxx, AVR, Z80, F2MC8L/FX, GameBoy(Z80), H8/3xx, Cypress PSoC(M8C), PIC, Rabbit 2000/3000, Z8, Z80(HD64180)) linux &amp;amp; windows, source code&lt;br /&gt;
* [http://www.i8086.de/asm/8086-88-asm.html 8086/88 Assembler Befehlsreferenz] - Informationen zum Befehlssatz, Registern und Speicheradressierung&lt;br /&gt;
&lt;br /&gt;
==== Disassembler ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.datarescue.com/idabase/ IDA-Pro] -Disassembler und Debugger für fast alle bekannten Prozessoren. Evaluation Version verfügbar. Tagline: &#039;&#039;The most advanced tool for Hostile Code Analysis, Vulnerability and Software Reverse Engineering&#039;&#039;&lt;br /&gt;
* [http://www.jassenbaum.de/ja-tools/ ReAVR] - Disassembler und ACXutility Binary Tool&lt;br /&gt;
* [http://www.visi.com/~dwinker/revava/ revava] - Disassembler&lt;br /&gt;
* [http://dev.frozeneskimo.com/software_projects/vavrdisasm vAVRdisasm] - Free AVR Disassembler&lt;br /&gt;
* [http://www.johannes-bauer.com/mcus/avrdisas/ avrdisas] - AVR Mikrocontroller Disassembler für Linux (und Win32)&lt;br /&gt;
&amp;lt;!-- * [http://biew.sourceforge.net/en/biew.html BVIEW] is multiplatform portable viewer of binary files with built-in editor in binary, hexadecimal and disassembler modes. It includes &#039;&#039;&#039;AVR&#039;&#039;&#039;/Java/i86-i386-AMD64/ARM-XScale/PPC64 disassemblers, russian codepages convertor, full preview of formats - MZ, NE, PE, NLM, coff32, elf partial - a.out, LE, LX, PharLap; code navigator and more over. (GPL) - 404, 6.9.2010 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BASIC ====&lt;br /&gt;
* [http://www.mcselec.com/bascom-avr.htm Bascom AVR]&lt;br /&gt;
* [http://www.fastavr.com FastAVR] - und mit &#039;ASM&#039; Ausgabe, Nokia3310 LCD Unterstützung&lt;br /&gt;
* [http://www.nettypes.de/mbasic mikrocontrollerBASIC Freeware] - mit Simulator für ATmega32, ATmega128 und C-CONTROL.&lt;br /&gt;
* [http://www.mikroe.com/en/compilers/mikrobasic/avr/ mikroBasic] - Comprehensive, stand-alone Basic compiler for AVR microcontrollers&lt;br /&gt;
* [http://home.arcor.de/EDAconsult/Page3/index.html?c~3.1 MCS BASIC-52] - Original-Übersetzung 1988 INTEL MCS BASIC-52 USERS MANUAL 220 Seiten frei Download als PDF&lt;br /&gt;
* [http://www.DieProjektseite.de Beetle-Basic] Leistungsfähiges Basic-Betriebssystem im AVR.&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR_BASIC AVR_BASIC] Open Source Freeware: Minimalistischer Basic-Interpreter  im AVR.&lt;br /&gt;
* [http://gcbasic.sourceforge.net/ Great Cow BASIC] &amp;quot;Open Source BASIC programming tools for Microchip PIC and Atmel AVR microcontrollers&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Pascal ====&lt;br /&gt;
* [http://www.e-lab.de AVRco Pascal Compiler] - AVR Pascal Compiler mit umfangreicher Funktionslibrary&lt;br /&gt;
* [http://www.mikroe.com/en/compilers/mikropascal/avr/ mikroPascal] - Comprehensive, stand-alone Pascal compiler for AVR microcontrollers&lt;br /&gt;
&lt;br /&gt;
==== Forth ====&lt;br /&gt;
* [http://www.robo-forth.de www.robo-forth.de] - AVR Forth Compiler mit umfangreicher Funktionslibrary für Servos, Motore und Sensoren&lt;br /&gt;
* [http://amforth.sourceforge.net/ amforth] - Forth for Atmel ATmega micro controllers von Matthias Trute. [http://www.mikrocontroller.net/topic/55807#430816 Diskussion]&lt;br /&gt;
&lt;br /&gt;
==== Java ====&lt;br /&gt;
* [http://www.harbaum.org/till/nanovm NanoVM] - Java VM für AVR-Mikrocontroller ([[NanoVM|deutsches Wiki]])&lt;br /&gt;
* [http://www.fam-frenz.de/stefan/compiler.html SJC] - Java-Compiler (erzeugt AVR-Maschinencode) für AVR-Mikrocontroller ([[SJC]])&lt;br /&gt;
&lt;br /&gt;
==== Ada ====&lt;br /&gt;
* [http://avr-ada.sourceforge.net/ AVR-Ada] - Ada Compiler innerhalb von GCC (GNAT) für AVR.  Enthält eine kleine Laufzeitbibliothek ohne Tasking und ohne Exceptions. [http://www.mikrocontroller.net/topic/168823#1614208]&lt;br /&gt;
&lt;br /&gt;
==== Virgil ====&lt;br /&gt;
* [http://compilers.cs.ucla.edu/virgil/index.html The Virgil Programming Language] is designed for building robust, flexible, and scalable software systems on embedded hardware platforms. Virgil builds on ideas from object-oriented, statically typed languages like Java, providing a clean, consistent source language. Its compiler system provides an efficient implementation for resource-constrained environments.&lt;br /&gt;
&lt;br /&gt;
==== LabVIEW ====&lt;br /&gt;
* http://www.ni.com/embedded/ Informationen zu LabVIEW, der graphischen Entwicklungsumgebung von National Instruments&lt;br /&gt;
* http://www.labviewforum.de/ Deutsches Labview-Forum&lt;br /&gt;
* [http://web.me.com/iklln6/automation/LabVIEW.html Communicating Arduino--&amp;gt;LabVIEW]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
* [http://code.google.com/p/python-on-a-chip/ python-on-a-chip] (pymite). There are two sample projects in the source tree.  One for an 8-bit Atmel ATmega103 (but any AVR/ATmega with 4 KB RAM or more will do) and one for the 32-bit Atmel AT91SAM7S64 running on the AT91SAM7S-EK evaluation board. (GPL Lizenz)&lt;br /&gt;
&lt;br /&gt;
==== Openeye ====&lt;br /&gt;
&lt;br /&gt;
* OpenEye ist eine Kombination aus PC-Programm (Windows, Delphi) und einer Monitor-Routine im AVR. Die Daten aus dem AVR werden mit RS232 übertragen und können fürs Debuggen der laufenden Anwendung benutzt werden. OpenEye wurde vom User Martin Vogel (oldmax) geschrieben [http://www.mikrocontroller.net/topic/143144#1326244].&lt;br /&gt;
&lt;br /&gt;
==== Modkit ====&lt;br /&gt;
&lt;br /&gt;
[http://blog.modk.it/ Modkit] is a new kind of graphical programming environment that makes programming things in the physical world as easy as dragging and dropping little virtual code blocks in a web browser.. Heavily inspired by the Scratch programming environment (from MIT Media Lab&#039;s Lifelong Kindergarten Group), Modkit enables anyone including kids, artists and inventors to build with electronic kits and components including motors, sensors, lights, sound and the popular Arduino and Arduino compatible development boards... (Text vom Makezine)&lt;br /&gt;
&lt;br /&gt;
=== Tutorials und Beispiele ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.meinemullemaus.de/elektronik/avr_workshop/index.html AVR Mikrocontroller] Einfühung in AVR Mikrocontroller mit Nachbau des Spiels &amp;quot;Senso&amp;quot;.&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Modulares_Board] I2C Bus Tuts und Programme mit dem ATmega 1284p&lt;br /&gt;
* [http://www.avrbeginners.net AVRBeginners.net] Beginners Guides to AVRs&lt;br /&gt;
* [http://www.wikidorf.de/reintechnisch/Inhalt/AVRProjekt-9V-LED-Lampe reintechnisch.de] AVR Tutorial: 9V-LED-Lampe&lt;br /&gt;
* [http://www.schaltungsforum.de Das Schaltungsforum] ist eine Seite für Anfänger und Profis welche ständig mit Tutorials erweitert wird. Stellt Eure Projekte online. Die Seite befindet noch im Aufbau und Eure Mithilfe ist erwünscht.&lt;br /&gt;
* [http://www.mikrocontrollerspielwiese.de mikrocontrollerspielwiese.de] ist eine Seite, die an Anfänger gerichtet ist und Experimente und fertige Projekte komplett mit Code und Eagle-Dokumenten zur Verfügung stellt.&lt;br /&gt;
* [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-anwendungen ELO-AVR-Anwendungen] bietet eine wachsende Sammlung kleinerer AVR-Projekte, überwiegend für die ATTiny-Serie.&lt;br /&gt;
* [http://www.schramm-software.de/tipps/ AVR-Tipps] Programmier-Tipps und AVR-Experimente.&lt;br /&gt;
* [https://sys.cs.fau.de/lehre/ss22/spic/vorlesung Systemnahe Programmierung in C (SPiC)] Folien der Vorlesung, Übungen, Übungsplattform SPiCboard, Bibliothek, Projekte.&lt;br /&gt;
* [http://www.uwe-kerwien.de/pll/pll-synthesizer.htm PLL-Synthesizer Tutorial] kleines praxisorientiertes PLL-Tutorial zur Funktion, Reparatur und Steuerung einer PLL-Schaltung mit AVR ATtiny2313 über 3-Leiter-Bus&lt;br /&gt;
* Arduino&lt;br /&gt;
** [http://tronixstuff.wordpress.com/tutorials/ t r o n i x s t u f f] - Arduino Tutorials (engl.)&lt;br /&gt;
** [http://www.earthshinedesign.co.uk/ASKManual/Site/ASKManual.html The Complete Beginners Guide to the Arduino]&lt;br /&gt;
** [http://www.codeproject.com/KB/system/ArduinoVB.aspx Arduino with Visual Basic] by Carl Morey auf codeproject.com&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [http://www.smileymicros.com/QuickStartGuide.pdf Quick Start Guide for using the WinAVR Compiler with ATMEL&#039;s AVR Butterfly] ([http://www.smileymicros.com www.smileymicros.com], PDF)&lt;br /&gt;
* [http://www.avrtutor.com/tutorial/thermo/contents.htm avrtutor] - an attempt to provide a real tutorial for the ATMEL AVR microcontrollers.&lt;br /&gt;
* [http://www.sparkfun.com/commerce/present.php?p=BEE-1-PowerSupply Spark Fun Electronics] - Beginning Embedded Electronics (Atmega8, englisch)&lt;br /&gt;
* [http://metku.net/index.html?path=articles/microcontroller-part-1/index_eng metku.net] - How to get started with microcontrollers (ATtiny45, Steckbrett)&lt;br /&gt;
* [http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial XMEGA-C-Tutorial] - Tutorial über Atxmega&lt;br /&gt;
* [http://www.jtronics.de/avr-projekte/xmega-tutorial.html XMEGA Tutorial in C] - Tutorial ATxmega (unter anderen am ATxmega128A3U)&lt;br /&gt;
&lt;br /&gt;
==== C++ ====&lt;br /&gt;
* [http://www.avr-cpp.de/ www.avr-cpp.de] - Tutorial für AVR C++ und myAVR Bibliotheken&lt;br /&gt;
&lt;br /&gt;
==== Assembler ====&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.avr-asm-tutorial.net Atmel AVR Microcontroller Assembler Tutorial] (D)&lt;br /&gt;
* [[AVR-Studio]]&lt;br /&gt;
* [https://www.semiversus.com/dic/rechnerarchitektur/avr_assembler.html AVR Assembler Übersicht]&lt;br /&gt;
* [https://dev-supp.de/informatik/technische-informatik] - Schnittstelle zwischen Informatik und Elektrotechnik Mikrokontroller HC12 Anleitung&lt;br /&gt;
&lt;br /&gt;
==== Bascom ====&lt;br /&gt;
* [http://www.mcselec.com/ MCS Elektronik] BASCOM AVR Demo zum Download&lt;br /&gt;
&lt;br /&gt;
==== Pascal ====&lt;br /&gt;
* [http://www.elektronik-projekt.de/content/download/avrco_tut2.pdf AVRco Pascal Tutorial] - von Markus&lt;br /&gt;
* [http://www.ibrtses.com/embedded/avr.html ein paar Seiten zum AVR] (ASM und Pascal) von ibrt&lt;br /&gt;
&lt;br /&gt;
==== Ada ====&lt;br /&gt;
* [http://sourceforge.net/apps/mediawiki/avr-ada/index.php?title=Tutorial AVR-Ada Tutorial]&lt;br /&gt;
&lt;br /&gt;
=== Hardware (Prototypen-Platinen-Boards etc.) ===&lt;br /&gt;
&lt;br /&gt;
* [http://retrodan.tripod.com Atmel AVR Butterfly Site]&lt;br /&gt;
* [http://www.kanda.com Kanda] Starter Kits and Development Tools for different Microcontrollers&lt;br /&gt;
* [http://www.dontronics.com Dontronics] Starter Kits and Development Tools for different Microcontrollers, Linkpages for AVR and PIC&lt;br /&gt;
* [http://www.mikrocontroller.com mikrocontroller.com] u.a. Platine AVR-Ctrl, AVR-Webserver (D)&lt;br /&gt;
* [http://mikrocontroller.cco-ev.de/eng/ AVR webserver] RTL8019, 3COM (E) &lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter Kits for different Microcontrollers (D)&lt;br /&gt;
* [http://www.olimex.com Olimex Ltd.] DevelopmentBoards and Tools&lt;br /&gt;
* [http://www.krause-robotik.de Krause Robotik] Controller Boards &amp;amp; Zubehör&lt;br /&gt;
* [http://www.robotikhardware.de robotikhardware.de] Controller Boards&lt;br /&gt;
* [http://www.embedded-it.de/microcontroller/microcontroller-module.php Embedded-IT] USB Module auf AVR Basis sowie Ethernut kompatible Embedded Ethernet Mikrocontroller Boards für Industrie und Hobby auf ARM mit Nut/OS Betriebssystem&lt;br /&gt;
* [http://www.ssv-embedded.de SSV Embedded Systems] 32-bit Mikrocontrollermodule und -boards, Starter Kits etc.&lt;br /&gt;
* [http://shop.embedit.de/browse_002_21__.php Embedit] Mikrocontrollermodule und -boards&lt;br /&gt;
* [http://www.display3000.com Display3000] Farbdisplays, Mikrocontrollermodule und -boards mit TFT-Farbdisplays; Experimentierplatinen und Ansteuerplatinen für TFT Farbdisplays&lt;br /&gt;
* [http://www.myavr.de myAVR] Einsteigerboards und Zubehör&lt;br /&gt;
* [http://www.siphec.com/ SIPHEC] Development Boards für AVR, MSP430, USB&lt;br /&gt;
* [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MTY5OTgxOTk=&amp;amp;w=OTk4OTY4&amp;amp;ts=0 ATMEL Evaluations-Board Bausatz] ([http://www.pollin.de/shop/downloads/D810038B.PDF PDF]) und [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MzU5OTgxOTk=&amp;amp;w=OTk4OTY4&amp;amp;ts=0 ATMEL Funk-Evaluations-Board Bausatz] ([http://www.pollin.de/shop/downloads/D810046B.PDF PDF]) von Pollin&lt;br /&gt;
* [http://www.lochraster.org/etherrape/ Etherrape] Atmaga 644 mit Ethernet und TCP/IP als Bausatz.&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c4_Programmer.html AVR Programmieradapter],[http://www.ic-board.de/index.php?cat=c3_Funkmodule.html ZigBee-ready Funkmodule/Funk-USB-Sticks] und [http://www.ic-board.de/index.php?cat=c13_ICradio-Bundles.html Funk Starterkits] von In-Circuit&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c2_ICnova-Module.html AVR32 AP7000 Linux Board] mit 2xEthernet, TFT, Audio, SDCARD, USB-Host/Devive, Funk...&lt;br /&gt;
* [http://www.das-labor.org/wiki/Laborboard Das Laborboard] von das-labor.org (DIY)&lt;br /&gt;
* [http://six.media.mit.edu:8080/6 number six] - Open Source Design, Atmega32. Alle Pins sind auf eine 2x20 Pol Wannenstiftleiste herausgeführt.&lt;br /&gt;
* http://www.maares.de/tools USB Memory Stick am AVR Butterfly. AVR Butterfly Trägerplatine zum Anschluß von VDRIVE, VMUSIC, RFM12.&lt;br /&gt;
* [http://www.wiring.org.co/ Wiring] is an open source programming environment and electronics i/o board for exploring the electronic arts, tangible media, teaching and learning computer programming and prototyping with electronics.&lt;br /&gt;
* [http://www.chip45.com/ chip45] Atmel AVR Module und Boards mit USB, RS232/485, CAN, Ethernet, Funkmodule, sowie ISP Programmieradapter.&lt;br /&gt;
* [http://www.rakers.de/catalog Dr. Rakers] &amp;lt;b&amp;gt;AVR Boards und Experimentierplatinen&amp;lt;/b&amp;gt; mit USB, Ethernet, RS232, CAN, LCD etc. in hochwertiger Qualität zu günstigen Preisen.&lt;br /&gt;
* [http://nibo.nicai-systems.de Roboterbausatz Nibo] - autonomer &amp;lt;b&amp;gt;Roboter&amp;lt;/b&amp;gt; mit einem ATmega128 und einem ATmega88&lt;br /&gt;
* [http://www.aevum-mechatronik.de Modularis] - AVR Mikrocontroller-Boards (z.T. mit Zusatz-Speicher und USB) die über Flachbandkabel erweitert werden können. Es gibt bis jetzt Zubehör-Module mit Taster, Motor H-Brücke, XBee und Winkelsensor.&lt;br /&gt;
* [http://www.schramm-software.de/bausatz/ Schramm-Software] - AVR Mikrocontroller-Bausätze&lt;br /&gt;
* [http://www.alvidi.de/ Alvidi] - Headerboards mit AVR &amp;amp; AVR32 Controllern&lt;br /&gt;
* [http://www.steitec.net/ Steinert Technologies] - Thailändischer Anbieter von Mikrocontroller Boards (AVR, ARM7, ARM9, PIC, dsPIC, PSoC, uvm.)&lt;br /&gt;
* Arduino&lt;br /&gt;
** [http://www.arduino.cc/ Arduino] Homepage&lt;br /&gt;
** [http://www.freeduino.org/ Freeduino.org] - Riesige Linksammlung zu dem &#039;&#039;&#039;Ardunio&#039;&#039;&#039;(R) AVR-Board (Kit) und dessen Clones und Mutanten (DIY oder Kit)&lt;br /&gt;
** [http://www.freeduino.de/ freeduino.de] - Anleitungen und Tutorials, Arduino Wiki, Blog, Tools in Deutsch&lt;br /&gt;
** [http://shieldlist.org/ Arduino Shield List]&lt;br /&gt;
* [http://www.fritzing.org Fritzing] nützliches Programm für viele Betriebsysteme zur Unterstützung eines Brettboard-Aufbaus(ungetestet).&lt;br /&gt;
* [http://www.specialprint.eu Specialprint] InkjetDruck für den digitalen Direktdruck von Ätzmasken, Lötstoppmasken, Frontplatten, Kennzeichnungen&lt;br /&gt;
* [http://www.onlinesteuerung.de Onlinesteuerung.de] USB Bausatz. Technische Geräte per PC, Browser, Netzwerk, Ethernet, TCP/IP, Internet, Excel, Timer oder Sensoren schalten.&lt;br /&gt;
* [http://8devices.com/product/3/wi-fi-4-things Carambola WiFi module] Open hardware Linux friendly (OpenWRT) WiFi 802.11n OEM module&lt;br /&gt;
* [http://www.atxmega-board.de ATxMegaBoard und ATxMegaStick] Entwicklungsboards, zum Einstig in die Welt der ATxMegas&lt;br /&gt;
* [http://thinkembedded.ch/AVR:::21.html Thinkembedded Webshop, Schweiz] div. Olimex Demoboarde ab SFr 18.- / 14 Euro&lt;br /&gt;
* [https://shop.trimension.de Elektronische Baugruppen der AVR-Familie] Entwicklungs- und Breakout-Boards der Atmel AVR/XMEGA-Familie&lt;br /&gt;
&lt;br /&gt;
=== Programmierhard- und Software ===&lt;br /&gt;
* [http://www.obdev.at/products/avrusb/avrdoper.html AVR-Doper] Einfach nachzubauender, STK500-kompatibler Programmer mit USB-Anschluss. Beherrscht auch HVSP, nicht jedoch HVPP. Open Source.&lt;br /&gt;
* [http://www.bsdhome.com/avrdude/ AVRDUDE] AVR ISP-Programmerierwerkzeug für Unix/Linux/BSD und Windows. Kommandozeile [http://sourceforge.net/projects/avrdude-gui/ (oder mit GUI)], AVR Butterfly-Unterstützung&lt;br /&gt;
* [http://www.lancos.com/prog.html PonyProg] neben AVR für diverse seriell programmierbare Bauteile (Grafische Nutzeroberfläche und Kommandozeile), siehe auch [[Pony-Prog Tutorial]]&lt;br /&gt;
* [http://savannah.nongnu.org/projects/uisp/ uisp] AVR ISP-Programmierwerkzeug für Unix/Linux/BSD und Windows (Kommandozeile)&lt;br /&gt;
* [http://www.myplace.nu/avr/yaap/ yaap]&lt;br /&gt;
* [http://www.xs4all.nl/~sbolt/e-index.html SP12]&lt;br /&gt;
* [http://www.der-hammer.info/hvprog STK500 kompatibler Programmer] als Nachbauprojekt. Siehe auch [[STK500]&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=73&amp;amp;products_id=41 Preiswerter Standard ISP (STK200 kompatibel)]&lt;br /&gt;
*  [http://www.siwawi.arubi.uni-kl.de/avr_projects/evertool/ Evertool] kombinierter ISP &amp;amp; [[JTAG]] Programmer (kompatibel zum &amp;quot;original&amp;quot; Atmel AVRISP und Atmel JTAGICE) &lt;br /&gt;
* [http://www.olimex.com Olimex] (Bulgarischer Anbieter) Kostengünstig&lt;br /&gt;
* [http://www.avr-projekte.de/isp.htm AVR910-USB Programmer] incl. USB-Modul und USB-&amp;gt;Seriell Wandler&lt;br /&gt;
*[http://www.fischl.de/usbasp/ USBasp] &amp;amp;#8211; USB-Programmer bestehend aus ATmega8 (kein spezieller USB-Chip notwendig)&lt;br /&gt;
* [https://guloshop.de/shop/Mikrocontroller-Programmierung/guloprog-der-Programmer-von-guloshop-de::70.html USBasp – USB-Programmer guloprog] (ca. 5,00 €) mit Signalwandlerfunktion, bestehend aus ATtiny85 (kein spezieller USB-Chip notwendig)&lt;br /&gt;
* [[Bierdeckel-Programmer]] – USBasp mit ATtiny85, sehr wenige Bauteile, leicht nachzubauen&lt;br /&gt;
* [http://home.arcor.de/bernhard.michelis Amadeus-USB] - Highspeed-Programmer für PIC18, PIC24, dsPIC30, PIC32, dsPIC33 und AVR. Bietet auch Möglichkeiten zur Fehlersuche.&lt;br /&gt;
* [http://www.e-dsp.com Signalgenerator] - Signalgenerator software&lt;br /&gt;
* [http://www.piketec.com/products/tpt.php Time Partition Testing (TPT)] - Test-, und Testauswertewerkzeug für eingebettete Systeme&lt;br /&gt;
* [http://shop.myavr.de/Programmer.htm?sp=artlist_kat.sp.php&amp;amp;katID=16 mySmartUSB] - USB Programmer (ab 15€) kombiniert auch mit USB-UART-Bridge, STK500v2/AVR910/AVR911 kompatibel, ISP HV-seriell, HV-parallel&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=73&amp;amp;products_id=161 USB-Programmer für Bascom Programmierer]&lt;br /&gt;
* [http://www.virtualserialport.com/ Virtual Serial Port] Software for serial port communication and null-modem emulation&lt;br /&gt;
* [http://www.windautopilot.de/bcalmxp/SimpleSerial.zip] SimpleSerialTerminal, ein einfaches Tool für die serielle Schnittstelle, (freeware)&lt;br /&gt;
* [http://www.helmix.at/hapsim/index.htm HAPSIM graphischer Simulator ] zu graphischen Simulation von Tasten /LED /LCD und Terminal in AVR Studio Freeware !!!&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c4_Programmer.html AVR Programmieradapter und JTAGICE MKII]&lt;br /&gt;
* [http://www.myavr.de/download.php?suchwort=ProgTool myAVR ProgTool] nette Programmieroberfläche (free)&lt;br /&gt;
* [http://b9.com/elect/avr/kavrcalc/ KAVRCalc] is a free calculator to assist in programming AVR microcontrollers (Baudrate, Watchdog, Timer, ...)&lt;br /&gt;
* [http://www.chip45.com/CrispAVR-USB CrispAVR-USB] STK500 V2 kompatibler ISP Adapter mit USB Schnittstelle für Atmel AVR Mikrocontroller (1,8V-5,5V).&lt;br /&gt;
* [http://ucom-ir.nicai-systems.de UCOM-IR] - Programmieradapter mit USB Schnittstelle (AT90USB162) und IR-Sender/Empfänger, STK500 V2 kompatibel&lt;br /&gt;
* [http://www.anagate.de/products/programmers.htm AnaGate Programmer] Serielle Programmer mit LAN-Anschluss für I2C und SPI inkl. Programmier-API für Windows/Linux (Shop)&lt;br /&gt;
* [http://www.halec.de/roloFlash/?ref=wiki_links.mikrocontroller.net roloFlash] - mobiles Flashgerät ohne PC (standalone), flexibel durch eingebaute Skriptsprache roloBasic&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/AVR-ISP-Stick AVR-ISP-Stick] Sehr günstiger (6,90€!) und bereits über 500 mal bewährter AVR-Programmer mit USB-Anschluss&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=com.wesche.javad2xxmpsseavrprogrammer&amp;amp;hl=de Android AVR Flasher over FTDI] Program AVR Atmel Chips with FTDI chips (MPSSE mode) on Android&lt;br /&gt;
&lt;br /&gt;
=== Projekte und Quellcodebibliotheken ===&lt;br /&gt;
&lt;br /&gt;
====Bibliotheken====&lt;br /&gt;
* [http://www.sigem-elektronik.de/elektro/cad/eagle/biblio/eaglebib.htm Cadsoft Eagle Bibliotheken]&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/ AVR Libc]&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/index.html Procyon AVRlib]&lt;br /&gt;
* [http://homepage.hispeed.ch/peterfleury Peter Fleury&#039;s Pages] - UART / LCD (HD44780) / I²C (TWI)/ AVR-GCC Bibliotheken, STK500v2 Bootloader&lt;br /&gt;
*[http://sourceforge.net/projects/avrfix  Fixed Point Library Based on ISO/IEC Standard DTR 18037 for Atmel AVR microcontrollers, u.a. Cordic-Algorithmen] und [http://www.enti.it.uc3m.es/wises07/presentations/session2/05%20-%20Fixed%20Point%20Library%20According%20to%20ISOIEC%20Standard%20DTR%2018037%20for%20Atmel%20AVR%20ProcessorsWISES07-fixedpointlibrary%20-%20Elmenreich.pdf  Kurzbeschreibung dazu als Powerpoint-PDF TU Wien Febr. 2007]&lt;br /&gt;
&lt;br /&gt;
==== Betriebssysteme &amp;amp; Co. ====&lt;br /&gt;
* [http://www.tinyos.net/ TinyOS] - Komponentenbasiertes Betriebssystem für Sensorknoten. Bringt eigene C-ähnliche Hochsprache nesC mit.&lt;br /&gt;
* [http://www.chris.obyrne.com/yavrtos/ YAVRTOS] - Yet Another Atmel® AVR® Real-Time Operating System von Chris O&#039;Byrne (C, Atmega32, GPL3 Lizenz)&lt;br /&gt;
* [http://www.freertos.org/ FreeRTOS] is a portable, open source, mini Real Time Kernel - a free to download and royalty free RTOS that can be used in commercial applications. (AVR, MSP430, PIC, ARM7, ...)&lt;br /&gt;
* [http://www.barello.net/avrx/index.htm AvrX Real Time Kernel] (IAR ASM oder IAR/GCC C, GPL2 Lizenz)&lt;br /&gt;
* [http://scmrtos.sourceforge.net/ scmRTOS] - Single-Chip Microcontroller Real-Time Operating System (C++, AVR, MSP430, Blackfin, ARM7, FR (Fujitsu, [http://www.opensource.org/licenses/mit-license.php MIT Lizenz]).&lt;br /&gt;
* [http://www.circuitcellar.com/avr2004/DA3650.html csRTOS] - cooperative single-stack RTOS aus dem Circuit Cellar AVR 2004 Design Contest.  [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_id=987&amp;amp;item_type=project csRTOS port to ATmega32] und [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=50743&amp;amp;start=all&amp;amp;postdays=0&amp;amp;postorder=asc Diskussion] auf www.avrfreaks.net führte zur Weiterentwicklung als [http://www.mtcnet.net/~henryvm/4AvrOS/ 4AvrOS] - cooperative scheduler&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_type=project&amp;amp;item_id=230 OPEX] - freeware cooperative scheduler with lots of calendar and I/O functions von Steve Childress (Download auf www.avrfreaks.net ggf. Registrierung notwendig)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/12176#79672 Scheduler] von Peter Dannegger&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25087#186454 RTC-Scheduler] von ape&lt;br /&gt;
* [http://www.sics.se/~adam/pt/ Protothreads] - Lightweight, Stackless Threads in C (open source BSD-style license)&lt;br /&gt;
* [http://www.micrium.com/products/rtos/kernel/rtos.html uC/OS-II] is a real time operating system developed by Jean J. Labrosse. You can obtain the source code for the OS by buying Labrosse&#039;s excellent book &#039;&#039;MicroC/OS-II The Real-Time Kernel (2nd edition)&#039;&#039;. [http://www.ee.lut.fi/staff/Julius.Luukko/ucos-ii/avr/index.shtml Port for AVR (gcc 3.x)] and [http://www.myplace.nu/avr/ucos/index.htm AVR (gcc 2.x)].&lt;br /&gt;
* [http://freshmeat.net/projects/qp/ QP] is a lightweight, portable framework/RTOS for embedded systems (ARM, Cortex-M3, 8051, AVR, MSP430, M16C, HC08, NiosII, and x86). GPL (und kommerzielle Lizenz verfügbar)&lt;br /&gt;
* [http://www.femtoos.org/ Femto OS] von  Ruud Vlaming ist ein preemptives Betriebssystem für die kleinsten Mikrocontroller aus der AVR Serie bis ca. 16 KB ROM und 1 KB RAM. Spezielle Targets sind: ATtiny861/461/261. Geschrieben in C. Freie Software, GPLv3. Artikel in Elektor Februar 2010 &lt;br /&gt;
* [http://www.projects-lab.com/?p=344 kaOS] is a real-time, multithreaded, preemptive operating system for the ATmega32 microcontroller, which loads and executes programs from a Secure Digital or MMC card. Authors Nicholas Clark &amp;amp; Adam Liechty. (Circuit Cellar AVR Wettbewerb 2006)&lt;br /&gt;
* [http://helium.sourceforge.net/ Helium] is a minimalistic real-time kernel for the HC(S)08 core by Freescale and Atmel AVR.&lt;br /&gt;
* [http://dev.bertos.org/ BeRTOS] is a completely free, open source, real time operating system (RTOS) suitable for embedded platforms. Runs on many microprocessors and microcontrollers, ranging from 8 bits to 32 bits CPUs and even PCs.&lt;br /&gt;
* [http://funkos.sourceforge.net/ funkos] Targets: AVR, XMEGA, MSP430, Cortex M3, Open Source&lt;br /&gt;
* Vergleich zwischen [http://antipastohw.blogspot.com/2009/11/4-operating-systems-for-arduino.html 4 Operating Systems for the Arduino] auf [http://antipastohw.blogspot.com Liquidware Antipasto]&lt;br /&gt;
** &#039;&#039;&#039;DuinOS&#039;&#039;&#039; by RobotGroup (FreeRTOS Portierung)&lt;br /&gt;
** [http://www.skewworks.com/pyxis/ Pyxis OS] by ArduinoWill&lt;br /&gt;
** &#039;&#039;&#039;ArduinoMacOS&#039;&#039;&#039; by Mark&lt;br /&gt;
** &#039;&#039;&#039;TaOS&#039;&#039;&#039; by Ziplock&lt;br /&gt;
* [http://atomthreads.com/ Atomthreads] is a free, lightweight, portable, real-time scheduler for embedded systems. (BSD Lizenz)&lt;br /&gt;
* [http://www.shift-right.com/xmk/ XMK] (eXtreme Minimal Kernel) ist ein freies Echtzeitbetriebssystem für Mikrocontroller (AVR, H8, R8C, M16C).&lt;br /&gt;
* [http://irtos.sourceforge.net/index.html.en iRTOS] is an free Real Time Operating System. The iRTOS kernel is free to download and use under the terms of LGPL. It can be used in commercial applications. iRTOS is designed for tiny 8 bit microconroller chips with little RAM usage. OS can be installed also in 16 and 32 bit processor units.&lt;br /&gt;
* [http://sites.google.com/site/cocoosorg/avr-projects/home cocoOS] is a cooperative task scheduler, based on coroutines and it is written in C. (STK500, Atmega16)&lt;br /&gt;
* [http://www.DieProjektseite.de BasicBeetle] Basic-Betriebssystem im AVR&lt;br /&gt;
* Shells für Arduino:&lt;br /&gt;
** [http://biot.com/arsh/ ARSH]&lt;br /&gt;
** [http://www.battledroids.net/downloads/avrsh.html AVRSH]&lt;br /&gt;
** [http://bitlash.net/wiki/start BITLASH]&lt;br /&gt;
** [http://sourceforge.net/projects/fruitshell/ FRUITSHELL]&lt;br /&gt;
** [http://www.gisvold.co.uk/~gisvold/drupal/node/1484 BREAKFAST]&lt;br /&gt;
* [http://nootropicdesign.com/toolduino/ toolduino] is a simple software tool that lets you easily interact with your Arduino hardware so you can test the circuits you create. Toolduino is written in the [http://processing.org/ Processing] languange and is available for Windows, Mac OS X, and Linux. Toolduino uses the the [http://www.arduino.cc/playground/Interfacing/Processing Arduino library for Processing] to communicate with an Arduino board so you can manipulate output pins and read inputs. The Arduino must be running the [http://firmata.org/wiki/Main_Page Firmata] firmware that comes with the Arduino IDE. (LGPL)&lt;br /&gt;
* [http://www.mueller-torres.de/avr.php MOPS] - A small C and Assembly based operating system for the ATMEL AVR® 8-Bit RISC controller family.&lt;br /&gt;
* [http://www.hk-businessconsulting.de/rts.htm RTS(Realtime Tasking System)] - Betriebssystemkern mit Echtzeiteigenschaften, Lizenz: EUPL V. 1.1&lt;br /&gt;
&lt;br /&gt;
==== Projektsammlungen ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.DieProjektseite.de Die Elektronik-Projektseite und Heimat des BasicBeetle] Hauptthema ist der BasicBeetle. Ein modularer, leistungsfähiger, in Basic programmierbarer Mikrorechner speziell für Steuerungen. Mit vielen Programmen, Tiipps und Tricks, Informationen...&lt;br /&gt;
* [http://www.Happy-Micro.de Happy-Micro.de] Die Internetsite für Hobbyelektroniker, Mikrocontroller-Anwender, Programmierer und alle, die Spaß an Computern und Elektronik haben. Bei Happy-Micro.de steht der Spaß am Entwickeln von Programmen und Schaltungen im Vordergrund. Jeder Benutzer hat die Möglichkeit auch als Autor mitzumachen und seine Schaltungen oder Programme zu veröffentlichen. Freier Bilderdownload für die eigene Homepage. &#039;&#039;(Seite wurde geschlossen!)&#039;&#039;&lt;br /&gt;
* [http://iwenzo.de Elektronik und Informationen] Wissenswertes aus der Unterhaltungselektronik..&lt;br /&gt;
* [http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/ Cornell University ECE 476 Microcontroller Design Final Projects] &lt;br /&gt;
* [http://www.serasidis.gr/ Serasidis Vasilis&#039; AVRsite] u.a. GLCD, SMS, PAL&lt;br /&gt;
* [http://www.riccibitti.com Alberto Ricci Bitti] u.a. PAL Video-Interface&lt;br /&gt;
* [http://www.ulrichradig.de Mikrocontroller and more] AVR - Projekte (Ethernet, LCD, Relaiskarte usw.) und mehr&lt;br /&gt;
* [http://home.arcor.de/burkhard-john/index.html Burkhard John] (D)&lt;br /&gt;
* [http://www.avrprojects.net/ AVRmicrocontrollerprojects] u.a. Text-LCD, Schrittmotor, Thermometer&lt;br /&gt;
* [http://hem.bredband.net/robinstridh/ Robin Stridh] Rotor-Anzeige, Video-Interface&lt;br /&gt;
* [http://www.dertien.dds.nl/content/avrprojects.html dertien.dds.nl AVR-Projects]&lt;br /&gt;
* [http://www.microsps.com MicroSPS.com] Grafische Programmierung des AVR mit EAGLE&lt;br /&gt;
* [http://www.h-mpeg.de h-mpeg Festplatten mp3 Player] IDE Ansteuerung, IDE Filesystem, LCD Ansteuerung etc. in 8K Code. Quelltext unter GPL&lt;br /&gt;
* [http://www.embedtronics.com/ embedtronics.com]&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects  M. Thomas&#039; AVR Projekte] untern Anderem AVR Butterfly avr-gcc-port, DB101 gcc-port, BC100 gcc-port, Bootloader, Programmier- und Debughardware, Software-UART, DS1820-Lib., experimentelle avrdude-Versionen, AVR und CAN mit MCP2515 &amp;lt;!-- Vorsicht &amp;quot;Eigenwerbung&amp;quot; --&amp;gt;&lt;br /&gt;
* [http://www.mictronics.de Michaels Electronic Projects] AVR Projekte (EN) - ua. Sony/Becker CD/MD Wechsler Emulator, RDS-Decoder, GPS Infos, OBD J1850 VPW Interface, USB&amp;lt;&amp;gt;CAN Bus Interface. Informationen zu CD Wechsler Protokollen. MP3stick - MP3 Player mit ATmega128, color LCD, SD/MMC Karte und VS1011b&lt;br /&gt;
* [http://www.stahlbucht.de/elektronik/node13/ node13] modulares AVR 8515 Projekt: eine Controller-Platine, an die sich weitere Ein-Ausgabemodule (Tastenfeld, LEDs, LCD-Modul) anschliessen lassen&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2 Roboternetz-Mikrocontroller Projekte.de] Diverse Projekte mit AVR und anderen Controllern, insbesondere im Bereich Robotik&lt;br /&gt;
* [http://www.avr-projekte.de AVR-Projekte.de] Belichtungstimer, FT232RL Schaltungen,LED-Fading über Fernbedienung, HD44780-LCD über USB und Seriell, AVR910-USB Programmer, Basteleien: Ätzmaschine,Kompressor.&lt;br /&gt;
* [http://openeeg.sourceforge.net/ openeeg.sourceforge.net] Das OpenEEG Projekt befasst sich mit der Entwicklung eines preiswerten Elektro-Enzephalographie (EEG) Geräts und dessen freier Steuersoftware zur Messung elektrischer Gehirnströme. Sein µPC-Herz ist ein AT90S4433 bzw. ein ATmega8. Ziel sind auch verschiedene EEG Anwendungen z.&amp;amp;nbsp;B. im Bereich mentaler Trainingsmethoden (Neurofeedback).&lt;br /&gt;
* [http://www.amateurfunkbasteln.de/ www.amateurfunkbasteln.de] Seite von Michael Wöste (DL1DMW) u.a. CPU-Board mit AT89C2051, AT89C4051 oder AVR AT90S2313, CPU-Board mit Atmel AT90S8535, Experimentierplatine mit ATmega103, Programmer für AT89C2051/AT89C4051, 32-Kanal-Logik-Analysator bis 40 MHz (Entwurf von David L. Jones)&lt;br /&gt;
* [http://www.atmel.com/dyn/products/app_notes.asp?family_id=607 Atmel - AVR 8-Bit RISC - Application Notes] Anwendungshinweise und Beispiele vom Hersteller&lt;br /&gt;
* [http://www.projects.cappels.org/ Dick Cappels&#039; Project Pages]&lt;br /&gt;
* [http://see-by-touch.sourceforge.net/index.html SeebyTouch - Blinden-Seh-Ersatzsystem] Computerbilder fühlen durch ein einfaches Gerät (Bauanleitung) und freier Software (für 10 Betriebssysteme) - eine neue Erfahrung für alle&lt;br /&gt;
* [http://www.loetstelle.net www.loetstelle.net] Verschiedene kleinere AVR-Projekte rund um LEDs, z.&amp;amp;nbsp;B. RGB Dimmer, Moodlight. Diverse Elektronikprojekte und Grundlagen&lt;br /&gt;
* [http://www.dietmar-weisser.de Selbstbauprojekte Elektronik] kleine Sammlung von Elektronikprojekten zum Thema Leiterplattenfertigung, Hochfrequenztechnik und Mikrocontroller.&lt;br /&gt;
* [http://www.myplace.nu/avr/ Jesper&#039;s AVR pages] Yampp MP3 Player, Yaap Programmer, DDS mit 2313+R2R, Gitarrentuner, Frequenzzähler.&lt;br /&gt;
* [http://www.microsyl.com/ MicroSyl MCU] MP3 Player, MegaLoad, HCLoad, Propeller Clock, Freq Meter, BarCode Reader, Door Bell, OneWire Lib, Text LCD Lib, Graph LCD Lib, Nokia LCD Lib, Led Sign with MMC MemoryCard, Intercom&lt;br /&gt;
* [http://www.jeroen.homeunix.net/ http://www.jeroen.homeunix.net/] Aufbau eines elektronischen Rouletts auf basis eines AVRs&lt;br /&gt;
* [http://thomaspfeifer.net thomaspfeifer.net] Reflow-Ofen, Laminator-Temperaturregelung, USB-Atmel-Programmer, SMD-Tricks u.v.m.&lt;br /&gt;
* [http://www.scienceprog.com Scienceprog - embedded theory and projects] - AVR, ARM theory and projects&lt;br /&gt;
* [http://www.iuse.org Hausautomatisierung] - CAN-Bus mit ATmega32-Controllern und Bedienfeldern, Admin-Tools zum Updaten via CAN, Traffic Dumper etc.&lt;br /&gt;
* [http://www.myevertool.de AVRSAM] - AT91SAM7S Header Board annährend 100% Pinkompatibel zu den folgenden AVR Mikrocontroller: AT90S8535 / ATMEGA8535 / ATMEGA16 / ATMEGA32&lt;br /&gt;
* [http://members.aon.at/hausbus Hausbus Home] - Hausbus-Projekt unter Verwendung von ATmega8, ATtiny13 und ATmega128&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/AVR/avr-dcf-clock.html AVR-DCF-Clock] - DCF-Uhr mit bunter LED-Anzeige - ATmega8&lt;br /&gt;
* [http://www.grasbon.de/genuhr.html GenuhR] - DCF-Funkuhr / Wecker/ Timer mit LED-Punktmatrixanzeige. Das Projekt beschreibt den Aufbau des kompletten Gerätes beginnend beim Schaltplan bis hin zur Montage in ein Gehäuse.&lt;br /&gt;
* [http://www.avrguide.com/ AVR Projektsammlung] bei www.avrguide.com&lt;br /&gt;
* AVR Synth http://www.elby-designs.com/avrsynth/avrsyn-about.htm http://www.jarek-synth.strona.pl/&lt;br /&gt;
* [http://elm-chan.org/he_e.html Electronic Lives Manufacturing] - Aufbauten in Fädeldrahttechnik, tlw. auf Japanisch, aber mit englischen Sourcecodes&lt;br /&gt;
* AVR Synthesizer http://www.avrx.se/&lt;br /&gt;
* [http://www.wedis-basteleck.de/ Wedis-Basteleck] - Modellbahn DCC-Servo-Zubehördecoder DCC Servo Decoder mit ATmega8 / Servo Differenzierbaugruppe für Modellbau&lt;br /&gt;
* http://web.archive.org/web/20050415222337/http://www.hebel23.de/ RDS RADIO: ATMega32, TEA5757, T6963C, TDA7330B in C&lt;br /&gt;
* [http://www.gasenzer.dk Analog/Digital and MPU Eletronic Projects] PAL/VGA Terminal, CallerID, Ethernet, Wireless Bridge, LPC2214, AT91RM9200, Sony Unilink Controlled Wireless MP3 Player.&lt;br /&gt;
* [http://www.circuitcellar.com/avr2004/ Circuit Cellar AVR Design Contest 2004] mit Projektbeschreibungen&lt;br /&gt;
* [http://www.circuitcellar.com/avr2006/ Circuit Cellar AVR Design Contest 2006] mit Projektbeschreibungen&lt;br /&gt;
* [http://www.heesch.net/microcontroller.aspx/ Homepage von Stefan Heesch] - AVR Mikrokontroller Projekte, z.B. WLAN und AVR, netzwerkgesteuertes RGB Licht, IDE-Interface, DS1821 Thermometer, Morse-Dekoder u.a.&lt;br /&gt;
* [http://www.schaltungsforum.de Das Schaltungsforum] ist eine Seite für Anfänger und Profis welche ständig mit Tutorials erweitert wird. Stellt Eure Projekte online. Die Seite befindet noch im Aufbau und Eure Mithilfe ist erwünscht.&lt;br /&gt;
* [http://avrprojekte.de/] Viele Projekte mit LEDs(LED-Matrixen) und AVRs&lt;br /&gt;
* [http://wiki.trimension.de/wiki/Artikel_%C3%9Cbersicht wiki.trimension.de] Tutorial zum Auslesen eines TSIC, ein Belichtungsgerät, einfache PWM-Dimmer und andere Projekte mit AVR-Mikrocontrollern&lt;br /&gt;
* [http://arduino.milkcrate.com.au/ little-scale&#039;s arduino page]&lt;br /&gt;
* [http://www.sebastianweidmann.de www.sebastianweidmann.de] Grundlagen zum Thema Platinen ätzen, Bohren, Durchkontaktierungen und Projekte Tipps/Tricks mit Atmel AVR Microcontrollern&lt;br /&gt;
*[http://www.jtronics.de/avr-projekte.html Junghans Electronic Page] u.a Nokia 3310 LCD Ansteuerung in &amp;quot;C&amp;quot;(aktualisiert 2010), TWI/USI, Quadcopter&lt;br /&gt;
* [http://www.familie-finke.com/ http://www.familie-finke.com/] Die Website von Thomas Finke mit diversen Elektronikprojekten, wie z.B. STK-LAN (AVR im Netzwerk mit HTTPD, SNMP,...), UV-LED-Belichter, HPGL-Plotter.&lt;br /&gt;
* [http://phil-zone.de/ Philips Projektsammlung] Elektronik Projekte (µC,CMOS,Analog,...), Tutorials und nützliche Online-Tools&lt;br /&gt;
* [http://www.iuac.res.in/~elab/phoenix/index.html Phoenix] allows you to develop science experiments  by connecting  sensor / control elements to a computer and access them through software. The project was started by Inter University Accelerator Centre, with the objective of improving the laboratory facilities at Indian Universities, and growing with the support of the user community. Phoenix depends heavily on Python language. The data acquisition, analysis and writing simulation programs to teach science and computation. The hardware design is freely available. The project is based on Free Software tools and the code is distributed under GNU GPL. (Atmega16)&lt;br /&gt;
* [http://code.google.com/p/usb-pwm-generator/ USB PWM Generator] Low Cost PWM Generator, über USB Programmierbar. 1Hz - 120khz Duty Cycle 1 - 99 %.&lt;br /&gt;
* [http://www.electronicshub.org/ Electronics Hub] - Huge collection of electronics projects, free electronics circuits and other technical information is available for Engineering students.&lt;br /&gt;
&lt;br /&gt;
==== Schnittstellen &amp;amp; Protokolle ====&lt;br /&gt;
===== Ethernet (TCP/IP...) =====&lt;br /&gt;
* Kostengünstige und schnelle WLAN Anbindung an Mikrocontroller mit Wiz610wi. Bezugsquelle inkl. praktischer Adapterplatine bei: [http://www.shop.display3000.com/elektronikmodule/ethernet-wlan/index.html Display3000]&lt;br /&gt;
* [http://www.laskater.com/projects/uipAVR.htm TCP/IP Stack für AVR] mit Realtek RTL8019AS oder Axis AX88796 Netzwerk-Chips (open source für avr-gcc und Imagecraft). Passende Hardware in [http://www.edtp.com/ diesem online-shop]&lt;br /&gt;
* [http://www.ethernut.de Ethernut] - AVR based Hardware with Ethernet-Interface, Multithreading OS, Software and Hardwaredesign is free&lt;br /&gt;
* [http://www.embedded-it.de/microcontroller/eNet-sam7X.php eNet-sam7X] Embedded Ethernet Modul im DIL64 Format mit kompletten OpenSource Board Support Packake auf Ethernut / Nut/OS Basis. Industrie geeignet&lt;br /&gt;
* [http://www.ethersex.de/index.php/Feature_Liste Ethersex] - Trotz des bescheuerten Namens sehr empfehlenswert. Viele flexibel einbindbare Module für diverse Hardware.&lt;br /&gt;
* [http://wiki.neo-guerillaz.de OpenMCP] Bekanntes Board auf Basis des ATmega2561 und ENC28j60. Läuft auch auf dem AVR-NETIO und dem myAVR.&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUDP/IgorPlug-UDP%20(AVR)_eng.htm IgorPlug-UDP AVR] - Ethernet &amp;amp; UDP/IP in Software implementiert&lt;br /&gt;
* [http://members.home.nl/bzijlstra/software/examples/RTL8019as.htm] RTL8019 Bascom&lt;br /&gt;
* [http://members.home.nl/bzijlstra/software/examples/RTL8019as.htm AVR und RTL8019]&lt;br /&gt;
* [http://avr.auctionant.de/avr-ip-webcam AVR IP Webcam] &lt;br /&gt;
* http://mikrocontroller.cco-ev.de/de/webcam.php&lt;br /&gt;
* [http://avr.auctionant.de/avrETH1/ avrETH1 - Webserver mit enc28j60 und Webcam-Support]&lt;br /&gt;
* [http://www.sics.se/~adam/uip/ uIP-Stack, Teil des Contiki OS]&lt;br /&gt;
* [http://www.sics.se/~adam/lwip/ LwIP-Stack]&lt;br /&gt;
* [http://www.harbaum.org/till/spi2cf/ WLAN-Implementierung auf Basis einer PRISM-CF-Karte und uIP]&lt;br /&gt;
* http://www.circuitcellar.com/AVR2006/winners/DE/AT2581.htm MEGA128(CAN) PCMCIA&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c2_ICnova-Module.html AVR32 AP7000 Linux Board] mit 2xEthernet, TFT, Audio, SDCARD, USB-Host/Devive, Funk...&lt;br /&gt;
* [https://berlin.ccc.de/wiki/AVR-Board_mit_Ethernet AVR-Board mit Ethernet mit dem ENC28J60 von Microchip]&lt;br /&gt;
* [http://www.roland-riegel.de/mega-eth/ AVR-Ethernet-Board mit extra SRAM, SD/MMC, USB und zugehöriger Software]&lt;br /&gt;
&lt;br /&gt;
===== CAN =====&lt;br /&gt;
* [http://www.canathome.de/ Can@Home] - CAN als &amp;quot;Installationsbus&amp;quot;, u.a. mit AVRs (D)&lt;br /&gt;
* [http://www.iuse.org/ www.iuse.org] - Hausautomatisierung auf CAN Basis&lt;br /&gt;
* [http://www.port.de/ www.port.de] - Professionelle CAN/CANopen Entwicklungswerkzeuge&lt;br /&gt;
* [http://can-wiki.info CAN-WIKI] - spezielle Wiki Site für CAN bus (Englisch)&lt;br /&gt;
* [[CAN-Bus]] - Eintrag in diesem Wiki&lt;br /&gt;
* [[CAN als Hausbus]] - Eintrag in diesem Wiki&lt;br /&gt;
* [http://www.canhack.de/ www.canhack.de] - Ein Forum, dass sich mit dem CAN bus im Auto beschäftigt&lt;br /&gt;
* [http://www.edevices.lt/  www.edevices.lt ] - USB2CAN inexpensive USB to CAN bus converter&lt;br /&gt;
&lt;br /&gt;
===== USB =====&lt;br /&gt;
* [http://www.embedded-it.de/microcontroller/microcontroller-module.php eUSB-162 und eUSB-LCD] - At90USB162 basiertes universelles USB Prototypen / Mikrocontroller Modul und USB Terminal Interface für HD44780 kompatible LCDs auf Basis der Lufa Library&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm Igor-Plug] - USB Device interface in AVR Firmware - no extra Interface IC needed, read the License&lt;br /&gt;
* [http://www.obdev.at/products/vusb/index-de.html V-USB] &amp;amp;#8211; USB-Implementation in C nach gleichem Prinzip wie Igor-Plug, aber einfacher zu verwenden, GPL-ähnliche Lizenz (Nutzung des Projekts &#039;&#039;erfordert&#039;&#039; Veröffentlichung), englisch kommentierter Code&lt;br /&gt;
* [http://www.xs4all.nl/~dicks/avr/usbtiny/ USBTiny] &amp;amp;#8211; weitere Software-USB-Implementierung in C; sehr ähnlich AVR-USB; steht aber unter GPL; relativ wenige Beispiele&lt;br /&gt;
* MJoy USB Joystick Controller on AVR ATmega8&lt;br /&gt;
* [http://www.ime.jku.at/tusb/ TUSB3210-Controller, HID, LIBUSB] Ein Projektseminar, in dem es darum ging, die USB-Schnittstelle des TUSB3210 zu aktivieren und die Daten eines ADC an den PC zu senden. USB-Implementierung für µC und PC.&lt;br /&gt;
* [http://www.b-redemann.de Steuern und Messen mit USB - FT232, 245 und 2232] Das aktuelle Buch zu den USB-Controllern von FTDI. Viele Beispielprogramme in C, zwei Projektbeschreibungen: I²C-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.&lt;br /&gt;
* [http://www.eltima.com/products/usb-over-ethernet/ USB to Ethernet Connector] - Share your USB devices via LAN/Internet&lt;br /&gt;
* [http://www.ixbat.de Viele kleine USB Projekte] Rund um die Bibliothek usbn2mc http://usbn2mc.berlios.de. Dies ist eine einfache Bibliothek für den USBN9604/03 von National Semiconductor&lt;br /&gt;
* [http://www.rahand.eu Mega8D12] - Schritt für Schritt zum virtuellen COM-Port. Ein Einsteiger-Tutorial zur CDC-Klasse mit Schaltung und Firmware (ATmega8 und PDIUSBD12).&lt;br /&gt;
* http://www.maares.de/tools USB_ISO: Isolierter Schnittstellenwandler USB auf RS232 (TTL) mit FT232RL und ADUM1402. Galvanische Trennung für das Zielsystem.&lt;br /&gt;
* [http://www.embedded24.net USB HID Host Treiber] - USB HID Treiber DLL für Windows (Demo Projekte für Visual Studio 2010 C++, C# und VB).&lt;br /&gt;
&lt;br /&gt;
===== DMX512 =====&lt;br /&gt;
* [http://www.hoelscher-hi.de/hendrik/light/profile.htm Hennes Sites] Bauanleitungen für DMX-Dimmerpacks, DMX-Switchpacks, PWM-Controller, ... Tutorial für Senden und Empfangen von DMX-Daten mit AVRs.&lt;br /&gt;
* [http://www.lj-skinny-development.de/lj2000/ DMX Lichtanlage im Selbstbau] Projekt für den Selbstbau einer kompletten Lichtanlage zur Steuerung über DMX. Projekt beinhaltet alles was man für den Betrieb einer eigenen Lichtanlage benötigt (Mischpult, Steuersoftware, Dimmer, Scanner mit Iris, Shutter-Dimmer, 2 rotierenden Goborädern, 2 Farbrädern, CMY-Farbmischeinheit, Prisma, Fokus ...).&lt;br /&gt;
* [http://digital-enlightenment.de Digital Enlightenment ]Verschiedene DMX-Selbstbauprojekte&lt;br /&gt;
&lt;br /&gt;
===== PS2 =====&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_id=1086&amp;amp;item_type=project&amp;amp;timestamp=2007-09-04%2018:34:41 PC keyboard to an AVR]&lt;br /&gt;
&lt;br /&gt;
===== LANC =====&lt;br /&gt;
* [http://dsc.ijs.si/3dlancmaster/ 3D LANC Master from Damir Vrancic] is a device which keeps in synchronisation some of Sony camcorders by using LANC (CONTROL-L, ACC) protocol. (Open Hardware + Open Source, Atmega8).&lt;br /&gt;
* [http://jochendony.homeip.net/content/view/22/26/ LANC Lib] for AVRGCC. Read and write LANC commands.&lt;br /&gt;
* [http://blog.makezine.com/archive/2008/12/controlling_sony_camcorders_with_th.html Controlling Sony camcorders with the Arduino]&lt;br /&gt;
&lt;br /&gt;
===== MMC/SD-Card =====&lt;br /&gt;
* [http://www.roland-riegel.de/sd-reader/index.html MMC/SD card reader example application] von Roland Riegel (Atmega8, Atmega168 für FAT16)&lt;br /&gt;
* [http://www.captain.at/electronic-atmega-mmc.php MMC Flash] bzw.  [http://www.captain.at/electronic-atmega-sd-card.php SD Flash ] Memory Extension für Atmegas von Captain. (Atmega16, Atmega32)&lt;br /&gt;
* http://arm.hsz-t.ch MMC, SD, SDHC Kartentreiber für ARM7 Mikrocontroller&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/FAT32 Wiki und FAT16/32 Bibliothek für atmega]&lt;br /&gt;
&lt;br /&gt;
==== LC-Displays ====&lt;br /&gt;
&lt;br /&gt;
===== Text (character-mode) HD44780 =====&lt;br /&gt;
* [http://jump.to/fleury P.Fleury]&lt;br /&gt;
* avrfreaks Projekt 59 (Chris E.) und andere&lt;br /&gt;
* Procyon avrlib v. Pascal Slang (GPL)&lt;br /&gt;
* Bray&lt;br /&gt;
* [http://www.sprut.de/electronic/lcd/index.htm Spruts LCD-Seite]&lt;br /&gt;
* [http://elm-chan.org/docs/lcd/lcd3v.html Standard-LCD auf 3V betreiben (eng)]&lt;br /&gt;
* [http://www.harbaum.org/till/lcd2usb LCD2USB, LCD mit AVR am USB betreiben]&lt;br /&gt;
* [http://www.simon-brenner.ch/projekte/lcd-display 4x40 LCD Projekt, Microchip]&lt;br /&gt;
&lt;br /&gt;
===== Grafik T6963C etc. =====&lt;br /&gt;
&lt;br /&gt;
* http://www.holger-klabunde.de/avr/avrboard.htm#t6963&lt;br /&gt;
* [[Projekt T6963-LCD-Ansteuerung]] nur PC, keine Änderung seit Juli 2006&lt;br /&gt;
* avrfreaks.net - TOSHIBA_LCD_T6963C, AVR Graphics&lt;br /&gt;
* http://www.mikrocontroller.net/topic/48456 C&lt;br /&gt;
* http://www.mikrocontroller.net/topic/54563 C&lt;br /&gt;
* http://www.mikrocontroller.net/topic/48584 ASM&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430/viewtopic.php?t=47 Grafik LCDs] - 128 x 112 Grayscale für MSP430 und andere uCs.&lt;br /&gt;
* http://www.display3000.com/ Farb-TFT-Module inkl. Mikrocontroller (ATMega128; ATMega2561 und AT90CAN128)&lt;br /&gt;
* [http://www.tklinux.de/sed1330.html SED1330 an ATMega]. Library für SED 1330 controller an ATmega&lt;br /&gt;
In der Codesammlung gibt es auch für andere Controller was.&lt;br /&gt;
&lt;br /&gt;
===== Siemens S55/C60 =====&lt;br /&gt;
* [http://www.module.ro/siemens_lcd.html S55-Display Pinbelegung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/22643 Forumbeitrag]&lt;br /&gt;
&lt;br /&gt;
===== Siemens S65/M65/CX65 =====&lt;br /&gt;
* [http://www.superkranz.de/christian/S65_Display/DisplayIndex.html S65-Display] vom Siemens S65/M65/CX65, 132x176 Pixel, 65536 Farben, günstig als Ersatzteil zu bekommen.&lt;br /&gt;
&lt;br /&gt;
===== Nokia 3210/3310 =====&lt;br /&gt;
* [http://www.jtronics.de/avr-projekte.html Bibliothek für Nokia 3310 Lcd Ansteuerung in &amp;quot;C&amp;quot; von http://www.jtronics.de - sehr gut (aktualisiert 2010)]&lt;br /&gt;
* [http://www.microsyl.com MicroSyl.Com]&lt;br /&gt;
&amp;lt;!-- * [http://www.microsyl.com/nokialcd/shematic.gif Belegung] --&amp;gt;&lt;br /&gt;
* [http://www.deramon.de/nokia3310lcd.php Deramon.de]&lt;br /&gt;
&amp;lt;!-- [[Bild:Beispiel.jpg]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Nokia 6100 LCD =====&lt;br /&gt;
&amp;lt;!-- * [http://www.apetech.de/article.php?artId=3&amp;amp;nnId=12 Nokia 6100 LCD Library] für Nokia-Displays 132x132 Pixel, 4096 Farben mit Philips Controller (bei eBay ziemlich preiswert zu ersteigern) --&amp;gt;&lt;br /&gt;
* [http://www.myplace.nu/mp3/download/download.php Yampp 7 Software Download Seite]: Archiv &amp;quot;yampp-7 with colour LCD firmware&amp;quot; enthält avr-gcc/avr-as Routinen für 6100-LCDs mit Philips- oder Epson-Controller (nicht direkt eine &amp;quot;Library&amp;quot;)&lt;br /&gt;
*[http://www.e-dsp.com/controlling-a-color-graphic-lcd-epson-s1d15g10-controller-with-an-atmel-avr-atmega32l/ S1D15G10]: Routine code für den Epson S1D15G10 Controller&lt;br /&gt;
*[http://thomaspfeifer.net/nokia_6100_display.htm Nokia 6100 Display am AVR] Anzeige von RGB-Bildern (für avr-gcc)&lt;br /&gt;
*[http://www.optixx.org/ www.optixx.org] Code zur Ansteuerung von Philips und Epson&lt;br /&gt;
*[http://www.zipfelmaus.com/nokia6100lcd_en/ http://www.zipfelmaus.com/nokia6100lcd_en/] --&amp;gt; unter Download: Tool zum Konvertieren von BMPs in h-Files zum Ausgeben auf dem Display&lt;br /&gt;
&lt;br /&gt;
===== KS0108 =====&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib Procyon avrlib (GPL)]&lt;br /&gt;
* avrfreaks UP&lt;br /&gt;
* apetech.de nicht mehr erreichbar http://www.mikrocontroller.net/topic/68316&lt;br /&gt;
&lt;br /&gt;
====GPS====&lt;br /&gt;
* http://www.holger-klabunde.de/avr/avrboard.htm#GPSdisplay GPS-Daten auf LCD&lt;br /&gt;
* [http://www.geoclub.de/forum57.html www.geoclub.de] - Elektronik beim Geocaching&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430/viewtopic.php?t=22 passworld.co.jp] - Do It Yourself GPS&lt;br /&gt;
&lt;br /&gt;
== [[8051|8051 / MCS51]] ==&lt;br /&gt;
* [http://mcu8051ide.sourceforge.net/ MCU 8051 IDE] - MCU 8051 IDE is a new modern graphical IDE for microcontrollers based on 8051. MCU 8051 IDE is noncommercial open-source software for Linux.&lt;br /&gt;
* [http://www.rakers.de/catalog Dr. Rakers] Entwicklungssystem mit C-Compiler, BASIC-Compiler und Makroassembler für alle 8051-Mikrocontroller (80C552, 80C515(C), 80C537). Auch für Hobbyisten bezahlbar.&lt;br /&gt;
* [http://www.progshop.com/versand/software/prog-studio/index.html Prog-Studio] - Moderne Assembler Entwicklungsumgebung für 8051 Mikrocontroller mit Debugger, Edit &amp;amp; Continue, Code-Folding, Intelli-Sense, Monitorung und mehr&lt;br /&gt;
* [http://www.yCModule.de yCModule: µController-Systeme] - Preisgünstige µController-Module, ISP-Programmiertools und Applikationsboards&lt;br /&gt;
* [http://www.erikbuchmann.de/ Erik Buchmanns Mikrocontroller-Seite] - Assemblerkurs und mehrere Projekte&lt;br /&gt;
* [http://www.holger-klabunde.de/projects/8051.htm Experimentierboard für 8051 Controller] von Holger Klabunde.&lt;br /&gt;
* [http://www.woe.de.vu/ World Of Electronics] - Projekte mit den 8051-Controllern von Atmel&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/8051/8051.html Controllerplatine mit SAB80C535]&lt;br /&gt;
* [http://www.maxim.ph.tc Selbstbau-Programmer] für 2051er&lt;br /&gt;
* [http://www.nomad.ee/micros/8052bas.html 8052 BASIC Projects] - IDE-Interface&lt;br /&gt;
* [http://home.t-online.de/home/s.holst/sh51/index.html Mikrokontroller sh51] Schaltplan für 80C535-Board&lt;br /&gt;
* 8051-Makroassembler [http://plit.de/asem-51/ ASEM-51] (Freeware)&lt;br /&gt;
* [http://sdcc.sourceforge.net/ SDCC - Small Device C Compiler] - freier ANSI-C compiler für Intel 8051, Maxim DS80C390 und Zilog Z80 kompatible Controller.&lt;br /&gt;
* [http://sdccokr.dl9sec.de/ The SDCC Open Knowledge Resource]&lt;br /&gt;
* [http://www.wickenhaeuser.de/ Wickenhäuser C Compiler] - Preisgünstiger C Compiler&lt;br /&gt;
* [http://home.tiscali.cz:8080/~cz056018/lanc_a.htm LANC-Remote] Projekt von Ji&amp;amp;#345;í &amp;amp;#352;mach zur Steuerung von Videorekordern oder Camcordern über das Control-L (LANC) Protokoll mit Hilfe eines AT89C2051.&lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter-Kits für verschiedene Microcontroller (D) preisgünstige Platinen (ab 12,95 Euro für AT89S8252). Beim uC-Dualboard : Das Board ist nutzbar mit AVR-Controllern und 8051-Controllern!&lt;br /&gt;
* [http://turbo51.com Turbo51 - Free Pascal compiler for 8051]&lt;br /&gt;
* [http://self8051.de/ self8051.de] - Dein Nachschlagewerk - Befehlsreferenz, Eigenschaften, Derivate&lt;br /&gt;
* [http://cmon51.sourceforge.net/ CMON51] - freier Onboard Monitor und Debugger, anpassbar an unterschiedliche 8051 kompatible Mikrocontroller&lt;br /&gt;
* [http://et-tutorials.de/632/kostenloser-mikrocontroller-kurs/ Mikrocontroller Video Tutorial] Video-Tutorial für Einsteiger (C-Kurs + Einführung 8051)&lt;br /&gt;
&lt;br /&gt;
== MSP430 ==&lt;br /&gt;
* [http://www.mikekohn.net/micro/naken430asm_msp430_assembler.php naken430msp] -   MSP430 Assembler von Michael Kohn (GPL)&lt;br /&gt;
* [http://www.mathar.com MSP430 Tutorials] - Tutorials, Anleitungen und viele Beispielprojekte mit dem MSP430-Mikrocontroller&lt;br /&gt;
* [http://www.student-zw.fh-kl.de/~stwi0001/imp/msp430/pwm430/index.htm Pulsweitenmodulation mit dem MSP430] - sehr ausführliche Einführung&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/msp430/msp430.html Kleine Projekte mit dem MSP430] - Schaltplan und Layout zu einem MSP430F149-Board und einem ADXL-G-Sensor mit MSP430&lt;br /&gt;
* [http://tinymicros.com/embedded/MSP430/ The MSP430 Bugspray Database] - umfangreiche Datenbank für Bugs in MSP430-Controllern&lt;br /&gt;
* [http://msp430.info MSP430.info] - Portalseite für MSP430; Info, Projekte (MIDI, USB)&lt;br /&gt;
* [http://groups.yahoo.com/group/msp430 Yahoo group MSP430] - lebhaftes Forum mit vielen MSP430-Experten&lt;br /&gt;
* [http://homepage.hispeed.ch/py430/mspgcc/ mps430-gdb und Eclipse] - Eine Anleitung von Chris Liechti&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430 Forum MSP430] - Projekte mit MSP430 (GPS, BlueTooth usw...)&lt;br /&gt;
* TI Design-Wettbewerb: http://www.designmsp430.com/View.aspx (Dateien liegen evtl. in /projects/) [2011-01-24: redirect zum TI Wiki, Projekte nicht mehr vorhanden]&lt;br /&gt;
* [http://www.sics.se/project/mspsim MSPsim] - a Java-based simulator of MSP430 sensor network platforms (BSD License (revised))&lt;br /&gt;
* [http://develissimo.net/de/msp430entwicklung MSPGCC + Eclipse + msp430-gdbproxy / Linux / Debian / Ubuntu] - Anleitung / Tutorial zur Installation der MSPGCC Toolchain + Eclipse + msp430-gdbproxy für Linux / Debian / Ubuntu Lang=Deutsch und Englisch&lt;br /&gt;
* [http://travisgoodspeed.blogspot.com/ Travis Goodspeed&#039;s Blog] - Home of the [http://goodfet.sourceforge.net/ GoodFET] Programmer&lt;br /&gt;
* [http://www.43oh.com/ Four-Three-Oh!]&lt;br /&gt;
* [http://thinkembedded.ch/MSP430:::10.html Webshop mit MSP430 Olimex Demoboarden und Programmer]&lt;br /&gt;
&lt;br /&gt;
=== MSP430 Launchpad ===&lt;br /&gt;
* [http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_(MSP-EXP430G2)?DCMP=launchpad&amp;amp;HQS=Other+OT+launchpadwiki MSP430 LaunchPad Wiki] bei TI&lt;br /&gt;
* [http://hackaday.com/2010/08/11/how-to-launchpad-programming-with-linux/ How-to: Launchpad programming with Linux] auf hackaday.com&lt;br /&gt;
* [http://springuin.nl/en/articles/launchpadwindows TI Launchpad programming and debugging with Open Source tools on Windows] (Eclipse, MSPGCC4, Insight, msp430-gdbproxy)&lt;br /&gt;
* [http://osx-launchpad.blogspot.com/ MSP430 LaunchPad toolchain for Mac OS X]&lt;br /&gt;
&lt;br /&gt;
=== EZ430 Chronos ===&lt;br /&gt;
* [http://processors.wiki.ti.com/index.php/EZ430-Chronos?DCMP=Chronos&amp;amp;HQS=Other+OT+chronoswiki EZ Chronos Wiki] bei TI&lt;br /&gt;
&lt;br /&gt;
== ARM ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
* [http://www.arm.com ARM] - Entwickler des ARM-Prozessorkerns (kein Hersteller von ICs)&lt;br /&gt;
* [http://infocenter.arm.com ARM Infocenter] Sammlung Technischer Informationen&lt;br /&gt;
&lt;br /&gt;
* [http://www.analog.com/ Analog Devices] ADuC7xxx ARM7TDMI Serie unter &#039;&#039;Analog Microcontrollers&#039;&#039;&lt;br /&gt;
* [http://www.atmel.com/products/AT91/ Atmel AT91 Startseite]&lt;br /&gt;
* [http://www.at91.com AT91.COM] - Atmel ARM Informationsseite (Forum, Beispielcodes etc.)&lt;br /&gt;
* [http://www.cirrus.com/en/products/pro/techs/T7.html Cirrus Logic]&lt;br /&gt;
* [http://www.energymicro.com/ Energy Micro] EFM32 mit Cortex M0+,M3,M4&lt;br /&gt;
* [http://www.freescale.com/mac7100 Freescale MAC7100]&lt;br /&gt;
* [http://www.hilscher.com Hilscher netX] (ARM926 core)&lt;br /&gt;
* [http://www.infineon.com/cms/en/product/microcontrollers/32-bit-industrial-microcontrollers-based-on-arm-registered-cortex-tm-m/channel.html?channel=db3a30433c1a8752013c3e221b9d004f Infineon XMCxxxx] Cortex M0,M4&lt;br /&gt;
* [http://www.intel.com/design/intelxscale/ Intel XSCALE Startseite], siehe auch [http://www.marvell.com/ Marvell]&lt;br /&gt;
* [http://www.luminarymicro.com/ Luminiary Micro (TI)] Controller mit Cortex M3 core&lt;br /&gt;
* [http://www.standardics.nxp.com/microcontrollers/ NXP (ehemals Philips) Microcontroller Startseite] für sämtliche Mikrocontroller (ARM7, ARM9, Cortex-M0, -M3, MCS51 etc.), neben LPC2000, LPC3000 auch die LH7xxxx BlueStreak-Serie (ehemals Sharp Microelectronics)&lt;br /&gt;
* [http://www.lpc2000.com lpc2000.com] Infoseite für NXP (ex. Philips) LPC1700 Cortex-M3 basierende Typen, LPC2000, ARM7 basierende Typen und LPC3000, ARM9 basierende Typen. Auch andere Cortex-M3 Bausteine sind erfasst&lt;br /&gt;
* [http://www.okisemi.com/eu/1.Products/ARM32bit.html OKI ARM-Controller Startseite]&lt;br /&gt;
* [http://www.samsung.com/Products/Semiconductor/ Samsung] ARM7/9 unter &#039;&#039;Mobile SoC&#039;&#039;&lt;br /&gt;
* [http://mcu.st.com/mcu/ STMicroelectronics (ST) Microcontroller Startseite] u.a. STR7, STR9, STM32 Support-Forum&lt;br /&gt;
* [http://www.ti.com/ Texas Instruments] TMS470 ARM7TDMI Serie&lt;br /&gt;
* [http://www.toshiba.com/taec/ Toshiba] Controller mit ARM9 und Cortex-M3 core&lt;br /&gt;
&lt;br /&gt;
=== Information (Foren, Mailinglisten, Linksammlungen) ===&lt;br /&gt;
* [http://forum.energymicro.com Lizard Lounge -] Energy Micros Forum für EFM32&lt;br /&gt;
* [http://m8051.blogspot.no/2012/11/efm32-low-power-series-part-2-low-power.html Blog über Low Power Modes der EnergyMicro uC]&lt;br /&gt;
* [http://www.neko.ne.jp/~freewing/cpu/arm_olimex/ Freewing Linksammlung] zu den NXP (ex. Philips) LPC-ARM7-Controllern (Assemblerbeispiele u.a. für Nokia 3310-GLCD)&lt;br /&gt;
* [http://www.open-research.org.uk/ARMuC ARM Microcontroller Wiki]&lt;br /&gt;
* [http://arm.hsz-t.ch arm.hsz-t.ch] Einfühung in ARM7 Mikrocontroller und uClinux.&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/ADuC7000/ ADuC7000 Yahoo-Group]&lt;br /&gt;
* [http://www.at91.com AT91 Forum] (Atmel Rousset)&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/AT91SAM/ AT91SAM Yahoo-Group]&lt;br /&gt;
* [http://en.mikrocontroller.net/forum/17 arm-elf-gcc WinARM Forum] (auch für Yagarto)&lt;br /&gt;
* [http://www.codesourcery.com/archives/arm-gnu/maillist.html Sourcery G++ Lite Edition User Forum/Mailing-List]&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/gnuarm/ GNUARM Yahoo-Group]&lt;br /&gt;
* [http://www.keil.com/forum/ Keil/ARM Forum]&lt;br /&gt;
* [http://groups.yahoo.com/group/lpc2000/ LPC2000 Yahoo-Group]&lt;br /&gt;
* [http://www.mcu-related.com MCU related] Neuigkeiten zu MCUs, überwiegend ARM / Cortex-M3 basierend mit Vergleichen von RTOS und anderen Entwicklungstools&lt;br /&gt;
* [http://forum.sparkfun.com/ Sparkfun Foren]&lt;br /&gt;
* [http://mcu.st.com/mcu/modules.php?name=Splatt_Forums STMicroelectronis Forum]&lt;br /&gt;
* [http://www.stm32circle.com/ Forum for STM32 moderated by Raisonance] Sehr viele Beispielprogramme in Source fuer STM32 und den Primer2 von Raisonance&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungswerkzeuge (Compiler/Assembler/Debugger/Tools) ===&lt;br /&gt;
==== IDEs ====&lt;br /&gt;
* [http://www.st-angliamicro.com/software.asp Anglia Idealist IDE und Anglia Toolchain] GNU toolchain für Win32-hosts inkl. Beispielen für STR7, STR9 und STM32. IDE kostenlos aber registrierungspflichtig&lt;br /&gt;
* [http://atollic.com/ attolic] TrueSTUDIO&lt;br /&gt;
* [http://devkitpro.org/ devkitPro/devkitARM] GNU-Toolchain für MS-Windows &amp;quot;Hosts&amp;quot;. Vor allem auf GBA abgestimmt aber auch für andere ARM-Controller geeignet&lt;br /&gt;
* [http://www.itrgmbh.de/ecos-toolchain/ EmbOrigin] Integrierte Cross Entwicklungsumgebung für die Anwendungsentwicklung unter eCos (RTOS kernel) für ARM Prozessoren. Highlights: eCos Kernel Aware Debug Features. Trial Version verfügbar [http://tiprom.itrgmbh.com/projects/itr-products-ecos-toolchain/ Support,Download]&lt;br /&gt;
* [http://www.ghs.com/ Green Hills Software]&lt;br /&gt;
* [http://www.hitex.de Hitex] IDE für diverse Compiler, Debugger&lt;br /&gt;
* [http://www.iar.com IAR] Embedded Workbench, kommerzielle IDE/Compiler, codegrößenbeschränkte Evaluierungsversion verfügbar&lt;br /&gt;
* [http://www.isystem.com/ iSYSTEM] Integrated Development Environment, USB/JTAG interface, OnChip Emulation and Trace&lt;br /&gt;
* [http://www.keil.com Keil/ARM MDK-ARM] kommerzielle IDE/Compiler, unterstützt zwei Compiler (ARM RealView, GNU/gcc), codegrößenbeschränkte Evaluierungsversion verfügbar (IDE/Compiler unbeschränkt für GNU), guter Debugger, sehr guter Simulator, Simulator und Debugger in der Evaluierungsversion auch bei Nutzung der GNU-Toolchain mit Größenbeschränkung&lt;br /&gt;
* [http://mct.de/download.html#free MCT Demoversion C-Compiler für ARM und 68k] ARM C-Compiler basiert auf GCC laut Herstellerinformation jedoch mit Codegrößenbeschränkung &amp;lt;!-- etwas ungewöhnlich: Codegrößenbeschränkung bei GNU-Toolchain --&amp;gt;&lt;br /&gt;
* [http://www.mpeforth.com www.mpeforth.com] - A free Forth system with 125 page manual for all Philips LPC2xxx CPUs with at least 64k Flash and 16k RAM and cystal frequency of 10, 12, or 14.7456 MHz. &lt;br /&gt;
* [http://www.raisonance.com/ Raisonance] Ride, RKit-ARM&lt;br /&gt;
* [http://www.rowley.co.uk/ Rowley] Kommerzielle IDE für GNU-Compiler, eigene libc (nicht newlib), Debugger (inkl. gutem Support für Wiggler)&lt;br /&gt;
* [http://h-storm.tantos.homedns.org/gcc_arm.htm Tantos gcc for ARM Targets] eine weitere ARM-GNU-Toolchain für MS-Windows &amp;quot;Hosts&amp;quot; &lt;br /&gt;
* [http://www.yagarto.de Yagarto] GNU arm-eabi-Toolchain, Eclipse, OpenOCD für Win32 inkl. Setup&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html#winarm WinARM] eine an WinAVR angelehnte Sammlung von Entwicklungswerkzeugen (binutils, arm-elf-gcc, newlib, &#039;&#039;newlib-lpc&#039;&#039;, Programmers Notepad, &#039;&#039;Beispiel-Makefiles und Beispielcode&#039;&#039;) für alle ARM-Controller. Beispiele für Philips LPC2000 und Atmel AT91SAM7S (ARM7TDMI) u.a.&lt;br /&gt;
* [http://code.google.com/p/dissy/ Dissy] is a disassembler for Linux and UNIX which supports multiple architectures and allows easy navigation through the code. Dissy is implemented in Python and uses objdump for disassembling files.&lt;br /&gt;
* [http://www.sinelabore.com sinelaboreRT] - generiert leicht lesbaren C-Code aus einer Zustandsmaschine. Die Generierung berücksichtig speziell die Bedürfnisse eingebetteter Echtzeitsysteme.&lt;br /&gt;
* http://arm.hsz-t.ch Entwicklungsumgebung für ARM7 Mikrocontroller basierend auf der Knoppix CD. Keine Harddisk installation nötig für uClinux.&lt;br /&gt;
&lt;br /&gt;
==== HW Debugger/Programmer ====&lt;br /&gt;
* [http://openocd.berlios.de/web/ OpenOCD] Open On-Chip Debugger: Schnittstelle (&amp;quot;gdb-Server&amp;quot;) zwischen verschiedenen JTAG-Interfaces (u.a. auf FTDI2232-Basis, &amp;quot;Wiggler&amp;quot;-ParPort und andere) und GNU-debugger (gdb/Insight-gdb) Flash-Programmierfunktion für LPC2k, AT91SAM7S, LM3S, STM32 und viele andere interne und externe Flashspeicher (Open Source, GPL, unter anderem auf MS Windows und Linux lauffähig)&lt;br /&gt;
* [http://macraigor.com/full_gnu.htm OCDLibRemote] Schnittstelle zwischen WIGGLER-kompatibler JTAG Hardware und dem GNU-Debugger (gdb)&lt;br /&gt;
* [http://gdb-jtag-arm.sourceforge.net/ GDB-JTAG-ARM] GDB JTAG Tools&lt;br /&gt;
* [http://jtagpack.sourceforge.net/ JTAG-Pack] GDB JTAG Tools&lt;br /&gt;
* [http://www.hjtag.com H-JTAG] RDI-Interface für Wiggler, Flash-Funktionen für diverse interne und externe Speicher&lt;br /&gt;
* [http://www.clibb.de/ lpc21isp] Flashutility für LPC21xx, ISP via &amp;quot;Bootloader&amp;quot; (&amp;quot;multiplattform&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
*[http://www.abatron.ch Abatron] BDI1000 &amp;amp; BDI2000, On-Chip Debuggers für ARM, 68k, Coldfire uvm.&lt;br /&gt;
* [http://www.amontec.com Amontec] JTAGkey, JTAGkey2(P): JTAG-Adapter auf Basis des FTDI2232(H) &lt;br /&gt;
* [http://www.hjtag.com/product_intro.html H-JTAG USB Emulator]&lt;br /&gt;
* [http://www.keil.com Keil/ARM ULINK/ULINK2/ULINK-ME] JTAG-Adapter, USB-Anschluss, wird von Keil uVision unterstützt, ULINK2 teilw. auch von Codesourcery G++ (lt. Hestellerangaben)&lt;br /&gt;
* [http://www.kristech.eu Kristech] USB-Scarab, JTAG Adapter, kommt mit eigener Debugger-UI, kompatibel zu Olimex&lt;br /&gt;
* [http://www.lauterbach.de Lauterbach] TRACE32 JTAG-Adapter, USB und Ethernet-Anschluss, eigene Software&lt;br /&gt;
* [http://www.olimex.com Olimex] JTAG-Adapter: Wiggler-Nachbau (ParPort) und  Adapter auf Basis des FTDI2232 (USB)&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ Olimex ARM-JTAG-COOCOX] CoLinkEx nachbau von Olimex (daher siehe CoLinkEx)&lt;br /&gt;
* [http://www.coocox.org/Colinkex.htm CoLinkEx] günstiger JTAG/SWD Programmer von Coocox.com, nicht alle uC unterstützt, siehe [http://www.coocox.org/Colinkex.htm Website], unterstützt,CoIDE, Keil MDK-ARM, IAR sowie Eclipse.&lt;br /&gt;
* [http://www.ronetix.at/peedi.html Ronetix Peedi]&lt;br /&gt;
* [http://www.segger.de Segger J-Link] JTAG-Adapter, USB-Anschluss, unterstützt z.&amp;amp;nbsp;B. von IAR, Keil uVision (via RDI) (OEM: IAR J-Link, SAM-ICE)&lt;br /&gt;
* [http://www.signalyzer.com/ Signalyzer] Signalyzer Tool, u.a. JTAG-Adapter auf Basis des FTDI2232&lt;br /&gt;
* [http://www.versaloon.com/ Simon Qians Versaloon]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials und Beispiele ===&lt;br /&gt;
* [http://www.dreamislife.com/arm/ LPC210x ARM7 Microcontroller Tutorial] - Assembler-Beispiele (arm-elf-as) für das Olimex LPC-MT-Board (Philips LPC2106 ARM7TDMI)&lt;br /&gt;
* [http://re-eject.gbadev.org/index.php gcc-Assembler für ARM] - Befehlsübersicht&lt;br /&gt;
* [http://patater.com/gbaguy/gbaasm.htm GBA ASM Tutorial] - ARM7 Assembler Tutorial mit arm-elf-as (&amp;quot;gcc&amp;quot;) (Allgemein und GBA)&lt;br /&gt;
* [http://www.robsite.de/daten/tutorials/devgba/gba_asm1.html GBA Assembler Tutorial] - ARM7TDMI, Schwerpunkt auf GBA&lt;br /&gt;
* [http://www.sparkfun.com/tutorial/ARM/ARM_Cross_Development_with_Eclipse.pdf Eclipse+CDT+gnuarm-Tutorial]&lt;br /&gt;
* [http://mct.de/download/armsamples/map.html Beispiele in C, für ARM7-Controller von Philips und ADI]&lt;br /&gt;
* [http://www.embedded.com/design/opensource/201802580 Embedded.com: Building Bare-Metal ARM Systems with GNU] Teil 10, Links zu den Teilen 1-9 auf der Seite&lt;br /&gt;
* [http://www.sparkfun.com/datasheets/DevTools/SAM7/at91sam7%20serial%20communications.pdf AT91SAM7 Serial Communications] von James P. Lynch (PDF, www.sparkfun.com)&lt;br /&gt;
* [http://www.kaczurba.pl/aduc ADuC7000 Tutorial] von Witold Kaczurba (www.kaczurba.pl)&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS mit Webcam ]&lt;br /&gt;
* [http://www.mySTM32.de Tutorial für das STM32F4 Discovery in C und C++ (UML)]&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch2/index.html Einblick in die moderne Elektronik ohne viel Theorie] PDF&lt;br /&gt;
&lt;br /&gt;
=== Projekte und Quellcodebibliotheken ===&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/arm/armlib/ Procyon ARMlib-LPC2100] - Treiber, Beispiele (Lizenz: GPL, kaum weiterentwickelt)&lt;br /&gt;
* [http://www.standardics.nxp.com/support/documents/?type=software NXP BlueStreak] Code für LH7xxxx (ehemals Sharp)&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html M. Thomas&#039; ARM Projekte] &amp;quot;Projectvorlagen&amp;quot; für AT91SAM7 und LPC2000 mit GNU-Toolchain Einsteiger-Projekte für AT91SAM7, LPC2000, ADuC7000 u.a. (u.a. Blinky, UART, Interrupt, C++, GLCD mit KS0108, DS18x20, DCF77, Anpassungen von FAT16/32-Libraries) &amp;lt;!-- noch mehr &amp;quot;Eigenwerbung&amp;quot; --&amp;gt;&lt;br /&gt;
* [http://mcu.st.com/ STMicro] Treiber und Beispiel für STR7, STR9 und STM32&lt;br /&gt;
* [http://wiki.sikken.nl/index.php?title=LPCUSB LPCUSB] - Open-source [[USB]] stack for the built-in USB controller in LPC214x microcontrollers von Bertrik Sikken. [http://lpcusb.cvs.sourceforge.net/lpcusb/host/benchmark/main.c?revision=1.2&amp;amp;view=markup Sample code]&lt;br /&gt;
* [http://www.olimex.com Olimex] Einige Beispiele auf den &amp;quot;Produktseiten&amp;quot; der ARM Boards.&lt;br /&gt;
* [[ARM MP3/AAC Player]]&lt;br /&gt;
* [http://www.jcwren.com/arm/ J.C. Wrens Beispielprojekt] für LPC214x&lt;br /&gt;
* [http://www.keil.com/download/list/arm.htm Beispiele von Keil] abgestimmt auf deren Boards und Realview-Toolchain, Portierung auf andere Boards und Compiler relativ einfach, Lizenz beachten.&lt;br /&gt;
* [http://www.luminarymicro.com/ Luminary Micro Driverlib] für Stellaris Cortex-M3&lt;br /&gt;
* [http://r2d2.stefanm.com/gps-tracker.html GPS-Tracker] mit Navigation auf LPC2103-Basis (Complier: GCC)&lt;br /&gt;
* [http://elua.berlios.de elua] Lua für ARM-controller&lt;br /&gt;
* [http://freemodbus.berlios.de/ FreeMODBUS] &amp;quot;A Modbus ASCII/RTU and TCP implementation&amp;quot; (für STR71x, AT91SAM7, LPC214x, auch: AVR, MSP430 u.a.)&lt;br /&gt;
* [http://bettyhacks.com BettyHacks] Freie Firmware für die &amp;quot;interaktive TV-Fernbedienung&amp;quot; betty-tv (ARM7tdmi, 2MB Flash, 160 x 128 Pixel 2 bit LCD, CC1100, IR, Lautsprecher,..)&lt;br /&gt;
*[http://cdn.energymicro.com/dl/zip/Simplicity_Studio_Setup.exe Download Simlicity Studio], Tool mit vollständiger Dokumentation und vielen Beispielen zu Energy Micro EFM32 Cortex M0+/M3/M4 uC.&lt;br /&gt;
&lt;br /&gt;
=== Betriebssysteme ===&lt;br /&gt;
* [http://agnix.sourceforge.net/ Agnix]&lt;br /&gt;
* [http://www.bertos.org/ BeRTOS] is a completely free, open source, real time operating system (RTOS) suitable for embedded platforms. Runs on many microprocessors and microcontrollers, ranging from 8 bits to 32 bits CPUs and even PCs. &lt;br /&gt;
* [http://www.chibios.org/ ChibiOS/RT]&lt;br /&gt;
* [http://www.stm32circle.com/resources/upgrade.php Circle-OS for STM32] Kostenloses OS, sehr klein mit Basisfunktionen fuer STM32&lt;br /&gt;
* [http://coocox.org/ CoOS]&lt;br /&gt;
* [http://sources.redhat.com/ecos/ eCos] - &amp;quot;Real-Time-Operating-System&amp;quot; o.a. auch für ARM7&lt;br /&gt;
* [http://www.freertos.org/ FreeRTOS (.org!)] - &amp;quot;Real-Time-Kernel&amp;quot; unter anderem für ARM7 (LPC2xxx) auch AVR, MSP430, &#039;51er&lt;br /&gt;
* [http://sourceforge.net/projects/funkos/ FunkOS]&lt;br /&gt;
* [http://l4ka.org/ L4Ka]&lt;br /&gt;
* [http://developer.toradex.com/software-resources/arm-family/linux/source-code Linux für Toradex Module] basierend auf Intel XScale und Nvidia Tegra&lt;br /&gt;
* [http://www.linux4sam.org Linux4SAM] Informationen, Anleitungen und Code zur Anwendung von Linux auf AT91SAM9xxx&lt;br /&gt;
* [http://www.freertos.com/ NicheTask] (URL ist www.freertos.com aber hat nichts mit FreeRTOS(.org) zu tun)&lt;br /&gt;
* [http://www.ethernut.de/en/software/index.html Nut/OS] Echtzeitbetriebssystem für Mikrocontroller (ARM, AVR, AVR32, Cortex M3 u.A). Multitasking und vollständiger TCP/IP Stack inklusive. Leicht zu erlernen und viele Beispiele&lt;br /&gt;
* [http://nuttx.org/ NuttX RTOS] (ARM7TDMI port for TI TMS320C5471 also called a C5471 or TMS320DM180).&lt;br /&gt;
* [http://www.phoenix-rtos.org/ Phoenix-RTOS]&lt;br /&gt;
* [http://picoos.sourceforge.net/ PicoOS]&lt;br /&gt;
* [http://prex.sourceforge.net Prex] is a portable real-time operating system for embedded systems. The small, reliable, and low power kernel is written in the C language based on microkernel design. The file system, Unix process, and networking features are provided by user mode tasks. (ARM, i386, geplant: MIPS, PowerPC, Hitachi-SH und Win32)&lt;br /&gt;
* [http://www.rtems.org/ RTEMS]&lt;br /&gt;
* [https://github.com/RT-Thread/rt-thread rt-thread]&lt;br /&gt;
* [http://sourceforge.net/projects/scmrtos/ scmRTOS]&lt;br /&gt;
* [http://www.tnkernel.com/downloads.html TNKernel] - &amp;quot;Real-Time-Kernel&amp;quot; [[TNKernel]] ist ein kompakter und sehr schneller Echtzeitkernel unter anderem für ARM7 (Philips LPC2106/LPC21XX/LPC22xx, Samsung S3C44B0X, Atmel AT91SAM7S128, STMicroelectronics STR711FR2)&lt;br /&gt;
* [http://www.ucos-ii.com/ uC/OS-II RTOS]&lt;br /&gt;
&lt;br /&gt;
=== Hardware (Prototypen-Platinen etc.) ===&lt;br /&gt;
&amp;lt;!-- Veralteter Link; Shop verkauft &amp;quot;nichts&amp;quot; mehr * [http://www.knif-elektronik.de/index.php/cPath/27/category/industrie-module-/-bausaetze.html/ KNIF-elektronik] Preisgünstige Industriemodule und Bausätze z.B GPS, W-Lan, Kamera,Bluetooth uvm. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ist KEIN ARM-Board, falsche Rubrik! * [http://www.chip45.com/ chip45] Atmel AVR Module und Boards mit USB, RS232/485, CAN, Ethernet, Funkmodule, sowie ISP Programmieradapter --&amp;gt;&lt;br /&gt;
* [http://www.armkits.com/ Embest] Philips, Samsung und Atmel ARM Boards und Module, JTAG-Hard- und Software&lt;br /&gt;
* [http://www.waveplayer.de/ Embedded-Waveplayer] mit ARM7-Prozessor EP7309 (MIDI- und RS232-Steuerung)&lt;br /&gt;
* [http://www.embeddedartists.com/ Embedded Artists] bietet verschiedene preisgünstige Platinen (ab 25 Euro für LPC213x Familie)&lt;br /&gt;
* [http://www.embedded-it.de/microcontroller/microcontroller-module.php Embedded-IT] eNet-sam7X: Ethernut kompatible Embedded Ethernet Mikrocontroller Boards für Industrie und Hobby auf ARM mit Nut/OS Betriebssystem sowie USB Module auf AVR Basis&lt;br /&gt;
* [http://www.hiteg.com Hiteg] SAMSUNG und Intel XScale basierende boards. (Deutsches Unternehmen in China)&lt;br /&gt;
* [http://www.hitex.de/ Hitex] Starter-Kits für Philips LPC2000, ST STR7, Atmel AT91M&lt;br /&gt;
* [http://www.iar.com/ IAR] Starter-Kits für Atmel, Oki, Philips, ST und TI &lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c12_ICswift-Module.html ic-board.de] Kommunikationsplattform auf Basis des AT91SAM7X256 mit Ethernet, USB, CAN und Funk Schnittstellen&lt;br /&gt;
* [http://www.keil.com/ Keil] Philips LPC2000 und ST STR7/9 Boards und Starter-Kits&lt;br /&gt;
* [http://www.lpctools.com/ LPCTools] bietet verschiedene Starter Kits für die LPC2000-Familie&lt;br /&gt;
* [http://www.makingthings.com/ MakingThings] Make Controller Kit (AT91SAM7X256)&lt;br /&gt;
* [http://mct.de/index.html MCT Paul und Scherer] Starterkits für ARM7 (NXP LPC2000, ADI ADUC7000)&lt;br /&gt;
* [http://shop.mikrocontroller.net Mikrocontroller.net Shop] Platinen mit AT91SAM7, LPC2xxx, JTAG&lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter-Kits für verschiedene Microcontroller (D) preisgünstige Platinen (ab 12,95 Euro für LPC2129 und 2194) sowie Entwicklungsboard komplett bestückt&lt;br /&gt;
* [http://stores.ebay.de/Micro-Research Micro-Research] Development- und Header-Boards für LPC2000 und ADuC7000&lt;br /&gt;
* [http://www.olimex.com Olimex] Bulgarischer Anbieter günstiger ARM Prototypen- und Header-Boards (LPC2000, STR7, AT91SAM, ADI, TI, OKI u.a.)&lt;br /&gt;
* [http://www.propox.com/?lang=en Propox]&lt;br /&gt;
* [http://www.mcu-raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer2 from Raisonance] Focus auf STM32 mit sehr grossem Forum im STM32circle&lt;br /&gt;
* [http://www.revely.com/ Revely] Evaluations- und Demo-Boards mit Sharp ARM Controllern. Teilweise mit SVGA-Anschluss.&lt;br /&gt;
* [http://www.skpang.co.uk/catalog/index.php SKPang electronics] Entwicklungsboards für diverse ARM7/9 (UK)&lt;br /&gt;
* [http://www.dilnetpc.com SSV Embedded Systems] bietet verschiedene Starter Kits für die verschiedenen DIL/NetPC u.a. (A)DNP/9200 SBC mit AT91RM9200&lt;br /&gt;
* [http://www.taskit.de taskit] [https://www.ledato.de/shop_content.php?coID=10 Development- und Header-Boards für AT91SAM7S/X], AT91RM9200, AT91SAM9&lt;br /&gt;
* [http://www.toradex.com Toradex] ARM DevKits (XScale, Nvidia Tegra) (Schweiz)&lt;br /&gt;
* [http://thinkembedded.ch/ARM:::6.html Thinkembedded Webshop] Demoboarde,Debugger Cortex M (Schweiz)&lt;br /&gt;
&lt;br /&gt;
== [[PIC]] ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
* [http://www.microchip.com Microchip] Hersteller der PIC Microcontroller&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en010014&amp;amp;part=SW006011 Microchip C18 Student Edition] - die &amp;quot;Student Edition&amp;quot; des Microchip C18 C Compilers für die PIC18 Serie ist kostenlos verfügbar.&lt;br /&gt;
* [http://www.powercontact.de Elektronikentwicklung von Systemtechnik LEBER] Offizieller Microchip Design Partner für professionelles Microcontroller Design und Hersteller von Leistungsstellern, Thyristorstellern und Halbleiterelais...&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungstools / Tutorials / Foren  ===&lt;br /&gt;
* [http://www.osterer.co.at www.osterer.co.at] Entwicklungs-Board mit integrierten Programmer/Debugger für PIC18F4550.&lt;br /&gt;
* [http://www.martins-elektronikwelt.tk www.martins-elektronikwelt.tk] ICD1-Debugger-Nachbau im Kleinstformat u. SMD Technik (so groß wie eine halbe Scheckkarte).&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/index.htm PIC-Microchip-Controller (www.sprut.de)] Diese Seite soll dem Anfänger die ersten Schritte in die Welt der Microcontroller der Firma Microchip erleichtern. Betrachtet werden die 14-Bit-Controller der Serien PIC16Fxxx bzw PIC12Fxxx.&lt;br /&gt;
* http://www.waitingforfriday.com/ Wer anstatt mit Delphi (sprut.de) lieber mit C++ oder C# arbeiten möchte, findet bei Simon Inns ein USB-Framework und zahlreiche interessante und anpassbare Anwendungen.&lt;br /&gt;
* [http://pic-projekte.de/ PIC-Projekte.de] Tutorials (u.a. für PIC C) und Projekte mit erklärten Codesnipseln (geeignet für Anfänger), [http://pic-projekte.de/phpBB3/ deutschsprachiges PIC Forum]&lt;br /&gt;
* [http://www.fernando-heitor.de PIC: Programmierung in CCS (www.fernando-heitor.de)] Dies ist eine weitere Seite, die dem Anfänger, der sich mit PICs beschäftigt, auf die Beine hilft. Sie befasst sich hauptsächlich mit dem CCS-Compiler und hat dazu ein sehr gutes Tutorial. Ausserdem bietet die Seite ein Forum speziell für PIC Mikrocontroller.&lt;br /&gt;
* [http://www.cc5x.de CC5X] Programmierkurs für PIC-Mikrocontroller in C (CC5X Compiler)] Programmierkurs mit Beispielen und Schaltplänen, fertige Hardware- und Softwarelösungen. In diesem Kurs sind auch einige Unterprogramme detailliert erklärt.&lt;br /&gt;
* [http://www.microchipc.com/ MicrochipC.com] Programmieren von PIC-Microcontrollern mit C. (Enthält auch Links und Bootloader für diverse PICs.)&lt;br /&gt;
* [http://www.amodio.biz/projects/PIC10BaseT/index.html Internetworking with Microchip Microcontrollers - PIC18F4620+ENC28J60]&lt;br /&gt;
* [http://pic18fusb.online.fr/wiki/wikka.php?wakka=WikiHome Wiki about Microchip USB PIC] (PIC18F2550, PIC18F4550...)&lt;br /&gt;
* [http://picpgm.picprojects.net/ PICPgm - A free and simple PIC Development Programmer Software for Windows and Linux] Einfacher PIC Programmer für Windows und Linux. Unterstützt eine Vielzahl von PIC-Chips und wird ständig erweitert. Derzeit können PIC10F, PIC12F, PIC16F, PIC18F, PIC24H  sowie dsPIC30F und dsPIC33F programmiert werden.&lt;br /&gt;
* [http://www.stolz.de.be InCircuit-Programmer und -Debugger (www.stolz.de.be)] Einfacher Nachbau des Microchip ICD2s. Zum Programmieren und Debuggen.&lt;br /&gt;
* [http://www.winpicprog.co.uk WinPicProg] Programmer und Tutorials für Anfänger von Nigel Goodwin (Englisch)&lt;br /&gt;
* [http://usbpicprog.org/ usbpicprog], an open source Microchip PIC programmer for the USB port. A wxWidgets based (cross platform) application to communicate with the usbpicprog hardware / firmware. This application is known to function well on Linux, Windows (XP or later) and Macosx.&lt;br /&gt;
* [http://www.tigal.com EasyPIC3, EasyPIC4, Easy8051A, EasyAVR, Easy-was-weiss-ich (www.tigal.com)] - Distributor für Produkte von [http://www.mikroelektronika.co.yu mikroelektronika] und weiteren Herstellern&lt;br /&gt;
*[http://www.pro-zukunft.de Pro Zukunft] Evaluation-Board für PIC16F84A, hands-on-training und Print-Lehrgang. Für Schulen, Ausbildungsbetriebe &amp;amp; Hobbyelektroniker.&lt;br /&gt;
* [http://www.wselektronik.at www.wselektronik.at] Bausatz für &amp;quot;Full Speed ICD2&amp;quot; (USB2.0, Debugger, Programmer) oder Fertiggerät erhältlich.&lt;br /&gt;
* [http://www.uchobby.com/index.php/2008/04/19/pic-development-linux-style/ How to setup for PIC microcontroller development on Linux] von Steven Moughan&lt;br /&gt;
* [http://www.dattalo.com/gnupic/gpsim.html#docs gpsim] is a full-featured software simulator for Microchip PIC microcontrollers distributed under the GNU General Public License.&lt;br /&gt;
* [http://www.mtoussaint.de/yapide.html YaPIDE] aims to be a fully featured Microchip PIC simulator for Linux (and probably other UNIXes). YaPIDE is a GUI only application. If you need a commandline based PIC simulator there is the excellent &#039;&#039;&#039;gpsim&#039;&#039;&#039;. The simulator kernel currently supports the PIC 16F628.&lt;br /&gt;
* [http://piklab.sourceforge.net/ Piklab] is an integrated development environment for applications based on Microchip PIC and dsPIC microcontrollers similar to the MPLAB environment. It integrates with several compiler and assembler toolchains (like gputils, sdcc, c18) and with the simulator &#039;&#039;&#039;gpsim&#039;&#039;&#039;. It supports the most common programmers (serial, parallel, ICD2, Pickit2, PicStart+) and debuggers (ICD2).&lt;br /&gt;
* [http://dev.frozeneskimo.com/software_projects:vpicdisasm vPICdisasm] is a Microchip PIC Mid-Range family firmware disassembler. This single-pass disassembler can read Intel HEX and Motorola S-Record formatted files containing valid PIC firmware. (GPL)&lt;br /&gt;
* [http://pikdev.free.fr/ PiKdev] is a simple graphic IDE for the development of PIC-based applications. It currently supports assembly language. C language is also supported for PIC 18 devices. PiKdev is developed in C++ under Linux and is based on the KDE environment.&lt;br /&gt;
* [http://www.yenka.com/en/Yenka_PICs/ Yenka PICs] lets you write routines using simple flowcharts, and test them on-screen, before using them to program real PIC or PICAXE chips. To help spread the news about Yenka, we&#039;re offering free copies of Yenka PICs for use at home or school.&lt;br /&gt;
* [http://gcbasic.sourceforge.net/ Great Cow BASIC] &amp;quot;Open Source BASIC programming tools for Microchip PIC and Atmel AVR microcontrollers&amp;quot;&lt;br /&gt;
* [http://openprog.altervista.org/OP_eng.html Open Programmer] - An open source [[USB]] programmer for [[PIC]] micros, [[I2C]]-[[SPI]]-MicroWire [[EEPROM]]s, some ATMEL [[AVR]] micros, generic I2C/SPI devices and (soon) other devices. Can work as [[ICD]] debugger.&lt;br /&gt;
&lt;br /&gt;
=== Projektsammlungen/Einzelprojekte ===&lt;br /&gt;
* [http://www.martins-elektronikwelt.tk www.martins-elektronikwelt.tk] Viele Projekte mit den PIC Mikrocontrollern, u.a. SMS-Schaltzentrale, SD/MMC-FAT32-MP3-Player, Lichtschranken, Funk-Wetterempfänger, PS/2 am PIC usw.&lt;br /&gt;
* [http://www.Firmware-On-Demand.com Firmware-On-Demand] Umfangreiche Firmware-Bibliothek. &lt;br /&gt;
* [http://pic-projekte.de/wordpress/?p=387#more-387 XLCD Librarie] Anleitung zum Ansteuern des HD44780 unter Verwendung der C18 XLCD Librarie&lt;br /&gt;
* [http://www.rentron.com www.rentron.com] Anfänger-taugliche Projekte für PIC und [[8051]] von Reynolds Electronics (Englisch)&lt;br /&gt;
* [http://www.circuitcellar.com/microchip2007/ Microchip 16-Bit Embedded Control 2007 Design Contest] bei [http://www.circuitcellar.com/ Circuit cellar]&lt;br /&gt;
* [http://mondo-technology.com/ Mondo Technologiy] Grosse Ansammlung von PIC-Projekten, u.a. SuperProbe: Logic Probe,(Auf der linken Seite ganz oben) Logic pulser, Frequency Counter, Event Counter, Voltmeter, Diode Junction Voltage, Capacitance Measurement, Inductance Measurement, Signal Generator, Video Patern, Serial Ascii, Midi Note, R/C Servo, Square Wave, Pseudo Random Number, ir38, PWM in einem... (PIC16F870)&lt;br /&gt;
* [http://micrognurtos.sourceforge.net uGNU/RTOS] is a microcontroller-targeted serial real time operating system. It has been ported to USART capable Microchip PIC16 devices. It supports I/O operations and some internal registry operations. The user can interact with the chip through the RS-232 serial cable and a shell. The user can type a small list of commands and see the results on the chip&#039;s outputs. (LGPL)&lt;br /&gt;
* [http://pic-projekte.de http:pic-projekte.de] Viele Projekte vom Betreiber der Webseite. Außerdem gibt es ein deutsches PIC-Forum&lt;br /&gt;
* [http://pic16f628a.blogspot.com/ Experiments with PIC16F628A] - PIC Programming in C&lt;br /&gt;
&amp;lt;!-- * [http://www.picguide.org PIC Guide] Eine große Sammlung von PIC-Projekten für den Anfänger 6.9.2010: nur cPanel Standard Seite --&amp;gt;&lt;br /&gt;
*Stevy&#039;s Homepage http://stevy.bplaced.com Pic Projekte die in C geschriebn wurden z.B 3D Engine, Grafik Display Ansteuerungen, Oszilloskip usw&lt;br /&gt;
* [http://www.simon-brenner.ch/projekte/rgb-led-stripe RGB Stripe mit 16bit Bus, realisiert mit PIC12F629]&lt;br /&gt;
* [http://scifi.pages.at/drakesoft/aulem_mypong/ Spiel PONG] auf einer 16x16 LED Matrix mit Ton, realisiert auf einem AVR.&lt;br /&gt;
* [http://hackinglab.org/ Pinguino Webpage] und [http://wiki.pinguino.cc/index.php/Main_Page Pinguino Wiki] ist ein Arduino-ähnliches Open Source und Open Hardware Projekt für 8-Bit (PIC18F2550, PIC18F4550) Mikrocontroller.&lt;br /&gt;
* [http://pic-projekte.de/wordpress/?p=653 Entwicklungsboard auf Grundlage des PIC18F25K22] - Sehr gut geeignetes Entwicklungsboard für Einsteiger und Fortgeschrittene&lt;br /&gt;
&lt;br /&gt;
== [[Z8]] ==&lt;br /&gt;
* [http://groups.yahoo.com/group/z8encore/ Yahoo! Groups : z8encore] Yahoo-Gruppe, die sich mit den Z8 Encore! Mikrocontrollern beschäftigt (Anmeldung bei Yahoo erforderlich).&lt;br /&gt;
* [[Zilog Encore Experimentierplatine]] (Z8F6421 Familie mit DIP-40 Gehäuse)&lt;br /&gt;
*[http://thomastechnik.blogspot.de/ Thomas&#039; Technik Blog] Ein Z8Encore und ZNEO Projekt und viele Tips zum Programmieren und Debuggen.&lt;br /&gt;
&amp;lt;!-- * [http://www.z8micro.com/forum/ Z8 Encore! Microcontroller Discussion Forum - Dedicated to the ZiLOG Z8 Encore! Microcontroller] Ein der Z8 Encore!-Mikrocontrollerfamilie gewidmetes Diskussionsforum (in Englisch). - Link tot 6.9.2010 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmierbare Logik ([[CPLD]]/[[FPGA]]/[[GAL]]) ==&lt;br /&gt;
&lt;br /&gt;
=== Chip-Hersteller ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.altera.com      Altera], Große FPGAs, direkter Wettbewerber zu Xilinx&lt;br /&gt;
* [http://www.latticesemi.com Lattice Semiconductor], kleinere und mittlere FPGAs, sehr Strom sparend&lt;br /&gt;
* [http://www.microsemi.com   Microsemi]&lt;br /&gt;
* [http://www.xilinx.com      Xilinx], Große FPGAs, direkter Wettbewerber zu Altera&lt;br /&gt;
&lt;br /&gt;
=== Soft-Core-Prozessoren und IP-Cores ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.opencores.org/ OpenCores.org], VHDL Sourcen&lt;br /&gt;
* [http://opencollector.org/history/freecore/ Freecore], unter &#039;Module library&#039; gibt&#039;s einige freie Designs&lt;br /&gt;
* [http://members.optushome.com.au/jekent/FPGA.htm Private Seite von John Kent], enthält eine Menge Links und auch einige Designs&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungswerkzeuge für Soft-Core-Prozessoren===&lt;br /&gt;
&lt;br /&gt;
* [http://www.fautronix.com/fidex FIDEx], FIDEx assembler IDE für mehrere Soft-Core-Prozessoren&lt;br /&gt;
* [http://www.mediatronix.com/Tools.htm Mediatronix tools], Picoblaze und DSP tools&lt;br /&gt;
&lt;br /&gt;
=== Weitere Info-Seiten ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.fpga4fun.com/ fpga4fun], umfangreiche Seite mit Einführung und Beispielen, berücksichtigt Xilinx &amp;amp; Altera&lt;br /&gt;
* [http://www.fpgacpu.org/links.html FPGA CPU Links]&lt;br /&gt;
&lt;br /&gt;
=== FPGA-Modul- und Eval-Board-Hersteller ===&lt;br /&gt;
&lt;br /&gt;
* [https://digilent.us/ Digilent], Hersteller verschiedener FPGA/CPLD-Boards (u.a. Xilinx Spartan Starter Kit)&lt;br /&gt;
* [http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&amp;amp;CategoryNo=39 Terasic], Anbieter von Altera FPGA-Boards&lt;br /&gt;
* [http://shop.trenz-electronic.de/catalog/ Trenz Elektronik], verkauft verschiedene FPGA/CPLD-Boards&lt;br /&gt;
* [http://www.xess.com/index.html XESS], Anbieter von FPGA-Boards (Xilinx), unter Support gibts es eine Menge Beispiele&lt;br /&gt;
* [http://www.cesys.biz Online Shop für Cesys FPGA Karten]&lt;br /&gt;
&lt;br /&gt;
=== Programmierwerkzeuge ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.ixo.de/info/usb_jtag/ ixo.de usbjtag] - USB-JTAG Adapter, fast kompatibel zu Altera USB-Blaster, wahlweise basierend auf FT245+CPLD oder Cypress FX2 Controller&lt;br /&gt;
&lt;br /&gt;
== DSP ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.tetrix-systems.de/embedded.html combined embedded Linux-DSP Solutions]&lt;br /&gt;
* [http://open.neurostechnology.com/node/1020 TI c54x DSP  Compilertools (ohne Debugger)] frei für Open Source Projekte.&lt;br /&gt;
&lt;br /&gt;
== Wettbewerbe (Contests) == &lt;br /&gt;
&lt;br /&gt;
Verschiedene Hersteller veranstalten zur Promotion ihrer Produkte Designwettbewerbe, aus denen teilweise komplette Projektunterlagen hervorgehen (Schaltung, Source).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2014&#039;&#039;&#039;&lt;br /&gt;
*[http://http://makeit.intel.com/ Make It Wearable] Der &amp;quot;VISIONARY Track&amp;quot; startet am 24.02.2014, der &amp;quot;DEVELOPMENT Track&amp;quot; im Sommer 2014.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2013&#039;&#039;&#039;&lt;br /&gt;
*[http://www.digilentinc.com/events/ddc2013/ digilent Design contest 2013] &lt;br /&gt;
*[http://www.ebv.com/index.php?id=1477 EBV verlost Infineon XMC4500 Cortex M4 Starter Kits]&lt;br /&gt;
*[http://www.energymicro.com/freekit Energy Micro verschenkt kostenlose Starter Kits]&lt;br /&gt;
*[http://www.challenge.toradex.com/ Toradex Wettbewerb, 100&#039;000 USD in Preise] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2012&#039;&#039;&#039;&lt;br /&gt;
*[http://forum.energymicro.com/topic/150-contest-description/ EFM32 Design Contest 2012 von Energy Micro] Anmeldung bis zum 31.10.2012&lt;br /&gt;
*[http://dangerousprototypes.com/2012/09/03/announcing-the-open-7400-logic-competition-2012/ Open 7400 Logic Competition 2012] Anmeldung bis 31.10.2012&lt;br /&gt;
*[http://beagleboard.org/CapeContest/ beaglebone Cape Contest] Anmeldung bis 31.Dezember 2012&lt;br /&gt;
&#039;&#039;&#039;2011&#039;&#039;&#039;&lt;br /&gt;
*[http://www.designspark.com/chipkitchallenge DesignSpark chipKIT Challenge] bis 27.03.2012&lt;br /&gt;
*[http://www.555contest.com 555 Contest]&lt;br /&gt;
*[http://www.circuitcellar.com/nxpmbeddesignchallenge/ NXP and ARM/mbed challenge]&lt;br /&gt;
*[http://www.ebv.com/en/products/stm32-design-contest.html STM32 Design Contest] von EBV Elektronik und STMicroelectronics&lt;br /&gt;
* [http://www.renesasrulz.com/community/rx-contest The RX MCU Design Contest] und die Top 3 im [http://www.eevblog.com/2011/06/05/eevblog-174-renesas-rx-design-contest-winners/ Video] bei Dave Jones auf EEVBlog.com&lt;br /&gt;
* [http://www.cypress.com/?id=3298 ARM Cortex-M3 PSoC® 5 Design Challenge]&lt;br /&gt;
* [http://www.instructables.com/contest/micro/ SparkFun Microcontroller Contest] bis 13.02.2011&lt;br /&gt;
* [http://www.elektroniknet.de/bauelemente/news/article/27963/0/Wer_entwickelt_die_beste_Anwendung_mit_dem_EFM32/ EFM32 Design-Wettbewerb] von Elektronik, Avnet-Memec und Energy Micro&lt;br /&gt;
* [http://www.freescale.com/webapp/sps/site/overview.jsp?code=KINETIS_MAKEIT_CHALLENGE&amp;amp;tid=vanKINETIS_MAKEIT_CHALLENGE Make It Challenge: Kinetis MCUs] von Freescale&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2010&#039;&#039;&#039;&lt;br /&gt;
* [http://www.schmartboard.com/index.asp?page=mcu_2010 SchmartBoard 2010 MCU Challenge]&lt;br /&gt;
* [http://www.digilentinc.com/showcase/contests/designcontest.cfm?ContestID=6 Digilent Design Contest 2010]&lt;br /&gt;
* [http://www.parallax.com/go/holidaychallenge Parallax &amp;amp; iGen Student LED Holiday Challenge]&lt;br /&gt;
* [http://www.embeddedspark.com/upcomingchallenge/ The embeddedSPARK 2010 SUMMER Challenge]&lt;br /&gt;
* [http://www.libelium.com/tienda/catalog/contest.php?language=en Libelium Arduino Open Hardware Contest]&lt;br /&gt;
* [http://www.circuitcellar.com/designstellaris2010/index.html Texas Instruments DesignStellaris 2010]&lt;br /&gt;
* [http://www.wizwiki.net/main/ iMCU Design Contest] (WIZnet)&lt;br /&gt;
* [http://www.elo-web.de/elo/entwicklung-und-projekte/ping-pong/elo-programmierwettbewerb-2010 ELO-Programmierwettbewerb 2010] (Atmega8, PingPong-Platine, 31.3.10)&lt;br /&gt;
* [http://www.lpc1100challenge.com/ NXP LPC1100 Design Challenge] (Cortex-M0 based LPC1100)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2009&#039;&#039;&#039;&lt;br /&gt;
* [http://arduinofun.com/blog/2009/11/01/fun-with-arduino-contest/ Fun with Arduino Contest]&lt;br /&gt;
* [https://www.xmos.com/challenge/ XMOS Challenge]&lt;br /&gt;
* [http://www.designmsp430.com/ Design MSP430 Ultra-Low Power Challenge]&lt;br /&gt;
* [http://makezine.com/halloweencontest/ Make: Halloween Contest 2009], sponsored by Microchip Technology!&lt;br /&gt;
* [http://www.bricogeek.com/contest/let-arduino-play/resultados.php Let Arduino Play Contest]&lt;br /&gt;
* [http://www.dlpdesign.com/designcontest/ DLP Design DLP-232PC Design Contest]&lt;br /&gt;
* [http://www.libelium.com/tienda/catalog/contest.php Arduino contest by Libelium]&lt;br /&gt;
* [http://www.expli.de/wettbewerb/coole-avr-microcontroller-elektronik-ideen/ EXPLI Elektronik Wettbewerb]: Die coolsten Elektronik Projekte &amp;amp; AVR Microcontroller Anleitungen&lt;br /&gt;
* [http://www.stm32circle.com/projects/contest.php STM32 Primer2 Design Competition 2009]&lt;br /&gt;
* [http://www.parallax.com/Resources/ApplicationsContests/Contests/200910PropellerContest/tabid/846/Default.aspx 2009/2010 Propeller Design Contest]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2008&#039;&#039;&#039;&lt;br /&gt;
* [http://www.parallax.com/tabid/720/Default.aspx Propeller Design Contest]&lt;br /&gt;
* [http://www.psocidcindia.com/index.php PSoC Innovator Design Challenge India 2008]&lt;br /&gt;
* [http://www.mypic32.com Microchip PIC32 Design Challenge]&lt;br /&gt;
* [http://contest.renesasinteractive.com/ HEW Target Server Design Contest 2008]&lt;br /&gt;
* [http://www.stm32circle.com/projects/result_contest_2008.php STM32 Primer Design Competition 2008]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2007&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/wiznet/index.html WIZnet iEthernet Design Contest 2007] &lt;br /&gt;
* [http://www.circuitcellar.com/microchip2007/ Microchip 16-Bit Embedded Control 2007 Design Contest]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2006&#039;&#039;&#039;&lt;br /&gt;
* [http://www.designmsp430.com/View.aspx 2006 MSP430 eZ Design Contest] &lt;br /&gt;
* [http://www.luminarymicro.com/DesignStellaris2006 Luminary Micro DesignStellaris2006]&lt;br /&gt;
* [http://www.circuitcellar.com/avr2006/ Atmel AVR Design Contest 2006] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2005&#039;&#039;&#039;&lt;br /&gt;
* [http://www.jandspromotions.com/philips2005/index.htm Philips ARM Design Contest 2005] (LPC213x)&lt;br /&gt;
* [http://www.circuitcellar.com/renesas2005m16c/index.htm Renesas M16C Design Contest 2005]&lt;br /&gt;
* [http://www.edn.com/article/CA516007.html Cornelius van Drebbel&#039;s Mad Design Contest] (NEC)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2004&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/avr2004/ Atmel AVR 2004 Design Contest]&lt;br /&gt;
* [http://www.circuitcellar.com/psoc2004/ PSoC High Integration Challenge 2004]&lt;br /&gt;
* [http://www.jandspromotions.com/zilog2004/ Zilog 2004 Flash Nets Cash Design Contest] (eZ80Acclaim!)&lt;br /&gt;
* [http://www.jandspromotions.com/wirelesschallenge/index.html 2004 Freescale Wireless Design Challenge] (MC13191/92/93 RF Transceivers, [[Meshnetics Zigbee|ZigBee]])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2003&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/fi2003/ MOTOROLA FLASH INNOVATION 2003 DESIGN CONTEST] (Motorola HC08)&lt;br /&gt;
* [http://www.circuitcellar.com/renesas/ Renesas H8 Design 2003 Contest]&lt;br /&gt;
* [http://www.jandspromotions.com/zilog2003/ ZiLOG Flash for Cash Z8 Encore®! International Design Contest]&lt;br /&gt;
* [http://www.jandspromotions.com/efield203/index.htm 2003 Motorola E-Field Sensor Contest] (MC33794)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2002&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/flash2002/ Mad Dash for Flash Cash] (Microchip, PIC)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2001&#039;&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/dl2001/ Atmel &#039;Design Logic 2001&#039; Design Contest]&lt;br /&gt;
* [http://www.circuitcellar.com/msp430/ MSP430 Design Contest]&lt;br /&gt;
&lt;br /&gt;
== Interfaces &amp;amp; Protokolle ==&lt;br /&gt;
Siehe auch [[Linksammlung#Schnittstellen]]&lt;br /&gt;
&lt;br /&gt;
=== Infrarot (IR) ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.sbprojects.com/knowledge/ir/index.php Übersicht IR-Protokolle] von San Bergmans (engl.): ITT, JVC, NEC, Nokia NRC17, Sharp, Sony SIRC, Philips RC-5, RC-6, RC-MM, RECS80, RCA, X-Sat&lt;br /&gt;
* [http://www.vishay.com/docs/80071/dataform.pdf Data formats for IR controls (PDF)] von Vishay.&lt;br /&gt;
* [http://www.ostan.cz/IR_protocol_analyzer/ IR protocol analyzer] (Freeware)&lt;br /&gt;
&lt;br /&gt;
=== Parallelport ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.projects-lab.com/?p=1139 ECPMON] - ECP Parallel Port Monitor ([[M16C]]/62P) &lt;br /&gt;
&lt;br /&gt;
=== iPod ===&lt;br /&gt;
* [http://ipodlinux.org/IPod_to_T%26A_remotecontrol_adapter IPod to T&amp;amp;A remotecontrol adapter] ([[PIC]]-Projekt)(Link defect)&lt;br /&gt;
* http://jasongarr.wordpress.com/project-pages/ipod-clickwheel-hack/&lt;br /&gt;
&lt;br /&gt;
=== [[RFID]] ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.alexanderguthmann.de/RFIDemulator.html RFIDemulator] - Beschreibung eines RFIDemulators zum klonen von Tags&lt;br /&gt;
* [http://www.mwjournal.com/journal/article.asp?HH_ID=AR_905 Radio Frequency Identification: Evolution of Transponder Circuit Design] - Übersichtsartikel aus dem Microwave Journal&lt;br /&gt;
* [http://www.foebud.org/rfid Die StopRFID-Seiten des FoeBuD e.V.]&lt;br /&gt;
* [http://www.rfzone.org/free-rf-ebooks/ PDF-Bücher (englisch) ]- Bücher über RF, Antennen und elektromagnetische Wellen.&lt;br /&gt;
&lt;br /&gt;
* http://cq.cx/proxmark3.pl Jonathan Westhues RFID Leser/Schreiber/Cloner&lt;br /&gt;
&lt;br /&gt;
http://www.message_bocracco.com/&lt;br /&gt;
&lt;br /&gt;
==== ~ 125 kHz ====&lt;br /&gt;
&lt;br /&gt;
*[http://t4f.org/en/projects/open-rfid-tag Open RFID Tag]&lt;br /&gt;
&lt;br /&gt;
==== 13,56 MHz RFID ====&lt;br /&gt;
* [http://www.openpcd.org/ OpenPCD - a free 13.56MHz RFID reader design] for Proximity Coupling Devices (PCD) based on 13,56MHz communication. This device is able to screen informations from Proximity Integrated Circuit Cards (PICC) conforming to vendor-independent standards such as ISO 14443, ISO 15693 as well as proprietary protocols such as Mifare Classic. (AT91SAM7S128 [[ARM]] Projekt)&lt;br /&gt;
* [http://www.rf-dump.org/ RFDump] is a backend GPL tool to directly interoperate with any RFID ISO-Reader to make the contents stored on RFID tags accessible. (Linux)&lt;br /&gt;
&lt;br /&gt;
==== 2,4 GHz RFID ====&lt;br /&gt;
* [http://www.openbeacon.org/ OpenBeacon] - a free active 2.4GHz beacon design. (Reader: USB oder Ethernet; Tags: RF_Chip: NRF24L01, PIC16F684)&lt;br /&gt;
&lt;br /&gt;
=== [[DMX512]] ===&lt;br /&gt;
* [http://www.soundlight.de/techtips/dmx512/dmx512.htm DMX-512 - was ist das?] Eine Übersicht von SOUNDLIGHT.&lt;br /&gt;
* [http://dworkin-dmx.de/ USB DMX Interface] Bausatz /Fertiggerät USB DMX Interface  &lt;br /&gt;
* [http://www.oksidizer.com/electronic/spp2dmx/index_en.html OksiD DMX 3/1 is a Standard Parallel Port DMX 512 interface for IBM compatible PCs]. Drei Output Universe und ein Input Universe (Universe = 512 channels). Open project. All source code and schematics are available for free. &lt;br /&gt;
* [http://www.usbdmx.com/usb_dmx_interface.html USB DMX Interface revision 1.3] - opto isolated, bus powered, DMX512 from/to [[USB]]interface with both in and out universes. Cheap and simple to build.&lt;br /&gt;
* [http://www.dmx512-online.com/ Ujjal&#039;s DMX512 Seite]&lt;br /&gt;
* [http://llg.cubic.org/dmx4linux/ DMX4Linux 2.6] - A DMX device driver package for Linux (incl. hardware schematics with TI [[MSP430]])&lt;br /&gt;
&lt;br /&gt;
=== Verschiedenes ===&lt;br /&gt;
* [http://www.taelektroakustik.de/deu/index.htm T&amp;amp;A Kommandos] - &#039;&#039;&#039;RC&#039;&#039;&#039; und &#039;&#039;&#039;RCII&#039;&#039;&#039; Kommandoset der Philips PRONTO Familie zur Steuerung von Audiogeräten. Dokumentation siehe unter Downloads.&lt;br /&gt;
* [http://www.marjorie.de/ps2/ps2_protocol.htm Das PS/2 Maus und PS/2- oder AT-Tastatur-Protokoll] (Original auf [http://www.computer-engineering.org/])&lt;br /&gt;
* [http://www.hth.com/snap/ S.N.A.P - Scaleable Node Address Protocol]. S.N.A.P is an free and open network protocol. The protocol was primary developed for PLM-24 based home automation and control systems but it is a generic protocol and not limited to this. S.N.A.P can be used in any type of applications where an easy to learn and light weighted network protocol is needed.&lt;br /&gt;
* [http://www.ulrichradig.de/home/index.php/avr/avr_-_rc PPM / PWM Encoder/Decoder für R/C Funkfernsteuerungen] von Ulrich Radig (AVR, C)&lt;br /&gt;
* [http://www.national.com/analog/interface/lvds_owners_manual LVDS Owner&#039;s Manual - 4th Edition] von National Semiconductor&lt;br /&gt;
* [http://www.mictronics.de/?page=becker Becker Unilink]&lt;br /&gt;
* [http://users.ntplx.net/~andrew/sony/unilink/ Sony UniLink]&lt;br /&gt;
* [http://www.vending.org/technology/MDB_Version_4.pdf Multi-Drop Bus / Internal Communication Protocol (MDB / ICP)]&lt;br /&gt;
&lt;br /&gt;
== Elektronikversender‎ ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Elektronikversender‎]]&lt;br /&gt;
&lt;br /&gt;
== Leiterplattenhersteller ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Platinenhersteller]]&lt;br /&gt;
&lt;br /&gt;
== Schulungen (Online) ==&lt;br /&gt;
* [http://www.kr-onlinetraining.de/ www.kr-onlinetraining.de] Vor Ort und Onlineseminare zu den Themen Elektronik, Reparaturen von Unterhaltungselektronik, Telekommunikation und IT Administration&lt;br /&gt;
* [http://www.esacademy.com/myacademy/ www.esacademy.com] (engl.) - C, CAN, I²C, BlueTooth, PWM, USB, 51LPC, ARM (Einführung)&lt;br /&gt;
* [http://www.elprak.ch Elektronik in der Praxis] Präsentationen zu verschiedenen Themen der Elektronik in der Praxis. Lötvideo, das den zeitlichen Ablauf beim Löten anschaulich darstellt.&lt;br /&gt;
* [http://www.national.com/onlineseminar/ www.national.com] - Amplifiers, Audio, Data Acquisition, Die Products, Displays, Interface, Microcontrollers, Military/Aerospace, Power, Thermal Management, Wireless&lt;br /&gt;
* [http://www.circuitrework.com Circuit Technology Center] - Surgeon grade rework and repair, by the book and guaranteed. Deeplink: [http://www.circuitrework.com/guides/guides.shtml Guides]&lt;br /&gt;
* [http://www.onlinetutorials.de/index.htm onlinetutorials.de] - Linksammlung zu Tutorials für höhere Programmiersprachen ([[HLL]]) wie C, C++, Java, BASIC, Perl, PHP, ...&lt;br /&gt;
* [http://www.awce.com/classroom/ AWCE Interactive Classroom] - Embedded Systems (Using the APP-IV with GCC, Getting Started with the PIC 18F Family), Electronics (CLARC/HBSIG DSP Study Group, Basic Circuits), RoadMap to Programmable Logic&lt;br /&gt;
* [http://www.ibiblio.org/kuphaldt/socratic/ Socratic Electronics] (englisch)&lt;br /&gt;
* [http://www.embedded.com/design/multicore/201200638;jsessionid=4T1T0OZQW4PFSQSNDLRSKH0CJUNN2JVN?printable=true The basics of programming embedded processors] von Wayne Wolf. Neun Artikel bei embedded.com (englisch)&lt;br /&gt;
* [http://webcast.berkeley.edu/course_details.php?seriesid=1906978507 EE 42/EE 100 Introduction to Digital Electronics] - Webcast, Spring 2008 (englisch)&lt;br /&gt;
* [http://freevideolectures.com freevideolectures.com] - Webcasts zu  naturwissenschaftlichen Theman (englisch)&lt;br /&gt;
* [http://www.circuitsage.com/ Circuit Sage], a complete source of information to help you design circuits fast. (Linksammlung zu Software, Artikeln Büchern und Websites)&lt;br /&gt;
* [http://www.DieElektronikerseite.de Die Elektronikerseite] Umfangreiche Sammlung von kleinen Lehrgängen und Schaltungen. Ideal für Anfänger aber auch für Fortgeschrittene&lt;br /&gt;
* [http://homepages.internet.lu/absolute3/tronic/ 3D Virtual Development] - Sammlung von vielen Grundschaltungen im Bereich Oszillator, Operationsverstärker, Empfangstechnik. Vereinzelt in Englisch.&lt;br /&gt;
* [http://cws.gtc.edu/programs/objects/electronics.htm Learning Objects for Electronics] des Engineering Tech Wing of Gateway Technical College (Flash erforderlich)&lt;br /&gt;
* [http://ecee.colorado.edu/~bart/book/book/title.htm Principles of Semiconductor Devices] von Bart Van Zeghbroeck&lt;br /&gt;
* [http://itp.nyu.edu/physcomp/Intro/HomePage Introduction to Physical Computing] ([[AVR]], Arduino)&lt;br /&gt;
* [http://nptel.iitm.ac.in/courses.php?disciplineId=108 NPTEL ELearning Courses Electrical Engineering] (englisch)&lt;br /&gt;
*[http://www.energymicro.com/company/university-program-energy-micro University Program], Lernprogramm zum uC programmieren für Einsteiger (von [https://www.energymicro.com Energy Micro], ist jedoch universell anwendbar)&lt;br /&gt;
* [http://pic-projekte.de http://pic-projekte.de/] PIC- und PIC-C-Tutorial. Besonders geeignet für Einsteiger!&lt;br /&gt;
* [http://www.ta.de http://www.ta.de/] Weiterbildung für Industrietechniker Elektrotechnik IHK ([http://www.ta.de/industrietechniker-elektrotechnik-ihk.html weitere Infos])  und Industriemeister Elektrotechnik IHK ([http://www.ta.de/industriemeister-elektrotechnik-ihk.html weitere Infos])&lt;br /&gt;
&lt;br /&gt;
== Skripte ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.janson-soft.de/skripte/index.html Linksammlung von Volker Lange-Janson]&lt;br /&gt;
* [http://wwwex.physik.uni-ulm.de/lehre/physikalischeelektronik/phys_elektr/phys_elektr.html Physikalische Elektronik und Messtechnik] von Othmar Marti und Dr. Alfred Plettl, Universität Ulm&lt;br /&gt;
* [http://openbookproject.net//electricCircuits/index.htm Lessons in Electric Circuits I-VI] von Tony R. Kuphaldt&lt;br /&gt;
&lt;br /&gt;
== Messequipment ==&lt;br /&gt;
* [http://www.filmetrics.com  Filmetrics Inc.] (Filmetrics manufactures affordable thin-film measurement instruments capable of measuring thin films from 3nm to 0.5mm in thickness.)&lt;br /&gt;
* [http://www.pce-instruments.com  PCE Instruments] (Entwicklung und Produktion für Prüfgeräte und Waagen.)&lt;br /&gt;
* [http://www.bmcm.de/ger/prgr-products.html BMC Messsysteme] Sensorik, Anschlusstechnik, Messverstärker, Messsysteme und Digital I/O ([http://www.bmcm.de/dld/misc-messkette-a4-04.07.pdf Produkt Uebersicht]) auch erhältlich [http://www.redacom.ch/messtechnik/bmcm/index.html hier]&lt;br /&gt;
=== Logikanalyse ===&lt;br /&gt;
* [http://www.pctestinstruments.com Intronix LogicPort], Günstiger, aber sehr leistungsfähiger Logikanalysator mit USB-Anschluß an PC (34Ch, 500MHz Timing, 34 x 2kSa mit Kompression, ca. 367 Euro / 459 SFr.- [http://thinkembedded.ch/Measurement-Tools/LogicPort-Logikanalysator::13.html hier] )&lt;br /&gt;
* Zeroplus LAP-Cxxxx (Familie von LA&#039;s mit unterschiedlichen Daten, 32kBit...2MBit, 16ch oder 32ch, 100MHz..200MHz, Preise von 90,-...1100,- Euro, zu kaufen [http://www.tigal.com/products_category.asp?cid=96 hier])&lt;br /&gt;
* [http://www.tech-tools.com/dv_main.htm TechTools DigiView], Günstiger Logikanalysator mit USB-Anschluß an PC (18Ch, 100MHz Timing, 128kSa mit Kompression,  [http://elmicro.com/de/digiview.html ca. 430Euro])&lt;br /&gt;
* [http://www.tribalmicro.com/logic_an/ Tribalmicro], PC hosted LA (32ch, 40MHz Timing, 128kSa, ca. 1700$)&lt;br /&gt;
* [http://www.nci-usa.com/frame_products_overview.htm NCI GoLogic], Logikanalysator mit USB-Anschluß an PC (34 oder 72Ch, 500MHz Timing, 1 oder 2MSa, ca. 3000..5500$)&lt;br /&gt;
* [http://www.tek.com/products/logic_analyzers/index.html Tektronix], Verschiedene Geräte, standalone oder modular (ab 34ch, 2GHz Timing, ab 512kSa, gut und teuer)&lt;br /&gt;
* [http://www.home.agilent.com/DEger/nav/-536902443.0/pc.html Agilent], Verschiedene Geräte, standalone, modular oder PC-hosted (ab 34ch, ab 800MHz timing, ab 256kSa, gut und teuer)&lt;br /&gt;
* [http://www.sump.org/projects/analyzer/ Sumps LA], günstiges Projekt für einen LA basierend auf einem Digilent Spartan Board (32ch, 100MHz Timing, 256kSa, Kosten Digilent Board ca. 100$ + Versand/Zoll)&lt;br /&gt;
* [http://www.meilhaus.de/produkte/usb-mobile-messtechnik/?user_produkte%5BPATTR%5D=HPG_3-UPG1_3-UPG2_2&amp;amp;user_produkte%5BPR%5D=8&amp;amp;cHash=2c8edb93e2 Meilhaus Electronic - MEphisto Scope UM203] Robustes, mobiles 16 bit Kombi-Instrument 7 Mess-Geräte in einem! (ab 348€)&lt;br /&gt;
* [http://www.hacker-messtechnik.de/13722/59001.html TravelLogic TL2x36], Logikanalysator zum Anschluß an PC über USB, (36ch, 4GHz timing, 200MHz state, Speicher bis 72MBit, Preis ab ca. 500,- netto)&lt;br /&gt;
* [http://www.inovaflex.de/index.html Bus und Logic Analyzer] 100MHz Samplerate und integrierten SPI, I²C, CAN Interpreter, erweiterbar als Oszilloskop&lt;br /&gt;
* [http://www.saleae.com/logic/ logic] - Logik-Analyzer mit 8 Kanälen, mit Software zur Analyse von SPI, I2C, UART, etc... (ca 150$ + Versand/Zoll)&lt;br /&gt;
* [http://www.deditec.de/de/logikanalysatoren/prod/usb-logi-500.html DEDITEC USB-LOGI-500], kostengünstiges Einsteigermodell mit USB-Anschluß und dazugehöriger Software Logi+ (36Ch, Abtastrate 500MHz, 4096 Samples Speichertiefe/Kanal,  ca. 236 Euro)&lt;br /&gt;
* [http://basic.io/index.php/component/virtuemart/alogic-analyzer-detail Alogic Analyzer]: Verfügt über USB-, I2C-, UART- und SPI-Protokoll-Dekoder. Vier oder zwei Kanäle mit bis zu 24 MHz Abtastrate. USB-High-Speed-Transfer zur kontinuierlichen Datenspeicherung. Aufzeichnung über Tage hinweg (nur durch Festplatte begrenzt). Preis 99,- Euro incl. MwSt.&lt;br /&gt;
&lt;br /&gt;
* Eine Übersicht über verschiedene Selbstbauprojekte: [[Logic_Analyzer]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.timing-diagrams.com TimingAnalyzer] can be used to easily draw timing diagrams and perform timing analysis to find faults in digital logic systems. Written in Java, it runs on any platform that supports the Java Run-time Environment, JRE1.6.0 or Java Development Kit JDK1.6.0 or newer.&lt;br /&gt;
&lt;br /&gt;
=== Oszilloskope ===&lt;br /&gt;
&lt;br /&gt;
siehe die separate [http://www.mikrocontroller.net/articles/Oszilloskop Seite] zum Thema&lt;br /&gt;
&lt;br /&gt;
=== Generatoren ===&lt;br /&gt;
[http://www.meilhaus.de/produkte/mess-und-steuer-karten/?user_produkte%5BPR%5D=23&amp;amp;cHash=64a269a3c6 Meilhaus Electronic - ME-6x00] Waveform-Generator - potentialfrei isolierte 16 bit Analog-Ausgabe-Karte (ab EUR 1138,00)&lt;br /&gt;
&lt;br /&gt;
=== Handbücher für Messgeräte ===&lt;br /&gt;
Für ältere kommerzielle Messgeräte sind viele Handbücher im Web als PDF verfügbar. Hier eine Linkliste für den &amp;lt;u&amp;gt;kostenlosen&amp;lt;/u&amp;gt; Download:&lt;br /&gt;
* [http://www.ko4bb.com/cgi-bin/manuals.pl KO4BB Didier Juges]&lt;br /&gt;
* [http://bama.edebris.com/manuals/ BAMA-Edebris (mirror)]&lt;br /&gt;
* [http://www2.faculty.sbc.edu/kgrimm/boatanchor/index.htm BAMA Originalseite K4XL]&lt;br /&gt;
* [http://www.to-way.com/teqman.html to-way.com (K7MLR)]&lt;br /&gt;
* [ftp://ftp.bluefeathertech.com/pub/electronics/testgear/ Bluefeathertech FTP-Server]&lt;br /&gt;
* [http://www.bitsavers.org/ Bitsavers, vor allem Computermanuals und Software]&lt;br /&gt;
* [https://www.logsa.army.mil/etms/online.cfm Handbücher der US-Army (-&amp;gt;&amp;quot;i accept&amp;quot; -&amp;gt; &amp;quot;Enter the site&amp;quot; -&amp;gt; Suchbegriff z.B &amp;quot;Analyzer&amp;quot; in &amp;quot;Pub Title Text&amp;quot; eingeben -&amp;gt; search)]&lt;br /&gt;
* [http://www.eserviceinfo.com/browse.php eserviceinfo.com]&lt;br /&gt;
* [http://www.one-electron.com/FC_TestEquipment.html one-electron.com]&lt;br /&gt;
* [http://manoman.sqhill.com/ manoman]&lt;br /&gt;
* [http://www.nostalgiaair.org/ Nostalgia Air schematics, manuals, tube data]&lt;br /&gt;
* [http://pages.cthome.net/fwc/ Freds sehr alte (vor allem Militärelektronik-) Geräteliteratur, Röhrentechnik] und hier [http://pages.cthome.net/fwc/TO-DOC.HTM Übersicht zur Nummerierung der Militärhandbücher]&lt;br /&gt;
* [http://www.hpmemory.org/ressources/resrc_home.htm HP-Memory.org, alte Applications und HP-Journals]&lt;br /&gt;
* [http://www.ebaman.com/index.php/home Ebaman Registrierung per e-Mail erforderlich]&lt;br /&gt;
&lt;br /&gt;
Eine [http://www.slack.com/elec.html Linksammlung zu Messgeräten], sehr ausführlich&lt;br /&gt;
&lt;br /&gt;
== Vermischtes == &lt;br /&gt;
&lt;br /&gt;
=== Ältere Applikationsbücher und Schaltungssammlungen ===   &lt;br /&gt;
*[https://www.rainers-elektronikpage.de/ Rainers-Elektronikpage]  - Sammlung alter Applikationsbücher und Schaltungen (Siemens, Telefunken, Valvo, etc.)&lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://forum.sparkfun.com/ Spark Fun Electronics] MicroController Ideas and Support (Englisch) ([[AVR]], [[PIC]], [[MSP]], [[ARM]], OpenOCD)&lt;br /&gt;
* [http://www.edaboard.com/ EDAboard.com] International Electronics Forum Center (Englisch)&lt;br /&gt;
* [http://stsboard.de STS Reparatur Forum] Forum für Radio und Fernsehtechniker&lt;br /&gt;
* [http://pic-projekte.de/phpBB3/ PIC-Forum] Deutschsprachiges PIC-Forum&lt;br /&gt;
* [http://formu.iwenzo.de Elektronik Reparatur Forum] Informationselektroniker Reparatur Forum&lt;br /&gt;
* [http://www.elektrikforum.de Elektrik-Forum] Forum zum Thema Elektroinstallationen&lt;br /&gt;
* [http://www.eeweb.com/electronics-forum/ Electronics Forum] Electrical Engineering Community Forum (Englisch)&lt;br /&gt;
* [http://www.digikey.com/techxchange/community/microcontroller Digi-Key TechXchange Communities &amp;gt; Microcontroller Solutions Community]&lt;br /&gt;
* [http://forum.energymicro.com Forum von Energy Micro]&lt;br /&gt;
&lt;br /&gt;
=== Videocasts und Podcasts ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.eevblog.com/ EEVblog] Electronics Engineering Video Blog von David L. Jones (englisch). &#039;&#039;Anm.: David ist Australier und das hört man. An die Sprechweise kann man sich aber gewöhnen. Und nicht erschrecken, wenn öfter mal ein drastisches Fourletterword auftaucht!&#039;&#039;&lt;br /&gt;
* [http://www.theamphour.com/ The Amp Hour] Podcast mit Chris Gammell und David Jones (englisch)&lt;br /&gt;
* [https://www.youtube.com/watch?v=IIV-P6K2t4M Youtube-Video] Über Ingenieursdienstleister und einen Audi-Personalchef in Erklärungsnot&lt;br /&gt;
&lt;br /&gt;
=== Projektsammlungen ===&lt;br /&gt;
Meist in Englisch. &lt;br /&gt;
* [http://circuitscout.com/ Circuit Scout] - Online Suchmaschine&lt;br /&gt;
* [http://www.epanorama.net ePanorama.net]&lt;br /&gt;
&amp;lt;!-- offline 4/2010&lt;br /&gt;
* [http://www.commlinx.info Electronic Schematics] from CommLinx Solutions Pty Ltd&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [http://www.discovercircuits.com Discover Circuits] a collection of 25000+ electronic circuits or schematics&lt;br /&gt;
* [http://www.next.gr/ Next] Electronic Circuit Database&lt;br /&gt;
* [http://www.beyondlogic.org/ BeyondLogic.org] Diverse Mikrocontroller und Interfacing Projekte&lt;br /&gt;
* [http://www.uoguelph.ca/~antoon/circ/circuits.htm Circuits for the Hobbyist] by VA3AVR&lt;br /&gt;
* [http://www.stefpro.de/ StefPro.de] Diverse Projekte und Datenblattsammlung nach Kategorien, Microcontroller, Digital und Analog... Sowie Tutorial &amp;quot;Grundlagen der Bestückung von Platinen&amp;quot; und anderes Wissen&lt;br /&gt;
* [http://www.schaltplaene-online.net/ www.schaltplaene-online.de] Umfangreiche Linksammlung zu Schaltplänen aller Art&lt;br /&gt;
* [http://www.halloweenmonsterlist.info/ MoNsTeRlIsT of Halloween Projects]&lt;br /&gt;
* [http://www.open-innovation-projects.org Open Innovation Projects] - Sammlung von offenen Projekten zu physischen Produkten, darunter etliche Mikrocontroller-Projekte. Man kann selber Projekte hinzufügen.&lt;br /&gt;
* [http://blog.thomasheldt.de/ ThomasHeldt.de Blog] Elektronik Blog mit vielen interessanten Projekten.&lt;br /&gt;
&lt;br /&gt;
=== Referenzen, Beschreibungen, Standards ===&lt;br /&gt;
* Extraseite: [[Datenblätter]]&lt;br /&gt;
* [http://www.technick.net Technik.Net] Pinouts, Circuits and Guides&lt;br /&gt;
* [http://pinouts.ru/ pinout.ru] und [http://www.hardwarebook.info/ hardwarebook.info] - Online handbooks of hardware pinouts, cables schemes and connectors layouts&lt;br /&gt;
* [http://www.networktechinc.com/technote.html Keyboard, Monitor &amp;amp; Mouse Pinouts] for PC, SUN, MAC, USB, FireWire, RS232, Digital Flat Panel and EVC configurations&lt;br /&gt;
* [http://www.q1.fcen.uba.ar/materias/iqi/joygus/tvgames.html Special joysticks used in TV games]&lt;br /&gt;
* [http://microsym.com/editor/assets/intelhex.pdf Intel-Hex-Format (PDF)]&lt;br /&gt;
* [http://home.teleport.com/~brainy/fat32.htm FAT32 Structure Information] - Written by Jack Dobiash&lt;br /&gt;
* [http://www.pjrc.com/tech/8051/ide/fat32.html Understanding FAT32 Filesystems] mit Beispielen (engl.)&lt;br /&gt;
* [http://www.rev-ed.co.uk/docs/picaxe_manual3.pdf Microcontroller Interfacing Circuits] - Revolution Education Ltd.&lt;br /&gt;
* [http://www.digchip.com/application-notes/ Datenbank für &#039;&#039;Application Notes&#039;&#039;] bei www.digchip.com&lt;br /&gt;
* [http://www.pavouk.org/hw/lamp/en_index.html#bigluz20w Compact Fluorescent Lamp (CFL)], Schaltungen von Energiesparlampen&lt;br /&gt;
&lt;br /&gt;
=== Online-Bücher ===&lt;br /&gt;
* [http://www.allaboutcircuits.com/ All About Circuits] - Series of online textbooks covering electricity and electronics. The information provided is great for both students and hobbyists who are looking to expand their knowledge in this field. (Englisch)&lt;br /&gt;
* http://www.computer-books.us/ - überwiegend zu höheren Programmiersprachen. Englisch.&lt;br /&gt;
* [http://www.vias.org/feee/index.html FEEE - Fundamentals of Electrical Engineering and Electronics]&lt;br /&gt;
* [http://www.nrbook.com/a/bookcpdf.php Numerical Recipes in C, Second Edition (1992)]&lt;br /&gt;
* [http://www.specamotor.de/freebook.php Electrical drives for precision engineering designs]  Prof.dr.ir. Compter&lt;br /&gt;
* [http://www.joretronik.de/Web_NT_Buch/Vorwort/Vorwort.html Das neue InterNetzteil- und Konverter-Handbuch] Dipl.-Ing. Jörg Rehrmann&lt;br /&gt;
* [http://stefanfrings.de/mikrocontroller_buch/index.html Einstieg in die Elektronik mit (AVR) Mikrocontrollern] Stefan Frings&lt;br /&gt;
&lt;br /&gt;
=== Bedienungsanleitungen / Manuals ===&lt;br /&gt;
* [http://bama.edebris.com/manuals/ BAMA Archiv] &lt;br /&gt;
* [http://www.big-list.com/ Big-List.com] - This is a directory of over 600 dealers in used high technology equipment. Most deal in used electronic test equipment or semiconductor production equipment. Included are dealers in related high technology items, rental companies, equipment auction sites, test equipment manual dealers, foreign (non-U.S.) used equipment dealers, cal labs, and repair services.&lt;br /&gt;
* [http://ko4bb.com/manuals/ KO4BB&#039;s Manuals Repository]&lt;br /&gt;
&lt;br /&gt;
=== Ungewöhnliche Basteleien (Hacks) ===&lt;br /&gt;
Auf eigene Gefahr und nicht immer ganz ernst... Meist in Englisch. &lt;br /&gt;
&lt;br /&gt;
* Metablogs (tägliche News)&lt;br /&gt;
** [http://www.makezine.com/ Makezine]&lt;br /&gt;
** [http://www.hackaday.com/ Hack a Day]&lt;br /&gt;
** [http://www.hackedgadgets.com/ HackedGadgets]&lt;br /&gt;
** [http://www.hacknmod.com/ Hack N&#039; Mod]&lt;br /&gt;
** [http://zedomax.com/blog/category/diy/ Zedomax DIY]&lt;br /&gt;
** [http://digital-diy.com Digital-DIY]&lt;br /&gt;
** [http://dangerousprototypes.com Dangerous Prototypes]&lt;br /&gt;
** [http://www.heise.de/hardware-hacks/ Heise Hardware Hacks]&lt;br /&gt;
&lt;br /&gt;
* Foren&lt;br /&gt;
** [http://www.fingers-welt.de/home.htm Fingers elektrische Welt]&lt;br /&gt;
** [http://forum.hackedgadgets.com/ HackedGadgets Forum]&lt;br /&gt;
** [http://stsboard.de Reparatur Forum]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
domain expired&lt;br /&gt;
** [http://camerahacking.com camerahacking Forum]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Projektsammlungen&lt;br /&gt;
** Final Projects der Kurse [http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/ ECE4760] (Designing with Microcontrollers) und [http://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/ ECE5760] (Advanced Microcontrollers) an der Cornell University &lt;br /&gt;
** [http://www.coolcircuit.com/gadgets/ Cool Circuit] tot -&amp;gt; https://web.archive.org/web/20130116005101/http://www.coolcircuit.com/gadgets/&lt;br /&gt;
** [http://www.electronics-lab.com/blog/ Electronics-Lab.com Blog]&lt;br /&gt;
** [http://blog.energymicro.com/category/hack-a-gecko/ Hack a Gecko Blog] Energy Micro Hacks&lt;br /&gt;
&lt;br /&gt;
* DIY-Anleitungen&lt;br /&gt;
** [http://www.instructables.com/ instructables]&lt;br /&gt;
** [http://www.scitoys.com/ Scitoys] You Can Make With Your Kids&lt;br /&gt;
&lt;br /&gt;
* Mix&lt;br /&gt;
** [http://www.evilmadscientist.com Evil Mad Scientist Laboratories] - u.a. The Flying Spaghetti Monster, on toast ;-)&lt;br /&gt;
** [http://home.earthlink.net/~lenyr/index.html Spark, Bang, Buzz and Other Good Stuff] ([http://www.sparkbangbuzz.com Neue Sachen])&lt;br /&gt;
** [http://www.electricstuff.co.uk/ Mike&#039;s Electric Stuff] - Antique Glass, Tesla coils and high-voltage stuff, Lasers&lt;br /&gt;
** [http://electricity.pbwiki.com/ DHS electricity]&lt;br /&gt;
** [http://www.elephantstaircase.com/wiki/index.php?title=Main_Page Elephant Staircase]&lt;br /&gt;
** [http://mycpu.eu Eine selbstgebaute CPU aus TTL-Gattern]&lt;br /&gt;
** [http://www.knollep.de/ Knolles Bauanleitungen]&lt;br /&gt;
** [http://www.ikalogic.com/index.php ikalogic.com]&lt;br /&gt;
** [http://www.electronicsinfoline.com/ Electronics Infoline]&lt;br /&gt;
** [http://www.uchobby.com/ uC Hobby]&lt;br /&gt;
** [http://elettrolinux.com elettrolinux] - Elektronik und Linux (engl.)&lt;br /&gt;
** [http://electronicfox.at.tf/ electronicfox] - Verschiedene Projekte mit [[AVR]], Fernbedienungen und deren Aufbau sowie Decoder und alten ICs aus dem Recyclinghof&lt;br /&gt;
** [http://www.techfocusmedia.net/archives/fresh-bytes/ Fresh Bytes von Techfocusmedia]&lt;br /&gt;
** [http://stefanfrings.de/esp8266/index.html ESP-8266 Module] Anwendungshinweise von Stefan Frings&lt;br /&gt;
&lt;br /&gt;
=== Zeitschriften über Elektronik und µC ===&lt;br /&gt;
* [http://www.robotrontechnik.de/html/forum/thwb/showtopic.php?threadid=11011 rfe-Datenbank] - ein Projekt von PSblnkd&lt;br /&gt;
* [http://www.elektroniknet.de/ Elektronik - Das Elektronikmagazin für Entwickler]&lt;br /&gt;
* [http://www.eue24.net/ E&amp;amp;E Faszination Elektronik] - Magazin für Elektronik-Entwickler und Elektronik-Interessierte&lt;br /&gt;
* [http://www.embedded.com embedded.com] - Hauptaugenmerk auf die Philosophie drumherum&lt;br /&gt;
* [http://www.siliconchip.com.au/ Silicon Chip] - Freie Artikel unter &#039;&#039;Free Preview&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/ Circuit Cellar] - Freie Artikel unter &#039;&#039;Digital Library&#039;&#039;&lt;br /&gt;
* [http://www.elektronikpraxis.vogel.de/themen/hardwareentwicklung/mikrocontrollerprozessoren/ Elektronikpraxis - Das professionelle Elektronikmagazin]&lt;br /&gt;
* [http://www.funkamateur.de/ FUNKAMATEUR] - Elektronik, Amateurfunk, CB-Funk u. v. a. m.&lt;br /&gt;
* [http://www.edn.com/ EDN] (etwas schwer zu finden, aber lesenswert: die [http://www.edn.com/channel/Design_Ideas.php Design Ideas] und das [http://www.edn.com/archive/ Archiv der Druckausgaben])&lt;br /&gt;
* [http://www.franzis.de/elo-das-magazin ELO - Das Magazin] für Elektronik-Einsteiger&lt;br /&gt;
* [http://techonline.com/ TechOnline]&lt;br /&gt;
* [http://www.elektor.de/ Elektor] &lt;br /&gt;
* [http://www.techbriefs.com/tech-briefs/electronics-techbriefs NASA Tech Briefs] - Electronics &amp;amp; Computers&lt;br /&gt;
* [http://et.nmsu.edu/~etti/ Technology Interface Journal]&lt;br /&gt;
* [http://dev.emcelettronica.com/ Your Electronics Open Source]&lt;br /&gt;
* [http://www.element-14.com element14.com] is an information portal and community specifically built for electronic design engineers.&lt;br /&gt;
* [http://www.itwissen.info ITWissen.info] (gutes Lexikon)&lt;br /&gt;
* [http://www.nutsvolts.com Nuts&#039;n&#039;Volts] Amerikanisches Elektronikmagazin mit Online Blog&lt;br /&gt;
* [http://de.rs-online.com/web/generalDisplay.html?id=eTech eTech] von RS Online&lt;br /&gt;
* [http://www.eeweb.com/ EEWeb], a premier electrical engineering community for hardware designers.&lt;br /&gt;
* [http://www.all-about-test.info/ All-about-Test], ein News- und Informations-Portal über Test- und Messtechnik.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=107745</id>
		<title>AVR-Tutorial: Equipment</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=107745"/>
		<updated>2025-10-26T11:19:51Z</updated>

		<summary type="html">&lt;p&gt;Alesi: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AVR-Tutorial - Benötigte Ausrüstung =&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller alleine ist noch zu nichts nütze. Damit man etwas damit anfangen kann braucht man eine Schaltung in die der Controller eingesetzt wird. Dazu werden bei Elektronikhändlern Platinen angeboten, die alles nötige (Taster, LEDs, Steckverbinder...) enthalten. Häufig enthalten diese Platinen nicht nur Platz für den Mikroprozessor, sondern auch einen ISP-Programmierer (Näheres dazu später)&lt;br /&gt;
&lt;br /&gt;
Da es eine Unmenge verschiedener Mikrocontroller allein aus der AVR-Familie gibt, ist der Anfänger mit der Auswahl bereits überfordert. Dieses Tutorial (und viele andere auch) beginnt mit dem &#039;&#039;mittelgroßen&#039;&#039; Controller &#039;&#039;&#039;ATmega8&#039;&#039;&#039;. Die 8 steht für 8 Kilobyte Flash-Speicher. Er gilt als ideal für Einsteiger, und auch von „alten Hasen“ wird dieser Typ gern verwendet. Es gibt ihn im 28-poligen DIL-Gehäuse, ideal für Bastelschaltungen auf dem Steckbrett, als auch in verschiedenen SMD-Gehäusen wenn das Endgerät klein werden soll.&lt;br /&gt;
&lt;br /&gt;
Das Tutorial kann auch mit dem weniger alten &#039;&#039;&#039;ATmega88&#039;&#039;&#039; (oder ATmega88A, ATmega88PA) genutzt werden. Der ATmega88 ist zwar nicht als Ersatz für den ATmega8 entwickelt worden, kann aber auf Grund der Pin-Kompatibilität sehr leicht in bestehenden Schaltungen ersetzt werden. Einige Besonderheiten müssen dabei bei der Programmierung berücksichtigt werden, denn die Lage vieler IO-Register, und teils der offizielle Name, hat sich ggü. dem ATmega8 geändert. Einige der IO-Register sind nicht mehr per In/OUT ansprechbar, so dass ggf. etwas längerer Code entsteht. &lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Verbesserungen des ATmega88 gegenüber dem ATmega8 im Überblick:&lt;br /&gt;
  ( übernommen aus https://rn-wissen.de/wiki/index.php?title=ATmega48_ATmega88_ATmega168_ATmega328 )&lt;br /&gt;
&lt;br /&gt;
    Schnellere Taktfrequenz bis 20MHz&lt;br /&gt;
    Geringerer Energieverbrauch&lt;br /&gt;
    Schnellere EEPROM Schreibzugriffe&lt;br /&gt;
    On-Chip Deggugging möglich mit DebugWire (über den RESET Pin)&lt;br /&gt;
    Pin Change Interrupt auf allen Eingangs Pins&lt;br /&gt;
    1.1V kalibrierte Referenzspannung im ADC gegenüber 2.56V beim ATmega8; &lt;br /&gt;
      (Signalspannungen sind leichter teilbar als multiplizierbar)&lt;br /&gt;
    Timer 0,2 erweitert um PWM und Compare Einheit&lt;br /&gt;
    Ausgabe des Systemtaktes auf einen I/O Pin möglich&lt;br /&gt;
    USART statt UART&lt;br /&gt;
    Programmierbarer Teiler für den Takt&lt;br /&gt;
&lt;br /&gt;
Eine detailierte Beschreibung der Unterschiede zwischen einem ATmega8 und ATmega88 findet man in der Application Note &amp;quot;AVR094: Replacing ATmega8 by ATmega88&amp;quot; unter https://ww1.microchip.com/downloads/en/AppNotes/doc2553.pdf .&lt;br /&gt;
&lt;br /&gt;
=== Fertige Evaluations-Boards und Starterkits ===&lt;br /&gt;
&lt;br /&gt;
==== AVR Starterkit aus dem Mikrocontroller.net-Shop ====&lt;br /&gt;
&lt;br /&gt;
Sehr gut für dieses Tutorial geeignet ist das [https://www.olimex.com/Products/AVR/Proto/AVR-P28-8MHz/ Olimex AVR-P28-Board], welches zusätzlich noch den Controller ATmega8, einen USB-ISP-Programmieradapter und ein Steckernetzteil benötigt. Die Platine enthält eine Fassung für den Controller, einen Spannungswandler, die Beschaltung für die serielle Schnittstelle und einen Anschluss für den Programmieradapter. Die restliche Hardware wie LEDs und Taster kann man sich selber nach Belieben auf das Lochrasterfeld löten.&lt;br /&gt;
&lt;br /&gt;
==== STK500 ====&lt;br /&gt;
[[Bild:Stk500.jpg|right]]&lt;br /&gt;
Das AVR-STK500 ist das Standard-Board für AVR Entwicklung, direkt von Atmel. Es enthält auch einen ISP-Programmer und ist fertig aufgebaut. Es ist unter Entwicklern sehr beliebt und wird natürlich von Atmel unterstützt. Es gilt allgemein als gute Investition wenn man ernsthaft in das Thema einsteigen möchte.&lt;br /&gt;
&lt;br /&gt;
Das AVR-STK500 kostet bei Reichelt ca. 188 Euro (Stand März 2025). Ein geeignetes Netzteil muss zusätzlich erworben werden.&lt;br /&gt;
&lt;br /&gt;
==== Pollin ATMEL Evaluations-Board Version 2.x ====&lt;br /&gt;
&lt;br /&gt;
Bei [https://www.pollin.de/ Pollin Electronic] gab es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz waren die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung mussten separat beschafft werden. Auf dem Board war ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. Siehe [[Pollin ATMEL Evaluations-Board]]. Inzwischen (Stand 2022) ist das Pollin-Board nicht mehr im Angebot.&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board von [https://www.pollin.de/ Pollin] bestand die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten. Siehe [[Pollin Funk-AVR-Evaluationsboard]]. Auch dieses Board ist im Jahr 2022 nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
==== Rumpus Board von lochraster.org ====&lt;br /&gt;
&lt;br /&gt;
Lochraster.org bietet ein Entwicklungsboard namens &#039;&#039;rumpus&#039;&#039; an. Es kommt als Bausatz mit allen Teilen und Microcontroller (Atmega 168). Auf dem Microcontroller ist bereits ein USB Bootloader installiert, so dass man nach dem Zusammenbau sofort starten kann. Das Board wird direkt über USB mit Strom versorgt und programmiert. Es kann auch selbst als Programmer für AVR Microcontroller benutzt werden. Das Board ist mit recht umfangreicher Peripherie ausgestattet, so dass sich von sehr einfachen Anwendungen wie dem Blinken einer LED bis hin zu komplexen Aufgaben wie Senden und Empfangen von Infrarot Signalen eine Vielzahl von Anwendungen realisieren lassen. Mit 45 Euro gehört es sicher nicht zu den ganz billigen Einsteigerboards, für den ambitionierten Amateur bietet die reichhaltige Peripherie den Vorteil, das Board während des gesamten Lernprozesses zu nutzen ohne für die Realisierung komplexerer Aufgaben neue Hardware auflöten zu müssen. Auch relativiert sich dieser Preis wieder dadurch, dass kein ISP Programmer benötigt wird. Beim Umstieg auf ein anderes Board, für welches man dann einen ISP Programmer benötigt, kann der Rumpus diese Aufgabe übernehmen anstatt zum alten Eisen geworfen zu werden (s. Infos im [http://www.mikrocontroller.net/topic/217122#2165435 Forumbeitrag von Sebastian Noack]).&lt;br /&gt;
&lt;br /&gt;
Weitere Infos unter http://www.lochraster.org/ und http://wiki.lochraster.org/&lt;br /&gt;
&lt;br /&gt;
==== RN-Control ====&lt;br /&gt;
&lt;br /&gt;
Die Forengemeinde von Roboternetz hat ebenfalls ein Evaluierungsboard entwickelt das mittlerweile sehr ausgereift ist und viele Erweiterungsmöglichkeiten bietet.&lt;br /&gt;
&lt;br /&gt;
Siehe:&lt;br /&gt;
* [http://robotikhardware.de/ http://robotikhardware.de/]&lt;br /&gt;
* [http://www.roboternetz.de/ http://www.roboternetz.de/]&lt;br /&gt;
&lt;br /&gt;
==== Arduino ====&lt;br /&gt;
Die Boards der [http://www.arduino.cc Arduino-Familie] bieten z.B. einen ATmega328P mit 16MHz und lassen sich über einen integrierten USB-seriell-Wandler und [[Bootloader]] programmieren. Die Ports sind auf Buchsenleisten herausgeführt. Arduino-Boards können auch unabhängig von der Arduino-Entwicklungsumgebung (Arduino-IDE) als AVR-Entwicklungsboard genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Andere ====&lt;br /&gt;
&lt;br /&gt;
Das Angebot an AVR-Evaluationboards, -Experimentierplatinen, -Entwicklerplatinen oder wie die jeweiligen Hersteller ihre Produkte auch immer bezeichnen, ist mittlerweile recht groß geworden. Sie alle zu bewerten ist unmöglich geworden.&lt;br /&gt;
&lt;br /&gt;
=== Selbstbau ===&lt;br /&gt;
&lt;br /&gt;
Ein fertiges Board ist gar nicht nötig, man kann die benötigte Schaltung auch selbst auf einem kleinen Steckbrett oder einer Lochrasterplatine aufbauen. So kompliziert wie das STK500 wird es nicht, es reichen eine Handvoll Bauteile. Wie man das macht wird im Folgenden beschrieben.&lt;br /&gt;
Steckbretter (Breadboards) gibt&#039;s z.&amp;amp;nbsp;B. bei [https://www.reichelt.de/ Reichelt], [https://de.elv.com/ ELV] oder [https://www.conrad.de/ Conrad].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8_Tutorial.png|center|framed| Die Grundschaltung eines ATmega8/ATmega8A.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Pinbelegung der 6-poligen [[ISP]]-Verbindung weicht von den ATMEL-Angaben ab! Wenn ATMEL oder ATMEL-kompatible ISP-Adapter benutzt werden, die Pinbelegung aus [https://ww1.microchip.com/downloads/en/Appnotes/atmel-2521-avr-hardware-design-considerations_applicationnote_avr042.pdf#page=8 Application Note AVR042 (PDF)] bzw. [[AVR In System Programmer#Pinbelegung]] benutzen!]]&lt;br /&gt;
&lt;br /&gt;
Über den Takteingang &#039;&#039;&#039;XTAL1&#039;&#039;&#039; ist der Mikrocontroller mit dem &#039;&#039;&#039;Quarzoszillator&#039;&#039;&#039; verbunden, der den benötigten Takt von 4&amp;amp;nbsp;MHz liefert (siehe unten). Achtung: die Pins werden, wenn man den Oszillator mit der Schrift nach oben vor sich liegen hat, von unten links aus abgezählt. Unten links ist Pin 1, unten rechts Pin 7, oben rechts Pin 8 und oben links Pin 14 (natürlich hat der Oszillator nur vier Pins. Die Nummerierung kommt daher, dass bei einem normalen IC dieser Größe an den gleichen Positionen die Pins Nr. 1, 7, 8 und 14 wären). Zu den Pins Datenblatt beachten [https://www.mikrocontroller.net/topic/204429#2015503].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PD0–PD7&#039;&#039;&#039; und &#039;&#039;&#039;PB0–PB5&#039;&#039;&#039; sind die &#039;&#039;&#039;IO-Ports&#039;&#039;&#039; des Mikrocontrollers. Hier können Bauteile wie LEDs, Taster oder LCDs angeschlossen werden.&lt;br /&gt;
Der &#039;&#039;&#039;Port C (PC0–PC5)&#039;&#039;&#039; spielt beim ATmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!&lt;br /&gt;
An &#039;&#039;&#039;Pin 17–19&#039;&#039;&#039; ist die Stiftleiste zur Verbindung mit dem ISP-Programmer angeschlossen, über den der AVR vom PC programmiert wird (Achtung: Pins in Abbildung entsprechen nicht der Belegung des AVRISP mkII. Die korrekte Pin-Belegung kann im [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42093-AVR-ISP-mkII_UserGuide.pdf#page=8 Handbuch des AVRISP mkII] eingesehen werden).&lt;br /&gt;
Die Resetschaltung, bestehend aus &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;C1&#039;&#039;&#039;, sorgt dafür, dass der Reseteingang des Controllers standardmäßig auf Vcc=+5V liegt.&lt;br /&gt;
Zum Programmieren zieht der ISP-Adapter die Resetleitung auf Masse (GND), die Programmausführung wird dadurch unterbrochen und der interne Speicher des Controllers kann neu programmiert werden.&lt;br /&gt;
Zwischen Vcc und GND kommen noch jeweils ein 100nF-Keramik- oder Folienkondensator C3 und C4, um Störungen in der Versorgungsspannung zu unterdrücken. Diese [[Kondensator#Entkoppelkondensator | Abblockkondensatoren]] sollten so nah wie möglich am Controller platziert werden. An den Ausgang ARef wird ebenfalls ein 100nF-Kondensator angeschlossen. Dieser wird allerdings erst benötigt, wenn der Analog/Digital-Konverter des µC in Betrieb genommen wird.&lt;br /&gt;
&lt;br /&gt;
Für den Anschluss des ISP-Programmiergerätes kann man im Grunde jede beliebige Pin-Belegung des ISP-Steckers benutzen, solange nur alle benötigten Leitungen mit dem Programmiergerät verbunden sind. In der Praxis haben sich allerdings bestimmte Belegungen durchgesetzt. Im Schaltbild ist eine &#039;&#039;&#039;eigene&#039;&#039;&#039; Belegung des 6-poligen Steckers gezeigt. Die alternative Pinbelegung eines 2-reihigen/10-poligen Steckers ist eine übliche Belegung. Benutzt man so eine übliche Belegung, so reicht normalerweise ein 10-poliges Flachbandkabel, um den vorhandenen ISP-Programmer so mit der Schaltung zu verbinden, dass alle Signale am richtigen Prozessorpin ankommen. Siehe auch [[AVR In System Programmer]].&lt;br /&gt;
&lt;br /&gt;
Hier die Liste der benötigten Bauteile: &lt;br /&gt;
&lt;br /&gt;
* R1         Widerstand 10 kΩ&lt;br /&gt;
* C1         Keramikkondensator 47 nF&lt;br /&gt;
* C2, C3, C4 Keramik- oder Folienkondensator 100 nF&lt;br /&gt;
*            Stiftleiste 6-polig&lt;br /&gt;
*            Mikrocontroller ATmega8 oder ATmega8A (kann u.&amp;amp;nbsp;a. bei Reichelt bestellt werden)&lt;br /&gt;
*            Quarzoszillator 4 MHz&lt;br /&gt;
&lt;br /&gt;
Beim Steckbrett ist darauf zu achten, dass man die parallel laufenden Schienen für GND (blau) und Vcc (rot) jeweils mit Drähten verbindet (nicht Vcc und GND miteinander!).&lt;br /&gt;
&lt;br /&gt;
Eine Zusammenstellung der benötigten Bauteile befindet sich in der [[AVR-Tutorial Bestellliste|Bestellliste]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beschreibung für ein Minimalsystem gibt es auf [https://web.archive.org/web/20171214110643/http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 conelek.org].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) ===&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller benötigt, wie jeder Computer, eine Taktversorgung. Der Takt ist notwendig, um die internen Abläufe im Prozessor in einer zeitlich geordneten Reihenfolge ausführen zu können. Die Frequenz des Taktes bestimmt im Wesentlichen, wie schnell ein Mikrocontroller arbeitet. Bei einem ATmega8 gibt es viele Möglichkeiten zur Taktversorgung, die Wichtigsten sollen hier gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
* interner RC-Oszillator (das ist der Auslieferungszustand),&lt;br /&gt;
* Keramikresonator,&lt;br /&gt;
* Quarz,&lt;br /&gt;
* Quarzoszillator.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Vergleich der AVR-Taktquellen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Typ || Genauigkeit || Vorteile || Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| interner&amp;lt;br /&amp;gt;RC-Oszillator || 1…5 % || • XTAL1/2-Pins als I/O verfügbar&amp;lt;br /&amp;gt;• kostenlos&amp;lt;br /&amp;gt;• kein Platzbedarf&amp;lt;br /&amp;gt;• schnellstes Einschwingen (wenige Takte) || • ungenau&amp;lt;br /&amp;gt;• Betrieb der [[UART]] unzuverlässig&lt;br /&gt;
|-&lt;br /&gt;
| Keramikresonator || 0,5…1 % || • ausreichend genau für [[UART]]&amp;lt;br /&amp;gt;• in sehr hohen Stückzahlen billiger als Quarz&amp;lt;br /&amp;gt;• schnelleres Einschwingen als Quarz (ca. 1ms) || • XTAL1/2-Pins nicht als I/O verfügbar&amp;lt;br /&amp;gt;• Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10…100&amp;amp;nbsp;ppm || • sehr genau&amp;lt;br /&amp;gt;• temperaturstabil || • XTAL1/2-Pins nicht als I/O verfügbar&amp;lt;br /&amp;gt;• Platzbedarf&amp;lt;br /&amp;gt;• Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br /&amp;gt;• langsames Anschwingen (ca. 10&amp;amp;nbsp;ms)&amp;lt;br /&amp;gt;• 2 zusätzliche Ballast-Kondensatoren (typ. 22&amp;amp;nbsp;pF) erforderlich&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1…100&amp;amp;nbsp;ppm || • hochgenau&amp;lt;br /&amp;gt;• sehr temperaturstabil&amp;lt;br /&amp;gt;• liefert selbst ein Signal, kann dadurch [[AVR_Fuses#Taktquellen Fuse Einstellung|„verfuste“ AVRs]] retten&amp;lt;br /&amp;gt;• kann mehrere Takteingänge treiben || • XTAL1-Pin nicht als I/O verfügbar&amp;lt;br /&amp;gt;• Platzbedarf&amp;lt;br /&amp;gt;• Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br /&amp;gt;• langsames Anschwingen (ca. 10&amp;amp;nbsp;ms)&lt;br /&gt;
|}&lt;br /&gt;
1&amp;amp;nbsp;ppm = 0,0001 % (engl. one &#039;&#039;&#039;p&#039;&#039;&#039;art &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, der millionste Teil)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;Achtung: Ein ATmega8 wird mit aktiviertem internen RC-Oszillator ausgeliefert. Um eine andere Taktquelle zu aktivieren, müssen die [[AVR Fuses#Taktquellen Fuse Einstellung|AVR Fuses]] des Prozessors verändert werden. Das muss jedoch sehr vorsichtig gemacht werden, siehe Artikel.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keramikresonator ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung eines dreibeinigen Keramikresonators sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Resonator.png|framed|center| Resonator Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Es werden keine Kondensatoren benötigt, diese sind schon eingebaut, daher ist der Anschluss eines Keramikschwingers kinderleicht. Achtung: Keramikresonatoren gibt es mit zwei oder drei Pins. Nur die mit drei Pins besitzen interne Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
==== Quarz ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung eines Quarzes sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial-quarz-schaltplan.png|center|framed|Quarz Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Die beiden (gleichen) Kondensatoren &#039;&#039;&#039;C3&#039;&#039;&#039; und &#039;&#039;&#039;C4&#039;&#039;&#039; sind zum Betrieb des Quarzes notwendig. Ihre Größe ist abhängig von den Daten des Quarzes. Zur Berechnung ihres Wertes C gibt es die folgende Formel (u.a. nachzulesen in der [https://www.microchip.com/content/dam/mchp/documents/MCU08/ApplicationNotes/ApplicationNotes/atmel-2521-avr-hardware-design-considerations_applicationnote_avr042.pdf Application Note AVR042]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;C = 2\cdot C_L-(C_P+C_I)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C_P&amp;lt;/math&amp;gt;: Leiterbahnen-bedingte Kapazität&lt;br /&gt;
* &amp;lt;math&amp;gt;C_I&amp;lt;/math&amp;gt;: µC-Pin-bedingte Kapazität&lt;br /&gt;
* &amp;lt;math&amp;gt;C_L&amp;lt;/math&amp;gt;: Nenn-Lastkapazität des Quarzes, siehe dessen Datenblatt&lt;br /&gt;
&lt;br /&gt;
Die Summe &amp;lt;math&amp;gt;C_P+C_I&amp;lt;/math&amp;gt; kann meist mit ca. 5…10&amp;amp;nbsp;pF angenommen werden.&lt;br /&gt;
&lt;br /&gt;
Da in den AVR-Datenblättern i.d.R. ein Wertebereich von C=12…22&amp;amp;nbsp;pF empfohlen wird, sollte ein Quarz mit entsprechender CL gewählt werden (d.h. ungefähr 10&amp;amp;nbsp;pF &amp;amp;lt; CL &amp;amp;lt; 16&amp;amp;nbsp;pF); siehe dazu die Diskussion in [https://www.mikrocontroller.net/topic/552413 diesem Forumsthread]. Am Beispiel von CL = 15&amp;amp;nbsp;pF:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;C = 2\cdot 15\,\mathrm{pF}-7{,}5\,\mathrm{pF} = 22{,}5\,\mathrm{pF}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit wird in diesem Fall der Normwert 22&amp;amp;nbsp;pF gewählt.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung &#039;&#039;&#039;U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&#039;&#039;&#039; beträgt 5V und kann z.&amp;amp;nbsp;B. mit der in diesem Kapitel beschriebenen Schaltung erzeugt werden. Falls zum Programmieren des Mikrocontrollers ein [[AVR_In_System_Programmer|ISP-Programmiergerät]] verwendet wird, das an die USB-Schnittstelle angeschlossen ist, kann man die Schaltung auch darüber mit Strom versorgen und dieses Kapitel überspringen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif|framed|center|Standard-Netzteilbeschaltung eines 7805]]&lt;br /&gt;
&lt;br /&gt;
Bauteile:&lt;br /&gt;
* IC1: 5V-Spannungsregler 7805&lt;br /&gt;
* C1: Elko 10µF (Polung beachten!)&lt;br /&gt;
* C2,C3: 2x Kondensator 100nF (kein Elektrolyt)&lt;br /&gt;
* D1: Diode 1N4001&lt;br /&gt;
&lt;br /&gt;
Hauptelement der Schaltung ist das IC 7805. Seine Aufgabe ist es aus der Versorgungsspannung stabile 5 V zu erzeugen. Dieses IC gibt es seit vielen Jahren und wird von vielen Chipherstellern produziert. Er stellt die einfachste Möglichkeit dar, aus einer vorhandenen Gleichspannung definierte 5 V zu erzeugen. Den 7805 gibt es in verschiedenen Ausführungen, was seine maximale Strombelastung angeht. Für die Zwecke dieses Tutorials ist die Standard-Variante, welche maximal 1 A abgeben kann, völlig ausreichend. Der 7805 enthält eine Übertemperatursicherung, so dass er abschaltet, wenn es ihm zu heiß wird. Auch ansonsten ist dieser Spannungsregler-IC kaum kaputt zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Die beiden 100-nF-Kondensatoren haben die Aufgabe, eine mögliche Schwingneigung des 7805 zu unterdrücken. Sie müssen so nahe wie möglich an den Anschlusspins des 7805 angeschlossen werden, um ihre Wirkung zu entfalten.&lt;br /&gt;
&lt;br /&gt;
An den Eingang (+ und – im Schaltplan) wird ein Steckernetzteil mit einer Spannung von 7 .. 12 V angeschlossen. Der 7805 benötigt an seinem Eingang eine Gleichspannung, die mindestens 7 V beträgt. Auf der anderen Seite ergibt es auch keinen Sinn, wesentlich über 12 V Eingangsspannung hinauszugehen. Der 7805 ist ein Linearregler. Salopp gesagt, wird die überschüssige Spannung in Form von Wärme vernichtet. Deshalb die Kühlfahne zum thermischen Anschluss an eine Wärmesenke. Liegt die Eingangsspannung weit über 12 V, so wird schon wesentlich mehr Energie in Form von Wärme umgesetzt, als am Ausgang entnommen werden kann. Mal ganz davon abgesehen, dass der 7805 davon brennend heiß wird. Je nach Strombedarf der Gesamtschaltung kann es zweckmäßig sein, einen Schaltregler vorzusehen, wenn die Eingangsspannung stark schwanken kann, etwa für die alternative Speisung mit 24 V aus einem Schaltschrank oder dem LKW-Bordnetz. Für Anfänger führt das zu weit, und ein Kühlblech am 7805 tut es dann auch.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar kleine Rechenbeispiele:&lt;br /&gt;
12 V Eingangsspannung – 5 V Ausgangsspannung = 7 V Differenz x 0,1 A Strombedarf der Schaltung ergibt die Verlustwärme die abgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
7 V × 0,1 A = 0,7 Watt&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Eingangsspannung von 7 V nimmt, so dass die Mindestdifferenz von 2V noch eingehalten wird kommen wir zu diesen Werten&lt;br /&gt;
&lt;br /&gt;
2 V ×  0,1 A = 0,2 Watt Abwärme&lt;br /&gt;
2 V × 0,35 A = 0,7 Watt Abwärme oder anders gesagt, können wir der Schaltung 350 mA entnehmen und haben die gleiche Abwärme wie im oberen Beispiel mit nur 100 mA Stromentnahme.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass man die Eingangsspannung so klein wie möglich wählen sollte um dadurch die Verluste in Grenzen halten zu können. Außerdem ist es meist so, dass für eine geringere Stromentnahme auch eine niedrigere Differenzspannung ausreicht. In manchen Datenblätter ist z.B. angegeben 0,5 A = 1 V Spannungsgefälle und bei 1 A = 2 V Gefälle …&lt;br /&gt;
&lt;br /&gt;
Weiterhin sei gesagt, dass es so genannte Low-Drop-, Ultra-Low-Drop- usw. -Regler gibt, die mit einer viel kleineren Differenz zwischen Ein- und Ausgangsspannung zurechtkommen, wodurch man die Verluste noch weiter drücken kann.&lt;br /&gt;
&lt;br /&gt;
Eine Stromversorgung mit Batterien ist grundsätzlich auch möglich, wenn die elektrischen Grenzdaten des Mikrocontrollers eingehalten werden (max. Spannung, min. Spannung). Bei der geregelten Stromversorgung oben sollte die Batteriespannung ca. 1,5 .. 2,5 V (Dropout-Spannung des Linearreglers) größer sein als die Versorgungsspannung des Controllers. Die [[Versorgung aus einer Zelle]] ist ein Thema für Fortgeschrittene. In der Regel verzichtet man dabei auf die Spannungsregelung, da der Controller in einem weiten Speisespannungsbereich betriebsfähig ist.&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafter Aufbau auf einem [[Steckbrett]] ===&lt;br /&gt;
&lt;br /&gt;
Auf einem [[Steckbrett]] könnte eine Schaltung etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial_grundschaltung_breadboard.jpg|600px|center|Steckbrett mit Selbstschaltung Atmega8 und Quarz als externe Taktquelle]]&lt;br /&gt;
&lt;br /&gt;
Hier ist die oben beschriebene Selbstbauschaltung zu sehen.  Spannungsversorgung (links), 6-poliger ISP-Anschluss (rechts hinter dem µC), Quarz mit 2 Kondensatoren statt Oszillator, erweitert um eine LED mit Vorwiderstand an PB0 (rechts vor dem µC), einem Resettaster (links vor dem µC) und einem Stützkondensator zwischen +5V und GND (rechts unten).&lt;br /&gt;
&lt;br /&gt;
=== Der ISP-Programmierer (In-System-Programmer)===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mikrocontroller.gif|framed|right|ISP Programmierer]]&lt;br /&gt;
Dann braucht man nur noch den &#039;&#039;&#039;ISP-Programmieradapter&#039;&#039;&#039;, über den man die Programme vom PC in den Controller übertragen kann. Eine Übersicht über mögliche ISP-Programmer-Varianten findet sich im Artikel [[AVR In System Programmer]].&lt;br /&gt;
&lt;br /&gt;
Fertige ISP-Programmer zum Anschluss an USB gibt es z.&amp;amp;nbsp;B. von [https://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=14 myAVR].&lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung für Parallelport-Programmer gibt es u.&amp;amp;nbsp;a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel rn-wissen.de] oder [http://rumil.de/hardware/avrisp.html rumil.de].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an USB (oder den Parallelport) an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan&amp;lt;!-- welchen? --&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
Wer vorausschauend kauft, kauft mehr als einen Mikrocontroller. Bis der erste Controller defekt ist, oder man durch Austauschen sicher gehen möchte, ob der Fehler im Programm oder im Controller ist, vergeht nur wenig Zeit.&lt;br /&gt;
&lt;br /&gt;
Tipp: Die Preise für Mikrocontroller haben eine deutliche Spannweite, nicht selten ist ein und derselbe Typ für 3 oder 8 Euro zu haben. Oft sind neuere oder größere Modelle billiger (ATmega8A statt ATmega8, ATmega328 statt ATmega8A). Eine Suche im Internet lohnt sich. Das Gleiche gilt für den Kauf von ISP-Programmierern.&lt;br /&gt;
&lt;br /&gt;
Für weitere Kapitel dieses Tutorials sollte man sich noch die folgenden Bauteile besorgen: &lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 2 (I/O-Grundlagen)&lt;br /&gt;
* 6 LEDs 5mm (Standard-LED, ruhig auch in unterschiedlichen Farben, rot/gelb/grün)&lt;br /&gt;
* 5 Taster&lt;br /&gt;
* 6 Widerstände 1k&lt;br /&gt;
* 5 Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 6 (LC-Display)&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* 1 HD44780-kompatibles LCD, z.&amp;amp;nbsp;B. 4x20 oder 2x16 Zeichen&lt;br /&gt;
*   besitzt das LCD eine Hintergrundbeleuchtung, dann noch einen Vorwiderstand dafür. Details dazu stehen im Datenblatt des LCD. Ein Wert von 50Ω sollte aber in jedem Fall passen. Schlimmstenfalls ist die Hintergrundbeleuchtung dann etwas zu dunkel.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 10 (Der UART)&lt;br /&gt;
* 1 Pegelwandler MAX232, MAX232&#039;&#039;&#039;A&#039;&#039;&#039; oder MAX202&lt;br /&gt;
* 5 Kondensatoren&lt;br /&gt;
** Bei einem MAX232: je 1µF Elektrolytkondensator&lt;br /&gt;
** Bei einem MAX202 oder MAX232&#039;&#039;&#039;A&#039;&#039;&#039;: je  100nF Keramik- oder Elektrolytkondensator&lt;br /&gt;
:Die Kondensatoren dürfen auch größer sein. Ist man sich nicht sicher, welchen MAX232 man hat (A oder nicht A), dann die größeren Kondensatoren 1µF nehmen, die funktionieren auch beim MAX232A oder MAX202.&lt;br /&gt;
* 1 9-polige SUBD-Buchse (female)&lt;br /&gt;
* 1 dazu passendes Modem(nicht Nullmodem!)-Kabel&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 14 (ADC)&lt;br /&gt;
* 1 Kondensator 100n&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* nach Lust und Laune temperatur- oder lichtabhängige Widerstände und jeweils einen Widerstand in der gleichen Größenordnung wie der Sensor&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 17 (Schieberegister)&lt;br /&gt;
* 2 Schieberegister 74HC595&lt;br /&gt;
* einige LED, damit man an die Schieberegister auch etwas anschließen kann, samt passenden Vorwiderständen&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 19 (7-Segmentanzeige)&lt;br /&gt;
* 4 7-Segmentanzeigen mit gemeinsamer Anode&lt;br /&gt;
* 4 PNP-Transistoren BC328&lt;br /&gt;
* 4 Widerstände 1k&lt;br /&gt;
* 7 Widerstände 100Ω&lt;br /&gt;
&lt;br /&gt;
Für weitere Bauteile, die man als angehender µC Bastler auch des Öfteren mal benötigt, empfiehlt sich ein Blick in die Liste der [[Standardbauelemente]] bzw. in die [[Absolute_beginner|Grundausstattung]]. Wenn Ihr Händler Großpackungen (zb. 100 Stück) von 100n Kondensatoren, 10k, 1k oder 100Ω Widerständen anbietet, sollten Sie deren Erwerb in Erwägung ziehen. Diese Bauteile benötigt man oft, und derartige Großpackungen sind meist nicht teurer, als wenn man einige wenige Exemplare einzeln kauft. Dies hängt damit zusammen, dass das Herauszählen von 9 Bauteilen für den Verkäufer teurer kommt, als 100 Bauteile abgepackt aus dem Regal zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird nur auf die Programmierung in Assembler eingegangen, da Assembler für das Verständnis der Hardware am besten geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&lt;br /&gt;
Zuerst braucht man einen &#039;&#039;&#039;Assembler&#039;&#039;&#039;, der in Assemblersprache geschriebene Programme in Maschinencode übersetzt. Windows-User können das [https://www.microchip.com/en-us/tools-resources/develop/microchip-studio Microchip-Studio] ([https://www.microchip.com/en-us/tools-resources/archives/avr-sam-mcus frühere Versionen von Atmel]) verwenden, das neben dem Assembler auch einen Simulator enthält, mit dem sich die Programme vor der Übertragung in den Controller testen lassen; für Linux gibt es [http://www.tavrasm.org/ tavrasm], [https://github.com/Ro5bert/avra avra] und [http://avr-asm-tutorial.net/gavrasm/index_de.html gavrasm].&lt;br /&gt;
&lt;br /&gt;
Um die vom Assembler erzeugte &amp;quot;.hex&amp;quot;-Datei über den ISP-Adapter in den Mikrocontroller zu programmieren, kann man unter Windows z.&amp;amp;nbsp;B. das Programm [http://www.myplace.nu/avr/yaap/ yaap] verwenden, für Linux gibt es [http://savannah.nongnu.org/projects/uisp/ uisp], für beide [[AVRDUDE|avrdude]].&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
Wer in C programmieren möchte, kann den kostenlosen GNU-C-Compiler AVR-GCC (unter Windows &amp;quot;WinAVR&amp;quot;) ausprobieren. Dieser C-Compiler kann auch in das für Assembler-Programmierung notwendige AVR-Studio integriert werden. In der Artikelsammlung gibt es ein umfangreiches [[AVR-GCC-Tutorial|Tutorial]] zu diesem Compiler;&lt;br /&gt;
&lt;br /&gt;
Wer unter Windows und Linux gleichermassen kostenlos entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Hier wird auch der AVR-GCC benutzt. In der Artikelsammlung gibt es ein umfangreiches [[AVR Eclipse|AVR Eclipse Tutorial]] zu dieser IDE.&lt;br /&gt;
Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Fragen dazu stellt man am besten hier im [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum].&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
Wer in Pascal programmieren muss, kann [http://www.e-lab.de AVRPascal] ausprobieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieser Pascalcompiler ist kostenfrei bis 4kb Code und bietet viele ausgereifte Bibliotheken für Servoansteuerung, Serielle Schnittstellen (COM, TWI, SPI), PWM, Timernutzung, LC-Displays usw.&amp;lt;br&amp;gt; &lt;br /&gt;
Außerdem gibt es eine kostenfreie Version für den Mega8 und den Mega88.&lt;br /&gt;
[http://www.e-lab.de E-LAB].&lt;br /&gt;
&lt;br /&gt;
=== Basic ===&lt;br /&gt;
Auch Basic-Fans kommen nicht zu kurz, für die gibt es z.&amp;amp;nbsp;B. [[Bascom AVR]] ($69, Demo verfügbar) oder das kostenlose [[http://avr.myluna.de LunaAVR]].&lt;br /&gt;
&lt;br /&gt;
=== Forth ===&lt;br /&gt;
Wer einen direkten und interaktiven Zugang zum Controller haben will, sollte sich [http://amforth.sourceforge.net Forth] anschauen. Voraussetzung ist ein serieller Anschluß (Max232), also etwas mehr als die Minimalbeschaltung.&lt;br /&gt;
&lt;br /&gt;
== Bereit für das erste Programm? ==&lt;br /&gt;
&lt;br /&gt;
Zum nächsten Kapitel geht es erst, wenn man Hard- und Software in einer Weise zum Funktionieren gebracht hat, dass:&lt;br /&gt;
* die Programmiersoftware das Programmiergerät erkennt&lt;br /&gt;
* die Programmiersoftware den Mikrocontroller erkennt (alle heute üblichen Controller haben eine typspezifische Selbsterkennung), dazu muss der Controller mit Strom versorgt sein&lt;br /&gt;
* die verwendete Erstell-Software (bspw. der Assembler) aus einem leeren oder Beispiel-Projekt eine Programmier-Datei erstellt (meistens eine .HEX-Datei), die man in die Programmiersoftware laden kann (noch nicht in den Controller programmieren!)&lt;br /&gt;
Diesen arbeitsfähigen Zustand zu erreichen ist im Eigenbau (etwa dem Steckbrett) schwieriger als mit einem Starterkit — und der wichtigste Grund warum viele das Geld für das ansonsten nutzlose Starterkit ausgeben.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
Bevor man anfängt, sollte man sich die folgenden Dokumente runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* Datenblatt des ATmega8: [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf Original (PDF; 6,3&amp;amp;nbsp;MB)]&amp;lt;!-- früher http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf --&amp;gt; oder [https://web.archive.org/web/20180617065644/http://www.avr-modelleisenbahn.de/controller/atmega8/atmega8.htm in deutscher Übersetzung (HTML)]&lt;br /&gt;
* Befehlssatz-Handbuch der AVRs: [https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-InstructionSet-Manual-DS40002198.pdf Original (PDF; 1,2&amp;amp;nbsp;MB)]&amp;lt;!-- früher http://www.atmel.com/Images/Atmel-0856-AVR-Instruction-Set-Manual.pdf --&amp;gt; oder [https://web.archive.org/web/20180209051940/http://www.avr-modelleisenbahn.de/controller/befehle/avr-befehle.htm in deutscher Übersetzung (HTML)]&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt eines Controllers ist das wichtigste Dokument für einen Entwickler. Es enthält Informationen über die Pinbelegung, Versorgungsspannung, Beschaltung, Speicher, die Verwendung der IO-Komponenten und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Im Befehlssatz sind alle Assemblerbefehle der AVR-Controllerfamilie aufgelistet und erklärt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_hochvor|	 &lt;br /&gt;
hochtext=Inhaltsverzeichnis|	 &lt;br /&gt;
hochlink=AVR-Tutorial|	 &lt;br /&gt;
vortext=I/O-Grundlagen|	 &lt;br /&gt;
vorlink=AVR-Tutorial: IO-Grundlagen}}	 &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Equipment]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=106682</id>
		<title>AVR-Tutorial: Equipment</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=106682"/>
		<updated>2024-02-24T14:59:57Z</updated>

		<summary type="html">&lt;p&gt;Alesi: Link http://www.watterott.com/de/AVR-P28-8MHz durch https://www.olimex.com/Products/AVR/Proto/AVR-P28-8MHz/ ersetzt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AVR-Tutorial - Benötigte Ausrüstung =&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller alleine ist noch zu nichts nütze. Damit man etwas damit anfangen kann braucht man eine Schaltung in die der Controller eingesetzt wird. Dazu werden bei Elektronikhändlern Platinen angeboten, die alles nötige (Taster, LEDs, Steckverbinder...) enthalten. Häufig enthalten diese Platinen nicht nur Platz für den Mikroprozessor, sondern auch einen ISP-Programmierer (Näheres dazu später)&lt;br /&gt;
&lt;br /&gt;
Da es eine Unmenge verschiedener Mikrocontroller allein aus der AVR-Familie gibt, ist der Anfänger mit der Auswahl bereits überfordert. Dieses Tutorial (und viele andere auch) beginnt mit dem &#039;&#039;mittelgroßen&#039;&#039; Controller &#039;&#039;&#039;ATmega8&#039;&#039;&#039;. Die 8 steht für 8 Kilobyte Flash-Speicher. Er gilt als ideal für Einsteiger, und auch von „alten Hasen“ wird dieser Typ gern verwendet. Es gibt ihn im 28-poligen DIL-Gehäuse, ideal für Bastelschaltungen auf dem Steckbrett, als auch in verschiedenen SMD-Gehäusen wenn das Endgerät klein werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Fertige Evaluations-Boards und Starterkits ===&lt;br /&gt;
&lt;br /&gt;
==== AVR Starterkit aus dem Mikrocontroller.net-Shop ====&lt;br /&gt;
&lt;br /&gt;
Sehr gut für dieses Tutorial geeignet ist das [https://www.olimex.com/Products/AVR/Proto/AVR-P28-8MHz/ Olimex AVR-P28-Board], welches zusätzlich noch den Controller ATmega8, einen USB-ISP-Programmieradapter und ein Steckernetzteil benötigt. Die Platine enthält eine Fassung für den Controller, einen Spannungswandler, die Beschaltung für die serielle Schnittstelle und einen Anschluss für den Programmieradapter. Die restliche Hardware wie LEDs und Taster kann man sich selber nach Belieben auf das Lochrasterfeld löten.&lt;br /&gt;
&lt;br /&gt;
==== STK500 ====&lt;br /&gt;
[[Bild:Stk500.jpg|right]]&lt;br /&gt;
Das STK500 ist das Standard-Board für AVR Entwicklung, direkt von Atmel. Es enthält auch einen ISP-Programmer und ist fertig aufgebaut. Es ist unter Entwicklern sehr beliebt und wird natürlich von Atmel unterstützt. Es gilt allgemein als gute Investition wenn man ernsthaft in das Thema einsteigen möchte.&lt;br /&gt;
&lt;br /&gt;
Das STK500 kostet bei Reichelt ca. 115 Euro (Stand November 2015). Ein geeignetes Netzteil muss zusätzlich erworben werden.&lt;br /&gt;
&lt;br /&gt;
==== Pollin ATMEL Evaluations-Board Version 2.x ====&lt;br /&gt;
&lt;br /&gt;
Bei [https://www.pollin.de/ Pollin Electronic] gab es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz waren die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung mussten separat beschafft werden. Auf dem Board war ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. Siehe [[Pollin ATMEL Evaluations-Board]]. Inzwischen (Stand 2022) ist das Pollin-Board nicht mehr im Angebot.&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board von [https://www.pollin.de/ Pollin] bestand die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten. Siehe [[Pollin Funk-AVR-Evaluationsboard]]. Auch dieses Board ist im Jahr 2022 nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
==== Rumpus Board von lochraster.org ====&lt;br /&gt;
&lt;br /&gt;
Lochraster.org bietet ein Entwicklungsboard namens &#039;&#039;rumpus&#039;&#039; an. Es kommt als Bausatz mit allen Teilen und Microcontroller (Atmega 168). Auf dem Microcontroller ist bereits ein USB Bootloader installiert, so dass man nach dem Zusammenbau sofort starten kann. Das Board wird direkt über USB mit Strom versorgt und programmiert. Es kann auch selbst als Programmer für AVR Microcontroller benutzt werden. Das Board ist mit recht umfangreicher Peripherie ausgestattet, so dass sich von sehr einfachen Anwendungen wie dem Blinken einer LED bis hin zu komplexen Aufgaben wie Senden und Empfangen von Infrarot Signalen eine Vielzahl von Anwendungen realisieren lassen. Mit 45 Euro gehört es sicher nicht zu den ganz billigen Einsteigerboards, für den ambitionierten Amateur bietet die reichhaltige Peripherie den Vorteil, das Board während des gesamten Lernprozesses zu nutzen ohne für die Realisierung komplexerer Aufgaben neue Hardware auflöten zu müssen. Auch relativiert sich dieser Preis wieder dadurch, dass kein ISP Programmer benötigt wird. Beim Umstieg auf ein anderes Board, für welches man dann einen ISP Programmer benötigt, kann der Rumpus diese Aufgabe übernehmen anstatt zum alten Eisen geworfen zu werden (s. Infos im [http://www.mikrocontroller.net/topic/217122#2165435 Forumbeitrag von Sebastian Noack]).&lt;br /&gt;
&lt;br /&gt;
Weitere Infos unter http://www.lochraster.org/ und http://wiki.lochraster.org/&lt;br /&gt;
&lt;br /&gt;
==== RN-Control ====&lt;br /&gt;
&lt;br /&gt;
Die Forengemeinde von Roboternetz hat ebenfalls ein Evaluierungsboard entwickelt das mittlerweile sehr ausgereift ist und viele Erweiterungsmöglichkeiten bietet.&lt;br /&gt;
&lt;br /&gt;
Siehe:&lt;br /&gt;
* [http://robotikhardware.de/ http://robotikhardware.de/]&lt;br /&gt;
* [http://www.roboternetz.de/ http://www.roboternetz.de/]&lt;br /&gt;
&lt;br /&gt;
==== Arduino ====&lt;br /&gt;
Die Boards der [http://www.arduino.cc Arduino-Familie] bieten z.B. einen ATmega328P mit 16MHz und lassen sich über einen integrierten USB-seriell-Wandler und [[Bootloader]] programmieren. Die Ports sind auf Buchsenleisten herausgeführt. Arduino-Boards können auch unabhängig von der Arduino-Entwicklungsumgebung (Arduino-IDE) als AVR-Entwicklungsboard genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Andere ====&lt;br /&gt;
&lt;br /&gt;
Das Angebot an AVR-Evaluationboards, -Experimentierplatinen, -Entwicklerplatinen oder wie die jeweiligen Hersteller ihre Produkte auch immer bezeichnen, ist mittlerweile recht groß geworden. Sie alle zu bewerten ist unmöglich geworden.&lt;br /&gt;
&lt;br /&gt;
===Selbstbau===&lt;br /&gt;
&lt;br /&gt;
Ein fertiges Board ist gar nicht nötig, man kann die benötigte Schaltung auch selbst auf einem kleinen Steckbrett oder einer Lochrasterplatine aufbauen. So kompliziert wie das STK500 wird es nicht, es reichen eine Handvoll Bauteile. Wie man das macht wird im Folgenden beschrieben.&lt;br /&gt;
Steckbretter (Breadboards) gibt&#039;s z.&amp;amp;nbsp;B. bei [http://www.reichelt.de/ Reichelt],  [http://www.conelek.com/Steckplatinen ConeleK], [http://www.elv.de/ ELV] oder [http://www.conrad.de/ Conrad].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8_Tutorial.png|center|framed| Die Grundschaltung eines ATmega8/ATmega8A.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Pinbelegung der 6-poligen [[ISP]]-Verbindung weicht von den ATMEL-Angaben ab! Wenn ATMEL oder ATMEL-kompatible ISP-Adapter benutzt werden, die Pinbelegung aus [https://ww1.microchip.com/downloads/en/Appnotes/atmel-2521-avr-hardware-design-considerations_applicationnote_avr042.pdf#page=8 Application Note AVR042 (PDF)] bzw. [[AVR_In_System_Programmer#Pinbelegung]] benutzen]]&lt;br /&gt;
&lt;br /&gt;
Über den Takteingang &#039;&#039;&#039;XTAL1&#039;&#039;&#039; ist der Mikrocontroller mit dem &#039;&#039;&#039;Quarzoszillator&#039;&#039;&#039; verbunden, der den benötigten Takt von 4&amp;amp;nbsp;MHz liefert (siehe unten). Achtung: die Pins werden, wenn man den Oszillator mit der Schrift nach oben vor sich liegen hat, von unten links aus abgezählt. Unten links ist Pin 1, unten rechts Pin 7, oben rechts Pin 8 und oben links Pin 14 (natürlich hat der Oszillator nur vier Pins. Die Nummerierung kommt daher, dass bei einem normalen IC dieser Größe an den gleichen Positionen die Pins Nr. 1, 7, 8 und 14 wären). Zu den Pins Datenblatt beachten [http://www.mikrocontroller.net/topic/204429#2015503].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PD0–PD7&#039;&#039;&#039; und &#039;&#039;&#039;PB0–PB5&#039;&#039;&#039; sind die &#039;&#039;&#039;IO-Ports&#039;&#039;&#039; des Mikrocontrollers. Hier können Bauteile wie LEDs, Taster oder LCDs angeschlossen werden.&lt;br /&gt;
Der &#039;&#039;&#039;Port C (PC0–PC5)&#039;&#039;&#039; spielt beim ATmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!&lt;br /&gt;
An &#039;&#039;&#039;Pin 17–19&#039;&#039;&#039; ist die Stiftleiste zur Verbindung mit dem ISP-Programmer angeschlossen, über den der AVR vom PC programmiert wird (Achtung: Pins in Abbildung entsprechen nicht der Belegung des AVRISP mkII. Die korrekte Pin-Belegung kann im [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42093-AVR-ISP-mkII_UserGuide.pdf#page=8 Handbuch des AVRISP mkII] eingesehen werden).&lt;br /&gt;
Die Resetschaltung, bestehend aus &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;C1&#039;&#039;&#039;, sorgt dafür, dass der Reseteingang des Controllers standardmäßig auf Vcc=+5V liegt.&lt;br /&gt;
Zum Programmieren zieht der ISP-Adapter die Resetleitung auf Masse (GND), die Programmausführung wird dadurch unterbrochen und der interne Speicher des Controllers kann neu programmiert werden.&lt;br /&gt;
Zwischen Vcc und GND kommen noch jeweils ein 100nF-Keramik- oder Folienkondensator C3 und C4, um Störungen in der Versorgungsspannung zu unterdrücken. Diese [[Kondensator#Entkoppelkondensator | Abblockkondensatoren]] sollten so nah wie möglich am Controller platziert werden. An den Ausgang ARef wird ebenfalls ein 100nF-Kondensator angeschlossen. Dieser wird allerdings erst benötigt, wenn der Analog/Digital-Konverter des µC in Betrieb genommen wird.&lt;br /&gt;
&lt;br /&gt;
Für den Anschluss des ISP-Programmiergerätes kann man im Grunde jede beliebige Pin-Belegung des ISP-Steckers benutzen, solange nur alle benötigten Leitungen mit dem Programmiergerät verbunden sind. In der Praxis haben sich allerdings bestimmte Belegungen durchgesetzt. Im Schaltbild ist eine &#039;&#039;&#039;eigene&#039;&#039;&#039; Belegung des 6-poligen Steckers gezeigt. Die alternative Pinbelegung eines 2-reihigen/10-poligen Steckers ist eine übliche Belegung. Benutzt man so eine übliche Belegung, so reicht normalerweise ein 10-poliges Flachbandkabel, um den vorhandenen ISP-Programmer so mit der Schaltung zu verbinden, dass alle Signale am richtigen Prozessorpin ankommen. Siehe auch [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Hier die Liste der benötigten Bauteile: &lt;br /&gt;
&lt;br /&gt;
* R1         Widerstand 10 kOhm&lt;br /&gt;
* C1         Keramikkondensator 47 nF&lt;br /&gt;
* C2, C3, C4 Keramik- oder Folienkondensator 100 nF&lt;br /&gt;
*            Stiftleiste 6-polig&lt;br /&gt;
*            Mikrocontroller ATmega8 oder ATmega8A (kann u.a. auf [http://shop.mikrocontroller.net/ http://shop.mikrocontroller.net/] bestellt werden)&lt;br /&gt;
*            Quarzoszillator 4 MHz&lt;br /&gt;
&lt;br /&gt;
Beim Steckbrett ist darauf zu achten, dass man die parallellaufenden Schienen für GND (blau) und Vcc (rot) jeweils mit Drähten verbindet (nicht Vcc und GND miteinander!).&lt;br /&gt;
&lt;br /&gt;
Eine Zusammenstellung der benötigten Bauteile befindet sich in der [[AVR-Tutorial_Bestellliste|Bestellliste]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beschreibung für ein Minimalsystem gibt es auf [https://web.archive.org/web/20171214110643/http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 conelek.org].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) ===&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller benötigt, wie jeder Computer, eine Taktversorgung. Der Takt ist notwendig, um die internen Abläufe im Prozessor in einer zeitlich geordneten Reihenfolge ausführen zu können. Die Frequenz des Taktes bestimmt im Wesentlichen, wie schnell ein Mikrocontroller arbeitet. Bei einem ATmega8 gibt es viele Möglichkeiten zur Taktversorgung, die Wichtigsten sollen hier gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
* interner RC-Oszillator (das ist der Auslieferungszustand),&lt;br /&gt;
* Keramikresonator,&lt;br /&gt;
* Quarz,&lt;br /&gt;
* Quarzoszillator.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Vergleich der AVR-Taktquellen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Typ || Genauigkeit || Vorteile || Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| interner&amp;lt;br /&amp;gt;RC-Oszillator || 1…5 % || • XTAL1/2-Pins als I/O verfügbar&amp;lt;br /&amp;gt;• kostenlos&amp;lt;br /&amp;gt;• kein Platzbedarf&amp;lt;br /&amp;gt;• schnellstes Einschwingen (wenige Takte) || • ungenau&amp;lt;br /&amp;gt;• Betrieb der [[UART]] unzuverlässig&lt;br /&gt;
|-&lt;br /&gt;
| Keramikresonator || 0,5…1 % || • ausreichend genau für [[UART]]&amp;lt;br /&amp;gt;• in sehr hohen Stückzahlen billiger als Quarz&amp;lt;br /&amp;gt;• schnelleres Einschwingen als Quarz (ca. 1ms) || • XTAL1/2-Pins nicht als I/O verfügbar&amp;lt;br /&amp;gt;• Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10…100&amp;amp;nbsp;ppm || • sehr genau&amp;lt;br /&amp;gt;• temperaturstabil || • XTAL1/2-Pins nicht als I/O verfügbar&amp;lt;br /&amp;gt;• Platzbedarf&amp;lt;br /&amp;gt;• Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br /&amp;gt;• langsames Anschwingen (ca. 10&amp;amp;nbsp;ms)&amp;lt;br /&amp;gt;• 2 zusätzliche Ballast-Kondensatoren (typ. 22&amp;amp;nbsp;pF) erforderlich&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1…100&amp;amp;nbsp;ppm || • hochgenau&amp;lt;br /&amp;gt;• sehr temperaturstabil&amp;lt;br /&amp;gt;• liefert selbst ein Signal, kann dadurch [[AVR_Fuses#Taktquellen Fuse Einstellung|„verfuste“ AVRs]] retten&amp;lt;br /&amp;gt;• kann mehrere Takteingänge treiben || • XTAL1-Pin nicht als I/O verfügbar&amp;lt;br /&amp;gt;• Platzbedarf&amp;lt;br /&amp;gt;• Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br /&amp;gt;• langsames Anschwingen (ca. 10&amp;amp;nbsp;ms)&lt;br /&gt;
|}&lt;br /&gt;
1&amp;amp;nbsp;ppm = 0,0001 % (engl. one &#039;&#039;&#039;p&#039;&#039;&#039;art &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, der millionste Teil)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;Achtung: Ein ATmega8 wird mit aktiviertem internen RC-Oszillator ausgeliefert. Um eine andere Taktquelle zu aktivieren, müssen die [[AVR Fuses#Taktquellen Fuse Einstellung|AVR Fuses]] des Prozessors verändert werden. Das muss jedoch sehr vorsichtig gemacht werden, siehe Artikel.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keramikresonator ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung eines dreibeinigen Keramikresonators sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Resonator.png|framed|center| Resonator Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Es werden keine Kondensatoren benötigt, diese sind schon eingebaut, daher ist der Anschluss eines Keramikschwingers kinderleicht. Achtung: Keramikresonatoren gibt es mit zwei oder drei Pins. Nur die mit drei Pins besitzen interne Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
==== Quarz ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung eines Quarzes sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial-quarz-schaltplan.png|center|framed|Quarz Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Die beiden (gleichen) Kondensatoren &#039;&#039;&#039;C3&#039;&#039;&#039; und &#039;&#039;&#039;C4&#039;&#039;&#039; sind zum Betrieb des Quarzes notwendig. Ihre Größe ist abhängig von den Daten des Quarzes. Zur Berechnung ihres Wertes C gibt es die folgende Formel (u.a. nachzulesen in der [https://www.microchip.com/content/dam/mchp/documents/MCU08/ApplicationNotes/ApplicationNotes/atmel-2521-avr-hardware-design-considerations_applicationnote_avr042.pdf Application Note AVR042]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;C = 2\cdot C_L-(C_P+C_I)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C_P&amp;lt;/math&amp;gt;: Leiterbahnen-bedingte Kapazität&lt;br /&gt;
* &amp;lt;math&amp;gt;C_I&amp;lt;/math&amp;gt;: µC-Pin-bedingte Kapazität&lt;br /&gt;
* &amp;lt;math&amp;gt;C_L&amp;lt;/math&amp;gt;: Nenn-Lastkapazität des Quarzes, siehe dessen Datenblatt&lt;br /&gt;
&lt;br /&gt;
Die Summe &amp;lt;math&amp;gt;C_P+C_I&amp;lt;/math&amp;gt; kann meist mit ca. 5…10&amp;amp;nbsp;pF angenommen werden.&lt;br /&gt;
&lt;br /&gt;
Da in den AVR-Datenblättern i.d.R. ein Wertebereich von C=12…22&amp;amp;nbsp;pF empfohlen wird, sollte ein Quarz mit entsprechender CL gewählt werden (d.h. ungefähr 10&amp;amp;nbsp;pF &amp;amp;lt; CL &amp;amp;lt; 16&amp;amp;nbsp;pF); siehe dazu die Diskussion in [https://www.mikrocontroller.net/topic/552413 diesem Forumsthread]. Am Beispiel von CL = 15&amp;amp;nbsp;pF:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;C = 2\cdot 15\,\mathrm{pF}-7{,}5\,\mathrm{pF} = 22{,}5\,\mathrm{pF}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit wird in diesem Fall der Normwert 22&amp;amp;nbsp;pF gewählt.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung &#039;&#039;&#039;U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&#039;&#039;&#039; beträgt 5V und kann z.&amp;amp;nbsp;B. mit der in diesem Kapitel beschriebenen Schaltung erzeugt werden. Falls zum Programmieren des Mikrocontrollers ein [[AVR_In_System_Programmer|ISP-Programmiergerät]] verwendet wird, das an die USB-Schnittstelle angeschlossen ist, kann man die Schaltung auch darüber mit Strom versorgen und dieses Kapitel überspringen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif|framed|center|Standard-Netzteilbeschaltung eines 7805]]&lt;br /&gt;
&lt;br /&gt;
Bauteile:&lt;br /&gt;
* IC1: 5V-Spannungsregler 7805&lt;br /&gt;
* C1: Elko 10µF (Polung beachten!)&lt;br /&gt;
* C2,C3: 2x Kondensator 100nF (kein Elektrolyt)&lt;br /&gt;
* D1: Diode 1N4001&lt;br /&gt;
&lt;br /&gt;
Hauptelement der Schaltung ist das IC 7805. Seine Aufgabe ist es aus der Versorgungsspannung stabile 5 V zu erzeugen. Dieses IC gibt es seit vielen Jahren und wird von vielen Chipherstellern produziert. Er stellt die einfachste Möglichkeit dar, aus einer vorhandenen Gleichspannung definierte 5 V zu erzeugen. Den 7805 gibt es in verschiedenen Ausführungen, was seine maximale Strombelastung angeht. Für die Zwecke dieses Tutorials ist die Standard-Variante, welche maximal 1 A abgeben kann, völlig ausreichend. Der 7805 enthält eine Übertemperatursicherung, so dass er abschaltet, wenn es ihm zu heiß wird. Auch ansonsten ist dieser Spannungsregler-IC kaum kaputt zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Die beiden 100-nF-Kondensatoren haben die Aufgabe, eine mögliche Schwingneigung des 7805 zu unterdrücken. Sie müssen so nahe wie möglich an den Anschlusspins des 7805 angeschlossen werden, um ihre Wirkung zu entfalten.&lt;br /&gt;
&lt;br /&gt;
An den Eingang (+ und – im Schaltplan) wird ein Steckernetzteil mit einer Spannung von 7 .. 12 V angeschlossen. Der 7805 benötigt an seinem Eingang eine Gleichspannung, die mindestens 7 V beträgt. Auf der anderen Seite ergibt es auch keinen Sinn, wesentlich über 12 V Eingangsspannung hinauszugehen. Der 7805 ist ein Linearregler. Salopp gesagt, wird die überschüssige Spannung in Form von Wärme vernichtet. Deshalb die Kühlfahne zum thermischen Anschluss an eine Wärmesenke. Liegt die Eingangsspannung weit über 12 V, so wird schon wesentlich mehr Energie in Form von Wärme umgesetzt, als am Ausgang entnommen werden kann. Mal ganz davon abgesehen, dass der 7805 davon brennend heiß wird. Je nach Strombedarf der Gesamtschaltung kann es zweckmäßig sein, einen Schaltregler vorzusehen, wenn die Eingangsspannung stark schwanken kann, etwa für die alternative Speisung mit 24 V aus einem Schaltschrank oder dem LKW-Bordnetz. Für Anfänger führt das zu weit, und ein Kühlblech am 7805 tut es dann auch.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar kleine Rechenbeispiele:&lt;br /&gt;
12 V Eingangsspannung – 5 V Ausgangsspannung = 7 V Differenz x 0,1 A Strombedarf der Schaltung ergibt die Verlustwärme die abgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
7 V × 0,1 A = 0,7 Watt&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Eingangsspannung von 7 V nimmt, so dass die Mindestdifferenz von 2V noch eingehalten wird kommen wir zu diesen Werten&lt;br /&gt;
&lt;br /&gt;
2 V ×  0,1 A = 0,2 Watt Abwärme&lt;br /&gt;
2 V × 0,35 A = 0,7 Watt Abwärme oder anders gesagt, können wir der Schaltung 350 mA entnehmen und haben die gleiche Abwärme wie im oberen Beispiel mit nur 100 mA Stromentnahme.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass man die Eingangsspannung so klein wie möglich wählen sollte um dadurch die Verluste in Grenzen halten zu können. Außerdem ist es meist so, dass für eine geringere Stromentnahme auch eine niedrigere Differenzspannung ausreicht. In manchen Datenblätter ist z.B. angegeben 0,5 A = 1 V Spannungsgefälle und bei 1 A = 2 V Gefälle …&lt;br /&gt;
&lt;br /&gt;
Weiterhin sei gesagt, dass es so genannte Low-Drop-, Ultra-Low-Drop- usw. -Regler gibt, die mit einer viel kleineren Differenz zwischen Ein- und Ausgangsspannung zurechtkommen, wodurch man die Verluste noch weiter drücken kann.&lt;br /&gt;
&lt;br /&gt;
Eine Stromversorgung mit Batterien ist grundsätzlich auch möglich, wenn die elektrischen Grenzdaten des Mikrocontrollers eingehalten werden (max. Spannung, min. Spannung). Bei der geregelten Stromversorgung oben sollte die Batteriespannung ca. 1,5 .. 2,5 V (Dropout-Spannung des Linearreglers) größer sein als die Versorgungsspannung des Controllers. Die [[Versorgung aus einer Zelle]] ist ein Thema für Fortgeschrittene. In der Regel verzichtet man dabei auf die Spannungsregelung, da der Controller in einem weiten Speisespannungsbereich betriebsfähig ist.&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafter Aufbau auf einem [[Steckbrett]] ===&lt;br /&gt;
&lt;br /&gt;
Auf einem [[Steckbrett]] könnte eine Schaltung etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial_grundschaltung_breadboard.jpg|600px|center|Steckbrett mit Selbstschaltung Atmega8 und Quarz als externe Taktquelle]]&lt;br /&gt;
&lt;br /&gt;
Hier ist die oben beschriebene Selbstbauschaltung zu sehen.  Spannungsversorgung (links), 6-poliger ISP-Anschluss (rechts hinter dem µC), Quarz mit 2 Kondensatoren statt Oszillator, erweitert um eine LED mit Vorwiderstand an PB0 (rechts vor dem µC), einem Resettaster (links vor dem µC) und einem Stützkondensator zwischen +5V und GND (rechts unten).&lt;br /&gt;
&lt;br /&gt;
=== Der ISP-Programmierer (In-System-Programmer)===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mikrocontroller.gif|framed|right|ISP Programmierer]]&lt;br /&gt;
Dann braucht man nur noch den &#039;&#039;&#039;ISP-Programmieradapter&#039;&#039;&#039;, über den man die Programme vom PC in den Controller übertragen kann. Eine Übersicht über mögliche ISP-Programmer-Varianten findet sich im Artikel [[AVR In System Programmer]].&lt;br /&gt;
&lt;br /&gt;
Fertige ISP-Programmer zum Anschluss an USB gibt es z.&amp;amp;nbsp;B. von [https://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=14 myAVR].&lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung für Parallelport-Programmer gibt es u.&amp;amp;nbsp;a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel rn-wissen.de] oder [http://rumil.de/hardware/avrisp.html rumil.de].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an USB (oder den Parallelport) an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan&amp;lt;!-- welchen? --&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
Wer vorausschauend kauft, kauft mehr als einen Mikrocontroller. Bis der erste Controller defekt ist, oder man durch Austauschen sicher gehen möchte, ob der Fehler im Programm oder im Controller ist, vergeht nur wenig Zeit.&lt;br /&gt;
&lt;br /&gt;
Tipp: Die Preise für Mikrocontroller haben eine deutliche Spannweite, nicht selten ist ein und derselbe Typ für 3 oder 8 Euro zu haben. Oft sind neuere oder größere Modelle billiger (ATmega8A statt ATmega8, ATmega328 statt ATmega8A). Eine Suche im Internet lohnt sich. Das Gleiche gilt für den Kauf von ISP-Programmierern.&lt;br /&gt;
&lt;br /&gt;
Für weitere Kapitel dieses Tutorials sollte man sich noch die folgenden Bauteile besorgen: &lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 2 (I/O-Grundlagen)&lt;br /&gt;
* 6 LEDs 5mm (Standard-LED, ruhig auch in unterschiedlichen Farben, rot/gelb/grün)&lt;br /&gt;
* 5 Taster&lt;br /&gt;
* 6 Widerstände 1k&lt;br /&gt;
* 5 Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 6 (LC-Display)&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* 1 HD44780-kompatibles LCD, z.&amp;amp;nbsp;B. 4x20 oder 2x16 Zeichen&lt;br /&gt;
*   besitzt das LCD eine Hintergrundbeleuchtung, dann noch einen Vorwiderstand dafür. Details dazu stehen im Datenblatt des LCD. Ein Wert von 50Ω sollte aber in jedem Fall passen. Schlimmstenfalls ist die Hintergrundbeleuchtung dann etwas zu dunkel.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 10 (Der UART)&lt;br /&gt;
* 1 Pegelwandler MAX232, MAX232&#039;&#039;&#039;A&#039;&#039;&#039; oder MAX202&lt;br /&gt;
* 5 Kondensatoren&lt;br /&gt;
** Bei einem MAX232: je 1µF Elektrolytkondensator&lt;br /&gt;
** Bei einem MAX202 oder MAX232&#039;&#039;&#039;A&#039;&#039;&#039;: je  100nF Keramik- oder Elektrolytkondensator&lt;br /&gt;
:Die Kondensatoren dürfen auch größer sein. Ist man sich nicht sicher, welchen MAX232 man hat (A oder nicht A), dann die größeren Kondensatoren 1µF nehmen, die funktionieren auch beim MAX232A oder MAX202.&lt;br /&gt;
* 1 9-polige SUBD-Buchse (female)&lt;br /&gt;
* 1 dazu passendes Modem(nicht Nullmodem!)-Kabel&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 14 (ADC)&lt;br /&gt;
* 1 Kondensator 100n&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* nach Lust und Laune temperatur- oder lichtabhängige Widerstände und jeweils einen Widerstand in der gleichen Größenordnung wie der Sensor&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 17 (Schieberegister)&lt;br /&gt;
* 2 Schieberegister 74HC595&lt;br /&gt;
* einige LED, damit man an die Schieberegister auch etwas anschließen kann, samt passenden Vorwiderständen&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 19 (7-Segmentanzeige)&lt;br /&gt;
* 4 7-Segmentanzeigen mit gemeinsamer Anode&lt;br /&gt;
* 4 PNP-Transistoren BC328&lt;br /&gt;
* 4 Widerstände 1k&lt;br /&gt;
* 7 Widerstände 100Ω&lt;br /&gt;
&lt;br /&gt;
Für weitere Bauteile, die man als angehender µC Bastler auch des Öfteren mal benötigt, empfiehlt sich ein Blick in die Liste der [[Standardbauelemente]] bzw. in die [[Absolute_beginner|Grundausstattung]]. Wenn Ihr Händler Großpackungen (zb. 100 Stück) von 100n Kondensatoren, 10k, 1k oder 100Ω Widerständen anbietet, sollten Sie deren Erwerb in Erwägung ziehen. Diese Bauteile benötigt man oft, und derartige Großpackungen sind meist nicht teurer, als wenn man einige wenige Exemplare einzeln kauft. Dies hängt damit zusammen, dass das Herauszählen von 9 Bauteilen für den Verkäufer teurer kommt, als 100 Bauteile abgepackt aus dem Regal zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird nur auf die Programmierung in Assembler eingegangen, da Assembler für das Verständnis der Hardware am besten geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&lt;br /&gt;
Zuerst braucht man einen &#039;&#039;&#039;Assembler&#039;&#039;&#039;, der in Assemblersprache geschriebene Programme in Maschinencode übersetzt. Windows-User können das [https://www.microchip.com/en-us/tools-resources/develop/microchip-studio Microchip-Studio] ([https://www.microchip.com/en-us/tools-resources/archives/avr-sam-mcus frühere Versionen von Atmel]) verwenden, das neben dem Assembler auch einen Simulator enthält, mit dem sich die Programme vor der Übertragung in den Controller testen lassen; für Linux gibt es [http://www.tavrasm.org/ tavrasm], [https://github.com/Ro5bert/avra avra] und [http://avr-asm-tutorial.net/gavrasm/index_de.html gavrasm].&lt;br /&gt;
&lt;br /&gt;
Um die vom Assembler erzeugte &amp;quot;.hex&amp;quot;-Datei über den ISP-Adapter in den Mikrocontroller zu programmieren, kann man unter Windows z.&amp;amp;nbsp;B. das Programm [http://www.myplace.nu/avr/yaap/ yaap] verwenden, für Linux gibt es [http://savannah.nongnu.org/projects/uisp/ uisp], für beide [[AVRDUDE|avrdude]].&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
Wer in C programmieren möchte, kann den kostenlosen GNU-C-Compiler AVR-GCC (unter Windows &amp;quot;WinAVR&amp;quot;) ausprobieren. Dieser C-Compiler kann auch in das für Assembler-Programmierung notwendige AVR-Studio integriert werden. In der Artikelsammlung gibt es ein umfangreiches [[AVR-GCC-Tutorial|Tutorial]] zu diesem Compiler;&lt;br /&gt;
&lt;br /&gt;
Wer unter Windows und Linux gleichermassen kostenlos entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Hier wird auch der AVR-GCC benutzt. In der Artikelsammlung gibt es ein umfangreiches [[AVR Eclipse|AVR Eclipse Tutorial]] zu dieser IDE.&lt;br /&gt;
Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Fragen dazu stellt man am besten hier im [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum].&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
Wer in Pascal programmieren muss, kann [http://www.e-lab.de AVRPascal] ausprobieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieser Pascalcompiler ist kostenfrei bis 4kb Code und bietet viele ausgereifte Bibliotheken für Servoansteuerung, Serielle Schnittstellen (COM, TWI, SPI), PWM, Timernutzung, LC-Displays usw.&amp;lt;br&amp;gt; &lt;br /&gt;
Außerdem gibt es eine kostenfreie Version für den Mega8 und den Mega88.&lt;br /&gt;
[http://www.e-lab.de E-LAB].&lt;br /&gt;
&lt;br /&gt;
=== Basic ===&lt;br /&gt;
Auch Basic-Fans kommen nicht zu kurz, für die gibt es z.&amp;amp;nbsp;B. [[Bascom AVR]] ($69, Demo verfügbar) oder das kostenlose [[http://avr.myluna.de LunaAVR]].&lt;br /&gt;
&lt;br /&gt;
=== Forth ===&lt;br /&gt;
Wer einen direkten und interaktiven Zugang zum Controller haben will, sollte sich [http://amforth.sourceforge.net Forth] anschauen. Voraussetzung ist ein serieller Anschluß (Max232), also etwas mehr als die Minimalbeschaltung.&lt;br /&gt;
&lt;br /&gt;
== Bereit für das erste Programm? ==&lt;br /&gt;
&lt;br /&gt;
Zum nächsten Kapitel geht es erst, wenn man Hard- und Software in einer Weise zum Funktionieren gebracht hat, dass:&lt;br /&gt;
* die Programmiersoftware das Programmiergerät erkennt&lt;br /&gt;
* die Programmiersoftware den Mikrocontroller erkennt (alle heute üblichen Controller haben eine typspezifische Selbsterkennung), dazu muss der Controller mit Strom versorgt sein&lt;br /&gt;
* die verwendete Erstell-Software (bspw. der Assembler) aus einem leeren oder Beispiel-Projekt eine Programmier-Datei erstellt (meistens eine .HEX-Datei), die man in die Programmiersoftware laden kann (noch nicht in den Controller programmieren!)&lt;br /&gt;
Diesen arbeitsfähigen Zustand zu erreichen ist im Eigenbau (etwa dem Steckbrett) schwieriger als mit einem Starterkit — und der wichtigste Grund warum viele das Geld für das ansonsten nutzlose Starterkit ausgeben.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
Bevor man anfängt, sollte man sich die folgenden Dokumente runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* Datenblatt des ATmega8: [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf Original (PDF; 6,3&amp;amp;nbsp;MB)]&amp;lt;!-- früher http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf --&amp;gt; oder [https://web.archive.org/web/20180617065644/http://www.avr-modelleisenbahn.de/controller/atmega8/atmega8.htm in deutscher Übersetzung (HTML)]&lt;br /&gt;
* Befehlssatz-Handbuch der AVRs: [https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-InstructionSet-Manual-DS40002198.pdf Original (PDF; 1,2&amp;amp;nbsp;MB)]&amp;lt;!-- früher http://www.atmel.com/Images/Atmel-0856-AVR-Instruction-Set-Manual.pdf --&amp;gt; oder [https://web.archive.org/web/20180209051940/http://www.avr-modelleisenbahn.de/controller/befehle/avr-befehle.htm in deutscher Übersetzung (HTML)]&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt eines Controllers ist das wichtigste Dokument für einen Entwickler. Es enthält Informationen über die Pinbelegung, Versorgungsspannung, Beschaltung, Speicher, die Verwendung der IO-Komponenten und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Im Befehlssatz sind alle Assemblerbefehle der AVR-Controllerfamilie aufgelistet und erklärt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_hochvor|	 &lt;br /&gt;
hochtext=Inhaltsverzeichnis|	 &lt;br /&gt;
hochlink=AVR-Tutorial|	 &lt;br /&gt;
vortext=I/O-Grundlagen|	 &lt;br /&gt;
vorlink=AVR-Tutorial: IO-Grundlagen}}	 &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Equipment]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmel_Studio&amp;diff=105630</id>
		<title>Atmel Studio</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmel_Studio&amp;diff=105630"/>
		<updated>2022-11-19T11:14:07Z</updated>

		<summary type="html">&lt;p&gt;Alesi: /* Weblinks */  Veralteten Link http://www.microchip.com/avr-support/avr-and-sam-downloads-archive aktualisiert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;Atmel Studio&#039;&#039;&#039; (vor Version 6: &amp;quot;&#039;&#039;&#039;AVR Studio&#039;&#039;&#039;&amp;quot;) ist eine kostenlose Entwicklungsumgebung ([[Editoren/IDEs|IDE]]) für die Programmierung der [[AVR]]-[[Mikrocontroller]] und [[ARM]]-[[Mikrocontroller]] (ab Version 6) von Atmel. Sie basiert ab Version 5 auf der Visual Studio Shell von Microsoft und besteht aus einer Projektverwaltung, einem [[Editoren/IDEs#Texteditoren für Programmierer|Editor]], einem [[AVR-Studio#Debugger|Debugger]] und Werkzeugen zum Beschreiben der Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
Mit dem Atmel Studio kann in [[Assembler]] sowie in [[C]]/[[C-Plusplus|C++]] programmiert werden. Für die Unterstützung von C/C++ musste bis einschließlich Version 4 vor der Installation des AVR Studio der GNU C Compiler für AVRs [[WinAVR]] installiert werden. Ab AVR Studio 5 ist eine vollständige Toolchain zur Entwicklung von C-Projekten enthalten. Atmel bietet weiterhin eine Erweiterung zwecks Erstellung von Projekten mit eingeschränkter C++-Unterstützung an (siehe [[AVR_Studio#Tipps_.26_Tricks|Tipps &amp;amp; Tricks]]).&lt;br /&gt;
&lt;br /&gt;
== Debugger ==&lt;br /&gt;
Die Atmel-Studio-Umgebung sieht unabhängig von der speziellen Debug-Plattform größtenteils identisch aus. Es existieren folgende Debug-Möglichkeiten:&lt;br /&gt;
# [[AVR-Simulation#AVR_Studio|AVR Simulator]]&lt;br /&gt;
# AVR In-Circuit Emulator / [[JTAG]]-Adapter: Atmel-ICE, AVR Dragon, AVR ONE!, JTAGICE3, JTAGICE mkII, SAM-ICE&lt;br /&gt;
&#039;&#039;&#039;Simulation&#039;&#039;&#039;&lt;br /&gt;
* die meisten AVR-Mikrocontroller werden unterstützt&lt;br /&gt;
* z.T langsamer als eine Emulation (insbesondere bei größeren Projekten)&lt;br /&gt;
* Wechselwirkung mit Peripherie nur über vordefinierte Stimuli möglich&lt;br /&gt;
* Anzeige aller Register zu jeder Zeit möglich&lt;br /&gt;
&#039;&#039;&#039;Emulation&#039;&#039;&#039;&lt;br /&gt;
* Unterstützung von Mikrocontrollern plattformabhängig eingeschränkt&lt;br /&gt;
* z.T. schneller als Simulation&lt;br /&gt;
* Debugging in tatsächlicher Hardwareumgebung&lt;br /&gt;
* Register nicht uneingeschränkt lesbar&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Studio Bugs]]&lt;br /&gt;
* [[AVR-Simulation]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/193587#1894280 Pfad zum Hexfile]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/237681#2411339 Anzeige der Größe benutzter Speicherbereiche in AVR Studio 5]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/236601#2413654 C++ Templates (beta) für AVR Studio 5] (Vorsicht: kein vollständiger Funktionsumfang, siehe [http://support.atmel.no/bin/customer.exe?=&amp;amp;action=viewKbEntry&amp;amp;id=1001 FAQ])&lt;br /&gt;
* [http://www.rn-wissen.de/index.php/AVR_Studio_5#Eigene_Templates_erzeugen Erstellung eigener Templates in AVR Studio 5]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267384#new Nicht Atmel Programmer direkt unter AVR Studio 5 oder 6 verwenden z.B. USBasp]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/316052#3420336 AVR Studio 4 und die neue AVR Toolchain - So funktionierts!]&lt;br /&gt;
*[https://www.mikrocontroller.net/topic/445097 AS7 printf auf das Output-Fenster umleiten]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
=== Offizielle Seite ===&lt;br /&gt;
* https://www.microchip.com/avr-support/atmel-studio-7&lt;br /&gt;
&lt;br /&gt;
=== Direktlinks Installer ===&lt;br /&gt;
[http://atmel-studio.s3-website-us-west-2.amazonaws.com/7.0.1931/as-installer-7.0.1931-readme.pdf Atmel Studio Release Notes] (PDF)&lt;br /&gt;
&lt;br /&gt;
[http://www.microchip.com/avr-support/avr-and-sam-downloads-archive Microchip Downloads Archive]&lt;br /&gt;
&lt;br /&gt;
Die MD5 bzw. SHA1 Checksumme dient zum Überprüfen der Downloads auf Vollständigkeit. Die aktuelle Version steht jeweils zuerst.&lt;br /&gt;
&lt;br /&gt;
; Atmel Studio 7:&lt;br /&gt;
* [https://ww1.microchip.com/downloads/aemdocuments/documents/parked-documents/as-installer-7.0.2542-full.exe Microchip Studio 7-2542 Full Installer] &amp;lt;small&amp;gt;(979MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://studio.download.atmel.com/7.0.2397/as-installer-7.0.2397-full.exe Atmel Studio 7-2397 Full Installer] &amp;lt;small&amp;gt;(updated Oktober 2019, 874MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [https://s3-us-west-2.amazonaws.com/atmel-studio/7.0.1931/as-installer-7.0.1931-full.exe Atmel Studio 7-1931 Full Installer] &amp;lt;small&amp;gt;(updated Juni 2018, 878MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://atmel-studio.s3-website-us-west-2.amazonaws.com/7.0.1645/as-installer-7.0.1645-full.exe Atmel Studio 7-1645 Full Installer] &amp;lt;small&amp;gt;(updated Oktober 2017, 887MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [https://s3-us-west-2.amazonaws.com/atmel-studio/7.0.1417/as-installer-7.0.1417-full.exe Atmel Studio 7-1417 Full Installer] &amp;lt;small&amp;gt;(updated März 2017, 866MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.atmel.com/images/as-installer-7.0.1188-full.exe Atmel Studio 7-1188 Full Installer] &amp;lt;small&amp;gt;(updated September 2016, 863MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.atmel.com/images/as-installer-7.0.1006-full.exe Atmel Studio 7-1006 Full Installer] &amp;lt;small&amp;gt;(updated Juni 2016, 856MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.atmel.com/images/as-installer-7.0.934-full.exe Atmel Studio 7-934 Full Installer] &amp;lt;small&amp;gt;(updated Mai 2016, 828MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.atmel.com/images/as-installer-7.0.790-full.exe Atmel Studio 7-790 Full Installer] &amp;lt;small&amp;gt;(updated März 2016, 824MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.atmel.com/images/as-installer-7.0.634-web.exe Atmel Studio 7-634 Web Installer] &amp;lt;small&amp;gt;(SHA1: 3ea8501ccc7e89e6839109927d5c289ff847ab32, updated Nov 2015, 2,4MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.atmel.com/images/as-installer-7.0.634-full.exe Atmel Studio 7-634 Full Installer] &amp;lt;small&amp;gt;(SHA1: 3e4b5c4546c1544d029404de53898fd8e545e254, updated Nov 2015, 734MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.atmel.com/images/as-installer-7.0.594-web.exe Atmel Studio 7-594 Web Installer] &amp;lt;small&amp;gt;(MD5: 563F33F02D81AF3491CB1DCE992A1322, updated Oktober 2015, 2,4MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.atmel.com/images/as-installer-7.0.594-full.exe Atmel Studio 7-594 Full Installer] &amp;lt;small&amp;gt;(MD5: A7DC906E1157B50BD764902CCD65289F, updated Oktober 2015, 729MB)&amp;lt;/small&amp;gt;&lt;br /&gt;
; Atmel Studio 6:&lt;br /&gt;
* [http://web.archive.org/web/20170719173845/http://www.atmel.com/images/AStudio6_2sp2_1563net.exe Atmel Studio 6.2 Service Pack 2 (Build 1563) Full Installer] &amp;lt;small&amp;gt;MD5: 3E0447826DC4B5FD42A5F73F6911E458 SHA-1: 60EFF100EF245B9BBF7910CBD369F7778A110C82 SHA-256: DCD97A19B016F600477A1758FEA2353D4BD980C644CBD6A89D03647E0728A1B8&amp;lt;/small&amp;gt; (775MB, updated February 2015)&lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/images/AStudio6_2sp1_1502net.exe Atmel Studio 6.2 Service Pack 1 (Build 1502) Full Installer] &amp;lt;small&amp;gt;MD5: A348B272B000A1881DB38A2C51FECEB7 SHA-1: ED5924A7B3CBCB06DEE7803EF26C3DCC35AA8EB4 SHA-256: 17335C38149B9B3F80815792C6F9BCB727843234B147FD2FD80EB00682E6D5FD&amp;lt;/small&amp;gt; (721MB, updated Nov 2014) &lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/AStudio6_2_1153net.exe Atmel Studio 6.2 (Build 1153) Full Installer] &amp;lt;small&amp;gt;MD5: 3C62CD17DAF1ECD327E74CBF4DB40CF1 SHA-1: D482D69E10AD61ED5784D797F98EABB30B2FF30A SHA-256: 689EBDB03EFCB4E3EC403F80CD2D0B63A01A492FEFD96F9D5969A5698DAB2FDC&amp;lt;/small&amp;gt; (735MB, updated May 2014)&lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/AStudio62betanet.exe Atmel Studio 6.2 beta Full Installer]  (728MB, updated February 2014)&lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/AStudio61sp2net.exe Atmel Studio 6.1 update 2.0 (build 2730)] (853MB, updated August 2013)&lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/AStudio61sp1_1net.exe Atmel Studio 6.1-2674] (806 MB, 2013/06)&lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/AStudio61net.exe Atmel Studio 6.1-2565] (783 MB, 2013/04)&lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/AtmelStudio-6.1.2440-beta-net.exe Atmel Studio 6.1-2440 (beta)] (639 MB, 2013/03)&lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/as6installer-6.0.1996-net.exe Atmel Studio 6.0-1996 Service Pack 2]&amp;lt;ref&amp;gt;Update-Installer ist leider nicht in Sicht&amp;lt;/ref&amp;gt; (799 MB, 2012/11)&lt;br /&gt;
* [http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/as6installer-stable-servicepack1-6.0.1938.exe Atmel Studio 6.0-1938 Service Pack 1] Upgrade auf Build 1938 (148 MB, updated 2012/09)&lt;br /&gt;
*[http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/as6installer-patch-6.0.1882.exe Atmel Studio 6.0-1882 Patch 2] Bugfix update für Atmel Studio 6.0-1843 und 6.0-1863 (25MB, updated 2012/08) &lt;br /&gt;
*[http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/as6installer-6.0.1843.exe Atmel Studio 6.0-1843]&amp;lt;small&amp;gt;MD5: 55CAD1A86458A3BB946E53190AEEE499&amp;lt;/small&amp;gt; &amp;lt;ref&amp;gt;Atmel Studio 6.0 zeigt die RAM-Nutzung falsch an, egal welche Toolchain genutzt wird. Es addiert die EEPROM-Belegung dazu. [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;p=963389#963389 Work-Around]&amp;lt;/ref&amp;gt; (743MB, updated 2012/05)&lt;br /&gt;
*[http://web.archive.org/web/20170719172514/http://www.atmel.com/Images/as6installer-6.0.1703-full.exe Atmel Studio 6.0-1703 Beta] (731MB, updated 2012/03)&lt;br /&gt;
&lt;br /&gt;
; Atmel Studio 6 (ohne VSS und .NET):&lt;br /&gt;
* [http://web.archive.org/web/20171115152647/http://www.atmel.com/images/AStudio6_2sp2_1563.exe Atmel Studio 6.2 Service Pack 2 (build 1563) Installer] (560MB, updated February 2015)&lt;br /&gt;
* [http://web.archive.org/web/20171115152647/http://www.atmel.com/images/AStudio6_2sp1_1502.exe Atmel Studio 6.2 Service Pack 1 (build 1502) Installer] (506MB, updated Nov 2014)&lt;br /&gt;
* [http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/AStudio6_2_1153.exe Atmel Studio 6.2 (build 1153) Installer] &amp;lt;small&amp;gt;MD5: 3C62CD17DAF1ECD327E74CBF4DB40CF1&amp;lt;/small&amp;gt; (520MB, updated May 2014)&lt;br /&gt;
* [http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/AStudio62beta.exe Atmel Studio 6.2 beta Installer] (513MB, updated February 2014)&lt;br /&gt;
* [http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/AStudio61sp2.exe Atmel Studio 6.1 update 2.0 (build 2730)] (595MB, updated August 2013)&lt;br /&gt;
* [http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/AStudio61sp1_1.exe Atmel Studio 6.1-2674] (595 MB, 2013/06)&lt;br /&gt;
* [http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/AStudio61.exe Atmel Studio 6.1-2565] (568 MB, 2013/04)&lt;br /&gt;
*[http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/AtmelStudio-6.1.2440-beta.exe Atmel Studio-6.1.2440 beta] (424MB, 2013/03)&lt;br /&gt;
*[http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/as6installer-6.0.1996.exe Atmel Studio-6.0.1996 with Service Pack 2 Installer] (585MB, updated 2012/11)&lt;br /&gt;
*[http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/as6installer-6.0.1843.noVSSnoDotNet.exe Atmel Studio 6.0-1843] (528MB, updated 2012/05)&lt;br /&gt;
*[http://web.archive.org/web/20171115152647/http://www.atmel.com/Images/as6installer-6.0.1703-small.exe Atmel Studio 6.0-1703 Beta] (516MB, updated 2012/03)&lt;br /&gt;
&lt;br /&gt;
; AVR Studio 5:&lt;br /&gt;
&lt;br /&gt;
*[http://www.atmel.com/images/NEWas5installer-stable-5.1.208-full.exe AVR Studio 5.1-208] ASF 2.11.0, Toolchain 3.3.1 (616MB, updated 2012/02)&lt;br /&gt;
*[http://www.atmel.com/Images/as5installer-5.1.148.beta-full.exe AVR Studio 5.1-148 Beta] (523 MB, updated 2011/12)&lt;br /&gt;
&lt;br /&gt;
; AVR Studio 5 (ohne VSS und .NET):&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/images/as5installer-stable-5.1.208-small.exe AVR Studio 5.1-208] ASF 2.11.0, Toolchain 3.3.1 (387 MB, updated 2012/02)&lt;br /&gt;
*[http://www.atmel.com/Images/as5installer-5.1.148.beta-small.exe AVR Studio 5.1-148 Beta] (308 MB, updated 2011/12)&lt;br /&gt;
&lt;br /&gt;
; AVR Studio 4:&lt;br /&gt;
&lt;br /&gt;
*[http://www.atmel.com/Images/AvrStudio4Setup.exe AVR Studio 4.19-730]&amp;lt;small&amp;gt;MD5:609209DB9A1C6191945421299101DC15&amp;lt;/small&amp;gt; (124 MB, updated 2011/09/11)&lt;br /&gt;
*[http://www.atmel.com/Images/AVRStudio4.18Setup.exe AVR Studio 4.18-684] (117 MB, updated July 2009)&lt;br /&gt;
*[http://www.atmel.com/Images/AVRStudio4.18SP3.exe AVR Studio 4.18-716 Service Pack 3] (33 MB, updated July 2009)&lt;br /&gt;
*[http://www.atmel.com/Images/AvrStudio417Setup.exe AVR Studio 4.17-666] (112 MB, updated 07/09)&lt;br /&gt;
*[http://www.atmel.com/Images/AvrStudio416Setup.exe AVR Studio 4.16-628] Letzte Version für Windows 98 (126 MB, updated 02/09)&lt;br /&gt;
*[http://www.atmel.com/Images/aStudio4b589.exe AVR Studio 4.14-589] (89 MB, updated 04/08)&lt;br /&gt;
*[http://www.atmel.com/Images/aStudio4b528.exe AVR Studio 4.13-528] (73 MB, updated 03/07)&lt;br /&gt;
&lt;br /&gt;
=== Direktlinks Zusatzsoftware ===&lt;br /&gt;
====Atmel QTouch====&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/Images/AVRQTouchStudioSetup_VSS_dotNET.exe AVR QTouch Studio] (373 MB, mit .NET, März 2010)&lt;br /&gt;
* [http://www.atmel.com/Images/Atmel_QTouch_Libraries_5.0.exe Atmel QTouch Library 5.0] (34.3MB, April 2011)&lt;br /&gt;
&lt;br /&gt;
====AVR Toolchain====&lt;br /&gt;
* [https://ww1.microchip.com/downloads/Secure/en/DeviceDoc/avr8-gnu-toolchain-3.6.2.1778-win32.any.x86.zip AVR Toolchain 3.6.2]&lt;br /&gt;
* [http://www.atmel.com/images/avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe AVR Toolchain 3.5.4] (15.2 MB, avr-gcc 4.9.2, binutils 2.26, avr-libc 2.0.0, gdb 7.8, updated 2016/09)&lt;br /&gt;
* [http://www.atmel.com/images/avr8-gnu-toolchain-installer-3.5.1.87-win32.any.x86.exe AVR Toolchain 3.5.1] (14.8 MB, avr-gcc 4.9.2, binutils 2.25, avr-libc 1.8.0svn, gdb 7.8, updated 2016/03)&lt;br /&gt;
* [http://www.atmel.com/images/avr8-gnu-toolchain-installer-3.5.0.85-win32.any.x86.exe AVR Toolchain 3.5.0] (14.7 MB, avr-gcc 4.9.2, binutils 2.25, avr-libc 1.8.0svn, gdb 7.8, updated 2015/09)&lt;br /&gt;
* [http://www.atmel.com/images/avr8-gnu-toolchain-installer-3.4.5.30-win32.any.x86.exe AVR Toolchain 3.4.5] (15.9MB, updated 2014/11)&lt;br /&gt;
* [http://www.atmel.com/images/avr8-gnu-toolchain-installer-3.4.4.24-win32.any.x86.exe AVR Toolchain 3.4.4] (15.6MB, updated 2014/05)&lt;br /&gt;
* [http://www.atmel.com/images/avr-toolchain-installer-3.4.2.1573-win32.win32.x86.exe AVR Toolchain 3.4.2-1573] (86.6 MB, avr-gcc 4.7.2, AVR-Libc 1.8.0, updated 2013/04)&lt;br /&gt;
* [http://www.atmel.com/Images/avr-toolchain-installer-3.4.1.1195-win32.win32.x86.exe AVR Toolchain 3.4.1-1195] (95.9 MB, avr-gcc 4.6.2, AVR-Libc 1.8.0, updated 2012/08)&lt;br /&gt;
* [http://www.atmel.com/Images/avr-toolchain-installer-3.4.0.1146-win32.win32.x86.exe AVR Toolchain 3.4.0-1146] (91 MB, avr-gcc 4.6.2, AVR-Libc 1.8.0, updated 2012/06)&lt;br /&gt;
* [http://www.atmel.com/Images/avr-toolchain-installer-3.3.1.1020-win32.win32.x86.exe AVR Toolchain 3.3.1-1020] (94 MB, avr-gcc 4.5.1, AVR-Libc 1.7.1, updated 2012/04)&lt;br /&gt;
* [http://www.atmel.com/Images/avr-toolchain-installer-3.3.0.710-win32.win32.x86.exe AVR Toolchain 3.3.0-710] (94 MB, avr-gcc 4.5.1, AVR-Libc: 1.7.1, updated 2011/09/11)&lt;br /&gt;
* [http://www.atmel.com/Images/avr-toolchain-installer-3.2.3.579-win32.win32.x86.exe AVR Toolchain 3.2.3-579] (95 MB, avr-gcc 4.5.1, AVR-Libc 1.7.1, updated 2011/06/11, erzeugt Toolchain 3.2.3-314)&lt;br /&gt;
* [http://www.atmel.com/Images/avr-toolchain-installer-3.0.0.240-win32.win32.x86.exe AVR Toolchain 3.0.0-240] (87 MB, avr-gcc 4.4.3, AVR-Libc 1.7.0, updated 2010/09/10)&lt;br /&gt;
&lt;br /&gt;
====Atmel Software Framework====&lt;br /&gt;
&lt;br /&gt;
; Updates für Atmel Studio:&lt;br /&gt;
* [http://www.atmel.com/Images/as-asf341-msi-stable-6.0.0.165-win32.win32.x86.zip Atmel Software Framework 3.4.1.147] für Atmel Studio 6&lt;br /&gt;
* [http://www.atmel.com/Images/as-asf330-msi-stable-6.0.0.144-win32.win32.x86.zip Atmel Software Framework 3.3.0] für Atmel Studio 6&lt;br /&gt;
* [http://www.atmel.com/Images/as5.1-asf-vsix-stable-2.11.1.30-win32.win32.x86.zip Atmel Software Framework 2.11.1.30] für AVR Studio 5&lt;br /&gt;
* [http://www.atmel.com/Images/AVRStudio5-ASF-Update-2.8.1.76.exe Atmel Software Framework 2.8.1.76] für AVR Studio 5&lt;br /&gt;
&lt;br /&gt;
; Standalone:&lt;br /&gt;
* [http://www.atmel.com/images/asf-standalone-archive-3.20.1.101.zip AVR Software Framework 3.20.1.101]&lt;br /&gt;
* [http://www.atmel.com/Images/asf-standalone-archive-3.7.3.69.zip AVR Software Framework 3.7.3.69]&lt;br /&gt;
* [http://www.atmel.com/Images/asf-standalone-archive-3.5.1.62.zip AVR Software Framework 3.5.1.62]&lt;br /&gt;
* [http://www.atmel.com/Images/asf-standalone-archive-2.10.0.zip AVR Software Framework 2.10.0]&lt;br /&gt;
* [http://www.atmel.com/Images/asf-standalone-archive-2.9.0.zip AVR Software Framework 2.9.0]&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&#039;&#039;&#039;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://www.microchip.com/en-us/tools-resources/archives/avr-sam-mcus Download-Archiv des Herstellers mit funktionierenden Links zu allen Versionen]&lt;br /&gt;
&#039;&#039;&#039;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/user/AtmelCorporation#g/c/8F325BE889E62E50 YouTube-Playlist: AVR Studio 5 Tutorial]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=82994 How to install JTAGICE mkII (and AVR Dragon and AVRISP mkII) on Windows 7 x64] auf avrfreaks.net (ggf. kostenlos registrieren). Siehe auch Hinweis von Denny [http://www.mikrocontroller.net/topic/146857#1476962] im Forum.&lt;br /&gt;
*[http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR Eclipse Plugin]&lt;br /&gt;
*[http://avrstudio5.wordpress.com/ AVR Studio 5 Blog] - Useful hints and tips for installation troubleshooting with the new AVR Studio 5&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Uhr&amp;diff=94398</id>
		<title>AVR-Tutorial: Uhr</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Uhr&amp;diff=94398"/>
		<updated>2016-11-19T19:56:46Z</updated>

		<summary type="html">&lt;p&gt;Alesi: Fehlenden push und pop Befehl in Routine timer1_compare ergänzt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine beliebte Übung für jeden Programmierer ist die Implementierung einer Uhr. Die meisten Uhren bestehen aus einem Taktgeber und einer Auswerte- und Anzeigevorrichtung. Wir wollen hier beides mittels eines Programmes in einem Mikrocontroller realisieren. Voraussetzung für diese Fallstudie ist das Verständnis der Kapitel über&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: LCD| Ansteuerung eines LC-Displays]]&lt;br /&gt;
* [[AVR-Tutorial: Timer| Timer]]&lt;br /&gt;
&lt;br /&gt;
== Aufbau und Funktion ==&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe des Taktgebers, der uns einen möglichst konstanten und genauen Takt liefert, übernimmt ein Timer. Der Timer ermöglicht einen einfachen Zugang zum Takt, den der AVR vom Quarz abgreift. Wie schon im Einführungskapitel über den [[AVR-Tutorial:_Timer|Timer]] beschrieben, wird dazu ein Timer Overflow Interrupt installiert, und in diesem Interrupt wird die eigentliche Uhr hochgezählt. Die Uhr besteht aus vier Registern. Drei davon repräsentieren die Sekunden, Minuten und Stunden unserer Uhr. Nach jeweils einer Sekunde wird das Sekundenregister um eins erhöht. Sind 60 Sekunden vergangen, wird das Sekundenregister wieder auf Null gesetzt und gleichzeitig das Minutenregister um eins erhöht. Dies ist ein Überlauf. Nach 60 Minuten werden die Minuten wieder auf Null gesetzt und für diese vergangenen 60 Minuten eine Stunde aufaddiert. Nach 24 Stunden schliesslich werden die Stunden wieder auf Null gesetzt, ein ganzer Tag ist vergangen.&lt;br /&gt;
&lt;br /&gt;
Aber wozu das vierte Register?&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird mit 4 MHz betrieben. Bei einem Teiler von 1024 zählt der Timer also mit 4000000 / 1024 = 3906,25 Pulsen pro Sekunde. Der Timer muss einmal bis 256 zählen, bis er einen Überlauf auslöst. Es ereignen sich also 3906,25 / 256 = 15,2587 Überläufe pro Sekunde. Die Aufgabe des vierten Registers ist es nun, diese 15 Überläufe zu zählen. Bei Auftreten des 15. ist eine Sekunde vergangen. Dies stimmt jedoch nicht exakt, denn die Division weist ja auch Nachkommastellen auf, hat einen Rest, der hier im Moment der Einfachheit halber ignoriert wird. In einem späteren Abschnitt wird darauf noch eingegangen werden.&lt;br /&gt;
&lt;br /&gt;
Im Überlauf-Interrupt wird also diese Kette von Zählvorgängen auf den Sekunden, Minuten und Stunden durchgeführt und anschliessend zur Anzeige gebracht. Dazu werden die in einem vorhergehenden Kapitel entwickelten [[AVR-Tutorial:_LCD|LCD Funktionen]] benutzt.&lt;br /&gt;
&lt;br /&gt;
== Das erste Programm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
.def flag  = r19&lt;br /&gt;
 &lt;br /&gt;
.def SubCount = r21&lt;br /&gt;
.def Sekunden = r22&lt;br /&gt;
.def Minuten  = r23&lt;br /&gt;
.def Stunden  = r24&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
        rjmp    main                ; Reset Handler&lt;br /&gt;
.org OVF0addr&lt;br /&gt;
        rjmp    timer0_overflow     ; Timer Overflow Handler&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
        ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
        out     SPH, temp1&lt;br /&gt;
        ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
        out     SPL, temp1&lt;br /&gt;
&lt;br /&gt;
        ldi temp1, 0xFF    ; Port D = Ausgang&lt;br /&gt;
        out DDRD, temp1 &lt;br /&gt;
    &lt;br /&gt;
        rcall   lcd_init&lt;br /&gt;
        rcall   lcd_clear&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, (1&amp;lt;&amp;lt;CS02) | (1&amp;lt;&amp;lt;CS00)   ; Teiler 1024&lt;br /&gt;
        out     TCCR0, temp1&lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, 1&amp;lt;&amp;lt;TOIE0     ; TOIE0: Interrupt bei Timer Overflow&lt;br /&gt;
        out     TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
        clr     Minuten             ; Die Uhr auf 0 setzen&lt;br /&gt;
        clr     Sekunden&lt;br /&gt;
        clr     Stunden&lt;br /&gt;
        clr     SubCount&lt;br /&gt;
        clr     Flag                ; Merker löschen&lt;br /&gt;
&lt;br /&gt;
        sei&lt;br /&gt;
 &lt;br /&gt;
loop:&lt;br /&gt;
        cpi     flag,0&lt;br /&gt;
        breq    loop                ; Flag im Interrupt gesetzt?&lt;br /&gt;
        ldi     flag,0              ; flag löschen&lt;br /&gt;
  &lt;br /&gt;
        rcall   lcd_clear           ; das LCD löschen&lt;br /&gt;
        mov     temp1, Stunden      ; und die Stunden ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; zwischen Stunden und Minuten einen &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Minuten      ; dann die Minuten ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; und noch ein &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Sekunden     ; und die Sekunden&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
&lt;br /&gt;
        rjmp    loop&lt;br /&gt;
 &lt;br /&gt;
timer0_overflow:                    ; Timer 0 Overflow Handler&lt;br /&gt;
&lt;br /&gt;
        push    temp1               ; temp 1 sichern&lt;br /&gt;
        in      temp1,sreg          ; SREG sichern&lt;br /&gt;
        push    temp1&lt;br /&gt;
&lt;br /&gt;
        inc     SubCount            ; Wenn dies nicht der 15. Interrupt&lt;br /&gt;
        cpi     SubCount, 15        ; ist, dann passiert gar nichts&lt;br /&gt;
        brne    end_isr&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     SubCount            ; SubCount rücksetzen&lt;br /&gt;
        inc     Sekunden            ; plus 1 Sekunde&lt;br /&gt;
        cpi     Sekunden, 60        ; sind 60 Sekunden vergangen?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht kann die Ausgabe schon&lt;br /&gt;
                                    ; gemacht werden&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Sekunden            ; Sekunden wieder auf 0 und dafür&lt;br /&gt;
        inc     Minuten             ; plus 1 Minute&lt;br /&gt;
        cpi     Minuten, 60         ; sind 60 Minuten vergangen ?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht, -&amp;gt; Ausgabe&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Minuten             ; Minuten zurücksetzen und dafür&lt;br /&gt;
        inc     Stunden             ; plus 1 Stunde&lt;br /&gt;
        cpi     Stunden, 24         ; nach 24 Stunden, die Stundenanzeige&lt;br /&gt;
        brne    Ausgabe             ; wieder zurücksetzen&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Stunden             ; Stunden rücksetzen&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
        ldi     flag,1              ; Flag setzen, LCD updaten&lt;br /&gt;
&lt;br /&gt;
end_isr:&lt;br /&gt;
&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        out     sreg,temp1          ; sreg wieder herstellen&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        reti                        ; das wars. Interrupt ist fertig&lt;br /&gt;
&lt;br /&gt;
; Eine Zahl aus dem Register temp1 ausgeben&lt;br /&gt;
&lt;br /&gt;
lcd_number:&lt;br /&gt;
        push    temp2               ; register sichern,&lt;br /&gt;
                                    ; wird für Zwsichenergebnisse gebraucht     &lt;br /&gt;
        ldi     temp2, &#039;0&#039;         &lt;br /&gt;
lcd_number_10:                &lt;br /&gt;
        subi    temp1, 10           ; abzählen wieviele Zehner in&lt;br /&gt;
        brcs    lcd_number_1        ; der Zahl enthalten sind&lt;br /&gt;
        inc     temp2&lt;br /&gt;
        rjmp    lcd_number_10&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
        push    temp1               ; den Rest sichern (http://www.mikrocontroller.net/topic/172026)&lt;br /&gt;
        mov     temp1,temp2         ; &lt;br /&gt;
        rcall   lcd_data            ; die Zehnerstelle ausgeben&lt;br /&gt;
        pop     temp1               ; den Rest wiederherstellen&lt;br /&gt;
        subi    temp1, -10          ; 10 wieder dazuzählen, da die&lt;br /&gt;
                                    ; vorhergehende Schleife 10 zuviel&lt;br /&gt;
                                    ; abgezogen hat&lt;br /&gt;
                                    ; das Subtrahieren von -10&lt;br /&gt;
                                    ; = Addition von +10 ist ein Trick&lt;br /&gt;
                                    ; da kein addi Befehl existiert&lt;br /&gt;
        ldi     temp2, &#039;0&#039;          ; die übrig gebliebenen Einer&lt;br /&gt;
        add     temp1, temp2        ; noch ausgeben&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
&lt;br /&gt;
        pop     temp2               ; Register wieder herstellen&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der ISR wird nur die Zeit in den Registern neu berechnet, die Ausgabe auf das LCD erfolgt in der Hauptschleife. Das ist notwendig, da die LCD-Ausgabe bisweilen sehr lange dauern kann. Wenn sie länger als ~2/15 Sekunden dauert werden Timerinterrupts &amp;quot;verschluckt&amp;quot; und unsere Uhr geht noch mehr falsch. Dadurch, dass aber die Ausgabe in der Hauptschleife durchgeführt wird, welche jederzeit durch einen Timerinterrupt unterbrochen werden kann, werden keine Timerinterrupts verschluckt. Das ist vor allem wichtig, wenn mit höheren Interruptfrequenzen gearbeitet wird, z.&amp;amp;nbsp;B. 1/100s im Beispiel weiter unten. Auch wenn in diesem einfachen Beispiel die Ausgabe bei weitem nicht 2/15 Sekunden dauert, sollte man sich diesen Programmierstil allgemein angewöhnen. Siehe auch [[Interrupt]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Besonderheit ist das Register &#039;&#039;&#039;flag&#039;&#039;&#039; (=r19). Dieses Register fungiert als Anzeiger, wie eine Flagge, daher auch der Name. In der ISR wird dieses Register auf 1 gesetzt. Die Hauptschleife, also alles zwischen &#039;&#039;loop&#039;&#039; und &#039;&#039;rjmp loop&#039;&#039;, prüft dieses Flag und nur dann, wenn das Flag auf 1 steht, wird die LCD Ausgabe gemacht und das Flag wieder auf 0 zurückgesetzt. Auf diese Art wird nur dann Rechenzeit für die LCD Ausgabe verbraucht, wenn dies tatsächlich notwendig ist. Die ISR teilt mit dem Flag der Hauptschleife mit, dass eine bestimmte Aufgabe, nämlich der Update der Anzeige gemacht werden muss und die Hauptschleife reagiert darauf bei nächster Gelegenheit, indem sie diese Aufgabe ausführt und setzt das Flag zurück. Solche Flags werden daher auch &#039;&#039;&#039;Job-Flags&#039;&#039;&#039; genannt, weil durch ihr setzten das Abarbeiten eines Jobs (einer Aufgabe) angestoßen wird. Auch hier gilt wieder: Im Grunde würde man in diesem speziellen Beispiel kein Job-Flag benötigen, weil es in der Hauptschleife nur einen einzigen möglichen Job, die Neuausgabe der Uhrzeit, gibt. Sobald aber Programme komplizierter werden und mehrere Jobs möglich sind, sind Job-Flags eine gute Möglichkeit, ein Programm so zu organsieren, dass bestimmte Dinge nur dann gemacht werden, wenn sie notwendig sind.&lt;br /&gt;
&lt;br /&gt;
Im Moment gibt es keine Möglichkeit, die Uhr auf eine bestimmte Uhrzeit einzustellen. Um dies tun zu können, müssten noch zusätzlich Taster an den Mikrocontroller angeschlossen werden, mit deren Hilfe die Sekunden, Minuten und Stunden händisch vergrößert bzw. verkleinert werden können. Studieren Sie mal die Bedienungsanleitung einer käuflichen Digitaluhr und versuchen sie zu beschreiben, wie dieser Stellvorgang bei dieser Uhr vor sich geht. Sicherlich werden Sie daraus eine Idee entwickeln können, wie ein derartiges Stellen mit der hier vorgestellten Digitaluhr funktionieren könnte. Als Zwischenlösung kann man im Programm die Uhr beim Start anstelle von 00:00:00 z.&amp;amp;nbsp;B. auch auf 20:00:00 stellen und exakt mit dem Start der Tagesschau starten. Wobei der Start der Tagesschau verzögert bei uns ankommt, je nach Übertragung können das mehrere Sekunden sein.&lt;br /&gt;
&lt;br /&gt;
== Ganggenauigkeit ==&lt;br /&gt;
&lt;br /&gt;
Wird die Uhr mit einer gekauften Uhr verglichen, so stellt man schnell fest, dass sie ganz schön ungenau geht. Sie geht vor! Woran liegt das? Die Berechnung sieht so aus:&lt;br /&gt;
* Frequenz des Quarzes: 4.0 MHz&lt;br /&gt;
* Vorteiler des Timers: 1024&lt;br /&gt;
* Überlauf alle 256 Timertakte&lt;br /&gt;
&lt;br /&gt;
Daraus errechnet sich, dass in einer Sekunde 4000000 / 1024 / 256 = 15.258789 Overflow Interrupts auftreten. Im Programm wird aber bereits nach 15 Overflows eine Sekunde weitergeschaltet, daher geht die Uhr vor. Rechnen wir etwas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {15}{15,258789}-1) \cdot 100% = -1,69%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So wie bisher läuft die Uhr also rund 1.7 % zu schnell. In einer Minute ist das immerhin etwas mehr als eine Sekunde. Im Grunde ist das ein ähnliches Problem wie mit unserer Jahreslänge. Ein Jahr dauert nicht exakt 365 Tage, sondern in etwa einen viertel Tag länger. Die Lösung, die im Kalender dafür gemacht wurde - der Schalttag -, könnte man fast direkt übernehmen. Nach 3 Stück 15er Overflow Sekunden folgt eine Sekunde für die 16 Overflows ablaufen müssen. Wie sieht die Rechnung bei einem 15, 15, 15, 16 Schema aus? Für 4 Sekunden werden exakt 15.258789 * 4 = 61,035156 Overflow Interrupts benötigt. Mit einem 15, 15, 15, 16 Schema werden in 4 Sekunden genau 61 Overflow Interrupts durchgeführt. Der relative Fehler beträgt dann&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {61}{61,035156}-1) \cdot 100% = -0,0575%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Schema ist der Fehler beträchtlich gesunken. Nur noch 0.06%. Bei dieser Rate muss die Uhr immerhin etwas länger als 0,5 Stunden laufen, bis der Fehler auf eine Sekunde angewachsen ist. Das sind aber immer noch 48 Sekunden pro Tag bzw. 1488 Sekunden (=24,8 Minuten) pro Monat. So schlecht sind nicht mal billige mechanische Uhren!&lt;br /&gt;
&lt;br /&gt;
Jetzt könnte man natürlich noch weiter gehen und immer kompliziertere &amp;quot;Schalt-Overflow&amp;quot;-Schemata austüfteln und damit die Genauigkeit näher an 100% bringen. Aber gibt es noch andere Möglichkeiten?&lt;br /&gt;
&lt;br /&gt;
Im ersten Ansatz wurde ein Vorteiler von 1024 eingesetzt. Was passiert bei einem anderen Vorteiler? Nehmen wir mal einen Vorteiler von 64. Das heißt, es müssen ( 4000000 / 64 ) / 256 = 244.140625 Overflows auflaufen, bis 1 Sekunde vergangen ist. Wenn also 244 Overflows gezählt werden, dann beläuft sich der Fehler auf&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {244}{244,140625}-1) \cdot 100% = -0,0576%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht schlecht. Nur durch Verändern von 2 Zahlenwerten im Programm (Teilerfaktor und Anzahl der Overflow Interrupts bis zu einer Sekunden) kann die Genauigkeit gegenüber dem ursprünglichen Overflow-Schema beträchtlich gesteigert werden. Aber geht das noch besser? Ja das geht. Allerdings nicht mit dem Overflow Interrupt.&lt;br /&gt;
&lt;br /&gt;
== Der CTC-Modus des Timers ==&lt;br /&gt;
&lt;br /&gt;
Worin liegt denn das eigentliche Problem, mit dem die Uhr zu kämpfen hat? Es liegt darin, dass jedesmal ein kompletter Timerzyklus bis zum Overflow abgewartet werden muss, um darauf zu reagieren. Da aber nur jeweils ganzzahlige Overflowzyklen abgezählt werden können, heißt das auch, dass im ersten Fall nur in Vielfachen von 1024 * 256 = 262.144 Takten operiert werden kann, während im letzten Fall immerhin schon eine Granulierung von 64 * 256 = 16.384 Takten erreicht wird. Aber offensichtlich ist das nicht genau genug. Bei 4 MHz entsprechen 262.144 Takte bereits einem Zeitraum von 65,5 ms, während 16384 Takte einem Zeitbedarf von 4,096 ms entsprechen. Beide Zahlen teilen aber 1.000 ms nicht ganzzahlig, Nachkommareste fallen unter den Tisch und daraus summiert sich der Fehler auf. Angestrebt wird ein Timer, der seinen &amp;lt;em&amp;gt;Overflow&amp;lt;/em&amp;gt; so erreicht, dass sich ein ganzzahliger Teiler von einer Sekunde einstellt. Dann gibt es keinen Rest. Dazu müsste man dem Timer aber vorschreiben können, bei welchem Zählerstand der &amp;lt;em&amp;gt;Overflow&amp;lt;/em&amp;gt; erfolgen soll. Und genau dies ist im &#039;&#039;&#039;CTC&#039;&#039;&#039;-Modus möglich, allerdings nur beim Timer 1. &#039;&#039;&#039;CTC&#039;&#039;&#039; bedeutet &amp;quot;&#039;&#039;&#039;C&#039;&#039;&#039;lear &#039;&#039;&#039;T&#039;&#039;&#039;imer on &#039;&#039;&#039;C&#039;&#039;&#039;ompare match&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Timer 1, ein 16-Bit-Timer, wird mit einem Vorteiler von 1 betrieben. Dadurch wird erreicht, dass der Timer mit höchster Zeitauflösung arbeiten kann. Bei jedem Ticken des Systemtaktes von 4 MHz wird auch der Timer um 1 erhöht. Zusätzlich wird noch das WGM12-Bit bei der Konfiguration gesetzt. Dadurch wird der Timer in den &#039;&#039;&#039;CTC&#039;&#039;&#039;-Modus gesetzt. Dabei wird der Inhalt des Timers hardwaremäßig mit dem Inhalt des &#039;&#039;&#039;OCR1A&#039;&#039;&#039;-Registers verglichen. Stimmen beide überein, so wird der Timer auf 0 zurückgesetzt und im nächsten Taktzyklus ein &#039;&#039;&#039;OCIE1A&#039;&#039;&#039;-Interrupt ausgelöst. Dadurch ist es möglich, exakt die Anzahl an Taktzyklen festzulegen, die von einem Interrupt zum nächsten vergehen sollen. Das Compare Register &#039;&#039;&#039;OCR1A&#039;&#039;&#039; wird mit dem Wert 39.999 vorbelegt. Dadurch vergehen exakt 40.000 Taktzyklen von einem Compare-Interrupt zum nächsten. &amp;quot;Zufällig&amp;quot; ist dieser Wert so gewählt, dass bei einem Systemtakt von 4 MHz von einem Interrupt zum nächsten genau 1/100 Sekunde vergeht, denn 40.000 / 4.000.000 = 0,01. Bei einem möglichen Umbau der Uhr zu einer Stoppuhr könnte sich die Hundertstelsekunde als nützlich erweisen. Im Interrupt wird das Hilfsregister SubCount bis 100 hochgezählt, und nach 100 Interrupts kommt wieder die Sekundenweiterschaltung wie oben in Gang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
.def Flag  = r19&lt;br /&gt;
 &lt;br /&gt;
.def SubCount = r21&lt;br /&gt;
.def Sekunden = r22&lt;br /&gt;
.def Minuten  = r23&lt;br /&gt;
.def Stunden  = r24&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
           rjmp    main             ; Reset Handler&lt;br /&gt;
.org OC1Aaddr&lt;br /&gt;
           rjmp    timer1_compare   ; Timer Compare Handler&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
        ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
        out     SPH, temp1&lt;br /&gt;
        ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
        out     SPL, temp1&lt;br /&gt;
&lt;br /&gt;
        ldi temp1, 0xFF    ; Port D = Ausgang&lt;br /&gt;
        out DDRD, temp1     &lt;br /&gt;
&lt;br /&gt;
        rcall   lcd_init&lt;br /&gt;
        rcall   lcd_clear&lt;br /&gt;
 &lt;br /&gt;
                                    ; Vergleichswert &lt;br /&gt;
        ldi     temp1, high( 40000 - 1 )&lt;br /&gt;
        out     OCR1AH, temp1&lt;br /&gt;
        ldi     temp1, low( 40000 - 1 )&lt;br /&gt;
        out     OCR1AL, temp1&lt;br /&gt;
                                    ; CTC Modus einschalten&lt;br /&gt;
                                    ; Vorteiler auf 1&lt;br /&gt;
        ldi     temp1, ( 1 &amp;lt;&amp;lt; WGM12 ) | ( 1 &amp;lt;&amp;lt; CS10 )&lt;br /&gt;
        out     TCCR1B, temp1&lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, 1 &amp;lt;&amp;lt; OCIE1A  ; OCIE1A: Interrupt bei Timer Compare&lt;br /&gt;
        out     TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
        clr     Minuten             ; Die Uhr auf 0 setzen&lt;br /&gt;
        clr     Sekunden&lt;br /&gt;
        clr     Stunden&lt;br /&gt;
        clr     SubCount&lt;br /&gt;
        clr     Flag                ; Flag löschen&lt;br /&gt;
&lt;br /&gt;
        sei&lt;br /&gt;
loop:&lt;br /&gt;
        cpi     flag,0&lt;br /&gt;
        breq    loop                ; Flag im Interrupt gesetzt?&lt;br /&gt;
        ldi     flag,0              ; Flag löschen&lt;br /&gt;
  &lt;br /&gt;
        rcall   lcd_clear           ; das LCD löschen&lt;br /&gt;
        mov     temp1, Stunden      ; und die Stunden ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; zwischen Stunden und Minuten einen &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Minuten      ; dann die Minuten ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; und noch ein &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Sekunden     ; und die Sekunden&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
&lt;br /&gt;
        rjmp    loop&lt;br /&gt;
 &lt;br /&gt;
timer1_compare:                     ; Timer 1 Output Compare Handler&lt;br /&gt;
&lt;br /&gt;
        push    temp1               ; temp 1 sichern&lt;br /&gt;
        in      temp1,sreg          ; SREG sichern&lt;br /&gt;
        push    temp1&lt;br /&gt;
&lt;br /&gt;
        inc     SubCount            ; Wenn dies nicht der 100. Interrupt&lt;br /&gt;
        cpi     SubCount, 100       ; ist, dann passiert gar nichts&lt;br /&gt;
        brne    end_isr&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     SubCount            ; SubCount rücksetzen&lt;br /&gt;
        inc     Sekunden            ; plus 1 Sekunde&lt;br /&gt;
        cpi     Sekunden, 60        ; sind 60 Sekunden vergangen?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht kann die Ausgabe schon&lt;br /&gt;
                                    ; gemacht werden&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Sekunden            ; Sekunden wieder auf 0 und dafür&lt;br /&gt;
        inc     Minuten             ; plus 1 Minute&lt;br /&gt;
        cpi     Minuten, 60         ; sind 60 Minuten vergangen ?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht, -&amp;gt; Ausgabe&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Minuten             ; Minuten zurücksetzen und dafür&lt;br /&gt;
        inc     Stunden             ; plus 1 Stunde&lt;br /&gt;
        cpi     Stunden, 24         ; nach 24 Stunden, die Stundenanzeige&lt;br /&gt;
        brne    Ausgabe             ; wieder zurücksetzen&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Stunden             ; Stunden rücksetzen&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
        ldi     flag,1              ; Flag setzen, LCD updaten&lt;br /&gt;
&lt;br /&gt;
end_isr:&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        out     sreg,temp1          ; sreg wieder herstellen&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        reti                        ; das wars. Interrupt ist fertig&lt;br /&gt;
&lt;br /&gt;
; Eine Zahl aus dem Register temp1 ausgeben&lt;br /&gt;
&lt;br /&gt;
lcd_number:&lt;br /&gt;
        push    temp2               ; register sichern,&lt;br /&gt;
                                    ; wird für Zwsichenergebnisse gebraucht     &lt;br /&gt;
        ldi     temp2, &#039;0&#039;         &lt;br /&gt;
lcd_number_10:                &lt;br /&gt;
        subi    temp1, 10           ; abzählen wieviele Zehner in&lt;br /&gt;
        brcs    lcd_number_1        ; der Zahl enthalten sind&lt;br /&gt;
        inc     temp2&lt;br /&gt;
        rjmp    lcd_number_10&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
        push    temp1               ; den Rest sichern (http://www.mikrocontroller.net/topic/172026)&lt;br /&gt;
        mov     temp1,temp2         ; &lt;br /&gt;
        rcall   lcd_data            ; die Zehnerstelle ausgeben&lt;br /&gt;
        pop     temp1               ; den Rest wieder holen&lt;br /&gt;
        subi    temp1, -10          ; 10 wieder dazuzählen, da die&lt;br /&gt;
                                    ; vorhergehende Schleife 10 zuviel&lt;br /&gt;
                                    ; abgezogen hat&lt;br /&gt;
                                    ; das Subtrahieren von -10&lt;br /&gt;
                                    ; = Addition von +10 ist ein Trick&lt;br /&gt;
                                    ; da kein addi Befehl existiert&lt;br /&gt;
        ldi     temp2, &#039;0&#039;          ; die übrig gebliebenen Einer&lt;br /&gt;
        add     temp1, temp2        ; noch ausgeben&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
&lt;br /&gt;
        pop     temp2               ; Register wieder herstellen&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Interrupt-Routine werden wieder, genauso wie vorher, die Anzahl der Interrupt-Aufrufe gezählt. Beim 100. Aufruf sind daher 40.000 * 100 = 4.000.000 Takte vergangen und da der Quarz mit 4.000.000 Schwingungen in der Sekunde arbeitet, ist daher eine Sekunde vergangen. Sie wird genauso wie vorher registriert und die Uhr entsprechend hochgezählt. Wird jetzt die Uhr mit einer kommerziellen verglichen, dann fällt nach einiger Zeit auf ... Sie geht immer noch falsch! Was ist jetzt die Ursache? Die Ursache liegt in einem Problem, das nicht direkt behebbar ist. Am Quarz! Auch wenn auf dem Quarz drauf steht, dass er eine Frequenz von 4MHz hat, so stimmt das nicht exakt. Auch Quarze haben Fertigungstoleranzen und verändern ihre Frequenz mit der Temperatur. Typisch liegt die Fertigungstoleranz bei +/- 100ppm = 0,01% (&#039;&#039;&#039;p&#039;&#039;&#039;arts &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, Millionstel Teile), die Temperaturdrift zwischen -40 Grad und 85 Grad liegt je nach Typ in der selben Größenordnung. Das bedeutet, dass die Uhr pro Monat um bis zu 268 Sekunden (~4 1/2 Minuten) falsch gehen kann. Diese Einflüsse auf die Quarzfrequenz sind aber messbar und per Hardware oder Software behebbar. In Uhren kommen normalerweise genauer gefertigte Uhrenquarze zum Einsatz, die vom Uhrmacher auch noch auf die exakte Frequenz abgeglichen werden (mittels Kondensatoren und Frequenzzähler). Ein Profi verwendet einen sehr genauen Frequenzzähler, womit er innerhalb weniger Sekunden die Frequenz sehr genau messen kann. Als Hobbybastler kann man die Uhr eine zeitlang (Tage, Wochen) laufen lassen und die Abweichung feststellen (z.&amp;amp;nbsp;B. exakt 20:00 Uhr zum Start der Tagsschau). Aus dieser Abweichung lässt sich dann errechnen, wie schnell der Quarz wirklich schwingt. Und da dank CTC die Messperiode taktgenau eingestellt werden kann, ist es möglich, diesen Frequenzfehler auszugleichen. Der genaue Vorgang ist in dem Wikiartikel [[AVR - Die genaue Sekunde / RTC]] beschrieben. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Timer|&lt;br /&gt;
zurücklink=AVR-Tutorial: Timer|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=ADC|&lt;br /&gt;
vorlink=AVR-Tutorial: ADC}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Uhr]]&lt;br /&gt;
[[Category:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Speicher&amp;diff=94331</id>
		<title>AVR-Tutorial: Speicher</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Speicher&amp;diff=94331"/>
		<updated>2016-11-11T22:11:21Z</updated>

		<summary type="html">&lt;p&gt;Alesi: Konsequente Verwendung der Variable temp für Register R16.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Speichertypen ==&lt;br /&gt;
&lt;br /&gt;
Die AVR-Mikrocontroller besitzen 3 verschiedene Arten von Speicher: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;hat&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Flash&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;EEPROM&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;RAM&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Schreibzyklen&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;gt;10.000&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;gt;100.000&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;unbegrenzt&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Lesezyklen&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;unbegrenzt&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;unbegrenzt&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;unbegrenzt&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;flüchtig&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Größe beim ATtiny2313&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;2 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;128 Byte&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;128 Byte&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Größe beim ATmega8&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;8 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;512 Byte&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Größe beim ATmega32&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;32 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;2 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Flash-ROM ===&lt;br /&gt;
&lt;br /&gt;
Das [[Speicher#Flash-ROM | &#039;&#039;&#039;Flash-ROM&#039;&#039;&#039;]] der AVRs dient als Programmspeicher. Über den Programmieradapter werden die kompilierten Programme vom PC an den Controller übertragen und im Flash-ROM abgelegt. Bei der Programmausführung wird das ROM [[Digitaltechnik#Word | Wort]] für Wort ausgelesen und ausgeführt. Es lässt sich aber auch zur Speicherung von Daten nutzen (z.&amp;amp;nbsp;B. Texte für ein [[LCD]]). Vom laufenden Programm aus kann man das ROM normalerweise nur lesen, nicht beschreiben. Es kann beliebig oft ausgelesen werden, aber theoretisch nur ~10.000 mal beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
&lt;br /&gt;
Das [[Speicher#EEPROM |&#039;&#039;&#039;EEPROM&#039;&#039;&#039;]] ist wie das Flash ein nichtflüchtiger Speicher, die Daten bleiben also auch nach dem Ausschalten der Betriebsspannung erhalten. Es kann beliebig oft gelesen und mindestens 100.000 mal beschrieben werden. Bei den AVRs kann man es z.&amp;amp;nbsp;B. als Speicher für Messwerte oder Einstellungen benutzen. &lt;br /&gt;
&lt;br /&gt;
=== RAM ===&lt;br /&gt;
&lt;br /&gt;
Das [[Speicher#RAM |&#039;&#039;&#039;RAM&#039;&#039;&#039;]] ist ein flüchtiger Speicher, d.h. die Daten gehen nach dem Ausschalten verloren. Es kann beliebig oft gelesen und beschrieben werden, weshalb es sich zur Speicherung von Variablen eignet, für die die Register R0-R31 nicht ausreichen. Daneben dient es als Speicherort für den Stack, auf dem z.&amp;amp;nbsp;B. bei Unterprogrammaufrufen (rcall) die Rücksprungadresse gespeichert wird (siehe [[AVR-Tutorial:_SRAM | AVR-Tutorial: SRAM]]).&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
=== Flash-ROM ===&lt;br /&gt;
&lt;br /&gt;
Die erste und wichtigste Anwendung des Flash-ROMs kennen wir bereits: Das Speichern von Programmen, die wir nach dem Assemblieren dort hineingeladen haben. Nun sollen aber auch vom laufenden Programm aus Daten ausgelesen werden. &lt;br /&gt;
&lt;br /&gt;
Um die Daten wieder auszulesen, muss man die Adresse, auf die zugegriffen werden soll, in den &#039;&#039;&#039;Z-Pointer&#039;&#039;&#039; laden. Der Z-Pointer besteht aus den Registern &#039;&#039;&#039;R30&#039;&#039;&#039; (Low-Byte) und &#039;&#039;&#039;R31&#039;&#039;&#039; (High-Byte), daher kann man das Laden einer Konstante wie gewohnt mit dem Befehl &#039;&#039;&#039;ldi&#039;&#039;&#039; durchführen. Statt R30 und R31 kann man übrigens einfach &#039;&#039;&#039;ZL&#039;&#039;&#039; und &#039;&#039;&#039;ZH&#039;&#039;&#039; schreiben, da diese Synonyme bereits in der include-Datei m8def.inc definiert sind. &lt;br /&gt;
&lt;br /&gt;
Wenn die richtige Adresse erstmal im Z-Pointer steht, geht das eigentliche Laden der Daten ganz einfach mit dem Befehl &#039;&#039;&#039;lpm&#039;&#039;&#039;. Dieser Befehl, der im Gegensatz zu out, ldi usw. keine Operanden hat, veranlasst das Laden des durch den Z-Pointer adressierten Bytes aus dem Programmspeicher in das Register &#039;&#039;&#039;R0&#039;&#039;&#039;, von wo aus man es weiterverarbeiten kann. &lt;br /&gt;
&lt;br /&gt;
Jetzt muss man nur noch wissen, wie man dem Assembler überhaupt beibringt, dass er die von uns festgelegten Daten im ROM platzieren soll, und wie man dann an die Adresse kommt, an der sich diese Daten befinden. Um den Programmspeicher mit Daten zu füllen, gibt es die Direktiven .db und .dw. In der Regel benötigt man nur .db, was folgendermaßen funktioniert: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
daten:&lt;br /&gt;
    .db 12, 20, 255, 0xFF, 0b10010000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Direktiven wie .db sind Anweisungen an den Assembler, keine Prozessorbefehle. Von denen kann man sie durch den vorangestellten Punkt unterscheiden. In diesem Fall sagen wir dem Assembler, dass er die angegebenen Bytes nacheinander im Speicher platzieren soll; wenn man die Zeile also assembliert, erhält man eine Hex-Datei, die nur diese Daten enthält.&lt;br /&gt;
&lt;br /&gt;
Aber was soll das &#039;&#039;&#039;daten:&#039;&#039;&#039; am Anfang der Zeile? Bis jetzt haben wir Labels nur als Sprungmarken verwendet, um den Befehlen &#039;&#039;&#039;rcall&#039;&#039;&#039; und &#039;&#039;&#039;rjmp&#039;&#039;&#039; zu sagen, an welche Stelle im Programm gesprungen werden soll. Würden wir in diesem Fall &#039;&#039;&#039;rjmp daten&#039;&#039;&#039; im Programm stehen haben, dann würde die Programmausführung zur Stelle &#039;&#039;&#039;daten:&#039;&#039;&#039; springen und versuchen, die sinnlosen Daten als Befehle zu interpretieren - was mit Sicherheit dazu führt, dass der Controller Amok läuft. &lt;br /&gt;
&lt;br /&gt;
Statt nach &#039;&#039;&#039;daten:&#039;&#039;&#039; zu springen, sollten wir die Adresse besser in den Z-Pointer laden. Da der Z-Pointer aus zwei Bytes besteht, brauchen wir dazu zweimal den Befehl &#039;&#039;&#039;ldi&#039;&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
    ldi ZL, LOW(daten*2)    ; Low-Byte der Adresse in Z-Pointer&lt;br /&gt;
    ldi ZH, HIGH(daten*2)   ; High-Byte der Adresse in Z-Pointer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, ist das Ganze sehr einfach: Man kann die Labels im Assembler direkt wie Konstanten verwenden. Über die Multiplikation der Adresse mit zwei sollte man sich erst mal keine Gedanken machen: &amp;quot;Das ist einfach so.&amp;quot; Wer es genauer wissen will schaut [[AVR-Tutorial:_Mehrfachverzweigung#Z-Pointer_leicht_verst.C3.A4ndlich | hier]] nach.&lt;br /&gt;
&lt;br /&gt;
Um zu zeigen, wie das alles konkret funktioniert, ist das folgende Beispiel nützlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ldi     R16, 0xFF&lt;br /&gt;
    out     DDRB, R16               ; Port B: Ausgang&lt;br /&gt;
&lt;br /&gt;
    ldi     ZL, LOW(daten*2)        ; Low-Byte der Adresse in Z-Pointer&lt;br /&gt;
    ldi     ZH, HIGH(daten*2)       ; High-Byte der Adresse in Z-Pointer&lt;br /&gt;
&lt;br /&gt;
    lpm                             ; durch Z-Pointer adressiertes Byte&lt;br /&gt;
                                    ; in R0 laden&lt;br /&gt;
    out     PORTB, R0               ; an PORTB ausgeben&lt;br /&gt;
&lt;br /&gt;
ende:   &lt;br /&gt;
    rjmp ende                       ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
daten:&lt;br /&gt;
    .db 0b10101010&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dieses Programm assembliert und in den Controller überträgt, dann kann man auf den an Port B angeschlossenen LEDs das mit &#039;&#039;&#039;.db 0b10101010&#039;&#039;&#039; im Programmspeicher abgelegte Bitmuster sehen. &lt;br /&gt;
&lt;br /&gt;
==== Fallbeispiel: Zeichenketten ====&lt;br /&gt;
Eine häufige Anwendung von &#039;&#039;&#039;lpm&#039;&#039;&#039; ist das Auslesen von Zeichenketten (&amp;quot;Strings&amp;quot;) aus dem Flash-ROM und die Ausgabe an den seriellen Port oder ein LCD. Das folgende Programm gibt in einer Endlosschleife den Text &amp;quot;AVR-Assembler ist ganz einfach&amp;quot;, gefolgt von einem Zeilenumbruch, an den UART aus. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
.def temp1 = r17&lt;br /&gt;
&lt;br /&gt;
.equ CLOCK = 4000000                ; Frequenz des Quarzes&lt;br /&gt;
.equ BAUD = 9600                    ; Baudrate&lt;br /&gt;
.equ UBRRVAL = CLOCK/(BAUD*16)-1    ; Baudratenteiler&lt;br /&gt;
 &lt;br /&gt;
; hier geht das Programmsegment los&lt;br /&gt;
&lt;br /&gt;
.CSEG &lt;br /&gt;
.org 0&lt;br /&gt;
    ldi     temp, low(RAMEND)            ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, temp                    &lt;br /&gt;
    ldi     temp, high(RAMEND)&lt;br /&gt;
    out     SPH, temp                    &lt;br /&gt;
&lt;br /&gt;
    ldi     temp, LOW(UBRRVAL)          ; Baudrate einstellen&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
    ldi     temp, HIGH(UBRRVAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
                                    &lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0) ; Frame-Format: 8 Bit&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
    sbi     UCSRB, TXEN                 ; TX (Senden) aktivieren&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    ldi     ZL, LOW(text*2)             ; Adresse des Strings in den&lt;br /&gt;
    ldi     ZH, HIGH(text*2)            ; Z-Pointer laden&lt;br /&gt;
    rcall   print                       ; Funktion print aufrufen&lt;br /&gt;
    rcall   wait                        ; kleine Pause&lt;br /&gt;
    rjmp    loop                        ; das Ganze wiederholen&lt;br /&gt;
&lt;br /&gt;
; kleine Pause&lt;br /&gt;
wait:&lt;br /&gt;
    ldi     temp,0&lt;br /&gt;
wait_1:&lt;br /&gt;
    ldi     temp1,0&lt;br /&gt;
wait_2:&lt;br /&gt;
    dec     temp1&lt;br /&gt;
    brne    wait_2&lt;br /&gt;
    dec     temp&lt;br /&gt;
    brne    wait_1&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; print: sendet die durch den Z-Pointer adressierte Zeichenkette&lt;br /&gt;
&lt;br /&gt;
print:&lt;br /&gt;
    lpm                                 ; Erstes Byte des Strings nach R0 lesen&lt;br /&gt;
    tst     R0                          ; R0 auf 0 testen&lt;br /&gt;
    breq    print_end                   ; wenn 0, dann zu print_end&lt;br /&gt;
    mov     temp, r0                     ; Inhalt von R0 nach R16 kopieren&lt;br /&gt;
    rcall   sendbyte                    ; UART-Sendefunktion aufrufen&lt;br /&gt;
    adiw    ZL, 1                       ; Adresse des Z-Pointers um 1 erhöhen&lt;br /&gt;
    rjmp    print                       ; wieder zum Anfang springen&lt;br /&gt;
print_end:&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; sendbyte: sendet das Byte aus temp über das UART&lt;br /&gt;
&lt;br /&gt;
sendbyte:&lt;br /&gt;
    sbis    UCSRA, UDRE                 ; warten bis das UART bereit ist&lt;br /&gt;
    rjmp    sendbyte&lt;br /&gt;
    out     UDR, temp&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; Konstanten werden hier im Flash abgelegt&lt;br /&gt;
&lt;br /&gt;
text:&lt;br /&gt;
    .db &amp;quot;AVR-Assembler ist ganz einfach&amp;quot;,10,13,0 &lt;br /&gt;
    ; Stringkonstante, durch eine 0 abgeschlossen&lt;br /&gt;
    ; die 10 bzw. 13 sind Steuerzeichen für Wagenrücklauf und neue Zeile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neuere AVR-Controller besitzen einen erweiterten Befehlssatz. Darunter befindet sich auch der folgende Befehl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
    lpm     r16, Z+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl liest ein Byte aus dem Flash und speichert es in einem beliebigen Register, hier r16. Danach wird der Zeiger Z um eins erhöht. Für die neuen Controller wie ATmegas kann das Codebeispiel also so abgeändert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
; print: sendet die durch den Z-Pointer adressierte Zeichenkette&lt;br /&gt;
print:&lt;br /&gt;
    lpm     temp, Z+         ; Erstes Byte des Strings nach temp lesen&lt;br /&gt;
    tst     temp             ; temp auf 0 testen&lt;br /&gt;
    breq    print_end       ; wenn 0, dann zu print_end&lt;br /&gt;
    rcall   sendbyte        ; UART-Sendefunktion aufrufen&lt;br /&gt;
    rjmp    print           ; wieder zum Anfang springen&lt;br /&gt;
print_end:&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man bei .db einen Text in doppelten Anführungszeichen angibt, werden die Zeichen automatisch in die entsprechenden ASCII-Codes umgerechnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
    .db     &amp;quot;Test&amp;quot;, 0               &lt;br /&gt;
    ; ist äquivalent zu&lt;br /&gt;
    .db     84, 101, 115, 116, 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit das Programm das Ende der Zeichenkette erkennen kann, wird eine 0 an den Text angehängt. &lt;br /&gt;
&lt;br /&gt;
Das ist doch schonmal sehr viel praktischer, als jeden Buchstaben einzeln in ein Register zu laden und abzuschicken. Und wenn man statt &#039;&#039;&#039;sendbyte&#039;&#039;&#039; einfach die Routine &#039;&#039;&#039;lcd_data&#039;&#039;&#039; aus dem 4. Teil des Tutorials aufruft, dann funktioniert das gleiche sogar mit dem LCD!&lt;br /&gt;
&lt;br /&gt;
==== Neue Assemblerbefehle ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
    lpm                             ; Liest das durch den Z-Pointer&lt;br /&gt;
                                    ; addressierte Byte aus dem Flash-ROM&lt;br /&gt;
                                    ; in das Register R0 ein. &lt;br /&gt;
&lt;br /&gt;
    lpm     [Register], Z           ; Macht das gleiche wie lpm, jedoch in&lt;br /&gt;
                                    ; ein beliebiges Register&lt;br /&gt;
&lt;br /&gt;
    lpm     [Register], Z+          ; Erhöht zusätzlich den Z-Zeiger&lt;br /&gt;
&lt;br /&gt;
    tst     [Register]              ; Prüft, ob Inhalt eines Registers&lt;br /&gt;
                                    ; gleich 0 ist.&lt;br /&gt;
&lt;br /&gt;
    breq    [Label]                 ; Springt zu [Label], wenn der&lt;br /&gt;
                                    ; vorhergehende Vergleich wahr ist. &lt;br /&gt;
&lt;br /&gt;
    adiw    [Register], [Konstante] ; Addiert eine Konstante zu einem&lt;br /&gt;
                                    ; Registerpaar. [Register] bezeichnet das&lt;br /&gt;
                                    ; untere der beiden Register.&lt;br /&gt;
                                    ; Kann nur auf die Registerpaare&lt;br /&gt;
                                    ; R25:R24, R27:R26, R29:R28 und R31:R30&lt;br /&gt;
                                    ; angewendet werden. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
&lt;br /&gt;
Den Flash Speicher kann man also benutzen, um dort Daten abzulegen, die sich während eines Programmlaufs nicht verändern. Irgendwelche Tabellen oder konstante Texte. Aber des öfteren möchte man auch die Möglichkeit haben, Daten zu speichern und wieder zu lesen, die sich während des Programmlaufs ändern. Ganz besonders möchte man eine Speicherfläche zur Verfügung haben, die ihren Inhalt auch dann behält, wenn dem µC die Versorgungsspannung abgedreht wird. Man denke z.B. an irgendwelche Konfigurationsdaten oder an Informationen, wie weit der µC in der Bearbeitung von Daten vorangekommen ist oder irgendwelche Statistikdaten, die auch nach einem Stromausfall noch verfügbar sein sollen. In solchen Fällen kommt das EEPROM zum Einsatz&lt;br /&gt;
&lt;br /&gt;
==== Lesen ====&lt;br /&gt;
&lt;br /&gt;
Als erstes muss geprüft werden, ob ein vorheriger Schreibzugriff schon abgeschlossen ist. Danach wird die EEPROM-Adresse von der gelesen werden soll in das IO-Registerpaar &#039;&#039;&#039;EEARH/EEARL&#039;&#039;&#039; (EEPROM Address Register) geladen. Da der ATmega8 mehr als 256 Byte EEPROM hat, passt die Adresse nicht in ein einziges 8-Bit-Register, sondern muss in zwei Register aufgeteilt werden: EEARH bekommt das obere Byte der Adresse, EEARL das untere Byte. Dann löst man den Lesevorgang durch das Setzen des Bits &#039;&#039;&#039;EERE&#039;&#039;&#039; (EEPROM Read Enable) im IO-Register &#039;&#039;&#039;EECR&#039;&#039;&#039; (EEPROM Control Register) aus. Das gelesene Byte kann sofort aus dem IO-Register &#039;&#039;&#039;EEDR&#039;&#039;&#039; (EEPROM Data Register) in ein normales CPU-Register kopiert und dort weiterverarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Wie auch das Flash-ROM kann man das EEPROM über den ISP-Programmer programmieren. Die Daten, die im EEPROM abgelegt werden sollen, werden wie gewohnt mit .db angegeben; allerdings muss man dem Assembler natürlich sagen, dass es sich hier um Daten für das EEPROM handelt. Das macht man durch die Direktive &#039;&#039;&#039;.eseg&#039;&#039;&#039;, woran der Assembler erkennt, dass alle nun folgenden Daten für das EEPROM bestimmt sind. &lt;br /&gt;
&lt;br /&gt;
Damit man die Bytes nicht von Hand abzählen muss um die Adresse herauszufinden, kann man auch im EEPROM-Segment wieder Labels einsetzen und diese im Assemblerprogramm wie Konstanten verwenden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; hier geht die Programmsektion los&lt;br /&gt;
.cseg&lt;br /&gt;
&lt;br /&gt;
    ldi     r16, low(RAMEND)            ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, r16                    &lt;br /&gt;
    ldi     r16, high(RAMEND)&lt;br /&gt;
    out     SPH, r16                    &lt;br /&gt;
&lt;br /&gt;
    ldi     r16, 0xFF&lt;br /&gt;
    out     DDRB, r16                   ; Port B Ausgang&lt;br /&gt;
&lt;br /&gt;
    ldi     ZL,low(daten)               ; Z-Zeiger laden&lt;br /&gt;
    ldi     ZH,high(daten)&lt;br /&gt;
    rcall   EEPROM_read                 ; Daten aus EEPROM lesen&lt;br /&gt;
    out     PORTB, r16&lt;br /&gt;
&lt;br /&gt;
loop:   &lt;br /&gt;
    rjmp loop&lt;br /&gt;
&lt;br /&gt;
EEPROM_read:&lt;br /&gt;
    sbic    EECR,EEWE                   ; prüfe ob der vorherige Schreibzugriff&lt;br /&gt;
                                        ; beendet ist&lt;br /&gt;
    rjmp    EEPROM_read                 ; nein, nochmal prüfen&lt;br /&gt;
&lt;br /&gt;
    out     EEARH, ZH                   ; Adresse laden&lt;br /&gt;
    out     EEARL, ZL    &lt;br /&gt;
    sbi     EECR, EERE                  ; Lesevorgang aktivieren&lt;br /&gt;
    in      r16, EEDR                   ; Daten in CPU Register kopieren&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; Daten im EEPROM definieren&lt;br /&gt;
.eseg&lt;br /&gt;
daten:&lt;br /&gt;
    .db     0b10101010&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dieses Programm assembliert, erhält man außer der .hex-Datei noch eine Datei mit der Endung &#039;&#039;&#039;.eep&#039;&#039;&#039;. Diese Datei enthält die Daten aus dem EEPROM-Segment (.eseg), und muss zusätzlich zu der hex-Datei in den Controller programmiert werden. &lt;br /&gt;
&lt;br /&gt;
Das Programm gibt die Binärzahl 0b10101010 an den Port B aus, das heißt jetzt sollte jede zweite LED leuchten.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man auch aus dem EEPROM Strings lesen und an den UART senden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
.equ CLOCK = 4000000                ; Frequenz des Quarzes&lt;br /&gt;
&lt;br /&gt;
.equ BAUD = 9600                    ; Baudrate&lt;br /&gt;
.equ UBRRVAL = CLOCK/(BAUD*16)-1    ; Baudratenteiler&lt;br /&gt;
 &lt;br /&gt;
; hier geht das Programmsegment los&lt;br /&gt;
&lt;br /&gt;
.CSEG &lt;br /&gt;
 &lt;br /&gt;
; Hauptprogramm&lt;br /&gt;
main:&lt;br /&gt;
    ldi     temp, LOW(RAMEND)           ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
                          &lt;br /&gt;
    ldi     temp, LOW(UBRRVAL)          ; Baudrate einstellen&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
    ldi     temp, HIGH(UBRRVAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
                                    &lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0) ; Frame-Format: 8 Bit&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
    sbi     UCSRB, TXEN                 ; TX (Senden) aktivieren&lt;br /&gt;
 &lt;br /&gt;
    ldi     ZL, low(text1)              ; ersten String senden&lt;br /&gt;
    ldi     ZH, high(text1)             ; Z-Pointer laden&lt;br /&gt;
    rcall   EEPROM_print&lt;br /&gt;
    &lt;br /&gt;
    ldi     ZL, low(text2)              ; zweiten String senden&lt;br /&gt;
    ldi     ZH, high(text2)             ; Z-Pointer laden&lt;br /&gt;
    rcall   EEPROM_print&lt;br /&gt;
&lt;br /&gt;
loop:   &lt;br /&gt;
    rjmp    loop                        ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; EEPROM Lesezugriff auf Strings + UART Ausgabe&lt;br /&gt;
&lt;br /&gt;
EEPROM_print:&lt;br /&gt;
    sbic    EECR,EEWE           ; prüf ob der vorherige Schreibzugriff&lt;br /&gt;
                                ; beendet ist&lt;br /&gt;
    rjmp    EEPROM_print        ; nein, nochmal prüfen&lt;br /&gt;
&lt;br /&gt;
    out     EEARH, ZH           ; Adresse laden&lt;br /&gt;
    out     EEARL, ZL&lt;br /&gt;
    &lt;br /&gt;
    sbi     EECR, EERE          ; Lesevorgang aktivieren&lt;br /&gt;
    in      temp, EEDR          ; Daten in CPU Register kopieren&lt;br /&gt;
    tst     temp                ; auf 0 testen (=Stringende)&lt;br /&gt;
    breq    eep_print_end       ; falls 0, Funktion beenden&lt;br /&gt;
    rcall   sendbyte            ; ansonsten Byte senden...&lt;br /&gt;
    adiw    ZL,1                ; Adresse um 1 erhöhen...&lt;br /&gt;
    rjmp    EEPROM_print        ; und zum Anfang der Funktion&lt;br /&gt;
eep_print_end:&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; sendbyte: sendet das Byte aus &amp;quot;data&amp;quot; über den UART&lt;br /&gt;
&lt;br /&gt;
sendbyte:&lt;br /&gt;
    sbis    UCSRA, UDRE         ; warten bis das UART bereit ist&lt;br /&gt;
    rjmp    sendbyte&lt;br /&gt;
    out     UDR, temp&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; hier wird der EEPROM-Inhalt definiert&lt;br /&gt;
&lt;br /&gt;
.ESEG&lt;br /&gt;
&lt;br /&gt;
text1:&lt;br /&gt;
    .db     &amp;quot;Strings funktionieren auch &amp;quot;, 0&lt;br /&gt;
text2:&lt;br /&gt;
    .db     &amp;quot;im EEPROM&amp;quot;,10,13, 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Schreiben ====&lt;br /&gt;
&lt;br /&gt;
Als erstes muss geprüft werden, ob ein vorheriger Schreibzugriff schon abgeschlossen ist. Danach wird die EEPROM-Adresse, auf die geschrieben wird, in das IO-Register &#039;&#039;&#039;EEAR&#039;&#039;&#039; (&#039;&#039;&#039;EE&#039;&#039;&#039;PROM &#039;&#039;&#039;A&#039;&#039;&#039;ddress &#039;&#039;&#039;R&#039;&#039;&#039;egister) geladen. Dann schreibt man die Daten, welche man auf der im Adressregister abgespeicherten Position ablegen will ins Register &#039;&#039;&#039;EEDR&#039;&#039;&#039; (&#039;&#039;&#039;EE&#039;&#039;&#039;PROM &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister). Als nächstes setzt man das &#039;&#039;&#039;EEMWE&#039;&#039;&#039; Bit im EEPROM-Kontrollregister &#039;&#039;&#039;EECR&#039;&#039;&#039; (&#039;&#039;&#039;EE&#039;&#039;&#039;PROM &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister) um den Schreibvorgang vorzubereiten. Nun wird es zeitkritisch - es darf nun keinesfalls ein Interrupt dazwischenfahren - denn man muss innerhalb von 4 Taktzyklen das &#039;&#039;&#039;EEWE&#039;&#039;&#039; Bit setzen um den Schreibvorgang auszulösen. Um das unter allen Bedingungen sicherzustellen werden die Interrupts kurz gesperrt. Danach startet der Schreibvorgang und läuft automatisch ab. Wenn er beendet ist, wird von der Hardware das &#039;&#039;&#039;EEWE&#039;&#039;&#039; Bit im Register &#039;&#039;&#039;EECR&#039;&#039;&#039; wieder gelöscht.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel werden Zeichen per UART und Interrupt empfangen und nacheinander im EEPROM gespeichert. Per Terminalprogramm kann man nun bis zu 512 Zeichen in den EEPROM schreiben. Per Programmieradapter kann man denn EEPROM wieder auslesen und seine gespeicherten Daten anschauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp      = r16&lt;br /&gt;
.def sreg_save = r17&lt;br /&gt;
&lt;br /&gt;
.equ CLOCK = 4000000&lt;br /&gt;
&lt;br /&gt;
.equ BAUD = 9600&lt;br /&gt;
.equ UBRRVAL = CLOCK/(BAUD*16)-1&lt;br /&gt;
 &lt;br /&gt;
; hier geht das Programmsegment los&lt;br /&gt;
&lt;br /&gt;
.CSEG&lt;br /&gt;
.org 0x00&lt;br /&gt;
    rjmp    main&lt;br /&gt;
 &lt;br /&gt;
.org URXCaddr&lt;br /&gt;
    rjmp    int_rxc&lt;br /&gt;
 &lt;br /&gt;
; Hauptprogramm&lt;br /&gt;
main:&lt;br /&gt;
    ldi     temp, LOW(RAMEND)           ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
                          &lt;br /&gt;
    ldi     temp, LOW(UBRRVAL)          ; Baudrate einstellen&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
    ldi     temp, HIGH(UBRRVAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
 &lt;br /&gt;
                                   &lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0) ; Frame-Format: 8 Bit&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
 &lt;br /&gt;
    sbi     UCSRB, RXCIE                ; Interrupt bei Empfang&lt;br /&gt;
    sbi     UCSRB, RXEN                 ; RX (Empfang) aktivieren&lt;br /&gt;
&lt;br /&gt;
    ldi     ZL,low(daten)               ; der Z-Zeiger wird hier exclusiv&lt;br /&gt;
    ldi     ZH,high(daten)              ; für die Datenadressierung verwendet&lt;br /&gt;
    &lt;br /&gt;
    sei                                 ; Interrupts global aktivieren&lt;br /&gt;
    &lt;br /&gt;
loop:   &lt;br /&gt;
    rjmp    loop                        ; Endlosschleife (ABER Interrupts!)&lt;br /&gt;
        &lt;br /&gt;
; Interruptroutine wird ausgeführt,&lt;br /&gt;
; sobald ein Byte über den UART empfangen wurde&lt;br /&gt;
&lt;br /&gt;
int_rxc:&lt;br /&gt;
    push    temp                        ; temp auf dem Stack sichern&lt;br /&gt;
    in      temp,sreg                   ; SREG sicher, muss praktisch in jeder&lt;br /&gt;
                                        ; Interruptroutine gemacht werden&lt;br /&gt;
    push    temp&lt;br /&gt;
    &lt;br /&gt;
    in      temp, UDR                   ; empfangenes Byte lesen&lt;br /&gt;
    rcall   EEPROM_write                ; Byte im EEPROM speichern&lt;br /&gt;
    adiw    ZL,1                        ; Zeiger erhöhen&lt;br /&gt;
    cpi     ZL,low(EEPROMEND+1)         ; Vergleiche den Z Zeiger&lt;br /&gt;
    ldi     temp,high(EEPROMEND+1)      ; mit der maximalen EEPROM Adresse +1&lt;br /&gt;
    cpc     ZH,temp&lt;br /&gt;
    brne    int_rxc_1                   ; wenn ungleich, springen&lt;br /&gt;
    ldi     ZL,low(Daten)               ; wenn gleich, Zeiger zurücksetzen&lt;br /&gt;
    ldi     ZH,high(Daten)&lt;br /&gt;
int_rxc_1:&lt;br /&gt;
&lt;br /&gt;
    pop     temp&lt;br /&gt;
    out     sreg,temp&lt;br /&gt;
    pop     temp                        ; temp wiederherstellen&lt;br /&gt;
    reti&lt;br /&gt;
&lt;br /&gt;
; der eigentliche EEPROM Schreibzugriff&lt;br /&gt;
; Adresse in ZL/ZH&lt;br /&gt;
; Daten in temp&lt;br /&gt;
&lt;br /&gt;
EEPROM_write:&lt;br /&gt;
    sbic    EECR, EEWE                  ; prüfe ob der letzte Schreibvorgang beendet ist&lt;br /&gt;
    rjmp    EEPROM_write                ; wenn nein, nochmal prüfen&lt;br /&gt;
&lt;br /&gt;
    out     EEARH, ZH                   ; Adresse schreiben&lt;br /&gt;
    out     EEARL, ZL                   ; &lt;br /&gt;
    out     EEDR,temp                   ; Daten  schreiben&lt;br /&gt;
    in      sreg_save,sreg              ; SREG sichern&lt;br /&gt;
    cli                                 ; Interrupts sperren, die nächsten&lt;br /&gt;
                                        ; zwei Befehle dürfen NICHT&lt;br /&gt;
                                        ; unterbrochen werden&lt;br /&gt;
    sbi     EECR,EEMWE                  ; Schreiben vorbereiten&lt;br /&gt;
    sbi     EECR,EEWE                   ; Und los !&lt;br /&gt;
    out     sreg, sreg_save             ; SREG wieder herstellen&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; hier wird der EEPROM-Inhalt definiert&lt;br /&gt;
.ESEG&lt;br /&gt;
&lt;br /&gt;
Daten:  &lt;br /&gt;
    .db     0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SRAM ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung des SRAM wird in einem anderen Kapitel erklärt: [[AVR-Tutorial: SRAM]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Adressierung]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=UART|&lt;br /&gt;
zurücklink=AVR-Tutorial: UART|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=Timer|&lt;br /&gt;
vorlink=AVR-Tutorial: Timer}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Speicher]]&lt;br /&gt;
[[Kategorie:Speicher und Dateisysteme]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_UART&amp;diff=94222</id>
		<title>AVR-Tutorial: UART</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_UART&amp;diff=94222"/>
		<updated>2016-10-30T20:15:51Z</updated>

		<summary type="html">&lt;p&gt;Alesi: /* Falsche Reihenfolge der Operanden bei adiw Befehl in Routine serout_string_wait korrigiert (s. Atmel Instruction Set Manual S. 17) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie viele andere Controller besitzen die meisten AVRs einen &#039;&#039;&#039;[[UART]]&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;A&#039;&#039;&#039;synchronous &#039;&#039;&#039;R&#039;&#039;&#039;eceiver and &#039;&#039;&#039;T&#039;&#039;&#039;ransmitter). Das ist eine serielle Schnittstelle, die meistens zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur Übertragung werden zwei Pins am Controller benötigt: &#039;&#039;&#039;TXD&#039;&#039;&#039; und &#039;&#039;&#039;RXD&#039;&#039;&#039;. Über &#039;&#039;&#039;TXD&#039;&#039;&#039; (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, &#039;&#039;&#039;RXD&#039;&#039;&#039; (&amp;quot;Receive Data&amp;quot;) dient zum Empfang von Daten.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Um den UART des Mikrocontrollers zu verwenden, muss der Versuchsaufbau um folgende Bauteile erweitert werden: &lt;br /&gt;
&lt;br /&gt;
[[Bild:AVR-RS232.png|framed|right|640px| UART/MAX232 Standardbeschaltung ]]&lt;br /&gt;
&lt;br /&gt;
Auf dem Board vom [http://shop.mikrocontroller.net/ Shop] sind diese Bauteile bereits enthalten, man muss nur noch die Verbindungen zwischen MAX232 (IC2) und AVR herstellen wie im [http://shop.mikrocontroller.net/images/avrplat28-app.jpg Bild] zu sehen.&lt;br /&gt;
&lt;br /&gt;
* Der MAX232 ist ein [[Pegelwandler]], der die -12V/+12V Signale an der seriellen Schnittstelle des PCs zu den 5V/0V des AVRs kompatibel macht.&lt;br /&gt;
* C1 ist ein kleiner Elektrolyt-, Tantal- oder Keramikkondensator, wie er immer wieder zur Entkopplung der Versorgungsspannungen an digitalen ICs verwendet wird. &lt;br /&gt;
* Die vier Kondensatoren C2..C5 sind Elektrolyt-, Tantal- oder Keramikkondensatoren. Falls Elkos oder Tantals verwendet werden, auf die richtige Polung achten! Der exakte Wert ist hier relativ unkritisch, in der Praxis sollte alles von ca. 1µF bis 47µF mit einer Spannungsfestigkeit von 16V und höher funktionieren.&lt;br /&gt;
* X1 ist ein weiblicher 9-poliger SUB-D-Verbinder.&lt;br /&gt;
* Die Verbindung zwischen PC und Mikrocontroller erfolgt über ein 9-poliges Modem-Kabel (also ein &#039;&#039;Verlängerungskabel&#039;&#039;, &#039;&#039;&#039;kein [http://de.wikipedia.org/wiki/Nullmodem-Kabel Nullmodem]-Kabel!)&#039;&#039;&#039;, das an den seriellen Port des PCs angeschlossen wird. Bei einem Modem-Kabel sind die Pins 2 und 3 des einen Kabelendes mit den Pins 2 und 3 des anderen Kabelendes durchverbunden. Bei einem Nullmodem-Kabel sind die Leitungen gekreuzt, sodass Pin 2 von der einen Seite mit Pin 3 auf der anderen Seite verbunden ist und umgekehrt.&lt;br /&gt;
* Als Faustregel kann man annehmen: Befinden sich an den beiden Enden des Kabels die gleiche Art von Anschlüssen (Männchen = Stecker; Weibchen = Buchse), dann benötigt man ein gekreuztes, also ein Nullmodem-Kabel. Am PC-Anschluss selbst befindet sich ein Stecker, also ein Männchen, sodaß am Kabel auf dieser Seite eine Buchse (also ein Weibchen) sitzen muss. Da am AVR laut obigem Schaltbild eine Buchse verbaut wird, muss daher an diesem Ende des Kabels ein Stecker sitzen. Das Kabel hat daher an einem Ende einen Stecker und am anderen Ende eine Buchse und ist daher ein normales Modem-Kabel ( = nicht gekreuzt).&lt;br /&gt;
&lt;br /&gt;
[[Bild:USART_Kabel.gif|framed|center| Kabelbeschaltungen]]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== UART konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
Als erstes muss die gewünschte Baudrate im Register &#039;&#039;&#039;UBRR&#039;&#039;&#039; festgelegt werden. Der in dieses Register zu schreibende Wert errechnet sich nach der folgenden Formel: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\text{UBRR} = \frac {\text{Taktfrequenz (in Hz)}} { 16 \cdot \text{Baudrate} } - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim AT90S4433 kann man den Wert direkt in das Register &#039;&#039;&#039;UBRR&#039;&#039;&#039; laden, beim ATmega8 gibt es für &#039;&#039;&#039;UBRR&#039;&#039;&#039; zwei Register: &#039;&#039;&#039;UBRRL&#039;&#039;&#039; (Low-Byte) und &#039;&#039;&#039;UBRRH&#039;&#039;&#039; (High-Byte). Bei Baudraten über etwa 3900 Bit/s (gilt nur bei Verwendung eines Takts von 16 MHz) steht in &#039;&#039;&#039;UBRRH&#039;&#039;&#039; 0, da der berechnete Wert kleiner als 256 ist und somit in &#039;&#039;&#039;UBRRL&#039;&#039;&#039; alleine passt. Beachtet werden muss, dass das Register &#039;&#039;&#039;UBRRH&#039;&#039;&#039; vor dem Register &#039;&#039;&#039;UBRRL&#039;&#039;&#039; beschrieben werden muss. Der Schreibzugriff auf &#039;&#039;&#039;UBRRL&#039;&#039;&#039; löst das Neusetzen des internen Taktteilers aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000;&amp;quot;&amp;gt;&#039;&#039;&#039;WICHTIGER HINWEIS 1&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich statt der oben genannten Formel, die Formel der Codebeispiele zu verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\text{UBRR} = \frac{\text{Taktfrequenz (in Hz)} + (\text{Baudrate} \cdot 8)}{(\text{Baudrate} \cdot 16)}-1 \quad \left( = \frac{ \text{Taktfrequenz (in Hz)} }{ 16 \cdot \text{Baudrate} } -0.5 \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Beispiel:&amp;lt;/b&amp;gt; Bei einem ATMega mit 16MHz und 115200 Baud ist der Wert laut Datenblatt UBBRL=8. Rechnet man mit der Formel UBRRL=(F_CPU / (UART_BAUDRATE* 16L) - 1) ergibt sich ein Wert von 7,680555 und im UBRRL Register steht somit eine &amp;lt;b&amp;gt;7 statt einer 8&amp;lt;/b&amp;gt;. Die Verwendung der Formel aus dem Codebeispiel ergibt 8.180555 und im UBRRL Register steht somit der richtige Wert - nämlich 8&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000;&amp;quot;&amp;gt;&#039;&#039;&#039;WICHTIGER HINWEIS 2&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Grund permanent wiederkehrender Nachfrage sei hier &#039;&#039;&#039;AUSDRÜCKLICH&#039;&#039;&#039; darauf hingewiesen, dass bei Verwendung des UART im asynchronen Modus dringend ein Quarz oder Quarzoszillator verwendet werden sollte! Der interne RC-Oszillator der AVRs ist recht ungenau! Damit kann es in Ausnahmefällen funktionieren, muss es aber nicht! Auch ist der interne Oszillator temperaturempfindlich. Damit hat man dann den schönen Effekt, dass eine UART-Schaltung die im Winter noch funktionierte, im Sommer den Dienst verweigert.&lt;br /&gt;
&lt;br /&gt;
Außerdem muss bei der Berechnung von &#039;&#039;&#039;UBRR&#039;&#039;&#039; geprüft werden, ob mit der verwendeten Taktfrequenz die gewünschte Baudrate mit einem Fehler von &amp;lt;1% generiert werden kann. Das Datenblatt bietet hier sowohl die Formel als auch Tabellen unter der Überschrift des U(S)ART an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \text{Fehler}_{\text{Baudrate}}[%] = \left( \frac{\text{UBRR}_{\text{gerundet}}+1}{\text{UBRR}_{\text{genau}}+1} -1 \right) \cdot 100&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Baudratenquarz]]&lt;br /&gt;
&lt;br /&gt;
Wer es ganz einfach haben will, nimmt die folgenden Macros. Die rechnen sogar den Fehler aus und brechen die Assemblierung ggf. ab. Das ist dann praktisch idiotensicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.equ F_CPU = 4000000                            ; Systemtakt in Hz&lt;br /&gt;
.equ BAUD  = 9600                               ; Baudrate&lt;br /&gt;
&lt;br /&gt;
; Berechnungen&lt;br /&gt;
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden&lt;br /&gt;
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate&lt;br /&gt;
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille&lt;br /&gt;
&lt;br /&gt;
.if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))       ; max. +/-10 Promille Fehler&lt;br /&gt;
  .error &amp;quot;Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!&amp;quot;&lt;br /&gt;
.endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer dennoch den internen RC-Oszillator verwenden will, muss diesen kalibrieren. Näheres findet man dazu im Datenblatt, Stichwort Register OSCCAL.  &lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Um den Sendekanal des UART zu aktivieren, muss das Bit &#039;&#039;&#039;TXEN&#039;&#039;&#039; im UART Control Register &#039;&#039;&#039;UCSRB&#039;&#039;&#039; auf 1 gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Danach kann das zu sendende Byte in das Register &#039;&#039;&#039;UDR&#039;&#039;&#039; eingeschrieben werden - vorher muss jedoch sichergestellt werden, dass das Register leer ist, die vorhergehende Übertragung also schon abgeschlossen wurde. Dazu wird getestet, ob das Bit &#039;&#039;&#039;UDRE&#039;&#039;&#039; (&amp;quot;UART Data Register Empty&amp;quot;) im Register &#039;&#039;&#039;UCSRA&#039;&#039;&#039; auf 1 ist.&lt;br /&gt;
&lt;br /&gt;
Genaueres über die UART-Register findet man im Datenblatt des Controllers.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle sei noch folgendes angemerkt: Das &#039;&#039;&#039;UDRE&#039;&#039;&#039;-Bit sagt nichts darüber aus, ob der Controller immer noch damit beschäftigt ist, Daten zu senden. Da das Senderegister mehrfach gepuffert ist, wird &#039;&#039;&#039;UDRE&#039;&#039;&#039; bereits gesetzt, obwohl das letzte Zeichen den AVR noch nicht komplett verlassen hat. Dies kann insbesondere bei der Verwendung von Sleep-Modes ein Problem werden, wenn der Controller schlafen gelegt wird, bevor das letzte Zeichen versendet wurde, da dies gezwungenermassen zu einem Frame-Error beim Empfänger führen wird. Um sicher zu gehen, dass der UART nicht mehr beschäftigt ist, kann das Bit &#039;&#039;&#039;TXC&#039;&#039;&#039; (&amp;quot;UART Transmit complete&amp;quot;) getestet werden. Dieses wird jedoch wirklich erst nach dem Senden eines Zeichens gesetzt, beinhaltet also auch nach dem Systemstart eine 0, obwohl der Controller nichts sendet.&lt;br /&gt;
&lt;br /&gt;
Der ATmega8 bietet noch viele weitere Optionen zur Konfiguration des UARTs, aber für die Datenübertragung zum PC sind im Normalfall keine anderen Einstellungen notwendig.&lt;br /&gt;
&lt;br /&gt;
=== Senden von Zeichen ===&lt;br /&gt;
&lt;br /&gt;
Das Beispielprogramm überträgt die Zeichenkette &amp;quot;Test!&amp;quot; in einer Endlosschleife an den PC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wenn man das nachfolgende Programm laufen lässt und Hyperterminal startet, scheint es problemlos zu funktionieren. Wenn man aber das RS232 Kabel zwischenzeitlich abzieht und wieder ansteckt wird es oft passieren, dass nur noch wirre Zeichen auf dem PC erscheinen. Das liegt daran, dass der PC aus einem ununterbrochen Zeichenstrom nicht den Anfang eines Zeichens erkennen kann. Darum muss in solchen Fällen periodisch eine kleine Pause von der Länge mindestens eines Zeichens eingelegt werden, damit der PC sich wieder synchronisieren kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele sind für den ATmega8 geschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp    = r16                              ; Register für kleinere Arbeiten&lt;br /&gt;
.def zeichen = r17                              ; in diesem Register wird das Zeichen an die&lt;br /&gt;
                                                ; Ausgabefunktion übergeben&lt;br /&gt;
&lt;br /&gt;
.equ F_CPU = 4000000                            ; Systemtakt in Hz&lt;br /&gt;
.equ BAUD  = 9600                               ; Baudrate&lt;br /&gt;
&lt;br /&gt;
; Berechnungen&lt;br /&gt;
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden&lt;br /&gt;
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate&lt;br /&gt;
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille&lt;br /&gt;
&lt;br /&gt;
.if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))       ; max. +/-10 Promille Fehler&lt;br /&gt;
  .error &amp;quot;Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!&amp;quot;&lt;br /&gt;
.endif&lt;br /&gt;
&lt;br /&gt;
    ; Stackpointer initialisieren&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
    ldi     temp, LOW(RAMEND)&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Baudrate einstellen&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(UBRR_VAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
    ldi     temp, LOW(UBRR_VAL)&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Frame-Format: 8 Bit&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0)&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
&lt;br /&gt;
    sbi     UCSRB,TXEN                  ; TX aktivieren&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    ldi     zeichen, &#039;T&#039;&lt;br /&gt;
    rcall   serout                      ; Unterprogramm aufrufen&lt;br /&gt;
    ldi     zeichen, &#039;e&#039;&lt;br /&gt;
    rcall   serout                      ; Unterprogramm aufrufen&lt;br /&gt;
    ldi     zeichen, &#039;s&#039;&lt;br /&gt;
    rcall   serout                      ; ...&lt;br /&gt;
    ldi     zeichen, &#039;t&#039;&lt;br /&gt;
    rcall   serout&lt;br /&gt;
    ldi     zeichen, &#039;!&#039;&lt;br /&gt;
    rcall   serout&lt;br /&gt;
    ldi     zeichen, 10&lt;br /&gt;
    rcall   serout&lt;br /&gt;
    ldi     zeichen, 13&lt;br /&gt;
    rcall   serout&lt;br /&gt;
    rcall   sync                        &lt;br /&gt;
    rjmp    loop&lt;br /&gt;
&lt;br /&gt;
serout:&lt;br /&gt;
    sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste&lt;br /&gt;
                                        ; Byte bereit ist&lt;br /&gt;
    rjmp    serout&lt;br /&gt;
    out     UDR, zeichen&lt;br /&gt;
    ret                                 ; zurück zum Hauptprogramm&lt;br /&gt;
&lt;br /&gt;
; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich&lt;br /&gt;
; das Kabel getrennt wurde&lt;br /&gt;
                                    &lt;br /&gt;
sync:&lt;br /&gt;
    ldi     r16,0&lt;br /&gt;
sync_1:&lt;br /&gt;
    ldi     r17,0&lt;br /&gt;
sync_loop:&lt;br /&gt;
    dec     r17&lt;br /&gt;
    brne    sync_loop&lt;br /&gt;
    dec     r16&lt;br /&gt;
    brne    sync_1  &lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; argin:1em&amp;quot;&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/images/hyperterminal.gif&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Der Befehl &#039;&#039;&#039;rcall serout&#039;&#039;&#039; ruft ein kleines Unterprogramm auf, das zuerst wartet bis das Datenregister &#039;&#039;&#039;UDR&#039;&#039;&#039; von der vorhergehenden Übertragung frei ist, und anschließend das in zeichen (=r17) gespeicherte Byte an &#039;&#039;&#039;UDR&#039;&#039;&#039; ausgibt. &lt;br /&gt;
&lt;br /&gt;
Bevor &amp;lt;i&amp;gt;serout&amp;lt;/i&amp;gt; aufgerufen wird, wird zeichen jedesmal mit dem ASCII-Code des zu übertragenden Zeichens geladen (so wie in Teil 4 bei der LCD-Ansteuerung). Der Assembler wandelt Zeichen in einfachen Anführungsstrichen automatisch in den entsprechenden ASCII-Wert um. Nach dem Wort &amp;quot;Test!&amp;quot; werden noch die Codes 10 (New Line) und 13 (Carriage Return) gesendet, um dem Terminalprogramm mitzuteilen, dass eine neue Zeile beginnt.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht aller ASCII-Codes gibt es auf [http://www.asciitable.com/ www.asciitable.com].&lt;br /&gt;
&lt;br /&gt;
Die Berechnung der Baudrate wird übrigens nicht im Controller während der Programmausführung durchgeführt, sondern schon beim Assemblieren, wie man beim Betrachten der Listingdatei feststellen kann. &lt;br /&gt;
&lt;br /&gt;
Zum Empfang muss auf dem PC ein Terminal-Programm wie z.&amp;amp;nbsp;B. HyperTerminal gestartet werden. Der folgende Screenshot zeigt, welche Einstellungen im Programm vorgenommen werden müssen: &lt;br /&gt;
&lt;br /&gt;
Linux-Benutzer können das entsprechende Device (z.&amp;amp;nbsp;B. /dev/ttyS0) mit stty konfigurieren und mit cat die empfangenen Daten anzeigen oder ein Terminalprogramm wie minicom nutzen.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann unter Windows und Linux [http://www.der-hammer.info/terminal/ HTerm] genutzt werden. (Freeware)&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
=== Senden von Zeichenketten ===&lt;br /&gt;
&lt;br /&gt;
Eine bequemere Methode um längere Zeichenketten (Strings) zu übertragen ist hier zu sehen. Dabei werden die Zeichenketten im Flash gespeichert. Als Abschluss des Strings wird der Wert 0x00 genutzt, so wie auch in der Programmiersprache C. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp    = r16                              ; Register für kleinere Arbeiten&lt;br /&gt;
.def zeichen = r17                              ; in diesem Register wird das Zeichen an die&lt;br /&gt;
                                                ; Ausgabefunktion übergeben&lt;br /&gt;
&lt;br /&gt;
.equ F_CPU = 4000000                            ; Systemtakt in Hz&lt;br /&gt;
.equ BAUD  = 9600                               ; Baudrate&lt;br /&gt;
&lt;br /&gt;
; Berechnungen&lt;br /&gt;
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden&lt;br /&gt;
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate&lt;br /&gt;
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille&lt;br /&gt;
&lt;br /&gt;
.if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))       ; max. +/-10 Promille Fehler&lt;br /&gt;
  .error &amp;quot;Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!&amp;quot;&lt;br /&gt;
.endif&lt;br /&gt;
&lt;br /&gt;
; hier geht unser Programm los&lt;br /&gt;
&lt;br /&gt;
    ; Stackpointer initialisieren&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
    ldi     temp, LOW(RAMEND)&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Baudrate einstellen&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(UBRR_VAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
    ldi     temp, LOW(UBRR_VAL)&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Frame-Format: 8 Bit&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0)&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
&lt;br /&gt;
    sbi     UCSRB,TXEN                      ; TX aktivieren&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    ldi     zl,low(my_string*2);            ; Z Pointer laden&lt;br /&gt;
    ldi     zh,high(my_string*2);&lt;br /&gt;
    rcall   serout_string&lt;br /&gt;
    rjmp    loop&lt;br /&gt;
&lt;br /&gt;
; Ausgabe eines Strings aus dem Flash&lt;br /&gt;
&lt;br /&gt;
serout_string:&lt;br /&gt;
    lpm                             ; nächstes Byte aus dem Flash laden&lt;br /&gt;
    and     r0,r0                   ; = Null? &lt;br /&gt;
    breq    serout_string_ende      ; wenn ja, -&amp;gt; Ende&lt;br /&gt;
serout_string_wait:&lt;br /&gt;
    sbis    UCSRA,UDRE              ; Warten bis UDR für das nächste&lt;br /&gt;
                                    ; Byte bereit ist&lt;br /&gt;
    rjmp    serout_string_wait&lt;br /&gt;
    out     UDR, r0&lt;br /&gt;
    adiw    zh:zl,1                 ; Zeiger erhöhen&lt;br /&gt;
    rjmp    serout_string           ; nächstes Zeichen bearbeiten&lt;br /&gt;
serout_string_ende:&lt;br /&gt;
    ret                             ; zurück zum Hauptprogramm&lt;br /&gt;
&lt;br /&gt;
; Hier wird jetzt der String definiert und im Flash gespeichert&lt;br /&gt;
&lt;br /&gt;
my_string:  .db &amp;quot;Test!&amp;quot;,10,13,0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfangen von Zeichen per Polling===&lt;br /&gt;
&lt;br /&gt;
Der AVR kann nicht nur Daten seriell senden, sondern auch empfangen. Dazu muss man, nachdem die Baudrate wie oben beschrieben eingestellt wurde, das Bit &#039;&#039;&#039;RXEN&#039;&#039;&#039; setzen. &lt;br /&gt;
&lt;br /&gt;
Sobald der UART ein Byte über die serielle Verbindung empfangen hat, wird das Bit &#039;&#039;&#039;RXC&#039;&#039;&#039; im Register &#039;&#039;&#039;UCSRA&#039;&#039;&#039; gesetzt, um anzuzeigen, dass ein Byte im Register &#039;&#039;&#039;UDR&#039;&#039;&#039; zur Weiterverarbeitung bereitsteht. Sobald es aus &#039;&#039;&#039;UDR&#039;&#039;&#039; gelesen wurde, wird &#039;&#039;&#039;RXC&#039;&#039;&#039; automatisch wieder gelöscht, bis das nächste Byte angekommen ist. &lt;br /&gt;
&lt;br /&gt;
Das erste einfache Testprogramm soll das empfangene Byte auf den an Port D angeschlossenen LEDs ausgeben. Dabei sollte man daran denken, dass PD0 (RXD) bereits für die Datenübertragung zuständig ist, so dass das entsprechende Bit im Register PORTD keine Funktion hat und damit auch nicht für die Datenanzeige verwendet werden kann. &lt;br /&gt;
&lt;br /&gt;
Nachdem der UART konfiguriert ist, wartet das Programm einfach in der Hauptschleife darauf, dass ein Byte über den UART ankommt (z.&amp;amp;nbsp;B. indem man im Terminalprogramm ein Zeichen eingibt), also &#039;&#039;&#039;RXC&#039;&#039;&#039; gesetzt wird. Sobald das passiert, wird das Register &#039;&#039;&#039;UDR&#039;&#039;&#039;, in dem die empfangenen Daten stehen, nach &amp;lt;i&amp;gt;temp&amp;lt;/i&amp;gt; eingelesen und an den Port D ausgegeben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = R16&lt;br /&gt;
&lt;br /&gt;
.equ F_CPU = 4000000                            ; Systemtakt in Hz&lt;br /&gt;
.equ BAUD  = 9600                               ; Baudrate&lt;br /&gt;
&lt;br /&gt;
; Berechnungen&lt;br /&gt;
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden&lt;br /&gt;
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate&lt;br /&gt;
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille&lt;br /&gt;
&lt;br /&gt;
.if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))       ; max. +/-10 Promille Fehler&lt;br /&gt;
  .error &amp;quot;Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!&amp;quot;&lt;br /&gt;
.endif&lt;br /&gt;
&lt;br /&gt;
    ; Stackpointer initialisieren&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
    ldi     temp, LOW(RAMEND)&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Port D = Ausgang&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, 0xFF&lt;br /&gt;
    out     DDRD, temp&lt;br /&gt;
&lt;br /&gt;
    ; Baudrate einstellen&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(UBRR_VAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
    ldi     temp, LOW(UBRR_VAL)&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Frame-Format: 8 Bit&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0)&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
&lt;br /&gt;
    sbi     UCSRB, RXEN                     ; RX (Empfang) aktivieren&lt;br /&gt;
&lt;br /&gt;
receive_loop:&lt;br /&gt;
   sbis     UCSRA, RXC                      ; warten bis ein Byte angekommen ist&lt;br /&gt;
   rjmp     receive_loop&lt;br /&gt;
   in       temp, UDR                       ; empfangenes Byte nach temp kopieren&lt;br /&gt;
   out      PORTD, temp                     ; und an Port D ausgeben.&lt;br /&gt;
   rjmp     receive_loop                    ; zurück zum Hauptprogramm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfangen von Zeichen per Interrupt ===&lt;br /&gt;
&lt;br /&gt;
Dieses Programm lässt sich allerdings noch verfeinern. Statt in der Hauptschleife auf die Daten zu warten, kann man auch veranlassen dass ein Interrupt ausgelöst wird, sobald ein Byte angekommen ist. Das sieht in der einfachsten Form so aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = R16&lt;br /&gt;
&lt;br /&gt;
.equ F_CPU = 4000000                            ; Systemtakt in Hz&lt;br /&gt;
.equ BAUD  = 9600                               ; Baudrate&lt;br /&gt;
&lt;br /&gt;
; Berechnungen&lt;br /&gt;
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden&lt;br /&gt;
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate&lt;br /&gt;
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille&lt;br /&gt;
&lt;br /&gt;
.if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))       ; max. +/-10 Promille Fehler&lt;br /&gt;
  .error &amp;quot;Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!&amp;quot;&lt;br /&gt;
.endif&lt;br /&gt;
&lt;br /&gt;
.org 0x00&lt;br /&gt;
        rjmp main&lt;br /&gt;
&lt;br /&gt;
.org URXCaddr                                   ; Interruptvektor für UART-Empfang&lt;br /&gt;
        rjmp int_rxc&lt;br /&gt;
&lt;br /&gt;
; Hauptprogramm&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
&lt;br /&gt;
    ; Stackpointer initialisieren&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
    ldi     temp, LOW(RAMEND)&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Port D = Ausgang&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, 0xFF&lt;br /&gt;
    out     DDRD, temp&lt;br /&gt;
&lt;br /&gt;
    ; Baudrate einstellen&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(UBRR_VAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
    ldi     temp, LOW(UBRR_VAL)&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Frame-Format: 8 Bit&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0)&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
&lt;br /&gt;
    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang&lt;br /&gt;
    sbi     UCSRB, RXEN                     ; RX (Empfang) aktivieren&lt;br /&gt;
    &lt;br /&gt;
    sei                                     ; Interrupts global aktivieren&lt;br /&gt;
    &lt;br /&gt;
loop:&lt;br /&gt;
    rjmp loop                               ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde&lt;br /&gt;
&lt;br /&gt;
int_rxc:&lt;br /&gt;
    push    temp                            ; temp auf dem Stack sichern&lt;br /&gt;
    in      temp, UDR                       ; empfangenes Byte lesen,&lt;br /&gt;
                                            ; dadurch wird auch der Interrupt gelöscht&lt;br /&gt;
    out     PORTD, temp                     ; Daten ausgeben&lt;br /&gt;
    pop     temp                            ; temp wiederherstellen&lt;br /&gt;
    reti                                    ; Interrupt beenden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode hat den großen Vorteil, dass das Hauptprogramm (hier nur eine leere Endlosschleife) andere Dinge erledigen kann, während der Controller Daten empfängt. Auf diese Weise kann man mehrere Aktionen quasi gleichzeitig ausführen, da das Hauptprogramm nur kurz unterbrochen wird, um die empfangenen Daten zu verarbeiten. &lt;br /&gt;
&lt;br /&gt;
Probleme können allerdings auftreten, wenn in der Interruptroutine die gleichen Register verwendet werden wie im Hauptprogramm, da dieses ja an beliebigen Stellen durch den Interrupt unterbrochen werden kann. Damit sich aus der Sicht der Hauptschleife durch den Interruptaufruf nichts ändert, müssen alle in der Interruptroutine geänderten Register am Anfang der Routine gesichert und am Ende wiederhergestellt werden. Das gilt vor allem für das CPU-Statusregister (&#039;&#039;&#039;SREG&#039;&#039;&#039;)! Sobald ein einziger Befehl im Interrupt ein einziges Bit im SREG beeinflusst, muss das SREG gesichert werden. Das ist praktisch fast immer der Fall, nur in dem ganz einfachen Beispiel oben ist es überflüssig, weil die verwendeten Befehle das SREG nicht beeinflussen. In diesem Zusammenhang wird der [[Stack]] wieder interessant. Um die Register zu sichern, kann man sie mit &#039;&#039;&#039;push&#039;&#039;&#039; oben auf den Stapel legen und am Ende wieder in der umgekehrten Reihenfolge(!) mit &#039;&#039;&#039;pop&#039;&#039;&#039; vom Stapel herunternehmen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispielprogramm werden die empfangenen Daten nun nicht mehr komplett angezeigt. Stattdessen kann man durch Eingabe einer 1 oder einer 0 im Terminalprogramm eine LED (an PB0) an- oder ausschalten. Dazu wird das empfangene Byte in der Interruptroutine mit den entsprechenden ASCII-Codes der Zeichen 1 und 0 (siehe [http://www.asciitable.com/ www.asciitable.com]) verglichen.&lt;br /&gt;
&lt;br /&gt;
Für den [[AVR-Tutorial:_Vergleiche|Vergleich]] eines Registers mit einer Konstanten gibt es den Befehl &#039;&#039;&#039;cpi register, konstante&#039;&#039;&#039;. Das Ergebnis dieses Vergleichs kann man mit den Befehlen &#039;&#039;&#039;breq label&#039;&#039;&#039; (springe zu label, wenn gleich) und &#039;&#039;&#039;brne label&#039;&#039;&#039; (springe zu label, wenn ungleich) auswerten. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = R16&lt;br /&gt;
&lt;br /&gt;
.equ F_CPU = 4000000                            ; Systemtakt in Hz&lt;br /&gt;
.equ BAUD  = 9600                               ; Baudrate&lt;br /&gt;
&lt;br /&gt;
; Berechnungen&lt;br /&gt;
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden&lt;br /&gt;
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate&lt;br /&gt;
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille&lt;br /&gt;
&lt;br /&gt;
.if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))       ; max. +/-10 Promille Fehler&lt;br /&gt;
  .error &amp;quot;Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!&amp;quot;&lt;br /&gt;
.endif&lt;br /&gt;
&lt;br /&gt;
.org 0x00&lt;br /&gt;
        rjmp main&lt;br /&gt;
&lt;br /&gt;
.org URXCaddr&lt;br /&gt;
        rjmp int_rxc&lt;br /&gt;
&lt;br /&gt;
; Hauptprogramm&lt;br /&gt;
main:&lt;br /&gt;
    &lt;br /&gt;
    ; Stackpointer initialisieren&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
    ldi     temp, LOW(RAMEND)&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Port B = Ausgang&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, 0xFF&lt;br /&gt;
    out     DDRB, temp&lt;br /&gt;
&lt;br /&gt;
    ; Baudrate einstellen&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, HIGH(UBRR_VAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
    ldi     temp, LOW(UBRR_VAL)&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
&lt;br /&gt;
    ; Frame-Format: 8 Bit&lt;br /&gt;
&lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0)&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
&lt;br /&gt;
    sbi     UCSRB, RXCIE                ; Interrupt bei Empfang&lt;br /&gt;
    sbi     UCSRB, RXEN                 ; RX (Empfang) aktivieren&lt;br /&gt;
    &lt;br /&gt;
    sei                                 ; Interrupts global aktivieren&lt;br /&gt;
    &lt;br /&gt;
loop:&lt;br /&gt;
    rjmp loop                           ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde&lt;br /&gt;
&lt;br /&gt;
int_rxc:&lt;br /&gt;
    push    temp                        ; temp auf dem Stack sichern&lt;br /&gt;
    in      temp, sreg                  ; SREG sichern&lt;br /&gt;
    push    temp&lt;br /&gt;
    &lt;br /&gt;
    in      temp, UDR                   ; UART Daten lesen&lt;br /&gt;
    cpi     temp, &#039;1&#039;                   ; empfangenes Byte mit &#039;1&#039; vergleichen&lt;br /&gt;
    brne    int_rxc_1                   ; wenn nicht gleich, dann zu int_rxc_1&lt;br /&gt;
    cbi     PORTB, 0                    ; LED einschalten, low aktiv&lt;br /&gt;
    rjmp    int_rxc_2                   ; Zu int_rxc_2 springen&lt;br /&gt;
int_rxc_1:&lt;br /&gt;
    cpi     temp, &#039;0&#039;                   ; empfangenes Byte mit &#039;0&#039; vergleichen&lt;br /&gt;
    brne    int_rxc_2                   ; wenn nicht gleich, dann zu int_rxc_2&lt;br /&gt;
    sbi     PORTB, 0                    ; LED ausschalten, low aktiv&lt;br /&gt;
int_rxc_2:&lt;br /&gt;
&lt;br /&gt;
    pop     temp&lt;br /&gt;
    out     sreg, temp                  ; SREG wiederherstellen&lt;br /&gt;
    pop     temp                        ; temp wiederherstellen&lt;br /&gt;
    reti&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Handshake ==&lt;br /&gt;
Werden Daten schnell über eine serielle Leitung an ein langsames Gerät übertragen, dann kann es passieren, dass die Situation eintritt, dass das empfangende Gerät nicht mehr mitkommt. Das kann z.B. dadurch passieren, dass das empfangende Gerät selbst etwas Zeit für die Bearbeitung der Daten benötigt. Man denke z.B. an die Situation, dass an ein Modem Daten übertragen werden. Das Modem muss diese Daten bearbeiten und unter Umständen über eine langsame Telefonleitung absetzen. Überträgt der AVR seine Daten mit voller Geschwindigkeit an das Modem, so wird auch dem besten Modem irgendwann der interne Speicher ausgehen, in dem es die Daten zwischenspeichern kann.&lt;br /&gt;
&lt;br /&gt;
Was benötigt wird, ist also eine Möglichkeit, wie die Gegenstelle dem Sender signalisieren kann: &amp;quot;Bitte jetzt nichts senden, ich bin beschäftigt!&amp;quot;. Die einfachste Form eines derartigen Protokolls, nennt sich Handshake. Es gibt bei RS232 2 Arten, wie dieses Handshake implementiert werden kann: &amp;lt;b&amp;gt;Software-Handshake&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;Hardware-Handshake&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Handshake ===&lt;br /&gt;
Hardware Handshake benutzt die beiden Steuerleitungen &amp;lt;b&amp;gt;RTS - Request to Send&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;CTS - Clear to Send&amp;lt;/b&amp;gt; um die Flusskontrolle durchzuführen.&lt;br /&gt;
&lt;br /&gt;
Die etwas seltsam anmutenden Namen haben historische Ursache. Ursprünglich war RS232 dazu gedacht ein Modem (ein sog. Data Carrier Equipment oder DCE) an einen Endpunkt (DTE oder Data Terminal Equipment) anzuschliessen. Wenn das DTE Daten senden wollte, aktivierte es die Leitung RTS, es fragte praktisch beim DCE an: &amp;quot;Darf ich senden? (engl. Request sending)&amp;quot;. Wenn das DCE bereit war, dann aktivierte es seinerseits die CTS Leitung und signalisierte damit &amp;quot;Alles ok. Daten marsch! (engl. Clear to send)&amp;quot;. Solange das DCE nicht bereit war, Daten entgegenzunehmen, musste das DTE warten, bis es vom DCE die Freigabe zum Senden bekam.&lt;br /&gt;
&lt;br /&gt;
* Für das DTE gilt: RTS ist ein Ausgang, CTS ist ein Eingang.&lt;br /&gt;
* Für das DCE gilt: RTS ist ein Eingang, CTS ist ein Ausgang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Bild:RS232_orig.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das war die ursprüngliche Idee. Heutzutage ist es aber normal, dass 2 DTE miteinander über eine RS232 Verbindung gekoppelt werden. Wird in so einem Fall Hardware Handshake benutzt, so muss jedes DTE seiner Gegenstelle eine korrekte Bedienung der RTS/CTS Leitung vortäuschen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Bild:RS232_dte.png]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil, dass CTS nur dann bedient wird, wenn über RTS die Anfrage nach der Sendefreigabe erfolgt entfällt dabei. Jeder Gesprächspartner überprüft ganz einfach vor dem Sendevorgang den Zustand der CTS Leitung der Gegenstelle, während der eigene RTS Ausgang zur Signalisierung der Empfangsbereitschaft für die Gegenstelle dient. Dies ist auch der Grund warum bei einem Null-Modem-Kabel nicht nur die RX/TX Leitungen, sondern auch die RTS/CTS Leitungen gekreuzt werden müssen.&lt;br /&gt;
&lt;br /&gt;
Möchte man obige Schaltung um eine Hardware-Flusskontrolle erweitern, so bietet es sich an, die beiden noch freien Kanäle des MAX232 dafür zu verwenden. Die Schaltung sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:640px-AVR-RS232_RTS.png|framed|center| UART/MAX232 Beschaltung für RTS/CTS am Beispiel eines Mega16. Achtung: Pinbelegung an den Mega8 anpassen]]&lt;br /&gt;
&lt;br /&gt;
Am Mega8 stehen dann die Signale RTS bzw. CTS an den Pins PD4 bzw. PD5 zur Verfügung. An PD5 kann abgefragt werden, ob die Gegenstelle zum Empfang von Daten bereit ist, während der Mega8 über PD4 signalisieren kann, dass er im Moment keine Daten über die serielle Schnittstelle empfangen kann.&lt;br /&gt;
&lt;br /&gt;
Bedenken sollte man dabei allerdings, dass nach der Rücknahme der Empfangsbereitschaft es je nach Gegenstelle dazu kommen kann, dass noch ein paar Zeichen über die UART eintreffen. Wird zb der Zustand der RTS Leitung vom Füllgrad eines Puffers abhängig gemacht, dann sollte man RTS nicht erst dann abschalten, wenn der Buffer komplett gefüllt ist, sondern schon ein paar Zeichen früher. Ursache könnte zb sein, dass die Gegenstelle über eine Hardware UART verfügt, die einen internen Buffer verfügt. Hat die Gegenstelle erst mal diesen Hardware Buffer gefüllt, dann gibt es oft keine Möglichkeit mehr für das dortige Programm diese UART-Hardware zu stoppen - die Zeichen die in die UART übertragen wurden, werden auf jeden Fall von der Hardware ausgegeben.&lt;br /&gt;
&lt;br /&gt;
=== Software Handshake ===&lt;br /&gt;
Software Handshake benutzt die Datenleitung selbst, um die Flußkontrolle von Sender/Empfänger zu erreichen. Dazu wurden im ASCII Code 2 spezielle &#039;Zeichen&#039; vorgesehen: XON (mit dem Code 0x11) und XOFF (mit dem Code 0x13).&lt;br /&gt;
&lt;br /&gt;
Bemerkt ein Empfänger, dass er in Kürze keine Daten mehr vom Sender aufnehmen kann, dann sendet er seinerseits ein XOFF, woraufhin der Sender das Senden der Daten unterbricht. Ist der Empfänger wieder aufnahmebereit, so gibt er die Übertragung durch das Senden eines XON wieder frei.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil des Software-Handshaking besteht also in mehreren Punkten&lt;br /&gt;
* zum einen können nicht mehr alle Datenbytes übertragen werden, da ja die Bytes 0x11 und 0x13 eine spezielle Bedeutung haben. Möchte man Bytes binär übertragen, muss man daher spezielle Vorkehrungen treffen, damit diese Datenbytes nicht durch das Software-Handshaking fehlinterpretiert werden.&lt;br /&gt;
* zum anderen muss jeder Sender während er sendet auch gleichzeitig einen möglichen Empfang von Daten überwachen. Die Gegenstelle könnte ja mittels XOFF eine kurzfristige Unterbrechung der Sendung anfordern. Auch muss jeder Sender exakt darüber Buch führen, ob die Leitung zur Zeit im Status XOFF liegt und ob daher Übertragungen überhaupt möglich sind.&lt;br /&gt;
* das Senden von XOFF muss rechtzeitig erfolgen. Denn meistens benötigt die Gegenstelle etwas Zeit um das Senden einzustellen. Es kann durchaus sein, dass nach einem XOFF noch ein paar Zeichen von der Gegenstelle eintreffen&lt;br /&gt;
* es besteht die Gefahr eines Deadlocks, indem sich beide Seiten gegenseitig mit einem XOFF blockieren, aus dem sie nicht mehr herauskommen.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.wormfood.net/avrbaudcalc.php WormFood&#039;s AVR Baud Rate Calculator] online.&lt;br /&gt;
* [http://www.gjlay.de/helferlein/avr-uart-rechner.html Online Baudraten-Rechner für ATmega AVRs] (JavaScript)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Mehrfachverzweigung|&lt;br /&gt;
zurücklink=AVR-Tutorial: Mehrfachverzweigung|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=Speicher|&lt;br /&gt;
vorlink=AVR-Tutorial: Speicher}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|UART]]&lt;br /&gt;
[[Category:UART und RS232]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Mehrfachverzweigung&amp;diff=94199</id>
		<title>AVR-Tutorial: Mehrfachverzweigung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Mehrfachverzweigung&amp;diff=94199"/>
		<updated>2016-10-24T19:42:12Z</updated>

		<summary type="html">&lt;p&gt;Alesi: Passend zum code &amp;quot;breq&amp;quot; durch &amp;quot;brne&amp;quot; ersetzt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Oft ist es in einem Programm notwendig, eine Variable auf mehrere Werte zu prüfen und abhängig vom Ergebnis verschiedene Aktionen auszulösen. Diese Konstruktion nennt man Mehrfachverzweigung. In einem Struktogramm sieht das so aus.&lt;br /&gt;
&lt;br /&gt;
[[bild:mv_struktogramm.png|350px]]&lt;br /&gt;
&lt;br /&gt;
In C gibt es direkt dafür eine Konstruktion namens &#039;&#039;&#039;switch&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
switch (variable) {&lt;br /&gt;
  case 1:       // Anweisungen für diesen Zweig, wenn variable == 1&lt;br /&gt;
    break;&lt;br /&gt;
  case 17:      // Anweisungen für diesen Zweig, wenn variable == 17&lt;br /&gt;
    break;&lt;br /&gt;
  case 33:      // Anweisungen für diesen Zweig, wenn variable == 33&lt;br /&gt;
    break;&lt;br /&gt;
  case 9:       // Anweisungen für diesen Zweig, wenn variable == 9&lt;br /&gt;
    break;&lt;br /&gt;
  case 22:      // Anweisungen für diesen Zweig, wenn variable == 22&lt;br /&gt;
    break;&lt;br /&gt;
  default:      // Anweisungen wenn keine der oben definierten Bedingungen erfüllt ist&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Assembler muss man so etwas &amp;quot;zu Fuß&amp;quot; programmieren. Die verschiedene Lösungen sollen hier betrachtet werden.&lt;br /&gt;
&lt;br /&gt;
== Einfacher Ansatz ==&lt;br /&gt;
&lt;br /&gt;
Im einfachsten Fall verwendet man eine lange Kette von &#039;&#039;&#039;cpi&#039;&#039;&#039; und &#039;&#039;&#039;brne&#039;&#039;&#039; Befehlen. Für jeden Zweig benötigt man zwei Befehle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
; Mehrfachverzeigung Version A&lt;br /&gt;
&lt;br /&gt;
; Einfacher Ansatz, mit vielen CPI&lt;br /&gt;
&lt;br /&gt;
start_vergleich:&lt;br /&gt;
&lt;br /&gt;
    cpi     r16,1&lt;br /&gt;
    brne    zweig_0&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig r16=1&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
zweig_0:&lt;br /&gt;
    cpi     r16,17&lt;br /&gt;
    brne    zweig_1&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig r16=17&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
zweig_1:&lt;br /&gt;
    cpi     r16,33&lt;br /&gt;
    brne    zweig_2&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig r16=33&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
zweig_2:&lt;br /&gt;
    cpi     r16,9&lt;br /&gt;
    brne    zweig_3&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig r16=9&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
zweig_3:&lt;br /&gt;
    cpi     r16,22&lt;br /&gt;
    brne    kein_Treffer&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig r16=22&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
kein_Treffer:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für den Fall, dass keiner der Vergleiche erfolgreich war&lt;br /&gt;
&lt;br /&gt;
ende_vergleich:&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich          ; nur für Simulationszwecke! ENTFERNEN!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Eigenschaften&#039;&#039;&#039;&lt;br /&gt;
* Programmspeicherbedarf: 6*N Bytes (N = Anzahl der Zweige)&lt;br /&gt;
* Laufzeit: n*3-1, Nicht gefunden: N*3 (N = Anzahl der Zweige, n = Ausgewählter Zweig)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile&#039;&#039;&#039;&lt;br /&gt;
* leicht verständlich&lt;br /&gt;
* Es können beliebige Vergleichswerte geprüft werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile&#039;&#039;&#039;&lt;br /&gt;
* relativ hoher Programmspeicherbedarf&lt;br /&gt;
* die Größe der Zweige ist stark begrenzt, weil der Befehl &#039;&#039;&#039;brne&#039;&#039;&#039; maximal 63 Worte weit springen kann!&lt;br /&gt;
* die einzelnen Zweige haben unterschiedliche Durchlaufzeiten, der letzte Zweig ist am langsamsten&lt;br /&gt;
* nur bedingt übersichtlicher Quellcode&lt;br /&gt;
&lt;br /&gt;
== Sprungtabelle ==&lt;br /&gt;
&lt;br /&gt;
Oft liegen die einzelnen Vergleichswerte nebeneinander (z.&amp;amp;nbsp;B. 7..15), z.&amp;amp;nbsp;B. bei der Übergabe von Parametern, Zustandsautomaten, Menueinträgen etc. . In so einem Fall kann man mittels einer &#039;&#039;&#039;Sprungtabelle&#039;&#039;&#039; das Programm verkürzen, beschleunigen und übersichtlicher gestalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Mehrfachverzweigung Version B&lt;br /&gt;
&lt;br /&gt;
; Clevere Version mit Sprungtabelle&lt;br /&gt;
; minimum und maximum sind auf 0..255 begrenzt!&lt;br /&gt;
&lt;br /&gt;
.equ minimum = 3&lt;br /&gt;
.equ maximum = 7&lt;br /&gt;
&lt;br /&gt;
start_vergleich:&lt;br /&gt;
&lt;br /&gt;
    subi    r16,minimum                 ; Nullpunkt verschieben&lt;br /&gt;
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen&lt;br /&gt;
    brsh    kein_Treffer                ; Index zu gross -&amp;gt; Fehler&lt;br /&gt;
    ldi     ZL,low(Sprungtabelle)       ; Tabellenzeiger laden, 16 Bit&lt;br /&gt;
    ldi     ZH,high(Sprungtabelle)&lt;br /&gt;
    add     ZL,r16                      ; Index addieren, 16 Bit&lt;br /&gt;
    ldi     r16,0                   &lt;br /&gt;
    adc     ZH,r16&lt;br /&gt;
    ijmp                                ; indirekter Sprung in Sprungtabelle&lt;br /&gt;
&lt;br /&gt;
kein_treffer:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für den Fall, dass keiner der Vergleiche erfolgreich war&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
Sprungtabelle:&lt;br /&gt;
    rjmp    zweig_0&lt;br /&gt;
    rjmp    zweig_1&lt;br /&gt;
    rjmp    zweig_2&lt;br /&gt;
    rjmp    zweig_3&lt;br /&gt;
    rjmp    zweig_4&lt;br /&gt;
&lt;br /&gt;
zweig_0:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
zweig_1:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Awneisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
zweig_2:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
zweig_3:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
zweig_4:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
ende_vergleich:&lt;br /&gt;
&lt;br /&gt;
; hier geht das Programm weiter&lt;br /&gt;
&lt;br /&gt;
    rjmp    ende_vergleich          ; nur für Simulationszwecke! ENTFERNEN!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Programmbeschreibung &#039;&#039;&#039;&amp;lt;BR&amp;gt;&lt;br /&gt;
Wie ist dieses Programm nun zu verstehen? Das Prinzip beruht darauf, daß in einer gleichmässigen Tabelle Sprungbefehle auf einzelne Programmzweige abgelegt werden. Das ist praktisch genauso wie der AVR [[AVR-Tutorial: Interrupts | Interrupts]] verarbeitet. Über einen Index (0...N) wird ein Sprungbefehl ausgewählt und ausgeführt.Der entscheidende Befehl dazu ist &#039;&#039;&#039;ijmp&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Zunächst muss der Wertebereich, auf welchen die Variable geprüft werden soll (minimum bis maximum), normiert werden (0 bis (Maximum-Minimum)). Dazu wird einfach das Minimum subtrahiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    subi    r16,minimum                 ; Nullpunkt verschieben&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss geprüft werden, ob der maximale Index nicht überschritten wird. Denn ein Sprung auf nichtexistierende Einträge oberhalb der Sprungtabelle wäre fatal!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen&lt;br /&gt;
    brsh    kein_Treffer                ; Index zu gross -&amp;gt; Fehler&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss der indirekte Sprung vorbereitet werden. Dazu wird die Adresse der Sprungtabelle in das Z-Register geladen, welches ein 16 Bit Register ist und gleichbedeutend mit r30 und r31.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ldi     ZL,low(Sprungtabelle)       ; Tabellenzeiger laden, 16 Bit&lt;br /&gt;
    ldi     ZH,high(Sprungtabelle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss der Index addiert werden, dies ist eine 16-Bit Addition.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    add     ZL,r16                      ; Index addieren, 16 Bit&lt;br /&gt;
    ldi     r16,0                   &lt;br /&gt;
    adc     ZH,r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt wird der indirekte Sprung in die Sprungtabelle ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ijmp                                ; indirekter Sprung in Sprungtabelle&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Sprungtabelle wird dann zum jeweiligen Zweig verzweigt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
Sprungtabelle:&lt;br /&gt;
    rjmp    zweig_0&lt;br /&gt;
    rjmp    zweig_1&lt;br /&gt;
    rjmp    zweig_2&lt;br /&gt;
    rjmp    zweig_3&lt;br /&gt;
    rjmp    zweig_4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zweig für einen ungültigen Index folgt direkt nach dem &#039;&#039;&#039;ijmp&#039;&#039;&#039;, weil der Befehl &#039;&#039;&#039;brsh&#039;&#039;&#039; nur maximal 63 Worte weit springen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eigenschaften&#039;&#039;&#039;&lt;br /&gt;
* Programmspeicherbedarf: 4*N +18 Bytes (N = Anzahl der Zweige)&lt;br /&gt;
* Laufzeit: 12, Nicht gefunden: 4&lt;br /&gt;
* maximale Gesamtgröße der Zweige wird durch den Befehl rjmp begrenzt (+/-4kB). Das sollte aber nur in sehr wenigen Fällen ein Problem sein (Man wird kaum einen AVR mit 8 kB FLASH mit einer einzigen Mehrfachverzweigung füllen!)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile&#039;&#039;&#039;&lt;br /&gt;
* relativ niedriger Programmspeicherbedarf&lt;br /&gt;
* die einzelnen Zweige haben unabhängig von der Grösse der Sprungtabelle eine konstante und kurze Durchlaufzeit von 12 Takten.&lt;br /&gt;
* übersichtlicher Quellcode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile&#039;&#039;&#039;&lt;br /&gt;
* Die Vergleichswerte müssen lückenlos aufeinander folgen&lt;br /&gt;
&lt;br /&gt;
== Lange Sprungtabelle ==&lt;br /&gt;
Wenn man doch mal eine GIGA-Mehrfachverzweigung braucht, dann hilft die Version C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m16def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Mehrfachverzweigung Version C&lt;br /&gt;
&lt;br /&gt;
; Clevere Version mit langer Sprungtabelle&lt;br /&gt;
; funktioniert nur mit AVRs mit mehr als 8KB FLASH&lt;br /&gt;
; minimum und maximum sind auf 0..127 begrenzt!&lt;br /&gt;
&lt;br /&gt;
.equ minimum = 3&lt;br /&gt;
.equ maximum = 7&lt;br /&gt;
&lt;br /&gt;
start_vergleich:&lt;br /&gt;
&lt;br /&gt;
    subi    r16,minimum                 ; Nullpunkt verschieben&lt;br /&gt;
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen&lt;br /&gt;
    brsh    kein_Treffer                ; Index zu gross -&amp;gt; Fehler&lt;br /&gt;
    ldi     ZL,low(Sprungtabelle*2)     ; Tabellenzeiger laden, 16 Bit&lt;br /&gt;
    ldi     ZH,high(Sprungtabelle*2)&lt;br /&gt;
    lsl     r16                         ; Index mit 2 multiplizieren&lt;br /&gt;
    add     zl,r16                      ; Index addieren, 16 Bit&lt;br /&gt;
    ldi     r16,0                   &lt;br /&gt;
    adc     zh,r16&lt;br /&gt;
    lpm     r16,Z+                      ; Low Byte laden und Pointer erhöhen&lt;br /&gt;
    lpm     ZH,Z                        ; zweites Byte laden&lt;br /&gt;
    mov     ZL,r16                      ; erstes Byte in Z-Pointer kopieren&lt;br /&gt;
    ijmp                                ; indirekter Sprung&lt;br /&gt;
&lt;br /&gt;
kein_treffer:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für den Fall, dass keiner der Vergleiche erfolgreich war&lt;br /&gt;
&lt;br /&gt;
    jmp     ende_vergleich&lt;br /&gt;
&lt;br /&gt;
Sprungtabelle:&lt;br /&gt;
.dw zweig_0&lt;br /&gt;
.dw zweig_1&lt;br /&gt;
.dw zweig_2&lt;br /&gt;
.dw zweig_3&lt;br /&gt;
.dw zweig_4&lt;br /&gt;
&lt;br /&gt;
zweig_0:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    jmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
zweig_1:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Awneisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    jmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
zweig_2:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    jmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
zweig_3:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
    jmp    ende_vergleich&lt;br /&gt;
&lt;br /&gt;
zweig_4:&lt;br /&gt;
&lt;br /&gt;
; hier stehen jetzt alle Anweisungen für diesen Zweig&lt;br /&gt;
&lt;br /&gt;
ende_vergleich:&lt;br /&gt;
&lt;br /&gt;
; hier geht das Programm weiter&lt;br /&gt;
&lt;br /&gt;
    jmp    ende_vergleich          ; nur für Simulationszwecke! ENTFERNEN!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Programmbeschreibung &#039;&#039;&#039;&amp;lt;BR&amp;gt;&lt;br /&gt;
Diese Version ist der Version B sehr ähnlich. Der Unterschied besteht darin, daß in Version B die Sprungtabelle mit Sprungbefehlen gefüllt ist (rjmp) während in Version C die Startadressen der Funktionen ablegt sind. D.H. man kann nicht in die Sprungtabelle springen, sondern muss sich mit Hilfe des Index die richtige Adresse aus der Sprungtabelle lesen und mit &#039;&#039;&#039;ijmp&#039;&#039;&#039; anspringen. Klingt sehr ähnlich, ist aber dennoch verschieden.&lt;br /&gt;
&lt;br /&gt;
Die ersten drei Befehle sind identisch, es wird der Index normiert und auf das Maximum geprüft.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    subi    r16,minimum                 ; Nullpunkt verschieben&lt;br /&gt;
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen&lt;br /&gt;
    brsh    kein_Treffer                ; Index zu gross -&amp;gt; Fehler&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die nächsten zwei Befehle laden wieder die Anfangsadresse der Sprungtabelle. Doch halt, hier wird die Adresse der Sprungtabelle mit zwei multipliziert. Des Rätsels Lösung gibt es weiter unten.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ldi     ZL,low(Sprungtabelle*2)     ; Tabellenzeiger laden, 16 Bit&lt;br /&gt;
    ldi     ZH,high(Sprungtabelle*2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Index wird ebenfalls mit zwei multipliziert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    lsl     r16                         ; Index mit 2 multiplizieren&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Danach erfolgt eine 16-Bit Addition.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    add     zl,r16                      ; Index addieren, 16 Bit&lt;br /&gt;
    ldi     r16,0                   &lt;br /&gt;
    adc     zh,r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun zeigt unser Z-Zeiger auf den richtigen Tabelleneintrag. Jetzt müssen zwei Bytes aus dem FLASH geladen werden. Das geschieht mit Hilfe des &#039;&#039;&#039;lpm&#039;&#039;&#039;-Befehls (&#039;&#039;&#039;L&#039;&#039;&#039;oad &#039;&#039;&#039;P&#039;&#039;&#039;rogram &#039;&#039;&#039;M&#039;&#039;&#039;emory). Hier wird die erweiterte Version des lpm-Befehls verwendet, wie sie nur auf grösseren AVRs verfügbar ist. Dabei wird ein Byte in Register r16 geladen und gleichzeitig der Z-Pointer um eins erhöht. Damit zeigt er wunderbar auf das nächste Byte, welches auch geladen werden muss.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    lpm     r16,Z+                      ; Low Byte laden und Zeiger erhöhen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der zweite lpm-Befehl ist etwas ungewöhnlich, denn er überschreibt einen Teil des Z-Pointers! In den meisten Programmen wäre das ein Schuss ins Knie (Programmierfehler!), da wir aber den Z-Pointer danach sowieso mit neuen Daten laden ist das OK.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    lpm     ZH,Z                        ; zweites Byte laden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das zuerst gelesene Byte wird in den Z-Pointer kopiert. Nun steht die Startadresse des gewählten Zweigs im Z-Pointer.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    mov     ZL,r16                      ; erstes Byte in Z-zeiger kopieren&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt wird der indirekte Sprung ausgeführt und bringt uns direkt in den Programmzweig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ijmp                                ; indirekter Sprung direkt in den Programmzweig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zweig für einen ungültigen Index folgt direkt nach dem &#039;&#039;&#039;ijmp&#039;&#039;&#039;, weil der Befehl &#039;&#039;&#039;brsh&#039;&#039;&#039; nur maximal 63 Worte weit springen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eigenschaften&#039;&#039;&#039;&lt;br /&gt;
* Programmspeicherbedarf: 6*N +26 Bytes (N = Anzahl der Zweige)&lt;br /&gt;
* unbegrenzte Sprungweite&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile&#039;&#039;&#039;&lt;br /&gt;
* relativ niedriger Programmspeicherbedarf&lt;br /&gt;
* die einzelnen Zweige haben unabhängig von der Grösse der Sprungtabelle eine konstante und kurze Durchlaufzeit von 18 Takten&lt;br /&gt;
* übersichtlicher Quellcode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile&#039;&#039;&#039;&lt;br /&gt;
* Die Vergleichswerte müssen lückenlos aufeinander folgen&lt;br /&gt;
* geringfügig höherer Programmspeicherbedarf (8 Byte mehr) und grössere Durchlaufzeit (6 Takte mehr)als Version B&lt;br /&gt;
&lt;br /&gt;
== Z-Pointer leicht verständlich ==&lt;br /&gt;
&lt;br /&gt;
Auf den ersten Blick scheint es sonderbar, daß Version B die Adresse der Sprungtabelle direkt lädt, während Version C sowohl Anfangsadresse als auch Index mit zwei multipliziert. Warum ist das so?&lt;br /&gt;
&lt;br /&gt;
Version B verwendet nur den Befehl &#039;&#039;&#039;ijmp&#039;&#039;&#039;. Dieser erwartet im Z-Register eine Adresse zur Programmausführung, eine &#039;&#039;&#039;Wort-Adresse&#039;&#039;&#039;. Da der Programmspeicher des AVR 16 Bit breit ist (=1 Wort = 2 Bytes), werden nur Worte adressiert, nicht jedoch Bytes! Genauso arbeitet der Assembler. Jedes Label entspricht einer Wort-Adresse. Damit kann man mit einer 12 Bit-Adresse 4096 Worte adressieren (=8192 Bytes). Wenn man sich die Befehle der einzelnen AVRs anschaut wird klar, daß alle AVRs mit 8KB und weniger FLASH nur die Befehle rjmp und rcall besitzen. Denn sie brauchen nicht mehr! (Hinweis: Der Atmega8 besitzt die Befehle ijmp und icall).&lt;br /&gt;
&lt;br /&gt;
Mit 12 Adressbits, welche direkt in einem Wort im Befehl rjmp bzw. rcall kodiert sind, kann der gesamte Programmspeicher erreicht werden. Größere AVRs besitzen call und jmp, dort ist die Adresse als 22 bzw. 16 Bit Zahl kodiert, deshalb brauchen diese Befehle auch 2 Worte Programmspeicher.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &#039;&#039;&#039;lpm&#039;&#039;&#039; dient zum Laden einzelner Bytes aus dem Programmspeicher. Das ist vor allem für Tabellen mit konstanten Werten sehr nützlich (7-Segmentdekoder, Zeichensätze, Kennlinien, Parameter Texte, etc.) Doch wie kommt man nun in dem wortweise adressierten Programmspeicher an einzelne Bytes? Ganz einfach. Der AVR &amp;quot;mogelt&amp;quot; hier und erwartet im Z-Register eine &#039;&#039;&#039;Byte-Adresse&#039;&#039;&#039;. Von dieser Adresse bilden die Bits 15..1 die Wortadresse, welche zur Adressierung des Programmspeichers verwendet wird. Bit 0 entscheidet dann, ob das hoch- oder niederwertige Byte in das Zielregister kopiert werden soll (0=niederwertiges Byte; 1=höherwertiges Byte).&lt;br /&gt;
&lt;br /&gt;
Darum muss bei Verwendung des Befehls lpm die Anfangsadresse immer mit zwei multipliziert werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ldi     ZL,low(Sprungtabelle*2)     ; Tabellenzeiger laden, 16 Bit&lt;br /&gt;
    ldi     ZH,high(Sprungtabelle*2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In Version C muss zusätzlich der Index mit zwei multipliziert werden, weil jeder Tabelleneintrag (Adresse des Programmzweigs) ein Wort breit ist. Damit wird aus einem Index von 0,1,2,3,4 ein Offset von 0,2,4,6,8.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Vergleiche|&lt;br /&gt;
zurücklink=AVR-Tutorial: Vergleiche|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=UART|&lt;br /&gt;
vorlink=AVR-Tutorial: UART}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Mehrfachverzweigung]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Differenzverst%C3%A4rker&amp;diff=79683</id>
		<title>Differenzverstärker</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Differenzverst%C3%A4rker&amp;diff=79683"/>
		<updated>2013-11-23T16:03:28Z</updated>

		<summary type="html">&lt;p&gt;Alesi: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Prinzip-Differenzverstärker.svg|thumb|Abb. 1: Grundprinzip des Differenzverstärkers]]&lt;br /&gt;
&lt;br /&gt;
Der Differenzverstärker ist das Herz eines jeden Operationsverstärkers. Der folgende Beitrag soll einen Blick unter die Haube dieses alltäglichen Bauteils liefern. Dazu wird vorweg die Theorie erläutert und anschließend zur Demonstration ein vereinfachter Operationsverstärker diskrete aufgebaut.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Erklärung ==&lt;br /&gt;
&lt;br /&gt;
Das Grundprinzip des Differenzverstärkers zeigt die Abbildung 1. Den untersten Teil bildet eine Stromsenke&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; und bedeutet, dass daran die Spannung solange absinkt, bis der Strom I&amp;lt;sub&amp;gt;Senke&amp;lt;/sub&amp;gt; darüber abfließt. Haben die Eingangsspannungen &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; den gleichen Wert, dann teilt sich der Strom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;Senke&amp;lt;/sub&amp;gt; je zur Hälfte auf die beiden Transistoren und an den Widerständen (mit R1=R2) fällt die gleiche Spannung ab. Als Folge weist die Spannungsdifferenz &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; den Wert null auf.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #AAA solid; border-collapse: collapse; empty-cells:show;float:right;&amp;quot;&lt;br /&gt;
! Eingang || Ausgang&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; = &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; || &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; = 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;gt; &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; || &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt; &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; || &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; &amp;lt; 0&lt;br /&gt;
|-&lt;br /&gt;
|} Hat die Eingangsspannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; einen höheren Wert als &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, dann sinkt &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;BE2&amp;lt;/sub&amp;gt;, da die Basis-Emitter-Diode von T1 das gemeinsame Emitterpotential nach oben zieht. Über T2 fließt bei verringerter Basis-Emitter-Spannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;BE2&amp;lt;/sub&amp;gt; nun ein geringerer Kollektorstrom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C2&amp;lt;/sub&amp;gt; als über T1 mit &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C1&amp;lt;/sub&amp;gt;. Da allerdings die Stromsenke einen festen Strom einprägt zieht selbige als Reaktion das gemeinsame Emitterpotential herunter bis die Summe der Kollektorströme soweit ansteigt, das &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C1&amp;lt;/sub&amp;gt; + &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C2&amp;lt;/sub&amp;gt; = &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;Senke&amp;lt;/sub&amp;gt; wieder gilt. Der Kollektorstrom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C1&amp;lt;/sub&amp;gt; bleibt weiterhin größer als &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C2&amp;lt;/sub&amp;gt;. Die Ausgangsspannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; weist einen positiven Wert auf, da der Spannungsabfall über R2 durch den geringeren Strom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; sinkt und damit das Potential bezogen auf Masse steigt. Umgekehrt verhält es sich für den Widerstand R1.&lt;br /&gt;
&lt;br /&gt;
Hat die Eingangsspannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; eine kleineren Wert als &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, dann ist nun leicht nachvollziehbar, das die Ausgangsspannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; einen negativen Wert aufweist. Letzlich zählt nur die Differenz der Eingangsspannungen, da die Stromsenke das Emitterpotential ständig anpasst. Mathematisch ausgedrückt errechnet sich die Ausgangsspannung aus der Differenz der Eingangsspannungen.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; ( &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; - &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
Bezogen auf den Operationsverstärker lässt sich der Anschluss 1 als der nich-invertierende Eingang deuten und entsprechend der Anschluss 2 als der invertierende Eingang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Eine kleine Schaltung die dieses grundlegende Konzept verdeutlicht wird auf [http://www.dieelektronikerseite.de/Lections/Differenzverstaerker%20-%20Der%20feine%20Unterschied.htm dieelektronikerseite.de] vorgestellt.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Theorie im Detail ==&lt;br /&gt;
[[Datei:Prinzip-Differenzverstärker-Kleinsignal.svg|thumb|Abb. 2: Kleinsignalersatzschaltbild]]&lt;br /&gt;
&lt;br /&gt;
Grundlage jeder Wissenschaft bildet die Theorie&lt;br /&gt;
&lt;br /&gt;
Die Verwendung des Kleinsignalersatzschaltbildes (Abb. 2) vereinfacht das Verständnis für die genauere Funktion eines Differenzverstärkers. Für das Kleinsignal-ESB ist es üblich, dass alle Kleinsignalgrößen mit Kleinbuchstaben geschrieben werden. Als erstes fällt auf, dass die Stromsenke fehlt, da ihr Strom konstant und im Kleinsignalbereich nur Änderungen, meist Wechselgrößen, betrachtet werden&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.  Die beiden identischen Transitoren bestehen nun aus dem differentiellen Basis-Emitter-Widerstand und einer Stromsenke. Der Begriff „differentiell“ beschreibt bildlich gesprochen die Steigung der Tangente zur U-I-Kennlinie für die Basis-Emitter-Strecke im Arbeitspunkt&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;. Die Stromsenke ergibt sich aus dem flachen Verlauf der Ausgangskennlinie des Transistors im Verstärkungsbereich. Der Strom bleibt unabhängig von der Spannung konstant.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;r_\mathrm{BE1} = r_\mathrm{BE2} = r_\mathrm{BE}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;R1 = R2 = R&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\beta_1 = \beta_2 = \beta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Differenz der Eingangsspannung fällt in gleichen Teilen über die identischen differentiellen BE-Widerstände ab. Entsprechend fließt in beiden der gleiche Strom nur in umgekehrter Richtung. Daraus ergibt sich, dass auch die Kollektorströme identische, aber entgegengesetzte Werte aufweisen.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{d} = u_1 - u_2&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{BE1} = \frac{1}{2} \cdot u_\mathrm{d}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{BE2} = -\frac{1}{2} \cdot u_\mathrm{d}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;i_\mathrm{C1} = \beta_1 \cdot \frac {u_\mathrm{BE1}}{r_\mathrm{BE1}} = \beta \cdot \frac {1}{2} \cdot \frac{u_\mathrm{d}}{r_\mathrm{BE}}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;i_\mathrm{C2} = -1 \cdot i_\mathrm{C1}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{BE1} = -1 \cdot u_\mathrm{BE2} = \frac{1}{2} \cdot u_\mathrm{d}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgangsspannung ergibt sich aus der Differenz der Spannungen über die Widerstände entsprechend den Kollektorströmen. Durch Einsetzen und Umstellen ergibt sich schließlich der Zusammenhang zwischen Eingans- und Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{a} = -1 \cdot U_\mathrm{R2} - (-1) \cdot U_\mathrm{R1}= -1 \cdot i_\mathrm{C2} \cdot R2 - (-1) \cdot i_\mathrm{C1} \cdot R1&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;i_\mathrm{C1} = \beta \cdot \frac{1}{2} \cdot \frac {u_\mathrm{d}}{r_\mathrm{BE}}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;i_\mathrm{C1} = -1 \cdot i_\mathrm{C2}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{a} = R \cdot 2 \cdot i_\mathrm{C1}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\boldsymbol{u_\mathrm{a} = u_\mathrm{d} \cdot R \cdot \frac{\beta}{r_\mathrm{BE}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für das Großsignalverhalten an dieser Stelle nur der Verweis an die Kollegen von [http://raumfahrtkommando.de/BPT-Differenzverstaerker.pdf raumfahrtkommando.de] (pdf, Seite 15ff.). Herausgegriffen und an die hier gemachte Darstellung angepasst, ergibt sich folgende Formel als Ergebnis:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_\mathrm{a} = I_\mathrm{Senke} \cdot R \cdot \tanh \frac{U_\mathrm{d}}{2 \cdot U_\mathrm{T}}&amp;lt;/math&amp;gt;&lt;br /&gt;
:mit &amp;lt;math&amp;gt;U_\mathrm{T} \approx 25{,}6 mV&amp;lt;/math&amp;gt; (Temperaturspannung)&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\mathrm{C1} = \frac{1}{2} I_\mathrm{Senke} \cdot \left( 1 + \tanh \frac{U_\mathrm{d}}{2 \cdot U_\mathrm{T}} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch Ableiten (Differentialrechnung) an der Stelle &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;d&amp;lt;/sub&amp;gt; = 0 ergibt sich die linearisierte Funktion:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{dI_\mathrm{C1}}{dU_\mathrm{d}} \bigg| _{U_\mathrm{d} = 0} = \frac{1}{2} I_\mathrm{Senke} \cdot \frac{1}{2 \cdot U_\mathrm{T}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\mathrm{C1} = \frac{1}{2} I_\mathrm{Senke} \cdot \left( 1 + U_\mathrm{d} \frac{1}{2 \cdot U_\mathrm{T}}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_\mathrm{a} = I_\mathrm{Senke} \cdot R \cdot U_\mathrm{d} \cdot \frac{1}{2 \cdot U_\mathrm{T}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diskreter Aufbau ==&lt;br /&gt;
=== Schaltung ===&lt;br /&gt;
[[Datei:Schaltplan Differenzverstaerker LTspiceIV.png|thumb|Abb. 3: Einfacher Operationsverstärker]]&lt;br /&gt;
&lt;br /&gt;
Für den diskreten Aufbau dient eine stark vereinfachte Schaltung (siehe Abb. 3), da mehr Bauteile mehr Aufwand und Fehlerquellen bedeutet. Als Versorgung genügt eine 9V-Blockbatterie. &lt;br /&gt;
Für die Schaltung ist ein Referenzstrom erforderlich, der über einen [[Stromspiegel]] (Q5, Q6, Q7) sowohl den Differenzverstärker als auch die Ausgangsstufe versorgt. Der Strom hängt dabei von der Versorgungsspannung und dem Widerstand R1 ab, wobei Q5 nur als zusätzliche Diode in Serie wirkt, da Basis und Kollektor verbunden sind. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\mathrm{ref} = \frac {U_\mathrm{B} - 0{,}7 V}{R1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Stromspiegel fallen die Emitter-Widerstände R7, R8 und R9 auf, die zunächst der Temperaturkompensation dienen. Da R9 jedoch eine deutlich kleiner Wert als die anderen beiden aufweist, bewirkt dieser auch eine Stromvervielfachung (≈10-fach).&lt;br /&gt;
&lt;br /&gt;
Die Transistoren Q1 und Q8 bilden den Kern des Differenzverstärkers, jedoch erfolgt die Anzapfung nicht differentiell&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; sondern einseitig unsymmetrisch durch einen Stromspiegel. Jeder Zweig des Differenzverstärkers bekommt bei &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;d&amp;lt;/sub&amp;gt; = 0 die Hälfte des Stromes von der gemeinsamen Stromsenke Q6. Daher erfolgt die Auskopplung des Stromes durch einen doppelten Stromspiegel (Q2, Q3, Q4) am Ausgang und versorgt damit die Ausgangsstufe von beiden Seiten mit einer gleichstarken Stromquelle. Die Symmetrie bleibt somit erhalten.&lt;br /&gt;
&lt;br /&gt;
Der Kondenstator C1 dient der Frequenzkompensation der Schaltung.&lt;br /&gt;
&lt;br /&gt;
Anschlüsse:&lt;br /&gt;
* Der Ausgang trägt die Kennzeichnung &#039;&#039;Ausgang&#039;&#039;&lt;br /&gt;
* Der nichtinvertierende Eingang trägt die Kennzeichnung &#039;&#039;nInv&#039;&#039;&lt;br /&gt;
* Der invertierende Eingang trägt die Kennzeichnung &#039;&#039;Inv&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften:&lt;br /&gt;
* Versorgungsspannung: (typ.) 9 V ... 15 V&lt;br /&gt;
* Stromaufnahme: 7-8 mA&lt;br /&gt;
* Linearer Eingangsspannungsbereich: Masse + 1,5 V ... Vcc - 1,5V&lt;br /&gt;
* Maximal zulässige Differenzspannung an den Eingängen: 5 V&lt;br /&gt;
* Linearer Ausgangsspannungsbereich: Masse + 1V ... Vcc - 1V&lt;br /&gt;
* Maximaler Ausgangsstrom: 5 mA&lt;br /&gt;
&lt;br /&gt;
=== Simulation ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Schaltplan Differenzverstaerker mit Rückkopplung LTspiceIV.png|thumb|Abb. 4: Aufbau mit Rückkopplung]]&lt;br /&gt;
Die Simulation erfolgt mittels LTspice IV, das im Internetauftritt von Linear Technology zum kostenlosen Herunterladen bereitsteht. Für den schnellen Einstieg gibt es den fertig gezeichneten Differenzverstärker im Wiki-Archiv.&lt;br /&gt;
&lt;br /&gt;
* [http://www.linear.com/designtools/software/ LTspice IV] (Anleitung und Einführung in englisch)&lt;br /&gt;
* [[:Datei:Differential amp with feedback 2.ltspice4.zip|Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Differenzverstärker finden sich in der Schaltung (Abbildung 4) noch zwei Spannungsteiler, die jeweils eine Ersatzspannungsquelle mit einem Innenwiderstand von 10kΩ bilden und die Hälfte der Versorgungsspannung als Potential liefern. Hinzu kommt ein Generator der über einen Kondensator gleichstormmäßig entkoppelt wurde und zusammen mit einem der Spannungsteiler (R5 und R10) an den nichtinvertierenden Eingang (nInv) gehen. Der 100kΩ Rückkopplungswiderstand R3 bildet zusammen mit dem Innenwiderstand aus dem zweiten Spannungsteiler (R6 und R14) einen Verstärkungsfaktor von 11 ([[Operationsverstärker-Grundschaltungen|Nichtinvertierende OPV-Schaltung]]). &lt;br /&gt;
&lt;br /&gt;
[[Datei:Differenzverstärker mit Rückkopplung Transientenanalyse.png|thumb|Abb. 5: Transientenanaylse mit LTspice&amp;amp;nbsp;IV]]&lt;br /&gt;
Für Messungen an der Testschaltung kommt als erstes der Transienten-Recorder zum Einsatz (vgl. Abb. 5). Messpunkte bilden &#039;&#039;nInv&#039;&#039;, &#039;&#039;Inv&#039;&#039; und &#039;&#039;Ausgang&#039;&#039;. Auffällig ist die merkliche Spannungsdifferenz (ca. 5mV) zwischen den Eingängen, deren Ursache im Lastwiderstand R4 liegt. Das bedeutet je größer die Last desto größer die Differenzspannung und lässt sich leicht durch Variation der Last überprüfen.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\mathrm{a} = f( U_\mathrm{d} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels der Arbeitspunktanalyse können der Schaltung weitere Eigenschaften entlockt werden, etwa das der Offset zwischen den Eingängen ohne Last etwa 1,5mV beträgt. Nun lässt sich durch überbrücken von C1 noch im Gleichstromfall der Ausgangsstrom in Abhängigkeit der Differenzspannung durchexerzieren.&lt;br /&gt;
&lt;br /&gt;
Noch nicht besprochen wurde das Überschwingen in der Transientenanalyse. Deren Ursache liegt im hochohmigen Rückkopplungsnetzwerk und erscheint ebenfalls bei richtigen Operationsverstärkern aus der LTspice-Bibliothek. Ein verringern der Widerstandswerte führt auch weitgehend zum Verschwinden der Überschwinger.&lt;br /&gt;
&lt;br /&gt;
Weitere Experimente kann nun jeder selbst ausprobieren nur bei nichtlinearen Schaltungen (Komparator) sollten die Eingangsparameter insbesondere die maximale Differenzspannung der Eingänge nicht überschritten werden, denn sonst kommt es eventuell auf der BE-Strecke zum Zenerdruchbruch (&amp;gt;7V). Das lässt sich aber durch einen entsprechenden Schaltungsentwurf meist vermeiden&lt;br /&gt;
&lt;br /&gt;
Experimentiervorschläge:&lt;br /&gt;
&lt;br /&gt;
* Verschieden OP-Verstärkerschaltungen&lt;br /&gt;
* Widerstände der Rückkopplung variieren&lt;br /&gt;
* Nichtlineare OP-Schaltungen&lt;br /&gt;
* Eingangsaussteuerbereich&lt;br /&gt;
* Ausgangsaussteuerbereich&lt;br /&gt;
* Wienbrückenoszillator&lt;br /&gt;
* ... (Nach Bedarf ergänzen)&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
Die Simulation erspart einem das mühevolle Löten einer Testschaltung, doch wirklich überzeugend ist nur eine echte Schaltung, die sich mit dem Multimeter und Oszilloskop „anfassen“ lässt.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau erfolgt auf einer Lochrasterplatine gemäß den unten angegebenen Schaltplänen. Dazu gibt es eigentlich nicht viel zu sagen. Im Gegensatz zur oberen Schaltung fallen die zwei Z-Dioden zwischen den Eingängen auf. Die Schützen die BE-Strecke vor dem Rückwärtsdurchbruch (plus möglicher Zerstörung) bei falscher oder nichtlinearer Ansteuerung. Als folge darf natürlich bei nichtlinearer Ansteuerung keine Differenzspannung größer 5 V anliegen, denn ansonsten kommt es zu Funktionsfehlern.&lt;br /&gt;
&lt;br /&gt;
Damit einige Experimente möglich sind sollten gleich noch einige Drahtbrücken mit Steckschuhen angefertigt werden. Zur Grundausrüstung gehören sechs Stück an der Zahl mit jeweils 15 cm Länge sowie der Batterieclip mit Steckschuhen. Eine Beschriftung der wesentlichen Anschlüsse erleichtert das Arbeiten. Damit das besser klappt als Tip: mit einem Folienschreiber auf ein kleines aufgeklebtes Stückchen Tesa schreiben und obendrauf nochmal einen Klebefilm als Abreibschutz. Das hält dann auch dauerhaft.&lt;br /&gt;
&lt;br /&gt;
==== Inbetriebnhame ====&lt;br /&gt;
&lt;br /&gt;
Selbst einfache Schaltungen bieten reichlich Möglichkeiten für Fehler im Aufbau. Deswegen darf an dieser Stelle eine Anleitung zur Inbetriebnahme nicht fehlen. Zunächst erfolgt der Aufbau als Komparator mit den Drahtbrücken gemäß der nachfolgenden Tabelle. Das Poti befindet sich auf Linksanschlag, die Spannungsteiler dürfen dabei keine wesentlichen Abweichenungen gegenüber ihrer Leerlaufspannung aufweisen, der Ausgang A zieht Richtung Versorgungsspannung. Alle Emitterwiderstände der Stromspiegel sollten angemessene Spannungswerte aufweisen. Anschließend dreht man das Poti auf Rechtsanschlag. Dann geht der Ausgang A gegen 0 V und die Spannungsteiler weisen weiterhin Werte in der Nähe ihrer Leerlaufspannung auf.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! Von&lt;br /&gt;
! Nach&lt;br /&gt;
|----&lt;br /&gt;
| Spannungsteiler #1&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| Poti&lt;br /&gt;
| +&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die zweite Testschaltung bildet der Spannungsfolger mit der Verdrahtung gemäß der nachfolgenden Tabelle. Folglich weisen Eingang (+) und Ausgang A den gleichen Spannungswert auf. Das Drehen am Poti bewirkt eine Änderung der Spannungen. Klappt das alles, dann ist der Differenzverstärker voll Funktionsfähig.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! Von&lt;br /&gt;
! Nach&lt;br /&gt;
|----&lt;br /&gt;
| A&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| Poti&lt;br /&gt;
| +&lt;br /&gt;
|----&lt;br /&gt;
| A&lt;br /&gt;
| Spannungsteiler #1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsbeispiel Wien-Robinson-Oszillator ====&lt;br /&gt;
&lt;br /&gt;
[[Datei:Differenzverstärker-Wienbrückenoszillator.png|miniatur|Mit DSO gemessenes Ausgangssignal]]&lt;br /&gt;
Damit sich ohne riesig Laborausrüstung etwas rührt, befinden sich auf der Lochrasterplatine noch alle nötigen Bauteile für einen Wien-Oszillator mit der Verdrahtung gemäß der nachfolgenden Tabelle. Die meisten Multimeter schaffen die gewählte Frequenz von etwa 3 kHz noch in der AC-Messung. Damit erfordert diese Schaltung nicht mal ein Oszilloskop zur Funktionsprüfung.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! Von&lt;br /&gt;
! Nach&lt;br /&gt;
|----&lt;br /&gt;
| A&lt;br /&gt;
| R17&lt;br /&gt;
|----&lt;br /&gt;
| A&lt;br /&gt;
| R11&lt;br /&gt;
|----&lt;br /&gt;
| C3/C4&lt;br /&gt;
| SPT #1&lt;br /&gt;
|----&lt;br /&gt;
| C3/C4&lt;br /&gt;
| +&lt;br /&gt;
|----&lt;br /&gt;
| R18 &lt;br /&gt;
| SPT #2&lt;br /&gt;
|----&lt;br /&gt;
| R18&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltpläne ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  Datei:Differenzverstärker Lochraster-Beschriftung.png|Beschriftung&lt;br /&gt;
  Datei:Differenzverstärker Lochraster-Bestückung.png|Bestückung&lt;br /&gt;
  Datei:Differenzverstärker Lochraster-Verdrahtung.png|Verdrahtung&lt;br /&gt;
  Datei:Differenzverstärker Lochraster-Aufgebaut.jpg|Fertig Aufgebaut&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Materialliste&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! Stückzahl&lt;br /&gt;
! Typ&lt;br /&gt;
! Wert&lt;br /&gt;
! Position&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 680&lt;br /&gt;
| R1, R3&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 18k&lt;br /&gt;
| R2&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 1k5&lt;br /&gt;
| R4&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 150&lt;br /&gt;
| R5, R7&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 68&lt;br /&gt;
| R6&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 5k6&lt;br /&gt;
| R8&lt;br /&gt;
|----&lt;br /&gt;
| 4x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 22k&lt;br /&gt;
| R9, R10, R12, R13&lt;br /&gt;
|----&lt;br /&gt;
| 3x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 10k&lt;br /&gt;
| R11, R14, R15&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 12k&lt;br /&gt;
| R17, R18&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Trimm-Potentiometer&lt;br /&gt;
| 25k&lt;br /&gt;
| R16&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Kondensator&lt;br /&gt;
| 56p&lt;br /&gt;
| C1&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Kondensator&lt;br /&gt;
| 470n&lt;br /&gt;
| C2&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Kondensator&lt;br /&gt;
| 5,6n&lt;br /&gt;
| C3, C4&lt;br /&gt;
|----&lt;br /&gt;
| 5x&lt;br /&gt;
| npn-Transistor&lt;br /&gt;
| BC547B&lt;br /&gt;
| T1, T2, T3, T4, T7&lt;br /&gt;
|----&lt;br /&gt;
| 3x&lt;br /&gt;
| pnp-Transistor&lt;br /&gt;
| BC557B&lt;br /&gt;
| T5, T6, T8&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Zener-Diode&lt;br /&gt;
| 4V7&lt;br /&gt;
| D1, D2&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Leuchtdiode&lt;br /&gt;
| 3mm&lt;br /&gt;
| D3&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Diode&lt;br /&gt;
| 1n4148&lt;br /&gt;
| D4&lt;br /&gt;
|----&lt;br /&gt;
| 15x&lt;br /&gt;
| Lötnagel&lt;br /&gt;
| 1mm&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 14x&lt;br /&gt;
| Steckschuh&lt;br /&gt;
| 1mm&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 4x&lt;br /&gt;
| Schraube&lt;br /&gt;
| M3x12mm&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 4x&lt;br /&gt;
| Mutter&lt;br /&gt;
| M3&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 8x&lt;br /&gt;
| Beilagscheibe&lt;br /&gt;
| M3&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Lochrasterplatine&lt;br /&gt;
| 54mmx100mm (1/3 Europaformat)&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Isolierter Draht für Steckschuhe&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Batterieclip&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Batterie&lt;br /&gt;
| 9V&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Diverses ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Prinzip-Differenzverstärker-Miller.svg|miniatur|Abb. 6: Stromspiegel als Last]]&lt;br /&gt;
&lt;br /&gt;
Ein Stromspiegel entsprechende Abbildung 6 zwischen den Differenzzweigen statt Widerstände als Last perfektionieren den Differenzverstärker. An der Anzapfung bilden dabei der Spiegelstrom und der Zweigstrom eine Stromdifferenz proportional zur Differenz der Eingangsspannung.&lt;br /&gt;
&lt;br /&gt;
Der Kondensator am Stromspiegel dient der Frequenzkompensation. Dabei verstärkt der Millereffekt dessen Wirkung und damit seine Wirkung sich auch entfaltet muss sich die Ausgangsspannung ändern. Eine direkte Ansteuerung einer Emitterschaltung als Impedanzwandler (Emitter auf festem Potential) führt folglich zur Instabilität also Schwingneigung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:TL071-beschriftet.png|thumb|Abb. 7:Der TL071/072/074 kommentiert]]&lt;br /&gt;
Vor allem bei den älteren OPs enthält das Datenblatt häufig eine Prinzipschaltung, die sich mit den hier gewonnen Erkenntnissen analysieren lässt. Beispielhaft sind hier TL071, LM358, LM324, LM393 oder TL071 (vgl. Abb. 7). Auch Audioendstufen sind häufig nach dem Prinzip des Operationsverstärkers aufgebaut und im wesentlichen nur durch einen Mute-Schaltkreis ergänzt, wie etwa der LM3886 zeigt.&lt;br /&gt;
&lt;br /&gt;
Der Aufgebaute Differenzverstärker hat einen hochohmigen Stromquellen Ausgang, wogegen Operationsverstärker eher niederohmig sind. Das liegt überwiegend am Early-Effekt, der den Quellenwiderstand bildet und der Class-AB-Endstufe die als Impedanzwandler diesen deutlich herabsetzt.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Bei einer Stromquelle steigt die Spannung solange an, bis ein entsprechender Strom fließt. Das Verhalten einer Stromsenke entspricht einer umgepolten Stromquelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;Eine Spannungsquelle wäre im Kleinsignalersatzschaltung mit einer durchgehenden Verbindung ersetzt worden, da sich ihre Spannung nie ändert und damit jede Spannungsänderung von einem zum anderen Anschluss weiter gibt. Die Stromquelle gibt keine Potentialänderung weiter und fällt daher weg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;Die Steigung der Tangente ergibt sich mit dem Steigungsdreieck, also im Fall der U-I-Kennlinie aus dem Quotient von &amp;amp;Delta;U / &amp;amp;Delta;I der die Einheit Ohm bildet. Zur Unterscheidung spricht man hier von differentiellem Widerstand&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;Differenziell bedeutet hier nicht wie im Kleinsignalersatzschaltbild Tangente zur U-I-Kennlinie, sondern die differenzielle Signalübertragung bei der die Potentialdifferenz zwischen den zwei Signalleitungen die Information trägt und nicht das Signal gegen Masse.&lt;br /&gt;
&lt;br /&gt;
== LTspice Tutorial ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.gunthard-kraus.de/LTSwitcherCAD/index_LTSwitcherCAD.html Leichter Einstieg in die SPICE-Schaltungssimulation mit LTspice IV]&lt;br /&gt;
&lt;br /&gt;
== Zielgruppe / Intension ==&lt;br /&gt;
&lt;br /&gt;
* Erfolgserlebnis bei einem Bastelprojekt mit Blick hinter die Kulissen einer allgegenwärtigen Analogschaltung&lt;br /&gt;
* Guten Auszubildenden zu interessanten Einblicken verhelfen&lt;br /&gt;
* Technikern vertieftes Verständnis bieten&lt;br /&gt;
* Studenten an einer fassbaren Schaltung das Verständnis der Theorie erleichtern&lt;br /&gt;
&lt;br /&gt;
== Forum ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/189566 Thread] für Fragen und Diskussion zum Projekt&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.raumfahrtkommando.de/BPT-Differenzverstaerker.pdf Differenzverstärker mit bipolaren Transistoren], raumfahrtkommando.de&lt;br /&gt;
* [http://wwwex.physik.uni-ulm.de/lehre/physikalischeelektronik/phys_elektr/node110.html Einige Grundschaltungen mit Transistoren], wwwex.physik.uni-ulm.de&lt;br /&gt;
* [http://schmidt-walter.eit.h-da.de/el/skript_pdf/el_17.pdf Elektronik], Prof. Dr.-Ing. Heinz Schmidt-Walter&lt;br /&gt;
* [http://kurcz.at/differenzverstaerker.php Verstärker], Best Of Elektronik&lt;br /&gt;
* [http://www.erckert-ibe.de/all/trainings/circuit_ideas/amplifiers/opamps/opamps.html Operational Amplifiers], Ingenieurbuero Erckert (englisch, verschieden Typen)&lt;br /&gt;
* [http://www.calvin.edu/~pribeiro/courses/engr332/Handouts/ho18opamp.pdf IC Op-Amps Through the Ages] (Geschichte des Operationsverstärkers)&lt;br /&gt;
* Die [http://en.wikipedia.org/wiki/Operational_amplifier#Internal_circuitry_of_741_type_op-amp englischsprachige Wikipedia] erklärt den 741&lt;br /&gt;
&lt;br /&gt;
; Vergleichbare Projekte&lt;br /&gt;
* [http://wwwex.physik.uni-ulm.de/lehre/physikalischeelektronik/phys_elektr/node113.html Standard-Operationsverstärker (VV-OPV)] Aufbau in groben Zügen beschrieben&lt;br /&gt;
* [http://www.dieelektronikerseite.de/Lections/Differenzverstaerker%20-%20Der%20feine%20Unterschied.htm Sehr einfacher Differenzverstärker mit LED-Indikator]&lt;br /&gt;
* [http://www.unibw.de/eit4_1/lehre/analogneu Umfangreiche Simulationen]&lt;br /&gt;
* … (Nach Bedarf ergänzen)&lt;br /&gt;
&lt;br /&gt;
; Informationen zu LTspice auf www.mikrocontroller.net&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Schaltungssimulation#LTspice.2FSwitcherCAD LTspice/SwitcherCAD]&lt;br /&gt;
&lt;br /&gt;
; Vertiefendes zu Operationsverstärkern&lt;br /&gt;
&lt;br /&gt;
* [http://focus.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=slod006b Op Amps for Everyone Design Guide (Rev. B)] (Texas Instruments)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Differenzverst%C3%A4rker&amp;diff=79682</id>
		<title>Differenzverstärker</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Differenzverst%C3%A4rker&amp;diff=79682"/>
		<updated>2013-11-23T15:58:35Z</updated>

		<summary type="html">&lt;p&gt;Alesi: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Prinzip-Differenzverstärker.svg|thumb|Abb. 1: Grundprinzip des Differenzverstärkers]]&lt;br /&gt;
&lt;br /&gt;
Der Differenzverstärker ist das Herz eines jeden Operationsverstärkers. Der folgende Beitrag soll einen Blick unter die Haube dieses alltäglichen Bauteils liefern. Dazu wird vorweg die Theorie erläutert und anschließend zur Demonstration ein vereinfachter Operationsverstärker diskrete aufgebaut.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Erklärung ==&lt;br /&gt;
&lt;br /&gt;
Das Grundprinzip des Differenzverstärkers zeigt die Abbildung 1. Den untersten Teil bildet eine Stromsenke&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; und bedeutet, dass daran die Spannung solange absinkt, bis der Strom I&amp;lt;sub&amp;gt;Senke&amp;lt;/sub&amp;gt; darüber abfließt. Haben die Eingangsspannungen &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; den gleichen Wert, dann teilt sich der Strom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;Senke&amp;lt;/sub&amp;gt; je zur Hälfte auf die beiden Transistoren und an den Widerständen (mit R1=R2) fällt die gleiche Spannung ab. Als Folge weist die Spannungsdifferenz &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; den Wert null auf.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #AAA solid; border-collapse: collapse; empty-cells:show;float:right;&amp;quot;&lt;br /&gt;
! Eingang || Ausgang&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; = &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; || &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; = 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;gt; &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; || &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt; &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; || &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; &amp;lt; 0&lt;br /&gt;
|-&lt;br /&gt;
|} Hat die Eingangsspannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; einen höheren Wert als &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, dann sinkt &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;BE2&amp;lt;/sub&amp;gt;, da die Basis-Emitter-Diode von T1 das gemeinsame Emitterpotential nach oben zieht. Über T2 fließt bei verringerter Basis-Emitter-Spannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;BE2&amp;lt;/sub&amp;gt; nun ein geringerer Kollektorstrom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C2&amp;lt;/sub&amp;gt; als über T1 mit &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C1&amp;lt;/sub&amp;gt;. Da allerdings die Stromsenke einen festen Strom einprägt zieht selbige als Reaktion das gemeinsame Emitterpotential herunter bis die Summe der Kollektorströme soweit ansteigt, das &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C1&amp;lt;/sub&amp;gt; + &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C2&amp;lt;/sub&amp;gt; = &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;Senke&amp;lt;/sub&amp;gt; wieder gilt. Der Kollektorstrom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C1&amp;lt;/sub&amp;gt; bleibt weiterhin größer als &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;C2&amp;lt;/sub&amp;gt;. Die Ausgangsspannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; weist einen positiven Wert auf, da der Spannungsabfall über R2 durch den geringeren Strom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; sinkt und damit das Potential bezogen auf Masse steigt. Umgekehrt verhält es sich für den Widerstand R1.&lt;br /&gt;
&lt;br /&gt;
Hat die Eingangsspannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; eine kleineren Wert als &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, dann ist nun leicht nachvollziehbar, das die Ausgangsspannung &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; einen negativen Wert aufweist. Letzlich zählt nur die Differenz der Eingangsspannungen, da die Stromsenke das Emitterpotential ständig anpasst. Mathematisch ausgedrückt errechnet sich die Ausgangsspannung aus der Differenz der Eingangsspannungen.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; ( &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; - &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
Bezogen auf den Operationsverstärker lässt sich der Anschluss 1 als der nich-invertierende Eingang deuten und entsprechend der Anschluss 2 als der invertierende Eingang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Eine kleine Schaltung die dieses grundlegende Konzept verdeutlicht wird auf [http://www.dieelektronikerseite.de/Lections/Differenzverstaerker%20-%20Der%20feine%20Unterschied.htm dieelektronikerseite.de] vorgestellt.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Theorie im Detail ==&lt;br /&gt;
[[Datei:Prinzip-Differenzverstärker-Kleinsignal.svg|thumb|Abb. 2: Kleinsignalersatzschaltbild]]&lt;br /&gt;
&lt;br /&gt;
Grundlage jeder Wissenschaft bildet die Theorie&lt;br /&gt;
&lt;br /&gt;
Die Verwendung des Kleinsignalersatzschaltbildes (Abb. 2) vereinfacht das Verständnis für die genauere Funktion eines Differenzverstärkers. Für das Kleinsignal-ESB ist es üblich, dass alle Kleinsignalgrößen mit Kleinbuchstaben geschrieben werden. Als erstes fällt auf, dass die Stromsenke fehlt, da ihr Strom konstant und im Kleinsignalbereich nur Änderungen, meist Wechselgrößen, betrachtet werden&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.  Die beiden identischen Transitoren bestehen nun aus dem differentiellen Basis-Emitter-Widerstand und einer Stromsenke. Der Begriff „differentiell“ beschreibt bildlich gesprochen die Steigung der Tangente zur U-I-Kennlinie für die Basis-Emitter-Strecke im Arbeitspunkt&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;. Die Stromsenke ergibt sich aus dem flachen Verlauf der Ausgangskennlinie des Transistors im Verstärkungsbereich. Der Strom bleibt unabhängig von der Spannung konstant.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;r_\mathrm{BE1} = r_\mathrm{BE2} = r_\mathrm{BE}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;R1 = R2 = R&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\beta_1 = \beta_2 = \beta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Differenz der Eingangsspannung fällt in gleichen Teilen über die identischen differentiellen BE-Widerstände ab. Entsprechend fließt in beiden der gleiche Strom nur in umgekehrter Richtung. Daraus ergibt sich, dass auch die Kollektorströme identische, aber entgegengesetzte Werte aufweisen.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{d} = u_1 - u_2&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{BE1} = \frac{1}{2} \cdot u_\mathrm{d}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{BE2} = -\frac{1}{2} \cdot u_\mathrm{d}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;i_\mathrm{C1} = \beta_1 \cdot \frac {u_\mathrm{BE1}}{r_\mathrm{BE1}} = \beta \cdot \frac {1}{2} \cdot \frac{u_\mathrm{d}}{r_\mathrm{BE}}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;i_\mathrm{C2} = -1 \cdot i_\mathrm{C1}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{BE1} = -1 \cdot u_\mathrm{BE2} = \frac{1}{2} \cdot u_\mathrm{d}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgangsspannung ergibt sich aus der Differenz der Spannungen über die Widerstände entsprechend den Kollektorströmen. Durch Einsetzen und Umstellen ergibt sich schließlich der Zusammenhang zwischen Eingans- und Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{a} = -1 \cdot U_\mathrm{R2} - (-1) \cdot U_\mathrm{R1}= -1 \cdot i_\mathrm{C2} \cdot R2 - (-1) \cdot i_\mathrm{C1} \cdot R1&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;i_\mathrm{C1} = \beta \cdot \frac{1}{2} \cdot \frac {u_\mathrm{d}}{r_\mathrm{BE}}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;i_\mathrm{C1} = -1 \cdot i_\mathrm{C2}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;u_\mathrm{a} = R \cdot 2 \cdot i_\mathrm{C1}&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\boldsymbol{u_\mathrm{a} = u_\mathrm{d} \cdot R \cdot \frac{\beta}{r_\mathrm{BE}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für das Großsignalverhalten an dieser Stelle nur der Verweis an die Kollegen von [http://raumfahrtkommando.de/BPT-Differenzverstaerker.pdf raumfahrtkommando.de] (pdf, Seite 15ff.). Herausgegriffen und an die hier gemachte Darstellung angepasst, ergibt sich folgende Formel als Ergebnis:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_\mathrm{a} = I_\mathrm{Senke} \cdot R \cdot \tanh \frac{U_\mathrm{d}}{2 \cdot U_\mathrm{T}}&amp;lt;/math&amp;gt;&lt;br /&gt;
:mit &amp;lt;math&amp;gt;U_\mathrm{T} \approx 25{,}6 mV&amp;lt;/math&amp;gt; (Temperaturspannung)&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\mathrm{C1} = \frac{1}{2} I_\mathrm{Senke} \cdot \left( 1 + \tanh \frac{U_\mathrm{d}}{2 \cdot U_\mathrm{T}} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch Ableiten (Differentialrechnung) an der Stelle &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;d&amp;lt;/sub&amp;gt; = 0 ergibt sich die linearisierte Funktion:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{dI_\mathrm{C1}}{dU_\mathrm{d}} \bigg| _{U_\mathrm{d} = 0} = \frac{1}{2} I_\mathrm{Senke} \cdot \frac{1}{2 \cdot U_\mathrm{T}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\mathrm{C1} = \frac{1}{2} I_\mathrm{Senke} \cdot \left( 1 + U_\mathrm{d} \frac{1}{2 \cdot U_\mathrm{T}}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_\mathrm{a} = I_\mathrm{Senke} \cdot R \cdot U_\mathrm{d} \cdot \frac{1}{2 \cdot U_\mathrm{T}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diskreter Aufbau ==&lt;br /&gt;
=== Schaltung ===&lt;br /&gt;
[[Datei:Schaltplan Differenzverstaerker LTspiceIV.png|thumb|Abb. 3: Einfacher Operationsverstärker]]&lt;br /&gt;
&lt;br /&gt;
Für den diskreten Aufbau dient eine stark vereinfachte Schaltung (siehe Abb. 3), da mehr Bauteile mehr Aufwand und Fehlerquellen bedeutet. Als Versorgung genügt eine 9V-Blockbatterie. &lt;br /&gt;
Für die Schaltung ist ein Referenzstrom erforderlich, der über einen [[Stromspiegel]] (Q5, Q6, Q7) sowohl den Differenzverstärker als auch die Ausgangsstufe versorgt. Der Strom hängt dabei von der Versorgungsspannung und dem Widerstand R1 ab, wobei Q5 nur als zusätzliche Diode in Serie wirkt, da Basis und Kollektor verbunden sind. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\mathrm{ref} = \frac {U_\mathrm{B} - 0{,}7 V}{R1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Stromspiegel fallen die Emitter-Widerstände R7, R8 und R9 auf, die zunächst der Temperaturkompensation dienen. Da R9 jedoch eine deutlich kleiner Wert als die anderen beiden aufweist, bewirkt dieser auch eine Stromvervielfachung (≈10-fach).&lt;br /&gt;
&lt;br /&gt;
Die Transistoren Q1 und Q8 bilden den Kern des Differenzverstärkers, jedoch erfolgt die Anzapfung nicht differentiell&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; sondern einseitig unsymmetrisch durch einen Stromspiegel. Jeder Zweig des Differenzverstärkers bekommt bei &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;d&amp;lt;/sub&amp;gt; = 0 die Hälfte des Stromes von der gemeinsamen Stromsenke Q6. Daher erfolgt die Auskopplung des Stromes durch einen doppelten Stromspiegel (Q2, Q3, Q4) am Ausgang und versorgt damit die Ausgangsstufe von beiden Seiten mit einer gleichstarken Stromquelle. Die Symmetrie bleibt somit erhalten.&lt;br /&gt;
&lt;br /&gt;
Der Kondenstator C1 dient der Frequenzkompensation der Schaltung.&lt;br /&gt;
&lt;br /&gt;
Anschlüsse:&lt;br /&gt;
* Der Ausgang trägt die Kennzeichnung &#039;&#039;Ausgang&#039;&#039;&lt;br /&gt;
* Der nichtinvertierende Eingang trägt die Kennzeichnung &#039;&#039;nInv&#039;&#039;&lt;br /&gt;
* Der invertierende Eingang trägt die Kennzeichnung &#039;&#039;Inv&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften:&lt;br /&gt;
* Versorgungsspannung: (typ.) 9 V ... 15 V&lt;br /&gt;
* Stromaufnahme: 7-8 mA&lt;br /&gt;
* Linearer Eingangsspannungsbereich: Masse + 1,5 V ... Vcc - 1,5V&lt;br /&gt;
* Maximal zulässige Differenzspannung an den Eingängen: 5 V&lt;br /&gt;
* Linearer Ausgangsspannungsbereich: Masse + 1V ... Vcc - 1V&lt;br /&gt;
* Maximaler Ausgangsstrom: 5 mA&lt;br /&gt;
&lt;br /&gt;
=== Simulation ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Schaltplan Differenzverstaerker mit Rückkopplung LTspiceIV.png|thumb|Abb. 4: Aufbau mit Rückkopplung]]&lt;br /&gt;
Die Simulation erfolgt mittels LTspice IV, das im Internetauftritt von Linear Technology zum kostenlosen Herunterladen bereitsteht. Für den schnellen Einstieg gibt es den fertig gezeichneten Differenzverstärker im Wiki-Archiv.&lt;br /&gt;
&lt;br /&gt;
* [http://www.linear.com/designtools/software/ LTspice IV] (Anleitung und Einführung in englisch)&lt;br /&gt;
* [[:Datei:Differential amp with feedback 2.ltspice4.zip|Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Differenzverstärker finden sich in der Schaltung (Abbildung 4) noch zwei Spannungsteiler, die jeweils eine Ersatzspannungsquelle mit einem Innenwiderstand von 10kΩ bilden und die Hälfte der Versorgungsspannung als Potential liefern. Hinzu kommt ein Generator der über einen Kondensator gleichstormmäßig entkoppelt wurde und zusammen mit einem der Spannungsteiler (R5 und R10) an den nichtinvertierenden Eingang (nInv) gehen. Der 100kΩ Rückkopplungswiderstand R3 bildet zusammen mit dem Innenwiderstand aus dem zweiten Spannungsteiler (R6 und R14) einen Verstärkungsfaktor von 11 ([[Operationsverstärker-Grundschaltungen|Nichtinvertierende OPV-Schaltung]]). &lt;br /&gt;
&lt;br /&gt;
[[Datei:Differenzverstärker mit Rückkopplung Transientenanalyse.png|thumb|Abb. 5: Transientenanaylse mit LTspice&amp;amp;nbsp;IV]]&lt;br /&gt;
Für Messungen an der Testschaltung kommt als erstes der Transienten-Recorder zum Einsatz (vgl. Abb. 5). Messpunkte bilden &#039;&#039;nInv&#039;&#039;, &#039;&#039;Inv&#039;&#039; und &#039;&#039;Ausgang&#039;&#039;. Auffällig ist die merkliche Spannungsdifferenz (ca. 5mV) zwischen den Eingängen, deren Ursache im Lastwiderstand R4 liegt. Das bedeutet je größer die Last desto größer die Differenzspannung und lässt sich leicht durch Variation der Last überprüfen.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\mathrm{a} = f( U_\mathrm{d} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels der Arbeitspunktanalyse können der Schaltung weitere Eigenschaften entlockt werden, etwa das der Offset zwischen den Eingängen ohne Last etwa 1,5mV beträgt. Nun lässt sich durch überbrücken von C1 noch im Gleichstromfall der Ausgangsstrom in Abhängigkeit der Differenzspannung durchexerzieren.&lt;br /&gt;
&lt;br /&gt;
Noch nicht besprochen wurde das Überschwingen in der Transientenanalyse. Deren Ursache liegt im hochohmigen Rückkopplungsnetzwerk und erscheint ebenfalls bei richtigen Operationsverstärkern aus der LTspice-Bibliothek. Ein verringern der Widerstandswerte führt auch weitgehend zum Verschwinden der Überschwinger.&lt;br /&gt;
&lt;br /&gt;
Weitere Experimente kann nun jeder selbst ausprobieren nur bei nichtlinearen Schaltungen (Komparator) sollten die Eingangsparameter insbesondere die maximale Differenzspannung der Eingänge nicht überschritten werden, denn sonst kommt es eventuell auf der BE-Strecke zum Zenerdruchbruch (&amp;gt;7V). Das lässt sich aber durch einen entsprechenden Schaltungsentwurf meist vermeiden&lt;br /&gt;
&lt;br /&gt;
Experimentiervorschläge:&lt;br /&gt;
&lt;br /&gt;
* Verschieden OP-Verstärkerschaltungen&lt;br /&gt;
* Widerstände der Rückkopplung variieren&lt;br /&gt;
* Nichtlineare OP-Schaltungen&lt;br /&gt;
* Eingangsaussteuerbereich&lt;br /&gt;
* Ausgangsaussteuerbereich&lt;br /&gt;
* Wienbrückenoszillator&lt;br /&gt;
* ... (Nach Bedarf ergänzen)&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
Die Simulation erspart einem das mühevolle Löten einer Testschaltung, doch wirklich überzeugend ist nur eine echte Schaltung, die sich mit dem Multimeter und Oszilloskop „anfassen“ lässt.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau erfolgt auf einer Lochrasterplatine gemäß den unten angegebenen Schaltplänen. Dazu gibt es eigentlich nicht viel zu sagen. Im Gegensatz zur oberen Schaltung fallen die zwei Z-Dioden zwischen den Eingängen auf. Die Schützen die BE-Strecke vor dem Rückwärtsdurchbruch (plus möglicher Zerstörung) bei falscher oder nichtlinearer Ansteuerung. Als folge darf natürlich bei nichtlinearer Ansteuerung keine Differenzspannung größer 5 V anliegen, denn ansonsten kommt es zu Funktionsfehlern.&lt;br /&gt;
&lt;br /&gt;
Damit einige Experimente möglich sind sollten gleich noch einige Drahtbrücken mit Steckschuhen angefertigt werden. Zur Grundausrüstung gehören sechs Stück an der Zahl mit jeweils 15 cm Länge sowie der Batterieclip mit Steckschuhen. Eine Beschriftung der wesentlichen Anschlüsse erleichtert das Arbeiten. Damit das besser klappt als Tip: mit einem Folienschreiber auf ein kleines aufgeklebtes Stückchen Tesa schreiben und obendrauf nochmal einen Klebefilm als Abreibschutz. Das hält dann auch dauerhaft.&lt;br /&gt;
&lt;br /&gt;
==== Inbetriebnhame ====&lt;br /&gt;
&lt;br /&gt;
Selbst einfache Schaltungen bieten reichlich Möglichkeiten für Fehler im Aufbau. Deswegen darf an dieser Stelle eine Anleitung zur Inbetriebnahme nicht fehlen. Zunächst erfolgt der Aufbau als Komparator mit den Drahtbrücken gemäß der nachfolgenden Tabelle. Das Poti befindet sich auf Linksanschlag, die Spannungsteiler dürfen dabei keine wesentlichen Abweichenungen gegenüber ihrer Leerlaufspannung aufweisen, der Ausgang A zieht Richtung Versorgungsspannung. Alle Emitterwiderstände der Stromspiegel sollten angemessene Spannungswerte aufweisen. Anschließend dreht man das Poti auf Rechtsanschlag. Dann geht der Ausgang A gegen 0 V und die Spannungsteiler weisen weiterhin Werte in der Nähe ihrer Leerlaufspannung auf.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! Von&lt;br /&gt;
! Nach&lt;br /&gt;
|----&lt;br /&gt;
| Spannungsteiler #1&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| Poti&lt;br /&gt;
| +&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die zweite Testschaltung bildet der Spannungsfolger mit der Verdrahtung gemäß der nachfolgenden Tabelle. Folglich weisen Eingang (+) und Ausgang A den gleichen Spannungswert auf. Das Drehen am Poti bewirkt eine Änderung der Spannungen. Klappt das alles, dann ist der Differenzverstärker voll Funktionsfähig.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! Von&lt;br /&gt;
! Nach&lt;br /&gt;
|----&lt;br /&gt;
| A&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| Poti&lt;br /&gt;
| +&lt;br /&gt;
|----&lt;br /&gt;
| A&lt;br /&gt;
| Spannungsteiler #1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsbeispiel Wien-Robinson-Oszillator ====&lt;br /&gt;
&lt;br /&gt;
[[Datei:Differenzverstärker-Wienbrückenoszillator.png|miniatur|Mit DSO gemessenes Ausgangssignal]]&lt;br /&gt;
Damit sich ohne riesig Laborausrüstung etwas rührt, befinden sich auf der Lochrasterplatine noch alle nötigen Bauteile für einen Wien-Oszillator mit der Verdrahtung gemäß der nachfolgenden Tabelle. Die meisten Multimeter schaffen die gewählte Frequenz von etwa 3 kHz noch in der AC-Messung. Damit erfordert diese Schaltung nicht mal ein Oszilloskop zur Funktionsprüfung.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! Von&lt;br /&gt;
! Nach&lt;br /&gt;
|----&lt;br /&gt;
| A&lt;br /&gt;
| R17&lt;br /&gt;
|----&lt;br /&gt;
| A&lt;br /&gt;
| R11&lt;br /&gt;
|----&lt;br /&gt;
| C3/C4&lt;br /&gt;
| SPT #1&lt;br /&gt;
|----&lt;br /&gt;
| C3/C4&lt;br /&gt;
| +&lt;br /&gt;
|----&lt;br /&gt;
| R18 &lt;br /&gt;
| SPT #2&lt;br /&gt;
|----&lt;br /&gt;
| R18&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltpläne ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  Datei:Differenzverstärker Lochraster-Beschriftung.png|Beschriftung&lt;br /&gt;
  Datei:Differenzverstärker Lochraster-Bestückung.png|Bestückung&lt;br /&gt;
  Datei:Differenzverstärker Lochraster-Verdrahtung.png|Verdrahtung&lt;br /&gt;
  Datei:Differenzverstärker Lochraster-Aufgebaut.jpg|Fertig Aufgebaut&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Materialliste&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! Stückzahl&lt;br /&gt;
! Typ&lt;br /&gt;
! Wert&lt;br /&gt;
! Position&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 680&lt;br /&gt;
| R1, R3&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 18k&lt;br /&gt;
| R2&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 1k5&lt;br /&gt;
| R4&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 150&lt;br /&gt;
| R5, R7&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 68&lt;br /&gt;
| R6&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 5k6&lt;br /&gt;
| R8&lt;br /&gt;
|----&lt;br /&gt;
| 4x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 22k&lt;br /&gt;
| R9, R10, R12, R13&lt;br /&gt;
|----&lt;br /&gt;
| 3x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 10k&lt;br /&gt;
| R11, R14, R15&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Widerstand&lt;br /&gt;
| 12k&lt;br /&gt;
| R17, R18&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Trimm-Potentiometer&lt;br /&gt;
| 25k&lt;br /&gt;
| R16&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Kondensator&lt;br /&gt;
| 56p&lt;br /&gt;
| C1&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Kondensator&lt;br /&gt;
| 470n&lt;br /&gt;
| C2&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Kondensator&lt;br /&gt;
| 5,6n&lt;br /&gt;
| C3, C4&lt;br /&gt;
|----&lt;br /&gt;
| 5x&lt;br /&gt;
| npn-Transistor&lt;br /&gt;
| BC547B&lt;br /&gt;
| T1, T2, T3, T4, T7&lt;br /&gt;
|----&lt;br /&gt;
| 3x&lt;br /&gt;
| pnp-Transistor&lt;br /&gt;
| BC557B&lt;br /&gt;
| T5, T6, T8&lt;br /&gt;
|----&lt;br /&gt;
| 2x&lt;br /&gt;
| Zener-Diode&lt;br /&gt;
| 4V7&lt;br /&gt;
| D1, D2&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Leuchtdiode&lt;br /&gt;
| 3mm&lt;br /&gt;
| D3&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Diode&lt;br /&gt;
| 1n4148&lt;br /&gt;
| D4&lt;br /&gt;
|----&lt;br /&gt;
| 15x&lt;br /&gt;
| Lötnagel&lt;br /&gt;
| 1mm&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 14x&lt;br /&gt;
| Steckschuh&lt;br /&gt;
| 1mm&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 4x&lt;br /&gt;
| Schraube&lt;br /&gt;
| M3x12mm&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 4x&lt;br /&gt;
| Mutter&lt;br /&gt;
| M3&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 8x&lt;br /&gt;
| Beilagscheibe&lt;br /&gt;
| M3&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Lochrasterplatine&lt;br /&gt;
| 54mmx100mm (1/3 Europaformat)&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Isolierter Draht für Steckschuhe&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Batterieclip&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
| 1x&lt;br /&gt;
| Batterie&lt;br /&gt;
| 9V&lt;br /&gt;
| -&lt;br /&gt;
|----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Diverses ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Prinzip-Differenzverstärker-Miller.svg|miniatur|Abb. 6: Stromspiegel als Last]]&lt;br /&gt;
&lt;br /&gt;
Ein Stromspiegel entsprechende Abbildung 6 zwischen den Differenzzweigen statt Widerstände als Last perfektionieren den Differenzverstärker. An der Anzapfung bilden dabei der Spiegelstrom und der Zweigstrom eine Stromdifferenz proportional zur Differenz der Eingangsspannung.&lt;br /&gt;
&lt;br /&gt;
Der Kondensator am Stromspiegel dient der Frequenzkompensation. Dabei verstärkt der Millereffekt dessen Wirkung und damit seine Wirkung sich auch entfaltet muss sich die Ausgangsspannung ändern. Eine direkte Ansteuerung einer Emitterschaltung als Impedanzwandler (Emitter auf festem Potential) führt folglich zur Instabilität also Schwingneigung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:TL071-beschriftet.png|thumb|Abb. 7:Der TL071/072/074 kommentiert]]&lt;br /&gt;
Vor allem bei den älteren OPs enthält das Datenblatt häufig eine Prinzipschaltung, die sich mit den hier gewonnen Erkenntnissen analysieren lässt. Beispielhaft sind hier TL071, LM358, LM324, LM393 oder TL071 (vgl. Abb. 7). Auch Audioendstufen sind häufig nach dem Prinzip des Operationsverstärkers aufgebaut und im wesentlichen nur durch einen Mute-Schaltkreis ergänzt, wie etwa der LM3886 zeigt.&lt;br /&gt;
&lt;br /&gt;
Der Aufgebaute Differenzverstärker hat einen hochohmigen Stromquellen Ausgang, wogegen Operationsverstärker eher niederohmig sind. Das liegt überwiegend am Early-Effekt, der den Quellenwiderstand bildet und der Class-AB-Endstufe die als Impedanzwandler diesen deutlich herabsetzt.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Bei einer Stromquelle steigt die Spannung solange an, bis ein entsprechender Strom fließt. Das Verhalten einer Stromsenke entspricht einer umgepolten Stromquelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;Eine Spannungsquelle wäre im Kleinsignalersatzschaltung mit einer durchgehenden Verbindung ersetzt worden, da sich ihre Spannung nie ändert und damit jede Spannungsänderung von einem zum anderen Anschluss weiter gibt. Die Stromquelle gibt keine Potentialänderung weiter und fällt daher weg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;Die Steigung der Tangente ergibt sich mit dem Steigungsdreieck, also im Fall der U-I-Kennlinie aus dem Quotient von &amp;amp;Delta;U / &amp;amp;Delta;I der die Einheit Ohm bildet. Zur Unterscheidung spricht man hier von differentiellem Widerstand&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;Differenziell bedeutet hier nicht wie im Kleinsignalersatzschaltbild Tangente zur U-I-Kennlinie, sondern die differenzielle Signalübertragung bei der die Potentialdifferenz zwischen den zwei Signalleitungen die Information trägt und nicht das Signal gegen Masse.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
* Weblinks für LTspice-Tutorial aufspüren&lt;br /&gt;
&lt;br /&gt;
http://141.69.160.32/~krausg/LTSwitcherCAD/index_LTSwitcherCAD.html&lt;br /&gt;
&lt;br /&gt;
== Zielgruppe / Intension ==&lt;br /&gt;
&lt;br /&gt;
* Erfolgserlebnis bei einem Bastelprojekt mit Blick hinter die Kulissen einer allgegenwärtigen Analogschaltung&lt;br /&gt;
* Guten Auszubildenden zu interessanten Einblicken verhelfen&lt;br /&gt;
* Technikern vertieftes Verständnis bieten&lt;br /&gt;
* Studenten an einer fassbaren Schaltung das Verständnis der Theorie erleichtern&lt;br /&gt;
&lt;br /&gt;
== Forum ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/189566 Thread] für Fragen und Diskussion zum Projekt&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.raumfahrtkommando.de/BPT-Differenzverstaerker.pdf Differenzverstärker mit bipolaren Transistoren], raumfahrtkommando.de&lt;br /&gt;
* [http://wwwex.physik.uni-ulm.de/lehre/physikalischeelektronik/phys_elektr/node110.html Einige Grundschaltungen mit Transistoren], wwwex.physik.uni-ulm.de&lt;br /&gt;
* [http://schmidt-walter.eit.h-da.de/el/skript_pdf/el_17.pdf Elektronik], Prof. Dr.-Ing. Heinz Schmidt-Walter&lt;br /&gt;
* [http://kurcz.at/differenzverstaerker.php Verstärker], Best Of Elektronik&lt;br /&gt;
* [http://www.erckert-ibe.de/all/trainings/circuit_ideas/amplifiers/opamps/opamps.html Operational Amplifiers], Ingenieurbuero Erckert (englisch, verschieden Typen)&lt;br /&gt;
* [http://www.calvin.edu/~pribeiro/courses/engr332/Handouts/ho18opamp.pdf IC Op-Amps Through the Ages] (Geschichte des Operationsverstärkers)&lt;br /&gt;
* Die [http://en.wikipedia.org/wiki/Operational_amplifier#Internal_circuitry_of_741_type_op-amp englischsprachige Wikipedia] erklärt den 741&lt;br /&gt;
&lt;br /&gt;
; Vergleichbare Projekte&lt;br /&gt;
* [http://wwwex.physik.uni-ulm.de/lehre/physikalischeelektronik/phys_elektr/node113.html Standard-Operationsverstärker (VV-OPV)] Aufbau in groben Zügen beschrieben&lt;br /&gt;
* [http://www.dieelektronikerseite.de/Lections/Differenzverstaerker%20-%20Der%20feine%20Unterschied.htm Sehr einfacher Differenzverstärker mit LED-Indikator]&lt;br /&gt;
* [http://www.unibw.de/eit4_1/lehre/analogneu Umfangreiche Simulationen]&lt;br /&gt;
* … (Nach Bedarf ergänzen)&lt;br /&gt;
&lt;br /&gt;
; Informationen zu LTspice auf www.mikrocontroller.net&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Schaltungssimulation#LTspice.2FSwitcherCAD LTspice/SwitcherCAD]&lt;br /&gt;
&lt;br /&gt;
; Vertiefendes zu Operationsverstärkern&lt;br /&gt;
&lt;br /&gt;
* [http://focus.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=slod006b Op Amps for Everyone Design Guide (Rev. B)] (Texas Instruments)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Alesi</name></author>
	</entry>
</feed>