<?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=Eltio</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=Eltio"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Eltio"/>
	<updated>2026-04-10T10:08:40Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Konstantstromquelle&amp;diff=105493</id>
		<title>Konstantstromquelle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Konstantstromquelle&amp;diff=105493"/>
		<updated>2022-10-17T15:30:40Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Alten Link entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine &#039;&#039;&#039;Konstantstromquelle&#039;&#039;&#039; ist eine Schaltung, deren Zweck es ist, den Strom durch eine Last (z.&amp;amp;nbsp;B. eine [[LED]]) möglichst konstant zu halten, das heißt Änderungen des Stroms infolge von Lastwiderstandsänderung durch Variation der Betriebsspannung und/oder des Innenwiderstands entgegen zu wirken.&lt;br /&gt;
&lt;br /&gt;
Es gibt, je nach Erfordernissen unterschiedliche Schaltungen, die zu diesem Zweck eingesetzt werden. Sie unterscheiden sich in ihrer Präzision (d.h. der Regelgenauigkeit und Regelgeschwindigkeit), der erforderlichen Betriebsspannung (wegen der benötigten Spannungsregelreserve) sowie den Kosten aufgrund des jeweiligen Bauteilaufwands.&lt;br /&gt;
&lt;br /&gt;
Es sollen hier nur einige besonders einfache Schaltungen vorgestellt werden.&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konstantstromquelle mit J-FET ==&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
&lt;br /&gt;
Eine sehr einfache Konstantstromquelle lässt sich mit einem [[FET|JFET]] realisieren. Der resultierende Strom ist durch den verwendeten FET bestimmt, dabei wird die Eigenschaft genutzt, dass der JFET selbstleitend ist, also bei einer Gate-Source-Spannung von 0V seinen maximal möglichen Strom leitet und bei ansteigender negativer Gate-Source-Spannung U_GS den Drain-Source-Kanal zunehmend abschnürt. Es werden Bauteile angeboten, bei denen die Verbindung zwischen Gate und Source des FET schon intern vorgenommen wurde (Konstantstromdiode, engl. current regulator diode). Diese werden mit engeren Toleranzen gefertigt und erlauben daher eine genauere Definition des Stroms. Außerdem benötigen diese keinen Widerstand in der Sourceleitung und haben damit weniger Spannungsabfall im Betrieb.&lt;br /&gt;
&lt;br /&gt;
=== Vorteile === &lt;br /&gt;
&lt;br /&gt;
* Großer Betriebsspannungsbereich, nach oben nur durch die maximale Drain-Source-Spannung (V_DS) des FETs und seine maximale Verlustleistung begrenzt.&lt;br /&gt;
* Einfachster Aufbau&lt;br /&gt;
&lt;br /&gt;
=== Nachteile === &lt;br /&gt;
&lt;br /&gt;
* Beeinflussung durch Toleranzen der Fertigungsparameter des FET, typ. +/- 10%&lt;br /&gt;
* hohe Sättigungsspannung über dem FET, typ. 1-3V&lt;br /&gt;
* nur mäßig temperaturstabil&lt;br /&gt;
* selbstleitende FETs für Ströme größer als 30mA sind selten und entsprechend teuer&amp;lt;ref&amp;gt;Es gibt aber einige Depletion-Mode Mosfets mit sehr hohen Sperrspannungen und z.T. auch grösseren Strömen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schaltung ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Konstantstrom.gif]]&lt;br /&gt;
&lt;br /&gt;
=== Weblinks ===&lt;br /&gt;
* [http://www.vishay.com/docs/70596/70596.pdf Vishay AN103 - The FET Constant-Current Source/Limiter]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/sites/slt/0207011.htm ELKO: FET als Konstantstromquelle]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/curr2pol.htm ELKO: Der Transistor-LED-und der FET-Konstantstromzweipol]&lt;br /&gt;
* [[Mosfet-Übersicht#N-Kanal J-FET | Liste von J-FETs]]&lt;br /&gt;
* [http://search.datasheetcatalog.net/key/LM334 LM334] betagter, aber guter IC, programmierbare Konstantstromquelle mit 1µA-10mA, 0,8-1V Spannungsabfall, kann per Transistor auf deutlich größere Ströme erweitert werden.&lt;br /&gt;
&lt;br /&gt;
=== Weblinks ===&lt;br /&gt;
* [http://www.elektronik-kompendium.de/sites/slt/0210253.htm ELKO: Transistor als Konstantstromquelle]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/currled.htm ELKO: Die Transistor-LED-Konstantstromquelle mit ein oder zwei Transistoren und Konstantstromquelle mit Bandgap und Opamp]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/curr2pol.htm ELKO: Der Transistor-LED-und der FET-Konstantstromzweipol]&lt;br /&gt;
* [http://www.ferromel.de/tronic_6.htm Verschiedene Konstantstromquellen mit Beschreibung]&lt;br /&gt;
* [http://www.elexs.de/kap5_9.htm Konstantstromquelle bei ELEXS]&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konstantstromquelle mit bipolaren Transistoren ==&lt;br /&gt;
[[Datei:Ksq.png|thumb|right|231px|U&amp;lt;sub&amp;gt;BE&amp;lt;/sub&amp;gt;-Konstantstromquelle]]&lt;br /&gt;
Die auch als U&amp;lt;sub&amp;gt;BE&amp;lt;/sub&amp;gt;-Konstantstromquelle bekannte Stromquelle funktioniert folgendermaßen:&lt;br /&gt;
Über R2 wird ein Strom in die Basis von T1 eingespeist, dadurch fließt in T1 ein Kollektorstrom, welcher gleichzeitig der Laststrom ist, welcher konstant gehalten werden soll. Die Summe aus Kollektor- und Basisstrom von T1 fließt durch R1 und erzeugt über ihm einen Spannungsabfall. Wenn die Spannung über R1 die Basis-Emitter-Flußspannung von T2 überschreitet (ca. 0,7V), beginnt ein Kollektorstrom durch T2 zu fließen. Dadurch fließt ein Teil des Basisstroms von T1 in den Kollektor von T2 ab. Da der Basisstrom von T1 nun nicht weiter ansteigen kann, weil jeder Zuwachs als Kollektorstrom von T2 abfließt, bleibt der Strom durch R1 und damit auch die Last konstant. So stellt sich diese Schaltung auf eine konstante BE-Spannung von ca. 0,7V über R1 ein, je nach verwendetem Transistor. R1 berechnet sich daher wie folgt:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
R1 &amp;amp; = \frac{U_{BE,T2}}{I_{\text{soll}}} = \frac{0.7\text{V}}{I_{\text{soll}}}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R2 wird so ausgelegt, dass T1 grundsätzlich sättigen kann. Siehe dazu [[Basiswiderstand]]. Ein guter Richtwert bei 5V Vcc ist 4,7kΩ. Anstatt &#039;&#039;&#039;T2&#039;&#039;&#039; kann auch eine Leuchtdiode verwendet werden, dazu den Basisanschluss weglassen. Die LED leuchtet auf, wenn die Stromquelle regelt, und verlischt bei Leerlauf. So lassen sich einfache Konstantstrom-Ladegeräte mit Kontrollanzeige aufbauen. Eine temperaturstabile Präzisions-Stromquelle entsteht durch Ersetzen von &#039;&#039;&#039;T2&#039;&#039;&#039; durch einen TL431[http://www.mikrocontroller.net/part/TL431].&lt;br /&gt;
&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
* Gut bei niedriger Betriebsspannung, da Schaltung bereits mit kleiner Restspannung am Transistor T1 läuft und die Regelung auch dann erfolgt, wenn nur noch wenige hundert mV zwischen Kollektor und Emitter des Transistors T1 anliegen.&lt;br /&gt;
:: &amp;lt;math&amp;gt;U_{BE,T2}+U_{CE,T1} \approx 0{,}65\,\text{V}+0{,}15\,\text{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Einfachster Aufbau mit Standardbauteilen, d.h. kann aus Resten aus der Bastelkiste aufgebaut werden&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
* Nicht temperaturkompensiert, der Strom schwankt um ca. 0,26%/K&lt;br /&gt;
:: &amp;lt;math&amp;gt;\frac{\Delta U_{BE}}{R1} \quad\text{ mit }\quad \Delta U_{BE} \left(\Delta\vartheta\right) \approx -1{,}7 \,\frac{\text{mV}}{\text{K}} \cdot \Delta\vartheta&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Datei:Ksq_2T_sim.svg|thumb|right|300px|Analyse bei steigender Versorgungsspannung]]&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Konstantstromquelle mit Operationsverstärker und Transistor ==&lt;br /&gt;
&lt;br /&gt;
=== Darlingtontransistor ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ksq_opv.png|thumb|right|Konstantstromquelle mit OPV und Bipolartransistor]]&lt;br /&gt;
&lt;br /&gt;
Der Strom, welcher konstant gehalten werden soll, wird durch R1 gemessen (Shunt). Nachteilig ist, dass der Basisstrom von T1 nicht durch die Last fließt, aber durch R1 und somit die Konstantstromregelung verfälscht. Als Gegenmaßnahme nutzt man einen Darlingtontransistor mit sehr hoher Stromverstärkung von 1000 und mehr, was bedeutet, dass der verfälschende Basisstrom nur noch 1 Promille Fehler verursacht. Der OPV arbeitet als Spannungsfolger und versucht, die Spannung am - Eingang so groß wie am + Eingang zu halten. Ist z.B. die Spannung am - Eingang etwas kleiner als am + Eingang (Bruchteile von mV!), dann steigt die Ausgangsspannung des OPV um einige mV und erhöht damit die Basis-Emitter-Spannung von T1 und damit den Basisstrom. Dadurch fließt ein höherer Kollerktorstom, welcher wiederum einen höheren Spannungsabfall über R1 verursacht, bis die Spannungen am - und + Eingang des OPV wieder absolut gleich sind (die Offsetspannung wird hier zunächst vernachlässigt). Die Beispielschaltung hier ist bei ausreichender [[Kühlkörper|Kühlung]] für T1 für ca. 1A brauchbar. Der Strom wird mit 0-100mV eingestellt. Der [[Basiswiderstand]] R2 wird nicht klassisch berechnet, da er hier eine etwas andere Funktion hat. Er dient mehreren Zwecken:&lt;br /&gt;
* Strombegrenzung des OPV im Extremfall, wenn die Last am Kollektor nicht angeschlossen ist. Dann versucht der OPV mit maximaler Ausgangsspannung den Strom durch R2 zu treiben, schafft das aber nicht.&lt;br /&gt;
* Verringerung der Verstärkung des Regelkreises. Damit kann man je nach Schaltung und OPV den Regelkreis stabil bekommen, falls er schwingt. Das ist auch von der internen Kompensation des OPVs abhängig und kann sehr verschieden sein.&lt;br /&gt;
* Schutz des OPV-Ausgangs im Fall der Überlastung von T1. Sollte dieser wegen Überlastung, Überspannung etc. kaputt gehen, so kann die Kollektorspannung an den OPV-Ausgang gelangen und diesen zerstören. Durch R2 wird der Strom begrenzt und damit eine Zerstörung verhindert.&lt;br /&gt;
Die Dimensionierung ist ein Kompromiss dieser drei Aufgaben, wobei man entscheiden muss, welche wichtiger ist. Um den den optimalen Wert zu finden, muss man meist auch einige Versuche durchführen. &lt;br /&gt;
Wichtig sind R3 und C1. In vielen Schaltungen im Internet fehlen sie, die Spannung über R1 geht direkt an den - Eingang des OPV. Das ist aber falsch und funktioniert oft nur durch Zufall. Denn R3 und C1 sind wichtig für die Frequenzgangkompensation des OPV. Die Schaltung ist ein [http://de.wikipedia.org/wiki/Regelkreis Regelkreis] und diese sind für notorische Instabilitäten bekannt, d.h. sie schwingen. Durch Rechnung oder Probieren muss der richtige Wert für R3 und C1 gefunden werden, bei denen die Stromquelle ausreichend schnell reagiert ohne zu schwingen. Testen kann man das u.a. dadurch, dass man einen Sprung auf den Eingang gibt, z.B. mit einem Funktionsgenerator oder einfach einem NE555 als Taktgeber. Dabei beobachtet man die Spannung über R1 mit dem Oszilloskop, ggf. auch am Ausgang des OPV. Hier sieht man wie schnell die Stromquelle reagiert und ob sie schwingt.&lt;br /&gt;
&lt;br /&gt;
Vorteile&lt;br /&gt;
* Große Ströme können sehr genau und schnell geregelt werden, nur durch T1 und dessen Kühlung begrenzt&lt;br /&gt;
* einfacher Aufbau mit Standardkomponenten&lt;br /&gt;
* wird oft als Stromregler in elektronischen Lasten benutzt&lt;br /&gt;
Nachteile&lt;br /&gt;
* hohe Verlustleistung bei kleinen Lastwiderständen und hoher Betriebsspannung (lineare Stromquelle)&lt;br /&gt;
* nur Einquadrantenbetrieb möglich&lt;br /&gt;
&lt;br /&gt;
=== Kompensierter Basisstrom ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ksq_opv_precision.png|thumb|right|Konstantstromquelle mit OPV und Bipolartransistor, Basisstrom kompensiert]]&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man mit gerade mal zwei clever platzierten Widerständen den Fehler des Basisstroms nahezu vollständig kompensieren, wie es in diesem [http://www.edn.com/design/power-management/4318484/Error-compensation-improves-bipolar-current-sinks Artikel] in [http://m.eet.com/media/1128969/12734-figure_3.pdf Figure 3] dargestellt ist. Das hat den Vorteil, dass man einfache Bipolartransistoren nutzen kann, welche deutlich höhere Grenzfrequenzen als Darlingtons aufweisen. Damit die Schaltung funktioniert, müssen die Widerstände 1% Toleranz haben und folgende Dimensionierungen eingehalten werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{R2}{R1} =\frac{R5}{R4}, R3=R4, R5=R6, R5&amp;gt;&amp;gt;R4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R1 und R2 werden durch den zu regelnden Strom bestimmt und sind eher klein. Die Widerstände R3-R6 bilden eine Brückenschaltung, die nur im ausgeregelten Zustand  praktisch 0V Brückenspannung hat. Bei einem Stromverstärkungsfaktor von Q1 von z.B. 25 mit 4% Fehler im Kollektorstrom erreicht man eine Reduktion um ca. Faktor 100 auf 0,04%, was einem scheinbaren Stromverstärkungsfaktor von 2500 entspricht! Eingangswiderstände an beiden OPV-Eingängen (R3, R4) sind gleich, damit werden Offsetfehler durch den Eingangsstrom kompensiert.&lt;br /&gt;
&lt;br /&gt;
=== MOSFET ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ksq_opv_mosfet.png|thumb|right|Konstantstromquelle mit OPV und N-Kanal-MOSFET]]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist die Verwendung eines MOSFET, dieser hat Gateströme (Leckströme) im Bereich von unter einem Mikroampere. Dieser Fehler fällt bei 99,9% der Anwendungen nicht ins Gewicht. Prüfen sollte man dabei, dass der MOSFET für [[FET#Linearbetrieb_von_MOSFETs | Linearbetrieb]] geeignet ist, denn das sind viele Hochleistungs-MOSFETs nicht! Hier wird noch ein zusätzlicher Widerstand vor dem Gate des MOSFETs geschaltet, um die hohe Kapazität des Gates vom OPV-Ausgang zu entkoppeln, welche viele OPVs wieder instabil machen würde. Der Nachteil des MOSFETs sind seine relativ hohen Eingangs- und Ausgangskapazitäten, welche bei höheren Frequenzen Probleme machen bzw. dort den Ausgangswiderstand vermindern.&lt;br /&gt;
&lt;br /&gt;
=== Weblinks ===&lt;br /&gt;
*Analog by Design Show - Hosted by Bob Pease&lt;br /&gt;
** [http://www.youtube.com/watch?v=411f0DvXu18 Konstantstromquellen]&lt;br /&gt;
** [http://www.youtube.com/watch?v=2N6cjGS7lUE Präzise 1A Konstantstromquelle ]&lt;br /&gt;
&lt;br /&gt;
== Stromspiegel als Konstantstromquelle ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Stromspiegel als Konstantstromquelle.svg|miniatur|Stromspiegel mit Widerstand]]&lt;br /&gt;
Bei stabiler Versorgungsspannung eignet sich ein Stromspiegel mit Widerstand als Spannungs-Stromwandler und findet sich beispielsweise in älteren Operationsverstärkern wie dem LM741. Das Konzept des Stromspiegels wird an dieser Stelle nicht weiter erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Widerstände R2 und R3 reduzieren die Auswirkungen von Bauteiltoleranzen und den Temperaturdrift. Als grober Richtwert sollte deren Spannungsabfall 0,2 V oder mehr betragen. T1 und T2 sind identische Transistortypen (z.B. BC557B), die idealerweise von einer Bauteilrolle stammen.&lt;br /&gt;
&lt;br /&gt;
Bei geeigneter Wahl von R2 und R3 oder Parallelschaltung von Transistoren wird aus dem Stromspiegel ein Stromvervielfacher. Bei gleichen Transistoren und gleichen Widerständen entsteht ein 1:1 Stromspiegel.&lt;br /&gt;
&lt;br /&gt;
Berechnung:&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung U&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; und der gewünschte Strom I sind bekannt&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_{ref} = \frac{U_B - 0{,}65 V}{R1+R2}&amp;lt;/math&amp;gt; (Ausgangsformel)&lt;br /&gt;
:&amp;lt;math&amp;gt;R3 = R2&amp;lt;/math&amp;gt; (1:1 Stromspiegel)&lt;br /&gt;
:&amp;lt;math&amp;gt;I = I_{ref}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;R1 + R2 = R_g = \frac{U_B - 0{,}65 V}{I}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;U_{R2} \approx 0{,}2 V&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;R2 = \frac{U_{R2}}{I}=\frac{0{,}2 V}{I}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;R1 = R_g - R2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
* wenige, günstige Bauteile&lt;br /&gt;
* sehr einfache Konstruktion&lt;br /&gt;
* mäßiger Spannungsabfall (ca. 1V)&lt;br /&gt;
* schnell, da keine ausgeprägte Rückkopplung vorhanden&lt;br /&gt;
* zur Stromsenke umformbar (Überkopf stellen und npn-Typen verwenden)&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
* geringer Wirkungsgrad, doppelt wegen Referenzstrom&lt;br /&gt;
* mäßig hoher Quellenwiderstand (einfacher Stromspiegel)&lt;br /&gt;
&lt;br /&gt;
== PTAT-Konstantstromquelle ==&lt;br /&gt;
&lt;br /&gt;
:→ siehe  [[PTAT-Stromquelle]]&lt;br /&gt;
&lt;br /&gt;
== Konstantstromquelle mit Linearreglern ==&lt;br /&gt;
&lt;br /&gt;
=== Grundschaltung mit LM317 ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:LM317_constant_current.png|thumb|right|280px|Konstantstromquelle mit LM317]]&lt;br /&gt;
&lt;br /&gt;
Eine sehr einfache, günstige und doch genaue Konstantstromquelle kann mittels LM317 aufgebaut werden (R_1 = 1,25 V / I_out). Für einen LED-Strom von 20mA ist ein R1 von 62,5 Ω erforderlich, praktisch wird man 68Ω wählen. Dabei ist zu beachten, daß die Eingangsspannung &#039;&#039;V&#039;&#039;&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; mindestens 3,5V + &#039;&#039;U&#039;&#039;&amp;lt;sub&amp;gt;f,LED&amp;lt;/sub&amp;gt; ([[LED#Flußspannung|Flußspannung der LED]]) betragen muss.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
==== Vorteile ====&lt;br /&gt;
&lt;br /&gt;
* temperaturstabil&lt;br /&gt;
* sehr wenige, billige Bauteile&lt;br /&gt;
&lt;br /&gt;
==== Nachteile ====&lt;br /&gt;
&lt;br /&gt;
* Überschwinger beim Einschalten können vorkommen, so dass sensible Lasten zerstört werden können.&lt;br /&gt;
* Hoher Spannungsabfall über der Schaltung von mind. 3,5V&lt;br /&gt;
* Verlustleistung&lt;br /&gt;
:: &amp;lt;math&amp;gt;PV_\text{LM317} = I_\text{out}\cdot (V_\text{in}- U_\text{f,LED} -1,25\,\mathrm V)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Abhängig vom Gehäuse ist bei höheren Eingangsspannungen ein [[Kühlkörper]] am LM317 nötig:&lt;br /&gt;
** TO220: 1W&lt;br /&gt;
** TO92: 500mW&lt;br /&gt;
** SO-8: 600mW&lt;br /&gt;
* Bei niedrigen Strömen unter 3.5 mA ungenau (min. Load Current 3.5 mA laut Datenblatt)&lt;br /&gt;
&lt;br /&gt;
==== Schrittweise einstellbare Variante ====&lt;br /&gt;
&lt;br /&gt;
Eine schrittweise voreinstellbare Variante der Grundschaltung wurde 2008 von einem Mitarbeiter von National Semiconductor (Hersteller des LM317) im EDN-Magazin vorgestellt: [http://m.eet.com/media/1132369/14758-figure_1.pdf  Programmable current source requires no power supply]. Dabei ist hier mit &#039;&#039;programmable&#039;&#039; manuell voreinstellbar gemeint, nicht Mikrocontroller-gesteuert. Auch der Teil des Titles &#039;&#039;requires no power supply&#039;&#039; ist irreführend. Die Konstantstromquelle benötigt sehr wohl eine externe Stromversorgung. Die Schaltung benötigt lediglich keine zusätzlichen Hilfsspannungen, entspricht sie doch der oben genannten Grundschaltung.&lt;br /&gt;
&lt;br /&gt;
Mittels dreier 0−9 BCD-Schalter werden geschickt gewählte Widerstände zwischen ADJ und OUT parallel geschaltet. Die Widerstände sind so gewählt, dass der erste Schalter mit seinen zehn Stellungen und Widerständen zwischen 0 mA und 9 mA in 1 mA Schritten zum Gesamtstrom beiträgt, der zweite 0 mA bis 90 mA in 10 mA Schritten und der dritte 0 mA bis 900 mA in 100 mA Schritten. &lt;br /&gt;
&lt;br /&gt;
In dieser Kombination ergibt das eine einstellbare Konstantstromquelle bis 999 mA in 1mA-Schritten bei rund 2% Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
Insgesamt werden &lt;br /&gt;
&lt;br /&gt;
* 45 Widerstände, alle 1%, 1/4 W&lt;br /&gt;
** 15 × 1,24 kΩ&lt;br /&gt;
** 15 × 124 Ω&lt;br /&gt;
** 15 × 12,4 Ω&lt;br /&gt;
* ein LM317&lt;br /&gt;
* drei 0−9 BCD-Schalter und&lt;br /&gt;
* Gehäusematerial (Gehäuse, Kühlkörper für den LM317, Polklemmen, ...)&lt;br /&gt;
benötigt.&lt;br /&gt;
&lt;br /&gt;
Der LM317 wird bei dieser einstellbaren Stromquelle gerade noch innerhalb seiner Spezifikation betrieben - wenn man den Spannungsabfall über ihn gering hält. Im Stromquellen-Beispiel im Datenblatt wird ein maximaler Widerstand von 120 Ω genannt, wohingegen die einstellbare Stromquelle bis zu 1,24 kΩ (nominell 1 mA Ausgangsstrom) und ∞ Ω (offen, nominell 0 mA Ausgangsstrom) verwendet. Mit etwas Geduld kann man aus dem Datenblatt herauslesen, dass 1,24 kΩ gerade noch ausreichen, damit die Regelung des LM317 nicht aussetzt. Dies findet man im Datenblatt in der Grafik &#039;&#039;Minimum Operating Current&#039;&#039; und im Beispiel &#039;&#039;1.2V-20V Regulator with Minimum Program Current&#039;&#039;. Mit ∞ Ω ist man definitiv außerhalb des Arbeitsbereiches.&lt;br /&gt;
&lt;br /&gt;
Der Strom bei der Einstellung 000 mA (Widerstand → ∞ Ω, d.h. offen) entspricht nicht 0,0 mA, sondern dem Strom aus dem ADJ-Anschluss für den nicht spezifizierten Fall, dass der LM317 außerhalb seines Arbeitsbereiches betrieben wird. Die im Datenblatt angegebenen 50 µA (typ.), 100 µA (max.) für den Arbeitsbereich können dabei je nach Exemplar überschnitten werden und sind nicht konstant. &lt;br /&gt;
&lt;br /&gt;
Die Messung an neueren Chargen (gefertigt nach 2006) des LM317 diverser Hersteller zeigt, dass auch 1mA nicht sicher erreichbar sind. Es ist vielmehr so, das diese KSQ erst korrekt ab 003 mA bis hoch zu den 999 mA funktioniert. Das heißt konkret, die Einstellungen 000 mA, 001 mA und 002 mA sind nicht mehr stromstabilsiert. Das sollte man beachten, sofern man unbedingt den LM317 bei sehr kleinen Strömen einsetzen möchte.&lt;br /&gt;
&lt;br /&gt;
In der Praxis lohnt es sich besonders bei kleinen Strömen ein Strommessgerät in Reihe zu schalten. Dabei ist Vorsicht bei billigen Multimetern geboten&amp;lt;ref&amp;gt;Bei billigen Multimetern ist auch aus anderen Gründen immer Vorsicht geboten. Siehe [http://gps.sozialnetz.de/global/show_document.asp?id=aaaaaaaaaaaajxn Schwerpunktaktion „Handmultimeter“ der hessischen Marktüberwachung ...]&amp;lt;/ref&amp;gt;. Deren niedrige Strommessbereiche sind häufig mit einer 200 mA oder 250 mA Schmelzsicherung abgesichert. Schaltet man die Stromquelle versehentlich über 200 mA, beziehungsweise 250 mA, ist ein Sicherungswechsel fällig.&lt;br /&gt;
&lt;br /&gt;
==== Weblinks ====&lt;br /&gt;
&lt;br /&gt;
* National Semiconductor Datenblatt [http://www.national.com/ds/LM/LM117.pdf LM117/LM317A/LM317 3-Terminal Adjustable Regulator]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/konstantstrom.php Passenden Widerstand für Konstantstromschaltung mit LM317 berechnen]&lt;br /&gt;
* [http://www.lumitronixforum.de/viewtopic.php?t=2611&amp;amp;highlight=lm317 Einfachste Konstantstromquelle mit dem LM317]&lt;br /&gt;
* [http://www.umnicom.de/Elektronik/Schaltungssammlung/Strom/Quelle/Stromquelle.html Konstantstromquelle bis 3A mit LM2576](Link nicht verfügbar)&lt;br /&gt;
*[http://www.edn.com/contents/images/6566536.pdf Programmable current source requires no power supply](Link nicht verfügbar)&lt;br /&gt;
*[https://www.edn.com/programmable-current-source-requires-no-power-supply/ Programmable current source requires no power supply](Ersatz für vorstehenden Link)&lt;br /&gt;
&lt;br /&gt;
==== Preise ====&lt;br /&gt;
&lt;br /&gt;
; LM317:&lt;br /&gt;
* TO3: 1,90 €&lt;br /&gt;
* TO-220: &amp;lt; 0,25 €&lt;br /&gt;
* TO-92: &amp;lt; 0,15 €&lt;br /&gt;
* SO-8: &amp;lt; 0,20 €&lt;br /&gt;
&lt;br /&gt;
=== Andere Linearregler ===&lt;br /&gt;
&lt;br /&gt;
Der zuvor beschriebene LM317 eignet sich besonders gut als Stromquelle, da er seine Regelspannung auf der &#039;high-side&#039; erwartet (1,25 V zwischen Vout und ADJ) und man den Regelpfad als Konstantstrompfad missbrauchen kann (ADJ als Ausgang nach GND, wobei der Strom über den Widerstand und nicht von ADJ geliefert wird)).&lt;br /&gt;
&lt;br /&gt;
==== Mittels Shunt und Messverstärker ====&lt;br /&gt;
&lt;br /&gt;
Die meisten anderen Linearregler messen ihre Regelspannung im Bezug auf GND. Um einen solchen Regler als Konstantstromquelle zu benutzen, kann man einen Stromsensor und einen Messverstärker verwenden. Letzterer steuert dann die Regelung des Linearreglers. Maxim hat in [http://www.maxim-ic.com/app-notes/index.mvp/id/921] ein Beispiel veröffentlicht, das so oder so ähnlich auch mit anderen Linearreglern funktioniert. Maxim misst den Strom auf der Eingangsseite. Vorteil: der Innenwiderstand des Ausgangs des Linearreglers wird durch den Messwiderstand nicht erhöht. Nachteil: Der Eigenverbrauch des Linearreglers wird mitgemessen.&lt;br /&gt;
&lt;br /&gt;
Man kann den Strom auch auf der Ausgangsseite messen.&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip funktioniert für Schaltregler, siehe zum Beispiel [[#LM2576_Step_Down| LM2576 Step Down]] auf dieser Seite.&lt;br /&gt;
&lt;br /&gt;
==== Im Regelpfad - High-Side ====&lt;br /&gt;
&lt;br /&gt;
              .-----------.&lt;br /&gt;
 VCC       IN |           | OUT&lt;br /&gt;
  ------------o           o------&amp;gt;----.&lt;br /&gt;
              |           |      I    |                 |&lt;br /&gt;
              |           |           |                 |&lt;br /&gt;
              |           |          .-.                |&lt;br /&gt;
              |           |          | |                |&lt;br /&gt;
              |           |          | |  Rload, R1     |&lt;br /&gt;
              |           |          &#039;-&#039;                |&lt;br /&gt;
              |           |           |                 |&lt;br /&gt;
              |           | FB        |                 |&lt;br /&gt;
              |           o------&amp;lt;----o                 |Vout&lt;br /&gt;
              |           |    Iref   |        |        |&lt;br /&gt;
              |           |           |        |        |&lt;br /&gt;
              |           |          .-.       |        |&lt;br /&gt;
              |           |          | |       | Vref   |&lt;br /&gt;
              |           |          | |  R2   |        |&lt;br /&gt;
              &#039;-----o-----&#039;          &#039;-&#039;       |        |&lt;br /&gt;
                    | GND             |        |        |&lt;br /&gt;
                    |                 |        |        |&lt;br /&gt;
                   ===               ===       v        v&lt;br /&gt;
                   GND               GND&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                             Iref &amp;lt;&amp;lt; I&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die meisten einstellbaren Linearregeler werden durch einen Spannungsteiler (R&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;) zwischen Ausgangsspannung (V&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;) und Masse (GND) eingestellt. Der Spannungsteiler wird dabei so dimensioniert, dass eine vorgegebene Spannung V&amp;lt;sub&amp;gt;ref&amp;lt;/sub&amp;gt; (meist 1,25 V) gegen GND an der Anzapfung des Spannungsteilers abfällt, die dann zum Regeleingang des Linearreglers geführt wird. Dabei wird üblicherweise angenommen, dass der Strom I&amp;lt;sub&amp;gt;ref&amp;lt;/sub&amp;gt; in den Regler hinein vernachlässigbar ist.&lt;br /&gt;
&lt;br /&gt;
Dann gilt für den Strom I im Spannungsteiler:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I = I_{R_1} = I_{R_2} = \frac{V_\text{out}}{R_1 + R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_{R_2} = \frac{V_\text{ref}}{R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Strom I im Spannungsteiler ist somit alleine durch Wahl von R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; bestimmt und unabhängig von R&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; bei vorgegebenem R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ersetzt man daher R&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; durch die Last, so erzeugt der Linearregler durch Steuerung von V&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt; einen konstanten Strom&lt;br /&gt;
&lt;br /&gt;
:{|cellpadding=&amp;quot;2&amp;quot; style=&amp;quot;border:2px solid #ccccff&amp;quot;&lt;br /&gt;
|&amp;lt;math&amp;gt;I = \frac{V_\text{ref}}{R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
durch die Last.&lt;br /&gt;
&lt;br /&gt;
Dabei muss man die Grenzen des Linearreglers beachten:&lt;br /&gt;
&lt;br /&gt;
Der maximale Strom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;max&amp;lt;/sub&amp;gt; des Reglers darf nicht überschritten werden. Damit die Annahme gilt, dass der Reglerstrom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;ref&amp;lt;/sub&amp;gt; gegenüber dem Strom &#039;&#039;I&#039;&#039; im Spannungsteiler vernachlässigbar ist muss R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; klein gegenüber dem Innenwiderstand des Regeleingangs sein. Dass bedeutet, dass R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; so zu wählen ist, dass immer gilt:&lt;br /&gt;
&lt;br /&gt;
:{|cellpadding=&amp;quot;2&amp;quot; style=&amp;quot;border:2px solid #ccccff&amp;quot;&lt;br /&gt;
|&amp;lt;math&amp;gt;\frac{V_\text{ref}}{I_\text{max}} \leqq R_2 \ll R_\text{in,ref} = \frac{V_\text{ref}}{I_\text{ref}}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es muss ein Minimalstrom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;min&amp;lt;/sub&amp;gt; durch den Spannungsteiler fließen, damit die Regelung nicht aussetzt. Für diesen Strom gilt gegenüber dem Regelstrom &#039;&#039;I&#039;&#039;&amp;lt;sub&amp;gt;ref&amp;lt;/sub&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_\text{min} = \frac{V_\text{out,min}}{R_1 + R_2} \gg I_\text{ref}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;V_\text{out,min} = V_\text{ref}\,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
folgt&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_1 \ll \frac{V_\text{ref}}{I_\text{ref}} - R_2 = R_\text{in,ref} - R_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Angenähert:&lt;br /&gt;
&lt;br /&gt;
:{|cellpadding=&amp;quot;2&amp;quot; style=&amp;quot;border:2px solid #ccccff&amp;quot;&lt;br /&gt;
|&amp;lt;math&amp;gt;R_\text{load} \approx R_1 \ll \frac{V_\text{ref}}{I_\text{ref}}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Neben diesen Einschränkungen ist auch zu beachten, dass Die Last R&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; auf der High-Side hängt und nicht gegen GND.&lt;br /&gt;
&lt;br /&gt;
== Konstantstromquelle mit Schaltregler ==&lt;br /&gt;
Am günstigsten erscheinen Tiefsetzsteller (StepDown-Schaltregler), die mit einer großen Drossel im nichtlückenden Bereich arbeiten. Dann ist der Strom-Ripple (Wechselspannungsanteil) durch die Induktivität und Schaltfrequenz vorgegeben. Ein weiteres Glätten des Stromes ist dann gar nicht mehr erforderlich. Es sind nahezu beliebig große Gleichströme bereitstellbar.&lt;br /&gt;
=== MC34063, Step Up ===&lt;br /&gt;
==== Beschreibung ====&lt;br /&gt;
&lt;br /&gt;
Der Ausgangsstrom beträgt 1,25V/Rx. Die Stromquelle ist &#039;&#039;&#039;nicht&#039;&#039;&#039; kurzschlussfest. Der Widerstand Rsc dient der Strombegrenzung der einzelnen Strompulse (Schaltregler), was u.a. einen gewissen Überlastschutz für den MC34063 darstellt. Rsc = 0.3/I_max, wobei I_max der maximale Pulsstrom ist und dieser kleiner 1.5A sein muss, weil der IC nicht mehr hergibt. In den meisten Anwendungen nimmt man hier 0,22Ω oder mehr. Das Ganze kann man z.&amp;amp;nbsp;B. für mehrere LEDs in Reihe verwenden um diese mit 5V oder mit 4x 1,5V Batterien zu betreiben. Die Schaltung wird durch Einfügen der Z-Diode D2 und des Widerstands R1 leerlauffest. Dabei wird im Leerlauf nur eine geringe Verlustleistung in der Z-Diode umgesetzt, weil diese durch den Trick mit R1 schon bei sehr kleinen Strömen der Regelung den Sollstrom vortäuscht (R1 wirkt wie ein 1k Shunt, der schon bei 1,25mA die volle Nennspannng am Eingang CII erreicht). Die maximale Ausgangsspannung im Leerlauf wird mit der Z-Diode eingestellt und sollte unter 40V liegen, mehr Sperrspannung verträgt der Schalttransistor im IC nicht. Aufgrund des Elkos am Ausgang ist die Stromquelle recht träge, d.h. schnelle PWM mit hohen Frequenzen ist eher nicht möglich. Achtung! Es darf keine LED oder ähnliches im laufenden Betrieb angeschlossen werden, weil sich dann zuerst einmal der Ausgangskondensator C2 in die LED pulsartig entlädt und die LEDs damit schädigt oder gar zerstört! Die Last muss immer vor dem Einschalten angeschlossen werden!&lt;br /&gt;
Die Bauteilwerte sind alle relativ unkritisch. Je nach Betriebsspannung sind die Bauteilwerte etwas anzupassen um den optimalen Wirkungsgrad und die beste Leistung zu erzielen. Die eingezeichneten Bauteilwerte sind für geringe Ströme (&amp;lt;100mA) und Eingangsspannungen zwischen 5 und 15V ausgelegt. R2 sollte bei hohen Spannungen vergrößert werden. Wie man die Werte genau berechnet, steht in der Application Note AN920/D.&lt;br /&gt;
http://www.onsemi.com/pub/Collateral/AN920-D.PDF&lt;br /&gt;
&lt;br /&gt;
Stromquellen sollten grundsätzlich &#039;&#039;keinen&#039;&#039; Ausgangselko aufweisen! Wie die Schaltregler-Schaltung dann stabil arbeitet muss gesondert herausgefunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Schaltung ====&lt;br /&gt;
&lt;br /&gt;
[[Bild:mc34063_constant_current.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Vorteile ====&lt;br /&gt;
* überschüssige Spannung wird nicht verheizt&lt;br /&gt;
&lt;br /&gt;
==== Nachteile ====&lt;br /&gt;
* nicht kurzschlussfest&lt;br /&gt;
* träge beim Einschalten&lt;br /&gt;
&lt;br /&gt;
=== MC34063, Step Down ===&lt;br /&gt;
==== Beschreibung ====&lt;br /&gt;
&lt;br /&gt;
Die Step-Down Version funktioniert im Prinzip genauso wie die normale, lineare Konstantstromquelle, nur dass die ungenutzte Spannung nicht sinnlos verheizt wird. Der Ausgangsstrom beträgt 1,25V/Rx. Die Eingangsspannung muss mindestens 2V größer sein als die Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
Diese Version ist auch ohne die Z-Diode leerlauffest. Kurzschlussfest wird sie durch Rsc. Allerdings entlädt sich der Elko erstmal in die Last, wenn man diese im Betrieb anklemmt. Dadurch kann die Last und der MC34063 beschädigt werden, der Widerstand R1 verhindert aber letzteres.&lt;br /&gt;
&lt;br /&gt;
Bei der Step-Down Version kann man die Elkos etwas kleiner machen, als bei der Step-Up Version, da der Stromfluss durch die Spule in die Last nahezu konstant ist. Wenn man die Spule vergrößert, wird der Strom gleichmäßiger und man kann die Elkos verkleinern. Allerdings wird der Wirkungsgrad aufgrund des höheren Gleichstromwiderstands der Spule schlechter und die Schaltung reagiert langsamer auf Laständerungen. Wie immer ist es also ein Kompromiss zwischen Wirkungsgrad, Kosten und Bauteilgröße.&lt;br /&gt;
&lt;br /&gt;
Konstantstromregler sollten grundsätzlich &#039;&#039;keinen&#039;&#039; Ausgangskondensator haben, weil dieser den gewünschten Regeleffekt zunichte macht. Wie die Rückführung zum Regelverstärker im Schaltregler regelschwingungsfrei gemacht wird muss dann gesondert herausgefunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Schaltung ====&lt;br /&gt;
&lt;br /&gt;
[[Bild:mc34063_constant_current_2.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Vorteile ====&lt;br /&gt;
* überschüssige Spannung wird nicht verheizt&lt;br /&gt;
* leerlauf &lt;br /&gt;
* kurzschlussfest&lt;br /&gt;
&lt;br /&gt;
==== Nachteile ====&lt;br /&gt;
* träge beim Ausschalten&lt;br /&gt;
&lt;br /&gt;
Besser ist hier eine [[Konstantstromquelle fuer Power LED]].&lt;br /&gt;
&lt;br /&gt;
=== LM2576 Step Down ===&lt;br /&gt;
In einem [http://www.mikrocontroller.net/topic/97838#new Beitrag] im Forum  wird folgende [http://www.mikrocontroller.net/attachment/34179/current_source.pdf Schaltung] genannt. Der vollständige Artikel ist [http://www.edn.com/Home/PrintView?contentItemId=4342728 hier] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Konstantstromquelle mit Komparatoren ==&lt;br /&gt;
=== Einfache Abwärtswandlung (Vout &amp;lt; Vin)===&lt;br /&gt;
&lt;br /&gt;
==== Beschreibung ====&lt;br /&gt;
&lt;br /&gt;
Diese Schaltung wurde eigentlich für 1W LEDs entworfen, kann aber sicherlich auch anderweitig verwendet werden. Sie ähnelt sehr der eines vollintegrierten Schaltreglers wie MC34063 oder LM2576, ohne jedoch einen solchen zu verwenden.&lt;br /&gt;
Der Komparator vergleicht den Spannungsabfall über einem Shunt mit dem einer Referenzspannungsquelle. Ist die Spannung über dem Shunt zu groß, so schaltet er ab und der P-Kanal MOSFET sperrt. Umgekehrt, ist die Spannung über dem Shunt kleiner als die Referenzspannung, leitet der P-FET. Q4 arbeitet als [[Konstantstromquelle]] und sorgt dafür, dass die Gateansteuerung auch bei unterschiedlichen Versorgungsspannungen immer gleich bleibt. Die Referenzspannung von 100mV wird hier einfach durch eine Z-Diode und einen Spannungsteiler eingestellt. Für D4 muss eine schnelle Diode eingesetzt werden, entweder eine Schottkydiode oder schnelle Siliziumdiode! Q2 und Q3 dienen als sehr einfacher [[FET|MOSFET]]-[[Treiber]]. D3 ist nur aus Sicherheitsgründen vorhanden, um die Gate-Source Spannung des MOSFETs zu begrenzen, sie kann ggf. auch weggelassen werden. Über den Anschluß PWM kann ein invertiertes [[PWM]]-Signal zur Dimmung eingespeist werden. Hierbei muss das PWM-Signal im HIGH-Zustand größer als ca. 1V sein, ein einfaches 3,3V oder 5V Logiksignal ist also voll OK.&lt;br /&gt;
&lt;br /&gt;
Der Ausgangsstrom kann durch Veränderung von R1 eingestellt werden. Der Wert kann einfach über die Formel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{aus}=\frac{V_{Ref}}{R1} = \frac{100mV}{R1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bestimmt werden.&lt;br /&gt;
&lt;br /&gt;
==== Schaltung ====&lt;br /&gt;
&lt;br /&gt;
Platinendatei im Eagle-Format gibt es [https://www.mikrocontroller.net/articles/Datei:LED_Stromregler.sch hier].&lt;br /&gt;
&lt;br /&gt;
[[Bild:LED_Stromregler.png|thumb|left|600px| Einfacher Stromregler aus Standardbauteilen]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:LED_Stromregler_brd.png|thumb|left|600px| Beispiel eines Platinenlayouts]]&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
==== Vorteile ====&lt;br /&gt;
&lt;br /&gt;
* Kurzschlussfest&lt;br /&gt;
* guter Wirkungsgrad bei hohen Eingangsspannungen, Energie wird nicht wie bei einem Linearregler in Wärme umgesetzt&lt;br /&gt;
* einfachste Komponenten&lt;br /&gt;
* sehr preiswert, max. 2 EUR &lt;br /&gt;
* Dimmung per [[PWM]] möglich&lt;br /&gt;
* Eingangsspannungsbereich sehr groß, ca. 6-30V&lt;br /&gt;
* sehr einfach auch auf anderen Strom einstellbar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Platzhalter == &lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
=== Schaltung ===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Threads im Forum  ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/75355#new Philosophiestunde Konstantstromquelle]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/71573#new Suche regelbare Konstantstromquelle für ACULED]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/67593#new Konstantstrom für Windmessung]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/66825#new Konstantstromdiode]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/66033#new Konstantstromquelle als IC und einstellbar]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/59467#new Konstantstromquelle für einen Haufen LEDs]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/58036#new Konstantstromquelle]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/61778#new temperaturunabhängige Konstantstromquelle]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/45039#new Konstanter Strom für LED bei 2,5V bis 5,5V]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/221395#2217701 Konstantstromquelle zur digitalen Lasermodulation]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/349022#3875273 Konstantstromquelle zur linearen Lasermodulation]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/470258#5764749 Konstantstromquelle für Power-LED an Akku mit Unterspannungsabschaltung]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Konstantstromquelle Konstantstromquelle bei Wikipedia]&lt;br /&gt;
* [http://www.dcdcselector.com/de/dc-dc-led-driver DC/DC LED Treiber IC parametrische Suche]&lt;br /&gt;
* [http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm DSE FAQ]&lt;br /&gt;
* [http://www.led-treiber.de Seite zu LED Treibern]&lt;br /&gt;
* [http://www.christiankoch.de/archiv/led-ksq/ Diskrete LED-Konstantstromquelle auf Schaltregler-Basis]&lt;br /&gt;
* [http://www.national.com/an/AN/AN-1392.pdf NATIONAL Application Note 1392: LM3485 LED Demo Board]&lt;br /&gt;
* [http://www.circuit-fantasia.com/circuit_stories/understanding_circuits/current_source/howland_current_source/howland_current_source.htm Howland Current Source]&lt;br /&gt;
* [http://www.national.com/an/AN/AN-1515.pdf &amp;quot;A Comprehensive Study of the Howland Current Pump&amp;quot;, Application Note von National Semiconductior, engl.]&lt;br /&gt;
* [http://www.nomad.ee/micros/mc34063a/index.shtml MC34063A Design Tool (engl.)]&lt;br /&gt;
* [http://www.onsemi.com/pub_link/Collateral/MC34063A-D.PDF Datenblatt des MC34063 bei ON Semi]&lt;br /&gt;
* [[Konstantstromquelle fuer Power LED]]&lt;br /&gt;
* [http://www.joretronik.de/Web_NT_Buch/Kap3/Kapitel3_2.html weitere Beispiele von Konstantstromquellen]&lt;br /&gt;
* [http://www.edn.com/design/power-management/4318484/Error-compensation-improves-bipolar-current-sinks Error compensation improves bipolar current sinks, EDN, engl.]&lt;br /&gt;
*[http://www.nxp.com/documents/application_note/AN10739.pdf] Diskreter LED Treiber, Konstantstromquellen&lt;br /&gt;
*[https://www.youtube.com/watch?v=LXzG2qk1J6Q Anwendungsbeispiel Konstantstromquelle: Milliohm messen extrem einfach (Video)]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Spannungsversorgung und Energiequellen]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Deklarationen_in_C&amp;diff=104581</id>
		<title>Deklarationen in C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Deklarationen_in_C&amp;diff=104581"/>
		<updated>2021-07-16T06:51:45Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;C Deklarationen können, wenn sie umfangreicher sind, ganz schön kompliziert sein. Zumindest sieht es auf den ersten Blick so aus. Aber es gibt Abhilfe: Es gibt ein Regelwerk, nach dem man Deklarationen, egal wie kompliziert sie sind, in einen leidlich deutschen Satz &#039;übersetzen&#039; kann.&lt;br /&gt;
&lt;br /&gt;
=Die vollständige Rechts-Links Regel=&lt;br /&gt;
&lt;br /&gt;
Die Anwendung der Rechts-Links Regel gestattet eine C Deklaration in einen lesbaren deutschen Satz zu übersetzen. Einige der Symbole werden durch feststehende Phrasen übersetzt. Diese sind&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Phrase&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; wird übersetzt mit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Anmerkung&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;*&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;Zeiger auf&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; steht immer links&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;Array von&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; steht immer rechts&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;()&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;Funktion welche zurückgibt&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; steht immer rechts&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 1:==&lt;br /&gt;
Der ganz Prozess wird immer ausgehend vom Variablennamen durchgeführt. Ihn gilt es als erstes zu finden. Hat man ihn, dann beginnt der deutsche Satz mit &amp;quot;xyz ist ein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Schritt 2:==&lt;br /&gt;
Ausgehend vom Variablennamen beginnt man abwechselnd rechts / links weiter zu lesen, wobei man mit der rechten Seite beginnt. Es wird immer solange in eine Richtung weiter gelesen, bis dort nichts mehr steht (bzw. ein &#039;;&#039; angetroffen wird) oder bis man auf eine schliessende Klammer &#039;)&#039; stösst. Genauso im umgekehrten Fall: ist die Leserichtung nach links, dann dreht sich diese um, wenn man auf eine öffnende Klammer &#039;(&#039; stösst.&lt;br /&gt;
&lt;br /&gt;
==Schritt 3:==&lt;br /&gt;
Handelt es sich bei einem &#039;Wort&#039; um eine entsprechende Phrase, so wird diese eingesetzt. Andernfalls setzt man einfach das angetroffene Wort ein.&lt;br /&gt;
&lt;br /&gt;
==Beispiele:==&lt;br /&gt;
===int *p[];===&lt;br /&gt;
&lt;br /&gt;
Als erster wird der Variablenname gesucht. In diesem Fall ist es das &#039;p&#039;.&lt;br /&gt;
&lt;br /&gt;
  int *p[];              p ist ein&lt;br /&gt;
       ^&lt;br /&gt;
&lt;br /&gt;
nach rechts weiterlesen. Dort wird die Phrase [] angetroffen&lt;br /&gt;
&lt;br /&gt;
  int *p[];              p ist ein Array von&lt;br /&gt;
        ^^&lt;br /&gt;
&lt;br /&gt;
das nächste Zeichen in Leserichtung rechts ist ein &#039;;&#039;. Damit geht es da nicht mehr weiter, die Leserichtung wird umgedreht&lt;br /&gt;
und es geht nach links weiter. Das nächste Zeichen ist der *&lt;br /&gt;
&lt;br /&gt;
  int *p[]               p ist ein Array von Zeigern auf&lt;br /&gt;
      ^&lt;br /&gt;
&lt;br /&gt;
wieder nach links weiterlesen, bringt das &#039;int&#039; zutage, welches direkt übernommen wird.&lt;br /&gt;
&lt;br /&gt;
  int *p[]               p ist ein Array von Zeigern auf int&lt;br /&gt;
  ^^^&lt;br /&gt;
&lt;br /&gt;
Die Deklaration besagt also dass es sich um ein Array von Zeigern handelt und nicht etwa um einen Zeiger auf ein Array.&lt;br /&gt;
Wie müsste so etwas aussehen?&lt;br /&gt;
Ganz einfach. Der * steht immer auf der linken Seite des Variablennamens und die Array-Phrase rechts davon. Da immer mit der Leserichtung rechts begonnen wird, muss man nur dafür sorgen, dass sich die Leserichtung sofort umkehrt. Die einzige Möglichkeit, die es dafür gibt, ist die Benutzung von Klammern ( und ). (Achtung: diese Klammern nicht mit der ()-Phrase für Funktionen verwechseln! Es ist aber immer eindeutig, wann es sich um ein Klammernpaar handelt, welches eine Funktion anzeigt.)&lt;br /&gt;
Wir möchten konstruieren: u ist ein Zeiger auf ein Array von double.&lt;br /&gt;
&lt;br /&gt;
           u                 u ist ein&lt;br /&gt;
          *u                 u ist ein Zeiger&lt;br /&gt;
         (*u)                u ist ein Zeiger auf ein Array&lt;br /&gt;
                             man beachte an dieser Stelle, wie das Klammernpaar dafür&lt;br /&gt;
                             sorgt, dass sich die Leserichtung beginnend beim Variablennamen&lt;br /&gt;
                             sofort umdreht, so dass zuerst der * relevant wird und erst dann&lt;br /&gt;
                             die [] zum Zug kommen.&lt;br /&gt;
  double (*u)[]              u ist ein Zeiger auf ein Array von double&lt;br /&gt;
&lt;br /&gt;
Mit der Kentniss der Rechts/Links Regel ist es also nicht nur möglich eine Deklaration zu lesen, sondern auch Deklarationen zu konstruieren. Sie leitet durch die Deklaration und lässt eine Aussage darüber zu, wo Klammern Paare ( ) die Interpretation verändern.&lt;br /&gt;
&lt;br /&gt;
===int *(*func())();===&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist ein&lt;br /&gt;
           ^^^^&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die zurückgibt&lt;br /&gt;
               ^^&lt;br /&gt;
&lt;br /&gt;
                              Das nächste Symbol in Leserichtung rechts ist eine ),&lt;br /&gt;
                              also dreht sich die Leserichtung um und es geht links weiter&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die einen Pointer zurückgibt&lt;br /&gt;
          ^&lt;br /&gt;
&lt;br /&gt;
                              In Leserichtung links ist das nächste Symbol eine (,&lt;br /&gt;
                              also dreht sich die Leserichtung wieder um und es geht rechts&lt;br /&gt;
                              nach der ) weiter.&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die zurückgibt einen Pointer auf&lt;br /&gt;
                  ^^          eine Funktion&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die zurückgibt einen Pointer auf&lt;br /&gt;
        ^                     eine Funktion, welche zurückgibt einen Pointer&lt;br /&gt;
  &lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die zurückgibt einen Pointer auf&lt;br /&gt;
    ^^^                       eine Funktion, welche zurückgibt einen Pointer auf int&lt;br /&gt;
&lt;br /&gt;
==Besonderheiten==&lt;br /&gt;
===mit Arrays===&lt;br /&gt;
Steht in einer Arraydeklaration eine Größenangabe in den [], so kann man diese Größenangabe in die Beschreibung mit heineinnehmen. Grundsätzlich ändert sich aber an der Verwendung der []-Phrase nichts.&lt;br /&gt;
&lt;br /&gt;
    int p[5];                 p ist ein&lt;br /&gt;
        ^&lt;br /&gt;
&lt;br /&gt;
    int p[5];                 p ist ein Array der Größe 5&lt;br /&gt;
         ^^^&lt;br /&gt;
&lt;br /&gt;
    int p[5];                 p ist ein Array der Größe 5 von int&lt;br /&gt;
    ^^^&lt;br /&gt;
&lt;br /&gt;
===mit Funktionen===&lt;br /&gt;
Sind in der ()-Phrase die Datentypen der Funktionsargumente angegeben, so werden diese bei der Funktion als &amp;quot;welche erwartet ....&amp;quot; aufgeführt. Aber auch hier wieder: an der grundsätzlichen Verwendung der ()-Phrase ändert sich nichts&lt;br /&gt;
&lt;br /&gt;
===Beispiele:===&lt;br /&gt;
  int (*(*foo)(char *, double))[5][4];&lt;br /&gt;
&lt;br /&gt;
foo ist ein Zeiger auf eine Funktion, welche einen char* und einen double erwartet und welche zurückgibt  einen Zeiger auf ein Array der Größe 5 eines Arrays der Größe 4 von int.&lt;br /&gt;
&lt;br /&gt;
(Zugegeben: der deutsche Satz holpert ein wenig, aber mit ein wenig umstellen, kann man ihn leicht in ordentliches Deutsch überführen)&lt;br /&gt;
&lt;br /&gt;
==Besonderheiten für Modifizierer wie const oder volatile==&lt;br /&gt;
Diese Phrasen werden ganz normal in den Text eingebaut. Dabei gilt: Diese Modifizierer gelten immer auf den nächsten Abschnitt links von ihnen. Es sei denn, sie stehen bereits ganz links, dann gelten sie auf den Teil rechts von ihnen.&lt;br /&gt;
&lt;br /&gt;
     int  i;          i ist ein int&lt;br /&gt;
     int const i;     i ist const und dieses konstante ist ein int&lt;br /&gt;
     const int i;     i ist ein int und dieser int ist const (ist dasselbe wie int const i)&lt;br /&gt;
&lt;br /&gt;
     int * v;         v ist ein Zeiger auf int&lt;br /&gt;
     int * const v    v ist konstant und ist ein Zeiger auf int (Der Zeiger ist konstant!)&lt;br /&gt;
     int const * v    v ist ein Zeiger auf etwas konstantes und dieses konstante ist ein int&lt;br /&gt;
                      (hier ist der int auf den der Zeiger zeigt konstant!)&lt;br /&gt;
     const int * v    v ist ein Zeiger auf einen int und dieser int ist konstant.&lt;br /&gt;
                      (identisch zum vorhergehenden Fall: der int ist konstant!)&lt;br /&gt;
     const int * const v   v ist ein konstant und ist ein Zeiger auf einen int, der konstant ist&lt;br /&gt;
                      (hier sind also sowohl Zeiger als auch der int konstant)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html C Right-Left Rule (Rick Ord&#039;s CSE 30 - UC San Diego)]&lt;br /&gt;
* [https://cdecl.org/ C-Deklarationen in englische Sprache &amp;quot;übersetzen&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Deklarationen_in_C&amp;diff=104580</id>
		<title>Deklarationen in C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Deklarationen_in_C&amp;diff=104580"/>
		<updated>2021-07-16T06:50:48Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Die vollständige Rechts-Links Regel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;C Deklarationen können, wenn sie umfangreicher sind, ganz schön kompliziert sein. Zumindest sieht es auf den ersten Blick so aus. Aber es gibt Abhilfe: Es gibt ein Regelwerk, nach dem man Deklarationen, egal wie kompliziert sie sind, in einen leidlich deutschen Satz &#039;übersetzen&#039; kann.&lt;br /&gt;
&lt;br /&gt;
=Die vollständige Rechts-Links Regel=&lt;br /&gt;
&lt;br /&gt;
Die Anwendung der Rechts-Links Regel gestattet eine C Deklaration in einen lesbaren deutschen Satz zu übersetzen. Einige der Symbole werden durch feststehende Phrasen übersetzt. Diese sind&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Phrase&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; wird übersetzt mit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Anmerkung&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;*&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;Zeiger auf&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; steht immer links&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;Array von&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; steht immer rechts&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;()&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;Funktion welche zurückgibt&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; steht immer rechts&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schritt 1:==&lt;br /&gt;
Der ganz Prozess wird immer ausgehend vom Variablennamen durchgeführt. Ihn gilt es als erstes zu finden. Hat man ihn, dann beginnt der deutsche Satz mit &amp;quot;xyz ist ein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Schritt 2:==&lt;br /&gt;
Ausgehend vom Variablennamen beginnt man abwechselnd rechts / links weiter zu lesen, wobei man mit der rechten Seite beginnt. Es wird immer solange in eine Richtung weiter gelesen, bis dort nichts mehr steht (bzw. ein &#039;;&#039; angetroffen wird) oder bis man auf eine schliessende Klammer &#039;)&#039; stösst. Genauso im umgekehrten Fall: ist die Leserichtung nach links, dann dreht sich diese um, wenn man auf eine öffnende Klammer &#039;(&#039; stösst.&lt;br /&gt;
&lt;br /&gt;
==Schritt 3:==&lt;br /&gt;
Handelt es sich bei einem &#039;Wort&#039; um eine entsprechende Phrase, so wird diese eingesetzt. Andernfalls setzt man einfach das angetroffene Wort ein.&lt;br /&gt;
&lt;br /&gt;
==Beispiele:==&lt;br /&gt;
===int *p[];===&lt;br /&gt;
&lt;br /&gt;
Als erster wird der Variablenname gesucht. In diesem Fall ist es das &#039;p&#039;.&lt;br /&gt;
&lt;br /&gt;
  int *p[];              p ist ein&lt;br /&gt;
       ^&lt;br /&gt;
&lt;br /&gt;
nach rechts weiterlesen. Dort wird die Phrase [] angetroffen&lt;br /&gt;
&lt;br /&gt;
  int *p[];              p ist ein Array von&lt;br /&gt;
        ^^&lt;br /&gt;
&lt;br /&gt;
das nächste Zeichen in Leserichtung rechts ist ein &#039;;&#039;. Damit geht es da nicht mehr weiter, die Leserichtung wird umgedreht&lt;br /&gt;
und es geht nach links weiter. Das nächste Zeichen ist der *&lt;br /&gt;
&lt;br /&gt;
  int *p[]               p ist ein Array von Zeigern auf&lt;br /&gt;
      ^&lt;br /&gt;
&lt;br /&gt;
wieder nach links weiterlesen, bringt das &#039;int&#039; zutage, welches direkt übernommen wird.&lt;br /&gt;
&lt;br /&gt;
  int *p[]               p ist ein Array von Zeigern auf int&lt;br /&gt;
  ^^^&lt;br /&gt;
&lt;br /&gt;
Die Deklaration besagt also dass es sich um ein Array von Zeigern handelt und nicht etwa um einen Zeiger auf ein Array.&lt;br /&gt;
Wie müsste so etwas aussehen?&lt;br /&gt;
Ganz einfach. Der * steht immer auf der linken Seite des Variablennamens und die Array-Phrase rechts davon. Da immer mit der Leserichtung rechts begonnen wird, muss man nur dafür sorgen, dass sich die Leserichtung sofort umkehrt. Die einzige Möglichkeit, die es dafür gibt, ist die Benutzung von Klammern ( und ). (Achtung: diese Klammern nicht mit der ()-Phrase für Funktionen verwechseln! Es ist aber immer eindeutig, wann es sich um ein Klammernpaar handelt, welches eine Funktion anzeigt.)&lt;br /&gt;
Wir möchten konstruieren: u ist ein Zeiger auf ein Array von double.&lt;br /&gt;
&lt;br /&gt;
           u                 u ist ein&lt;br /&gt;
          *u                 u ist ein Zeiger&lt;br /&gt;
         (*u)                u ist ein Zeiger auf ein Array&lt;br /&gt;
                             man beachte an dieser Stelle, wie das Klammernpaar dafür&lt;br /&gt;
                             sorgt, dass sich die Leserichtung beginnend beim Variablennamen&lt;br /&gt;
                             sofort umdreht, so dass zuerst der * relevant wird und erst dann&lt;br /&gt;
                             die [] zum Zug kommen.&lt;br /&gt;
  double (*u)[]              u ist ein Zeiger auf ein Array von double&lt;br /&gt;
&lt;br /&gt;
Mit der Kentniss der Rechts/Links Regel ist es also nicht nur möglich eine Deklaration zu lesen, sondern auch Deklarationen zu konstruieren. Sie leitet durch die Deklaration und lässt eine Aussage darüber zu, wo Klammern Paare ( ) die Interpretation verändern.&lt;br /&gt;
&lt;br /&gt;
===int *(*func())();===&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist ein&lt;br /&gt;
           ^^^^&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die zurückgibt&lt;br /&gt;
               ^^&lt;br /&gt;
&lt;br /&gt;
                              Das nächste Symbol in Leserichtung rechts ist eine ),&lt;br /&gt;
                              also dreht sich die Leserichtung um und es geht links weiter&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die einen Pointer zurückgibt&lt;br /&gt;
          ^&lt;br /&gt;
&lt;br /&gt;
                              In Leserichtung links ist das nächste Symbol eine (,&lt;br /&gt;
                              also dreht sich die Leserichtung wieder um und es geht rechts&lt;br /&gt;
                              nach der ) weiter.&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die zurückgibt einen Pointer auf&lt;br /&gt;
                  ^^          eine Funktion&lt;br /&gt;
&lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die zurückgibt einen Pointer auf&lt;br /&gt;
        ^                     eine Funktion, welche zurückgibt einen Pointer&lt;br /&gt;
  &lt;br /&gt;
    int *(*func())();         func ist eine Funktion, die zurückgibt einen Pointer auf&lt;br /&gt;
    ^^^                       eine Funktion, welche zurückgibt einen Pointer auf int&lt;br /&gt;
&lt;br /&gt;
==Besonderheiten==&lt;br /&gt;
===mit Arrays===&lt;br /&gt;
Steht in einer Arraydeklaration eine Größenangabe in den [], so kann man diese Größenangabe in die Beschreibung mit heineinnehmen. Grundsätzlich ändert sich aber an der Verwendung der []-Phrase nichts.&lt;br /&gt;
&lt;br /&gt;
    int p[5];                 p ist ein&lt;br /&gt;
        ^&lt;br /&gt;
&lt;br /&gt;
    int p[5];                 p ist ein Array der Größe 5&lt;br /&gt;
         ^^^&lt;br /&gt;
&lt;br /&gt;
    int p[5];                 p ist ein Array der Größe 5 von int&lt;br /&gt;
    ^^^&lt;br /&gt;
&lt;br /&gt;
===mit Funktionen===&lt;br /&gt;
Sind in der ()-Phrase die Datentypen der Funktionsargumente angegeben, so werden diese bei der Funktion als &amp;quot;welche erwartet ....&amp;quot; aufgeführt. Aber auch hier wieder: an der grundsätzlichen Verwendung der ()-Phrase ändert sich nichts&lt;br /&gt;
&lt;br /&gt;
===Beispiele:===&lt;br /&gt;
  int (*(*foo)(char *, double))[5][4];&lt;br /&gt;
&lt;br /&gt;
foo ist ein Zeiger auf eine Funktion, welche einen char* und einen double erwartet und welche zurückgibt  einen Zeiger auf ein Array der Größe 5 eines Arrays der Größe 4 von int.&lt;br /&gt;
&lt;br /&gt;
(Zugegeben: der deutsche Satz holpert ein wenig, aber mit ein wenig umstellen, kann man ihn leicht in ordentliches Deutsch überführen)&lt;br /&gt;
&lt;br /&gt;
==Besonderheiten für Modifizierer wie const oder volatile==&lt;br /&gt;
Diese Phrasen werden ganz normal in den Text eingebaut. Dabei gilt: Diese Modifizierer gelten immer auf den nächsten Abschnitt links von ihnen. Es sei denn, sie stehen bereits ganz links, dann gelten sie auf den Teil rechts von ihnen.&lt;br /&gt;
&lt;br /&gt;
     int  i;          i ist ein int&lt;br /&gt;
     int const i;     i ist const und dieses konstante ist ein int&lt;br /&gt;
     const int i;     i ist ein int und dieser int ist const (ist dasselbe wie int const i)&lt;br /&gt;
&lt;br /&gt;
     int * v;         v ist ein Zeiger auf int&lt;br /&gt;
     int * const v    v ist konstant und ist ein Zeiger auf int (Der Zeiger ist konstant!)&lt;br /&gt;
     int const * v    v ist ein Zeiger auf etwas konstantes und dieses konstante ist ein int&lt;br /&gt;
                      (hier ist der int auf den der Zeiger zeigt konstant!)&lt;br /&gt;
     const int * v    v ist ein Zeiger auf einen int und dieser int ist konstant.&lt;br /&gt;
                      (identisch zum vorhergehenden Fall: der int ist konstant!)&lt;br /&gt;
     const int * const v   v ist ein konstant und ist ein Zeiger auf einen int, der konstant ist&lt;br /&gt;
                      (hier sind also sowohl Zeiger als auch der int konstant)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html C Right-Left Rule (Rick Ord&#039;s CSE 30 - UC San Diego)]&lt;br /&gt;
* [https://cdecl.org/]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Schaltplaneditoren&amp;diff=104579</id>
		<title>Schaltplaneditoren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Schaltplaneditoren&amp;diff=104579"/>
		<updated>2021-07-16T06:47:07Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Freeware vs. Open Source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundüberlegungen zur Auswahl eines Layoutprogrammes ==&lt;br /&gt;
&lt;br /&gt;
Sehr häufig wird die Frage gestellt, welches Platinenlayoutprogramm man sich denn nun am besten kaufen soll. Diese Frage ist leider nicht einfach zu beantworten, weil sie von vielen Umständen abhängt und für jeden individuell beantwortet werden muss.&lt;br /&gt;
&lt;br /&gt;
Daher hier ein paar grundsätzliche Überlegungen, welche in die eigenen Entscheidungen einfließen könnten.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich ist der Übergang vom Hobbyanwender über den Studenten oder professionellen Kleingewerbetreibenden in Handwerk und Ingenieurbüro bis zum Vollzeitplatinenentwickler in der Industrie, der nur Großprojekte bearbeitet, stufenlos. Letztere haben im Allgemeinen aber schon genaue Vorstellungen über das, was sie benötigen. So sind diese Überlegungen in erster Linie für Hobbyanwender, Studenten und Kleingewerbe betreibende Ingenieurbüros gedacht.&lt;br /&gt;
&lt;br /&gt;
=== Freeware vs. Open Source ===&lt;br /&gt;
&amp;quot;Freeware&amp;quot; im Sinne von nur &amp;quot;kostenlos&amp;quot; kann gerade für Hobbyanwender, Studenten und Kleingewerbetreibende problematisch sein, weil bei den kostenlosen Versionen kommerzieller Programme je nach Lizensierung Probleme bestehen, damit erstellte Projekte zu veröffentlichen. Selbst wenn die Veröffentlichung nichtkommerziell ist und jemand anders greift die Unterlagen auf und verwertet sie kommerziell, kann der ursprüngliche Lizenznehmer wegen der Verletzung von Lizenzbestimmungen zur Rechenschaft gezogen werden. Hier ist also sehr intensiv das Kleingedruckte der Lizenzbestimmung zu beachten. Es mag zwar solche Programme geben, die auch eine kostenlose kommerzielle Nutzung erlauben, z.B. [[#DesignSpark_PCB|DesignSpark PCB]], aber auch hier ist dann z.B. eine Registrierung des Users unbedingt erforderlich und Details aus den Nutzungsbestimmungen sind genau zu prüfen. Gleiches gilt für zwar nicht kostenlose, aber stark verbilligte Studenten- oder Hobbyversionen kommerzieller Programme. Oft beinhalten diese kostenlosen oder stark verbilligten Versionen auch recht lästige Beschränkungen in Bezug auf Schaltplangröße, Platinengröße, Anzahl der Verbindungen/Pads und Layer. Testversionen haben oft eine beschränkte Gültigkeitsdauer über wenige Wochen. Sie sind zum Testen vor einer Kaufentscheidung gedacht. Daher sollte man mit solchen zeitbeschränkten Testversionen außer kleinen Testprojekten auch keine Projekte machen. Läuft die Lizenz aus und man entscheidet sich das Programm nicht zu kaufen oder zu mieten, kann man die Daten und somit die investierte Arbeit meist nicht weiter nutzen. Tatsächlich ist es daher oft sinnvoller sich eine Vollversion eines einfachen Programmes zu kaufen. Alternativ kann &amp;quot;echte&amp;quot; Open Source Software genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Bei diesen echten OpenSource-Programmen unter der [https://de.wikipedia.org/wiki/GNU_General_Public_License GNU-GPL-Lizenz] (oder Ähnlichen wie MIT) bestehen keine Probleme in der Verwertung und Veröffentlichung. Sogar für kommerzielle Projekte dürfen sie kostenlos verwendet werden. Diese Programme sind wirklich frei im Sinne von &amp;quot;freier Rede&amp;quot; und nicht nur im Sinne von &amp;quot;Freibier&amp;quot;. Leider gibt es davon nur wenige, z.B. &lt;br /&gt;
[[#gEDA-Suite|gEDA]], [[#KiCad|KiCad]] und [[#FreePCB|FreePCB]], sowie als Neuling und noch in der Entwicklung [[#Horizon|Horizon]]. [[#Fritzing|Fritzing]] gehört zwar ebenfalls in diesen Kreis, doch unterscheiden sich die Zielgruppe und demzufolge einige Aspekte der Handhabung extrem von denen gewöhnlicher Layoutprogramme.&lt;br /&gt;
&lt;br /&gt;
Bei nicht quelloffener Software hat der Ersteller der Software den Nutzer der Software in der Hand, was die Zukunft angeht.&lt;br /&gt;
Er kann bei der Weiterentwicklung seiner Software die Lizenzbedingungen ändern und der Anwender muss folgen, will er nicht auf seiner alten Softwareversion festsitzen. Auch der Ersteller von quelloffener Software kann seine zukünftigen Lizenzbedingungen ändern, aber wegen der offenen quellen bzw. der offenen Dateiformate hat der User dann die Chance des Ausweichens, weil solche Projekte dann meistens aufgegriffen werden und aus den alten offenen Quellen weiterentwickelt werden. Daher kann eine Entscheidung für openSource wichtige strategische Vorteile haben. Wenn jemand Software veröffentlichen will, die wirklich &amp;quot;frei&amp;quot; ist, gibt es sonst kaum einen Grund, die Quellen nicht zu veröffentlichen und proprietäre Lizenzen abweichend von den anerkannten Open Source Lizenzen wie  [https://de.wikipedia.org/wiki/GNU_General_Public_License GNU-GPL], [https://de.wikipedia.org/wiki/Creative_Commons Creative Commons], [https://de.wikipedia.org/wiki/BSD-Lizenz BSD-Lizenz], [https://de.wikipedia.org/wiki/MIT-Lizenz MIT-Lizenz] oder auch der [https://de.wikipedia.org/wiki/CERN_Open_Hardware_License CERN-OHW] mit all ihren Unterabspaltungen zu verwenden, oder auch alles gleich [https://de.wikipedia.org/wiki/Gemeinfreiheit gemeinfrei] zu stellen.&lt;br /&gt;
Daher kann eine Entscheidung für openSource wichtige strategische Vorteile haben.&lt;br /&gt;
&lt;br /&gt;
=== Einarbeitung ===&lt;br /&gt;
Grundsätzlich gibt es kein Layoutprogramm, in das man sich nicht einarbeiten müsste. Platinenentwicklung ist eine komplexe Angelegenheit, egal mit welcher Philosophie man sie angeht. Daher kommt man ohne Einarbeitung nie davon. Auf der anderen Seite werden jemandem, der mit einem Leiterplattenprogramm umgehen kann, vermutlich zwei Drittel eines anderen  Layoutprogrammes irgendwie bekannt vorkommen. Der Grund ist der, dass es dabei um Leiterplatten, ihre Eigenschaften und Herstellung geht. Dieses ist aber als Kontext, aus dem sich dann vieles ergibt, bei allen gleich. Unterschiede gibt es darum nur in Details der Handhabung.&lt;br /&gt;
&lt;br /&gt;
=== Handlichkeit ===&lt;br /&gt;
Die Programme sind vielfältig und zu komplex für eine vollkommen intuitive Bedienung, daher ist bei allen eine nicht unerhebliche Einarbeitungszeit erforderlich.&lt;br /&gt;
&lt;br /&gt;
Schaltungen und Boards kann man mit allen dieser Layoutprogramme entwickeln. Es hängt an den speziellen Bedürfnissen und dem speziellen Geschmack des konkreten speziellen Anwenders, womit er am besten umgehen kann. Dies ist vom kulturellen Hintergrund und der individuellen Persönlichkeit des Anwenders abhängig, daher kann hier keine allgemeingültige Empfehlungen abgegeben werden.&lt;br /&gt;
&lt;br /&gt;
Daher sollte man sich einige der Programme ansehen und damit experimentieren. Das ist leider der einzige Weg, um sich selber ein Bild zu machen. Dazu können auch durchaus die &amp;quot;kostenlosen&amp;quot; Versionen kommerzieller Programme verwendet werden. Aber Vorsicht: Erst einmal keine größeren Projekte mit Testversionen. Denn wenn die Erprobungsfrist abgelaufen ist, oder wenn man vor eine andere Beschränkung läuft, und dann das Programm doch nicht kaufen will, kann die darin eingebrachte Arbeit nicht mehr in ein anderes Programm übertragen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reine Schaltplaneditoren ==&lt;br /&gt;
&lt;br /&gt;
Diese haben keinen oder nur einen rudimentären Layouteditor. Somit können damit im wesentlichen nur Schaltpläne erstellt werden. Immerhin bieten viele einen Stücklistenexport an.&lt;br /&gt;
&lt;br /&gt;
=== Circuit Diagram ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Circuit Diagram&#039;&#039;&#039; ist ein moderner webbasierter editor. Das Programm muss nicht auf dem PC installiert werden, da es direkt im Browser genutzt werden kann. Die meisten Bauteile sind enthalten. Man kann sich aber auch vorgefertigte Plugins installieren oder sogar selber Bauteile kreieren.&lt;br /&gt;
Die Schaltpläne lassen sich lokal auf dem PC speichern oder mithilfe einer Google-Anmeldung.&lt;br /&gt;
&lt;br /&gt;
https://www.circuit-diagram.org/&lt;br /&gt;
&lt;br /&gt;
[[Datei:Circuitdiagram.png|rahmenlos]]&lt;br /&gt;
&lt;br /&gt;
=== AACircuit ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AACircuit&#039;&#039;&#039; ist ein Schaltplaneditor mit einer Ausgabe als ASCII-Grafik. Das Programm wurde dafür entwickelt, um mal eben eine Frage oder eine Antwort in &#039;&#039;newsgroups&#039;&#039;, Chats oder Foren zu veranschaulichen, wenn keine Upload-Möglichkeit von Bilddateien da ist. AACircuit gibt es bei http://www.tech-chat.de/ ([http://9r1.org/AACircuit1_28_6.zip Download-Mirror])&lt;br /&gt;
&lt;br /&gt;
Für allgemeine ASCII-Skizzen, wie Flussdiagramme oder UML, eignet sich [http://asciiflow.com ASCIIflow.com] ([http://stable.ascii-flow.appspot.com/ →alte Version]) besser.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  .---o----o------o---o---------------o---o----o------------o 12-15V&lt;br /&gt;
  |   |    |  22µF| + |               |   |    |&lt;br /&gt;
 .-.  |   .-.    ###  |              .-.  |    |    .-------o&lt;br /&gt;
 | |&amp;lt;-&#039;   | |    ---  |              | |  |    |    |   .---o&lt;br /&gt;
 | |5k    | |5k6  |   |              | |  |    |    |   |&lt;br /&gt;
 &#039;-&#039;      &#039;-&#039;     |   o--.           &#039;-&#039;  |   _|_   o  /o&lt;br /&gt;
  |        |     ===  |  |            |   |  |_/_|-   /&lt;br /&gt;
 .-.       |     GND  | ---100n   LED V   -    |     /&lt;br /&gt;
 | |       |          | ---           -   ^    |    o&lt;br /&gt;
 | |6k2    |          |  |            |   |    |    |&lt;br /&gt;
 &#039;-&#039;       |          | GND           &#039;---o----o    &#039;-------o&lt;br /&gt;
  |        |       2|\|7                       |&lt;br /&gt;
  o-----------------|-\ LM741      ___       |/&lt;br /&gt;
  |        |        |  &amp;gt;-------o--|___|--o---|&lt;br /&gt;
  |        o---o----|+/ 6      |   22k   |   |&amp;gt;  BC547&lt;br /&gt;
  |        |   |   3|/|4       |         |     |&lt;br /&gt;
 .-.       |   |     ===       o---.    .-.    |&lt;br /&gt;
 | |       |   o---. GND       |   |    | |5k6 |&lt;br /&gt;
 | |2k7   .-.  |   |   ___    _V_  |    | |    |&lt;br /&gt;
 &#039;-&#039;     KTY10 | + &#039;--|___|--|___|-&#039;    &#039;-&#039;    |&lt;br /&gt;
  |       | | ###      47k   220k        |     |&lt;br /&gt;
  |       &#039;-&#039; ---                        |     |&lt;br /&gt;
  |        |   |                         |     |&lt;br /&gt;
  |        |   |                         |     |&lt;br /&gt;
  &#039;--------o---o-------------------------o-----o------------o GND&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Basic Schematic ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Base schematic example.png|right|thumb|Screenshot Basic Schematic]]&lt;br /&gt;
&lt;br /&gt;
Basic Schematic (&#039;&#039;&#039;BSch3V&#039;&#039;&#039;) ist ein freier Schaltplaneditor für Windows (98/Me/2000/XP). In der aktuellen Version läuft es auch unter Windows7. Es enthält einen Component Library Editor, einen Parts List Generator und einen Netlist Generator, sowie eine Automatic Numbering Funktion.&lt;br /&gt;
&lt;br /&gt;
Ein ZIP-Archiv mit engl. Programm, Handbuch und Sourcecode gibt es bei http://www.suigyodo.com/online/e/index.htm.&lt;br /&gt;
&lt;br /&gt;
Ebenso ist dort eine Cross-Plattform Version &#039;&#039;&#039;Qt-BSch3V&#039;&#039;&#039; auf der Basis von Qt-Grafiklibraries erhältlich.&lt;br /&gt;
&lt;br /&gt;
Das Programm ermöglicht den Export der Schaltungsdaten im [[KiCad]]-Format.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist bis dato (Mai 2014) gut gepflegt.&lt;br /&gt;
&lt;br /&gt;
=== Caneda===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://caneda.org/ Caneda]&#039;&#039;&#039; ist eine open Source Schaltplaneditor und Platinenlayoutsoftware, die auch die Simulation gut integrieren will (Mit Ngspice als Simulationsprogramm). Autor ist Pablo Daniel Pareja Obregon. Caneda ist für Linux und Windows verfügbar. Bei Debian 9.6 (Stretch) ist Caneda bereits im Repository. Es sieht aber so aus, als wäre z.z. noch kein Platinenlayouttool verfügbar. Darum der Eintrag hier unter Schaltplaneditoren. Die Webseite ist etwas unübersichtlich, aber die Dokumentation ist hier zu finden: http://docs.caneda.org/en/latest/gettingstarted.html.&lt;br /&gt;
Erfahrungsberichte willkommen.&lt;br /&gt;
&lt;br /&gt;
=== Lepton-EDA ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://github.com/lepton-eda Lepton-EDA]&#039;&#039;&#039; ist ein Fork der [https://www.mikrocontroller.net/articles/Schaltplaneditoren#gEDA-Suite gEDA-Suite]. Bisher aber nur mit Schaltplanerstellung, Netzlistenerstellung und Matriallisten (BOM) Erstellung. Lizenz is GPL. Erfahrungsberichte willkommen.&lt;br /&gt;
&lt;br /&gt;
=== Inkscape ===&lt;br /&gt;
&lt;br /&gt;
Etwas bekannter noch als Jfig ist [https://inkscape.org/de &#039;&#039;&#039;Inkscape&#039;&#039;&#039;], ebenfalls ein reines Vektorzeichenprogramm, das vor allem (aber nicht nur) SVG-Dateien erstellt, die mit der Wikipedia eine große Verbreitung gefunden haben. Es ist in fast jeder gängigen Linux Distribution enthalten, eine Windowsversion sowie eine [http://portableapps.com/apps/graphics_pictures/inkscape_portable &#039;&#039;&#039;portable Windowsversion&#039;&#039;&#039;] existiert auch. In der Wikipedia findet sich eine Sammlung von Elektroniksymbolen im [https://commons.wikimedia.org/wiki/Category:SVG_electrical_symbols SVG-Format] und [https://commons.wikimedia.org/wiki/File:Electrical_symbols_library.svg hier]. Als Beispiele damit gezeichneter Schaltpläne sei diese [https://commons.wikimedia.org/wiki/Category:Created_with_electrical_symbols_library] genannt.&lt;br /&gt;
&lt;br /&gt;
=== KISSCAD ===&lt;br /&gt;
&lt;br /&gt;
[http://ludens.cl/Electron/kisscad/kisscad.html Kisscad] ist ein reiner Schaltplaneditor, dafür sind die Schaltpläne druckreif.&lt;br /&gt;
&lt;br /&gt;
Es ist ein portables Windows XP 32bit Programm, läuft aber auch recht gut unter Linux/Wine. Erinnert mit seiner Tastatursteuerung vage an das alte DOS Orcad. Das Zip-File zum Download enthält außer dem Programm und Drumherum eine 12 seitige Bedienungsanleitung in Englisch. Freeware, aber &#039;&#039;&#039;nicht&#039;&#039;&#039; Open Source. Entwickelt von Manfred Mornhinweg aus Chile.&lt;br /&gt;
&lt;br /&gt;
=== QCAD ===&lt;br /&gt;
&lt;br /&gt;
[http://www.ribbonsoft.de/qcad.html QCAD] gibt es in einer lizenzpflichtigen und in einer Open Source Community Version. QCAD ist kein ausschließlicher Schaltungseditor, sondern kann auch für andere 2D Zeichnungen (Konstruktionen etc.) eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== sPlan ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sPlan&#039;&#039;&#039; ist ein relativ preiswerter Schaltplaneditor für Windows (95,98,ME,NT,2000,XP,Vista,7,8,10, Versionen ab Oktober 2019 erfordern mindestens Vista oder höher)&lt;br /&gt;
Infos und eine Demoversion von sPlan gibt es u.a. bei http://www.abacom-online.de/html/splan.html&lt;br /&gt;
&lt;br /&gt;
=== TinyCAD ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TinyCAD&#039;&#039;&#039; ist ein weiterer &#039;&#039;Open Source&#039;&#039; Schaltplaneditor für Windows. Mehr Infos gibt es auf der [https://sourceforge.net/projects/tinycad Projektseite]. TinyCAD kann z.&amp;amp;nbsp;B. mit VeeCAD (s.u.) kombiniert werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltplan- und Leiterplattensoftware - für Lochrasterplatinen und Steckbretter ==&lt;br /&gt;
&lt;br /&gt;
Für experimentelle Zwecke wird gerne auf Streifen- oder Lochraster Platinen zurückgegriffen, die als &amp;quot;Layout&amp;quot; lediglich regelmäßig angeordnete Pads als Lötstützpunkte besitzen, zwischen denen Bauteile angeordnet werden. Desweiteren existieren Steckbretter, bei denen bedrahtete Bauteile in mit Kontaktfedern besetzte Löcher gesteckt werden können.&lt;br /&gt;
Diese Programme unterstützen den Aufbau und die Dokumentation solcher Experimentieraufbauten mit einem sehr speziellen grafischen Tool, welches die Lochrasterplatine bzw. das Steckbrett darstellt.&lt;br /&gt;
&lt;br /&gt;
Streifen- und Lochraster Platinen können aber grundsätzlich auch mit allen anderen Layoutprogrammen entwickelt bzw. dokumentiert werden, die ein Raster anzeigen können. Exemplarisch sei hier auf die bei KiCad beschriebene Methode verwiesen:&lt;br /&gt;
http://www.mikrocontroller.net/articles/KiCad#Tipps.26Tricks:_Lochraster.2FL.C3.B6tleisten_Platinen_Entwurf_mit_KiCad&lt;br /&gt;
&lt;br /&gt;
=== BlackBoard Circuit Designer ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:BlackBoard.png|right|thumb|Screenshot BlackBoard Circuit Designer]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlackBoard Circuit Designer&#039;&#039;&#039; ist ein freier Schaltplaneditor und ein Layoutprogramm für Loch- und Streifenrasterplatinen, der das Planen der Bauteilplatzierung sowie der beidseitigen Verdrahtung deutlich vereinfacht und sich u.a. auch für die Dokumentation solcher Prototypenaufbauten eignet. Außerdem hat er eine Schnittstelle zur Simulation mit NGSPICE.&lt;br /&gt;
&lt;br /&gt;
Es benötigt eine Java Runtime, wobei die neueren Versionen vom Oracle JDK nicht unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung des Programmes wurde eingestellt. &lt;br /&gt;
Der Sourcecode steht unter https://github.com/mpue/blackboard zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== DIY Layout Creator ===&lt;br /&gt;
&lt;br /&gt;
Ein Layoutprogramm, welches einen sehr künstlerischen Ansatz verfolgt. Mit ihm können Schaltpläne/Layouts wie in den Aufbauanleitungen von Bausätzen gezeichnet werden. Lochrasterplatinen werden unterstützt. Damit gehört es wie [[#Fritzing|Fritzing]] in die spezielle Kategorie abstraktionsvermeidender Layoutprogramme. Die  Zielgruppe für dieses Programm sind Künstler, Designer und Hobbyisten, spezieller wohl sogar Musiker, aber nicht unbedingt Profielektroniker. Die Software geht speziell auf diese Zielgruppe ein. Dabei wird wie bei Fritzing auf eine niedrige Zugangsschwelle und ein geringes Abstraktionsniveau wert gelegt. Das Programm ist Freeware (GPL v3). Das Programm läuft auf allen Betriebssystemen, auf denen es das Java JDK 8 oder neuer gibt.  Der Autor der Software ist Branislav Stojkovic.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bancika/diy-layout-creator/blob/master/README.md Link auf die DIY Layout Creator Website]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bancika/diy-layout-creator/releases Download]&lt;br /&gt;
&lt;br /&gt;
=== Fritzing ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fritzing bildschirmfoto.png|miniatur|rechts|Bildschirmfoto Fritzing]]&lt;br /&gt;
&#039;&#039;&#039;Fritzing&#039;&#039;&#039; verwendet die Metapher eines Breadboards (Steckbretts), auf dem die Benutzer virtuell Bauteile einstecken. Fritzings Zielgruppe sind Künstler, Designer und Hobbyisten aber nicht unbedingt Profielektroniker und die Software soll speziell auf die Zielgruppe zugeschnitten werden. Dabei wird auf eine niedrige Zugangsschwelle wert gelegt. Das Programm zählt damit genau wie der [[#DIY_Layout_Creator|DIY Layout Creator]] in die Kategorie spezieller abstraktionsvermeidender Layoutsoftware.&lt;br /&gt;
Versionen für Mac OS X, Linux und Windows (XP/Vista) sind bei http://www.fritzing.org erhältlich.&lt;br /&gt;
Nichtsdestotrotz besitzt das Programm drei Ansichten, von denen die Erste am häufigsten gezeigt wird – das o.a. Breadboard oder auch eine Streifenrasterplatte. Weiter wird aus dem Steckbrett in einer zweiten Ansicht ein Schaltplan erstellt und in einer dritten Ansicht lässt sich sogar eine ätzbare Leiterplatte mittels Autorouting entwerfen. Die Bauteilliste enthält bereits fertige Komponenten der [[Arduino]]-Gemeinschaft und ähnlicher Produkte wie die von Sparkfun, Parallaxe oder Picaxe. Ein paar Standardbauteile wie eine rote LED oder ein 220Ohm-Widerstand sind schnell zu finden. Die Bauteilbibliothek lässt sich erweitern.&lt;br /&gt;
Die Bedienung ist einfach zu erlernen und es gibt zwar Tastaturkürzel für die wichtigsten Funktionen, aber der erste Schaltplan ist schnell allein mit der Maus erstellt. Eine Umschaltung zwischen Platzierung der Bauteile und Routing ist nicht notwendig. Einfaches Klicken und Ziehen erstellt eine Kabelbrücke als Luftlinie. Auf Ebenen muss der Nutzer auch nicht verzichten. So lassen sich Bauteile, Kabel und Beschriftungen ein- und ausblenden. Auch wenn die Version noch nicht die 1.0 erreicht hat, kann Sie bei bei Schaltungen bis ca. 30 Teilen mit professionellen Programmen mithalten was den Zeitaufwand und die Übersichtlichkeit betrifft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Lochmaster ===&lt;br /&gt;
&lt;br /&gt;
[http://www.abacom-online.de/html/lochmaster.html Lochmaster] ist ein kommerzielles Programm zur Erstellung von Layouts speziell auf [[Lochrasterplatine]]n. Schaltplan und Layout sind ein und dasselbe.&lt;br /&gt;
&lt;br /&gt;
=== ProtoCAD ===&lt;br /&gt;
&lt;br /&gt;
[https://sourceforge.net/projects/protocad/ ProtoCAD] ist ein Werkzeug, um schnell Schaltpläne zu entwerfen. Es ist für [[Lochrasterplatine]]n entwickelt worden, kann aber auch für andere Methoden genutzt werden. (Java 1.5 kompatibel, Swing GUI, Open Source). Letzte Aktualisierung 2010.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VeeCAD ===&lt;br /&gt;
&lt;br /&gt;
[http://veecad.com/ VeeCAD] Stripboard Layout Editor ist ein Werkzeug, um [[Lochrasterplatine]]n zu entwerfen. VeeCAD ist jetzt als uneingeschränkte Version erhältlich, also nicht mehr in kommerzielle und eingeschränkte freie Version aufgeteilt: NOW FREE AND OPEN SOURCE&lt;br /&gt;
&lt;br /&gt;
== gEDA-Suite ==&lt;br /&gt;
&lt;br /&gt;
gEDA ([[gEDA|Artikel]]) ist eine unter anderem aus [[#Gschem|Gschem]] und [[#PCB|PCB]] bestehende Open Source Programmsammlung zur Entwicklung von Schaltplänen und Platinen, die 1998 gegründet wurde.&lt;br /&gt;
&lt;br /&gt;
=== Gschem ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gschem.png|right|thumb|Screenshot Gschem]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Gschem&#039;&#039;&#039;&#039;&#039; ist der Schaltplaneditor aus dem Open Source Projekt gEDA. &#039;&#039;gschem&#039;&#039; wird hauptsächlich auf Linux Rechnern entwickelt, läuft aber auch auf anderen Unix-Betriebssystemen und unter Windows. &#039;&#039;gschem&#039;&#039; ist für die Linuxdistributionen RedHat und Debian als Paket verfügbar, für Windows ist nur eine ältere Version erhältlich und für alle anderen ist selber kompilieren angesagt.&lt;br /&gt;
&lt;br /&gt;
Die Bedienung ist nicht sonderlich anfängerfreundlich. Hat man sich aber mal daran gewöhnt, dass jeder Menüpunkt mit 1 oder 2 Tasten erreichbar ist, läßt sich&#039;s mit &#039;&#039;gschem&#039;&#039; prima arbeiten. &lt;br /&gt;
&lt;br /&gt;
In der Symbolbibliothek (die auch online betrachtet werden kann) sind etwas mehr als 1000 Symbole; das Selbsterzeugen von Symbolen ist jedoch problemlos möglich. Insbesondere ist es aufgrund des gut dokumentierten und einfachen Datei-Formates möglich, mit einfachen Perl-Programmen z.&amp;amp;nbsp;B. aus Reports von Xilinx ISE Symbole zu erzeugen und automatisch zu aktualisieren, wenn sich die Pinzuordnung ändert. Das fehlerhafte Eingeben der Pinbelegung von CPLDs und FPGAs von Hand und die Änderung derselben ist damit für &#039;&#039;gschem&#039;&#039; User Geschichte.&lt;br /&gt;
&lt;br /&gt;
Die Schaltpläne lassen sich als png und als Postscript exportieren. &lt;br /&gt;
&lt;br /&gt;
Netzlisten (insgesamt über 20 Formate für PCB, Protel, Eagle, BAE, spice, pads, ... ) lassen sich mit dem Programm &#039;&#039;gnetlist&#039;&#039; generieren. Aus diesem Grund ist man (bis auf die Namen der Footprints) unabhängig von der verwendeten Layout-Software und kann diese auch sehr leicht wechseln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Gschem&#039;&#039; bildet zusammen mit PCB und anderen Programmen das [[GEDA|gEDA]] Programmpacket.&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil der gEDA-Suite sind die Dateiformate, welche alle reiner ASCII-Text sind. Dies macht die Entwicklung von Helper-Tools zur Lösung von speziellen Aufgaben sehr leicht. Außerdem können die Dateien deswegen sehr einfach in Versionsverwaltungssystemen wie CVS verwaltet werden, was insbesondere die Entwickler größerer Projekte zu schätzen wissen.&lt;br /&gt;
&lt;br /&gt;
Nähere Informationen über &#039;&#039;gschem&#039;&#039; (gEDA) gibt es unter [http://www.geda.seul.org http://www.geda.seul.org].&lt;br /&gt;
Hier auf der Mikrocontroller.net Seite finden sich Informationen zu Gschem [[GEDA|unter gEDA]].&lt;br /&gt;
&lt;br /&gt;
=== PCB ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;[http://pcb.sourceforge.net/index.html PCB]&#039;&#039;&#039;&#039;&#039; ist ein freies (Open Source) Layoutprogramm inklusive Autorouter. Zum Zeichnen der Schaltpläne kann [[#Gschem|Gschem]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCB&#039;&#039; wurde ursprünglich für den Atari ST entwickelt und später nach Unix portiert. &#039;&#039;PCB&#039;&#039; läuft meist unter Linux, kann allerdings mit [https://www.cygwin.com Cygwin] auch unter Windows betrieben werden.&lt;br /&gt;
&lt;br /&gt;
Als Ausgabeformate stehen [https://de.wikipedia.org/wiki/Postscript Postscript] und Gerber RS-274-X zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil von &#039;&#039;PCB&#039;&#039; ist, dass alle Funktionen auch über Hotkeys gesteuert werden können, was insbesondere nach längerer Einarbeitungszeit ein großer Gewinn gegenüber manchen Windows-Programmen ist.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung ist es meines Erachtens sehr wichtig, sich das [http://www.geda.seul.org/wiki/geda:gsch2pcb_tutorial Tutorial] durchzulesen. &#039;&#039;PCB&#039;&#039; und &#039;&#039;Gschem&#039;&#039; sind nicht besonders einfach zu benutzen. Gerade am Anfang, wenn man sich versucht damit einzuarbeiten. Aber wenn man einmal mit dem Werkzeug arbeiten kann, wird man es nicht mehr missen wollen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCB&#039;&#039; bildet zusammen mit &#039;&#039;Gschem&#039;&#039; und anderen Programmen das [[GEDA|gEDA]] Programmpaket. Hier auf der Mikrocontroller.net Seite finden sich Informationen zu PCB [[GEDA|unter gEDA]].&lt;br /&gt;
&lt;br /&gt;
==== PCB-RND ====&lt;br /&gt;
&lt;br /&gt;
Homepage: http://repo.hu/projects/pcb-rnd/index.html&lt;br /&gt;
PCB-RND ist eine Weiterentwicklung von PCB, das extrem flexibel und kompatibel mit anderen Layout-Tools sein will. Siehe http://repo.hu/projects/pcb-rnd/user/09_appendix/bridges.svg Es werden 10 Skriptsprachen unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Schaltplan- und Leiterplattensoftware - Sonderlösungen ==&lt;br /&gt;
&lt;br /&gt;
Alle Softwarelösungen, die nicht in andere Kategorien passen. Teilweise sehr neu mit unklarem Geschäftsmodell, weshalb es noch keine Erfahrung gibt, teilweise ältere Open Source Projekte.&lt;br /&gt;
&lt;br /&gt;
=== Electric ===&lt;br /&gt;
&lt;br /&gt;
Das [http://www.staticfreesoft.com/index.html Electric(TM)] VLSI Design System ist ein Open Source Electronic Design Automation (EDA) System.&lt;br /&gt;
&lt;br /&gt;
=== FidoCadJ ===&lt;br /&gt;
&lt;br /&gt;
[http://davbucci.chez-alice.fr/index.php?argument=elettronica/fidocadj/fidocadj.inc&amp;amp;language=English FidoCadJ] is a very easy to use editor, with a library of electrical symbols and footprints (through hole and SMD). Albeit its ease of use, it is a very immediate and effective EDA tool for the hobbyst. FidoCadJ stores its drawings in a compact text format. This choice is well suited for the copy and paste in newsgroups and forums. This explains the success of FidoCadJ in Usenet groups and in several portals. FidoCadJ is multi-platform Java program and runs on MacOSX, Linux and Windows. FidoCadJ and its manuals are in english, french and italian. Lizenz: Creative Commons 3.0 BY-NC-ND&lt;br /&gt;
&lt;br /&gt;
=== FreePCB ===&lt;br /&gt;
&lt;br /&gt;
FreePCB ist ein Open Source PCB Editor für Microsoft Windows, der unter der GNU General Public License veröffentlicht wurde. Er wurde entwickelt, um ihn einfach erlernen und nutzen zu können und dennoch für professionelles Arbeiten geeignet. Er besitzt keinen eingebauten Auto-Router, kann jedoch den web-basierten auf www.freerouting.net verwenden.&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/FreePCB Englischer Wikipedia Eintrag.&lt;br /&gt;
* http://www.freepcb.com/ Offizielle Homepage&lt;br /&gt;
* http://www.freepcb.com/freepcb_user_guide.pdf Users Guide&lt;br /&gt;
&lt;br /&gt;
=== EasyEDA ===&lt;br /&gt;
&lt;br /&gt;
[https://easyeda.com/ EasyEDA] ist eine kostenlose, Webbrowser-basierte EDA-Plattform zur Entwicklung von Schaltplänen, PCB-Layouts und Prozess-Simulationen (SPICE), deren Nutzung, &#039;&#039;&#039;aber nicht dessen Sourcecode&#039;&#039;&#039; unter der CC BY-SA 2.5 steht (Quelle: https://easyeda.com/page/privacy). Schaltpläne können direkt im Browser via Internet auf einem Server unter Zuhilfenahme der verfügbaren Bibliotheken erstellt werden. Der Serverdienst wird dabei von einem Leiterplattenhersteller gestellt. Projekte können sowohl als privates, als auch als öffentliches Projekt gespeichert werden. Es können Bibliotheken von Altium, Eagle, KiCad und LTspice importiert werden. Aus einem Schaltplan kann auf dem Server ein PCB-Layout gezeichnet werden, und beim Anbieter des Dienstes bestellt werden. Die Layout-Erstellung wird durch eine Autoroute-Funktion unterstützt. Das Projekt wird dabei in einem JSON Stil gespeichert, es kann aber auch in Gerber exportiert werden. Natürlich setzt die Nutzung des Dienstes einen funktionierenden permanenten Internetzugang voraus.&lt;br /&gt;
&lt;br /&gt;
=== ExpressPCB ===&lt;br /&gt;
&lt;br /&gt;
Die Firma &#039;&#039;&#039;ExpressPCB&#039;&#039;&#039; bietet den kostenlosen Schaltplaneditor &#039;&#039;&#039;&#039;&#039;ExpressSCH&#039;&#039;&#039;&#039;&#039; an. Zusätzlich gibt es das kostenlose Layoutprogramm &#039;&#039;&#039;&#039;&#039;ExpressPCB&#039;&#039;&#039;&#039;&#039; zum Erstellen von zwei- und vierlagigen Leiterplatten. Die beiden Programme sind auf Windows (NT, 2000, XP, Vista) beschränkt. Die Firma bietet auf der [https://www.expresspcb.com ExpressPCB Homepage] außerdem einen kommerziellen Service für die Herstellung von zwei- und vierlagigen Leiterplatten an. Auf der Seite finden sich [https://www.expresspcb.com/tips-for-designing-pcbs/ hier] einige Hinweise zum Entwurf von Leiterplatten.&lt;br /&gt;
&lt;br /&gt;
=== PCBWeb ===&lt;br /&gt;
&lt;br /&gt;
Ein kostenloser Layout- und Schaltplaneditor, dessen Lizensierung unklar ist.(Quelle: http://www.pcbweb.com/faq am 17. Mai 2017). Die Projektdaten werden in einem XML Format lokal vorgehalten, die Bibliotheken liegen auf einer Cloud des Anbieters (Quelle: http://www.pcbweb.com/faq am 17. Mai 2017). Dieser bietet auch eine Möglichkeit an, Platinen aus den Projektdaten zu erstellen. Ein Datenexport ist aber nur in Gerber möglich. Alle verwendeten Bauteile, die auch Arrow im Angebot hat, erscheinen in der Stückliste und können per Knopfdruck dort bestellt werden (Quelle: http://www.pcbweb.com/documentation#bill-of-materials-manager).&lt;br /&gt;
&lt;br /&gt;
[http://www.pcbweb.com/ Webseite zum Download]&lt;br /&gt;
&lt;br /&gt;
=== Razen PCB ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Razenpcb.png|miniatur|rechts|Screenshot Razen PCB]]&lt;br /&gt;
&lt;br /&gt;
[http://razencad.com/ Razen CAD] ist zwar noch in der Beta Phase, aber sieht momentan schon recht vielversprechend aus. &lt;br /&gt;
Es setzt auf Mercurial auf und ermöglicht dadurch kolaboratives arbeiten an einem Layout.&lt;br /&gt;
&lt;br /&gt;
=== ZenitPCB Suite ===&lt;br /&gt;
&lt;br /&gt;
[http://www.zenitpcb.com/eng/IndexEng.html ZenitPCB Suite] is directed to all those people who want to make printed circuit board for hobby, or to student and academics from universities or high schools, who want to create their own pcb with a professional approach and particularly without having to pay for expensive licenses. ZenitPCB Layout (part of the ZenitPCB Suite) is completely freeware for personal or semi-professional use, limited to [http://www.zenitpcb.com/images/MainBoard_01_01.gif 800 pins]. (Windows XP, Vista)&lt;br /&gt;
&lt;br /&gt;
Übersetzung: ZenitPCB richtet sich an all diejenigen, welche fürs Hobby, Schule, Studium etc professionelle PCBs erstellen möchten, ohne viel Geld für Lizenzen ausgeben zu müssen. ZenitPCb ist in der eingeschränkten Version mit 800 Pins für den semi-professionellen und privaten Gebrauch kostenfrei benutzbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan- und Leiterplattensoftware - meist verwendete Programme ==&lt;br /&gt;
&lt;br /&gt;
Diese zeichnen sich durch eine (relativ) geringe Einarbeitungszeit aus. Eagle ist der wohl bekannteste Vertreter und kostet in einer kommerziell verwendbaren Version gut drei- bis vierstellig. TARGET 3001! ist in Mitteleuropa recht verbreitet und etwas günstiger als Eagle. KiCad ist Open Source und hat seit 2014 Fahrt aufgenommen.&lt;br /&gt;
&lt;br /&gt;
Alle bestehen aus Schaltplaneditor und Layoutprogramm inklusive 3D-Ansicht. Mit keinem der Drei macht der versierte Hobbyist eine schlechte Wahl, kostenlose Versionen gibt es ebenso.&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Eagle.png|right|thumb|Screenshot Eagle]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eagle&#039;&#039;&#039; ([[:Kategorie:Eagle|Artikel]]) ([https://cadsoft.io/de/ Homepage]) von CadSoft, inzwischen Autodesk, ist ein komplettes Paket mit Schaltplaneditor, Layoutprogramm und Autorouter. Das hat den Vorteil, dass man einen erstellten Schaltplan gleich zu einer Platine weiterverarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Mitgeliefert werden umfangreiche Symbol- bzw. Bauteilbibliotheken, von Widerständen in allen Bauformen über Taster bis hin zu [[AVR]]s. Eine Library für viele aktuelle AVRs findet sich im Download-Bereich &lt;br /&gt;
von [http://www.embedit.de www.embedit.de].&lt;br /&gt;
&lt;br /&gt;
Eagle läuft unter Linux, Windows (2000/XP/Vista/7/8/10) und Mac OS X. Ausgabedateien können direkt an die einschlägigen Hersteller geliefert werden.&lt;br /&gt;
&lt;br /&gt;
Eine für nichtkommerzielle Anwendungen kostenlose Version ist von [https://www.cadsoft.io CadSoft] erhältlich. Diese ist auf zweilagige Platinen im halben Euro-Format (80x100mm) sowie Schaltpläne mit nur einer Seite beschränkt.&lt;br /&gt;
&lt;br /&gt;
==== Autorouter ====&lt;br /&gt;
Der eher mäßige Autorouter funktioniert nur in der kommerziellen Version. Man kann aber den kostenlosen Autorouter von [http://www.freerouting.net www.freerouting.net] verwenden, die Eagle-brd Dateien dort importieren und als Eagle-session-script (.scr) wieder in Eagle importieren. Dabei auf die richtige Version des Eagle-ULP achten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Stereobild-elektronik-3d.jpg|right|thumb|Rot-Grün-Stereo-Bild]]&lt;br /&gt;
==== 3D-Ansicht ====&lt;br /&gt;
Zum Betrachten des fertigen, bestückten Platinenentwurfs in Form eines 3D-Bilds bietet sich das nicht von CadSoft entwickelte Paket [https://sourceforge.net/projects/eagle3d.berlios/files/?source=navbar eagle3D] an. Mit Hilfe eines ULP wird eine Beschreibungsdatei für den Open Source Renderer &#039;&#039;POVray&#039;&#039; erzeugt, welche dann anschließend halbautomatisch generiert werden kann. Auch Bewegungsanimation und Kameraflug sind möglich. Es wird bereits eine große Zahl an Bauteilen unterstützt.&lt;br /&gt;
&lt;br /&gt;
Anwendungshinweise:&lt;br /&gt;
* [[Eagle im Hobbybereich]]&lt;br /&gt;
* [[:Kategorie:Eagle]]&lt;br /&gt;
* [http://gaussmarkov.net/wordpress/category/tools/software/eagle/ Eagle CAD Tutorial] im Blog &#039;&#039;gaussmarkov: diy fx&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== TARGET 3001! ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:target3001.png|right|thumb|Screenshot TARGET 3001!]]&lt;br /&gt;
&lt;br /&gt;
TARGET 3001! ([https://www.ibfriedrich.com/de/ Homepage]) für Windows (ME/NT4/2000/XP/Vista/Win7/Win8/Win10) bietet folgende Funktionen:&lt;br /&gt;
&lt;br /&gt;
* Schaltplan&lt;br /&gt;
* Bauteilerstellung &lt;br /&gt;
* Schaltungssimulation (PSPICE-Syntax)&lt;br /&gt;
* Platinen-Layout mit Autoplacement&lt;br /&gt;
* Autorouter ([http://konekt.com ELECTRA])&lt;br /&gt;
* Anzeige der Platine in 3D&lt;br /&gt;
* Frontplattenentwurf direkt an oder über der Platine&lt;br /&gt;
&lt;br /&gt;
Die Platinen-Layout-Software ist in deutscher, englischer oder französischer Sprache. Es gibt eine für nicht kommerzielle Anwendungen kostenlose Version: &#039;&#039;&#039;TARGET 3001! discover&#039;&#039;&#039; ist beschränkt auf 250 Pins/Pads, 2 Kupferlagen&lt;br /&gt;
und 30 Signale sind simulierbar, die Fläche ist unbeschränkt (1,2m x 1,2m).&lt;br /&gt;
&lt;br /&gt;
Auf der c&#039;t 11/07 CD ist eine &#039;&#039;&#039;SE Version&#039;&#039;&#039; von TARGET 3001! verfügbar, welche 400 Pins/Pads verarbeiten kann. &lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;PCB-Pool Edition&#039;&#039;&#039; hat keine Beschränkungen, speichert aber die Layouts in einem von normalen Target Versionen nicht lesbaren Format. Diese Layouts können dann allerdings nur zum selbst Ätzen ausgedruckt werden oder vom PCB-POOL® produziert werden.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [https://server.ibfriedrich.com/wiki/ibfwikide TARGET 3001 Wiki]&lt;br /&gt;
* [https://www.pcb-pool.com/ppde/service_downloads.html TARGET 3001 PCB-Pool-Edition]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TARGET 3001!&#039;&#039; bietet ein typisches Windows Look-And-Feel. Eine einfache Einführung findet sich &#039;&#039;&#039;[https://server.ibfriedrich.com/wiki/ibfwikide/index.php?title=Kurzeinführung2 hier]&#039;&#039;&#039;. Wer sich schon mit Eagle auskennt, kann auch &#039;&#039;&#039;[https://server.ibfriedrich.com/wiki/ibfwikide/index.php?title=Eagle hier]&#039;&#039;&#039; schauen. Es gibt kostenlosen direkten Service durch den Hersteller telefonisch oder per E-Mail auch für Einsteiger oder Demo-User.&lt;br /&gt;
&lt;br /&gt;
=== KiCad ===&lt;br /&gt;
[[Bild:kicad1.gif|right|thumb|Screenshot KiCad Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
KiCad ([[KiCad|Artikel]]) ([http://kicad-pcb.org Homepage]) ist ein Paket aus Design-, Layout- und Routingprogramm. Damit können Schaltpläne gezeichnet, diese zu Platinen weiterentwickelt werden und das Ganze dann zur Fertigung der Leiterplatten im Gerber Format exportiert werden. Es existieren viele Hilfsprogramme wie z.B. zur Erstellung eigener Schaltplansymbole und von Bauteil Footprints für das Board, Import von Grafik für Logos, Gerberviewer ec.&lt;br /&gt;
Es existieren umfangreiche Bibliotheken für Schaltplansymbole und Footprints, sowie auch teilweise 3-D Modelle der Bauteile.&lt;br /&gt;
&lt;br /&gt;
Neben der mitgelieferten, bereits umfangreichen Bibliothek, die auch hier extern zugänglich ist (https://github.com/KiCad) gibt es auf vielen anderen Seiten weitere Bibliotheken zum Download, die einfach integriert werden können (siehe [[KiCad#Sonstige_Bibliotheken_im_Netz|KiCAD-Artikel]]). Die Erstellung und Vorhaltung von Symbolen, Footprints und 3D-Modellen ist aber mittlerweile wegen des enormen Umfanges seit 2015 ein eigenständiges Projekt, welches auf Gitub gehosted ist. Auf diese Footprintbibliotheken kann direkt aus dem Layoutprogramm zugegriffen werden, auch wenn dringend empfolen wird, eine lokale Arbeits- und Sicherungskopie anzulegen. Auch Symbolbibliotheken und 3D-Modelle können von dort bezogen werden. Selbstredend ist es auch einfach möglich, Symbole und Footprints mit KiCad selber zu erstellen. Für die Erstellung von 3D-Modellen sind andere Programme nötig. Doch auch hier besteht eine Anzahl von openSource Programmen, wie z.B. als primitives Beispiel Wings-3D.&lt;br /&gt;
&lt;br /&gt;
Eine KiCad Mailingliste findet sich unter http://groups.yahoo.com/group/kicad-users/. Die Anmeldung erfolgt erst, nachdem man vom Besitzer freigeschaltet wurde (wie üblich für die meisten Yahoo-Groups). Weitere User Foren sind hier aufgelistet: http://kicad-pcb.org/community/sites/#_forums&lt;br /&gt;
&lt;br /&gt;
Das KiCad Projekt wurde von Jean Pierre Charras gestartet und enthält eine Gruppe recht aktiver Entwickler. Es ist auf [http://de.wikipedia.org/wiki/Launchpad Launchpad] angesiedelt. Auch eine Nutzergruppe des [http://de.wikipedia.org/wiki/CERN CERN] beteiligt sich mit einem [https://code.launchpad.net/~cern-kicad/kicad/kicad-gal-orson branch] an der Weiterentwicklung von KiCad: [http://www.ohwr.org/projects/cern-kicad/wiki/WorkPackages Über die geplante Weiterentwicklung von KiCad (englisch)] und [http://home.web.cern.ch/about/updates/2015/02/kicad-software-gets-cern-treatment warum das CERN KiCad unterstützt (englisch)] . &lt;br /&gt;
&lt;br /&gt;
KiCad basiert auf wxWidgets und ist damit plattformübergreifend. Die Programme sind unter der GPL veröffentlicht und damit echte Open Source. KiCad darf frei benutzt werden und die Nutzer haben volle Rechte an ihren damit erstellten Schaltplänen und Layouts, auch für kommerzielle Nutzung. Im deutschsprachigen Raum existiert noch ein Zeichenprogramm für Elektrotechnik, welches auch kicad heißt, aber ein kommerzielles Projekt ist, und mit dem hier behandelten lediglich den Namen gemeinsam hat.&lt;br /&gt;
&lt;br /&gt;
Für Umsteiger von anderen Programmen sollten sich nach wenigen Stunden bereits die gleichen Ergebnisse erzielen lassen. Zum Erlernen kann man auf die Tutorials unter http://kicad-pcb.org/help/tutorials/ zurückgreifen. Ebenso findet sich hier unter [[KiCad]] eine umfangreiche FAQ (und Bibliothekssammlung). Das KiCad Projekt hat eine umfangreiche Dokumentation unter http://kicad-pcb.org/help/documentation/ in einigen verschiedenen Sprachen.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplaneditor von KiCad verfügt über Möglichkeiten hierarchische Schaltpläne anzulegen. Etwas, das man nicht mehr missen möchte, nachdem man einmal damit gearbeitet hat. Obwohl ursprünglich nicht dafür gedacht, lässt sich dieses System nutzen, um aus vorgefertigten Teilschaltplänen einen Hauptschaltplan modular zusammenzusetzten. Eine Anleitung dazu findet sich hier: [[Media:HierarchischeSchaltplaeneAlsBausteineInKicad_RevC_23Dec2013.pdf]]&lt;br /&gt;
&lt;br /&gt;
Zur Simulation lässt sich ngSpice (http://ngspice.sourceforge.net/download.html) einbinden, so dass auch aus KiCad eine direkte Simulation aus dem Schema heraus möglich wird. Eine Anleitung befindet sich unter http://stffrdhrn.github.io/electronics/2015/04/28/simulating_kicad_schematics_in_spice.html.&lt;br /&gt;
&lt;br /&gt;
[[Bild:kicad2.gif|right|thumb|300px|Screenshot KiCad 3D-Ansicht]]&lt;br /&gt;
KiCad liefert eine schöne 3D-Ansicht des fertigen Layouts einschließlich der bestückten Bauteile, so dass man an dieser Stelle schon einmal einen Überblick bekommt, ob vielleicht nicht doch etwas vergessen wurde. Es gibt zwar nicht für alle Bauformen ein 3D-Modell, allerdings lassen sich diese selbst erstellen. Das 3D-Modell lässt sich exportieren, um es z.B. in mechanischen CAD-Systemen zu verwenden (Passt die Platine hinein? lässt sie sich montieren?).&lt;br /&gt;
[[Bild:DC-50Ohm_Terminierung_Downside.png|right|thumb|Unterseite eines Messadapters]]&lt;br /&gt;
[[Bild:DC-50Ohm_Terminierung_Upside.png|right|thumb|Oberseite eines Messadapters]]&lt;br /&gt;
&lt;br /&gt;
KiCad enthält eine Autoplacement und eine Autorouterfunktion, die aber leider nicht sehr effizient sind. Außerdem sind sie schlecht dokumentiert. Es lassen sich aber Netzlisten zum Export in mehrere verschiedene externe Autorouter erzeugen. Desweiteren lässt sich der bekannte Freeroute Autorouter im Netz direkt verwenden. Desweiteren können Netzlisten zum Export in Spice erzeugt werden.&lt;br /&gt;
Neuere KiCad Versionen enthalten allerdings einen sehr effizienten interaktiven Router. Dieser kann allerdings nur verwendet werden, wenn die Hardware und das Betriebssystem des Rechners aktuelle openGL Versionen unterstützt. Hier ein Video zur Benutzung des interaktiven Routers: https://www.youtube.com/watch?v=CCG4daPvuVI (aktueller: https://www.youtube.com/watch?v=QwxDOHjU2PA). Ebenso existiert ein Tool für &amp;quot;Different Pair matching&amp;quot; um Leiterbahnen gleicher Länge (Laufzeit) zu erzeugen. Siehe dazu dieses Video: https://www.youtube.com/watch?v=chejn7dqpfQ&lt;br /&gt;
&lt;br /&gt;
Eagle 6 Boarddateien können in KiCad eingelesen werden. Ebenso können Eagle &amp;quot;Packages&amp;quot; als Footprintbibliotheken in KiCad eingebunden werden. Auch gEDA Footprints können direkt als KiCad Footprint Bibliothek in PCBnew eingebunden werden. Diese Funktionen sind aber noch als experimentell zu bezeichnen.&lt;br /&gt;
&lt;br /&gt;
Des weiteren existieren eine Reihe von Konvertern, mit denen Daten anderer Platinenlayoutprogramme nach KiCad exportiert werden können. Eine Liste findet sich hier: [[KiCad#Konverter]]&lt;br /&gt;
&lt;br /&gt;
KiCad kann Gerberdaten wahlweise als &amp;quot;Extendet Gerber&amp;quot; oder im aktuellen [[Gerber-Tools#Aktuell:_Gerber_Version_2_.28X2.29|Gerber Version 2]] exportieren, die jeder seriöse Leiterplattenhersteller verarbeiten kann. KiCad ist mittlerweile soweit verbreitet, das viele Leiterplattenhersteller die KiCad-Board Daten auch direkt verarbeiten können, auch wenn das wegen der Fehleranfälligkeit keine empfehlenswerte Vorgehensweise ist.&lt;br /&gt;
&lt;br /&gt;
Das KiCad Packet enthält außerdem einen Gerberdatenviewer, der auch eingelesene Gerberdaten als Layout reimportieren kann. &lt;br /&gt;
Sauberes Gerber vorausgesetzt, kann KiCad damit gut für reverse Engeneering verwendet werden, in Fällen, wo nur noch die Gerberdaten einer Platine vorhansden sind.&lt;br /&gt;
&lt;br /&gt;
Außerdem zählt zum KiCad Packet ein &amp;quot;Leiterplattenrechner&amp;quot; mit dem z.B. Wellenwiderstände, Leiterbahnbreiten und Isolationsabstände bestimmt werden können.&lt;br /&gt;
&lt;br /&gt;
KiCad kann (Version Dezember 2015) Boards mit 32 Kupferlagen und die dazugehörigen Löttstop-, Umriss-, Lötpasten-, Kleber-, Silkscreen- etc. Lagen verarbeiten. Die mögliche Leiterplattengröße liegt über 2x2m. Damit ist eine deutlich größere Fläche als die von Einheitstafeln abgedeckt. Wer Platinen im oder über dem Einheitstafelnformat benötigt, wird Mühe aufwenden müssen, einen Hersteller dafür zu finden.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Kritikpunkt wäre, dass die offizielle Symbolbibliothek nur amerikanische, aber keine europäischen Schaltplansymbole enthält. Aber eine aktuelle Version einer europäischen Symbolbibliothek findet sich hier in  Mikrocontroller.de unter [[KiCad#Bibliotheken]]&lt;br /&gt;
unter SymbolsSimilarEN60617+oldDIN617-RevE8.lib&lt;br /&gt;
Diese enthält aber nicht nur EN60617 Symbole, sondern auch einige andere Symbole wie Logos für Gefahr, Hochspannung, ESD-Schutz und Dummy Symbole für Platinenumrisse, Fiducials, Messpunkte ec. Eine [https://www.mikrocontroller.net/wikifiles/7/77/Symbols_EN60617_13Mar2013.lib &amp;quot;gereinigte&amp;quot; EN60617 Bibliothek] findet sich am gleichen Ort unter Symbols_EN60617_13Mar2013.lib, zusammen mit einem &lt;br /&gt;
[https://www.mikrocontroller.net/wikifiles/e/e6/Symbols_EN60617_13Mar2013.pdf  PDF-Katalog der enthaltenen Symbole].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Einarbeitung in KiCad ist vergleichbar mit Eagle. Es hängt vermutlich von den individuellen Denkstrukturen ab, welches Programm man handlicher findet. Ein großer Vorteil sind die Dateiformate, welche alle reiner ASCII-Text sind. Dies macht die Entwicklung von externen Skripten zur Lösung von speziellen Aufgaben sehr leicht. Außerdem können die Dateien deswegen sehr einfach in Versionsverwaltungssystemen wie CVS verwaltet werden, was insbesondere die Entwickler größerer Projekte zu schätzen wissen.&lt;br /&gt;
Ein internes Skripting unter Python für KiCad ist in der Entwicklung. z.Z. kann es aber nur unter PCBnew verwendet werden.&lt;br /&gt;
&lt;br /&gt;
[http://www.bigmessowires.com/2014/12/09/eagle-vs-kicad-revisited/ Und hier ein Link auf eine Kritik/Meinung (englisch)]&lt;br /&gt;
&lt;br /&gt;
== Schaltplan- und Leiterplattensoftware - Neulinge ==&lt;br /&gt;
&lt;br /&gt;
=== CircuitMaker ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://circuitmaker.com/ CircuitMaker]&#039;&#039;&#039; ist eine kostenfreie, cloudbasierte und vereinfachte Version des vollwertigen AltiumDesigner. Mehr zur Historie in der [https://en.wikipedia.org/wiki/CircuitMaker englischen Wikipedia].&lt;br /&gt;
&lt;br /&gt;
Der Funktionsumfang ist nicht jener von einem vollwertigen AltiumDesigner, aber viele Aspekte sind gleich.&lt;br /&gt;
So ist es auch möglich, Leiterbahnen mittels Hug &#039;n Shove zu verschieben oder komplexe DesignRules anzuwenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cloud&#039;&#039;&#039;&lt;br /&gt;
Die Cloud beschränkt sich darauf, dass die eigenen Files dort abgelegt werden.&lt;br /&gt;
Grundsätzlich wäre die Idee, dass alle Community Mitglieder alle Projekte selbst benutzen und bearbeiten könnten. Wenn man jedoch das eigene Projekt nie &amp;quot;committed&amp;quot;, dann ist es auch nie sichtbar für andere Mitglieder. Zudem werden sämtliche Daten auch Lokal in einem Ordner abgelegt.&lt;br /&gt;
&lt;br /&gt;
=== DesignSpark PCB ===&lt;br /&gt;
&lt;br /&gt;
Integrierter Schaltplan-Editor mit Autorouter und Leiterplatten-Designer&amp;lt;br /&amp;gt;&lt;br /&gt;
DesignSpark PCB ist kostenlos auch für kommerzielle Projekte, allerdings nicht quelloffen (Open Source). Eine Registrierung des Users ist unbedingt erforderlich.&amp;lt;br /&amp;gt;&lt;br /&gt;
Unbegrenzte Leiterplattengröße, im Prinzip auch unbegrenzte Layer-Anzahl.&amp;lt;br /&amp;gt;&lt;br /&gt;
Bedienung ist etwas gewöhnungsbedürftig - leider z.Zt. nur als englische (u. chinesische) Version verfügbar. &amp;lt;br /&amp;gt;&lt;br /&gt;
Weitere Features: z.B. professionelle 3D-Designsoftware, Schnittstelle zu SPICE, Gerberausgabe direkt. Import von EAGLE-Datein möglich. &amp;lt;br /&amp;gt;&lt;br /&gt;
Kostenloser Download: http://www.rs-online.com/designspark/electronics/deu/page/designspark-pcb-home-page bzw. http://www.rs-online.com/designspark/electronics/deu/ &amp;lt;br /&amp;gt;&lt;br /&gt;
Erfahrungsbericht, der veralteten Version 3.0. Es existiert heute (2016) die Version 7.01: [http://www.ps-blnkd.de/Erfahrungsbericht_Schaltung&amp;amp;Leiterplatte.pdf] &amp;lt;br /&amp;gt;&lt;br /&gt;
Verschiedene Tutorials &amp;quot;DesignSpark Tipps &amp;amp; Tricks&amp;quot; in deutscher Sprache im &amp;quot;Elektor&amp;quot; 2014/2015.&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://de.wikipedia.org/wiki/DesignSpark_PCB Wikipedia Artikel zu DesignSpark]. DesignSpark PCB ist an den Bauteiledistributor [http://de.rs-online.com/web/generalDisplay.html?id=DesignSpark-Jan11 RS Components] angelehnt.&lt;br /&gt;
&lt;br /&gt;
=== DipTrace ===&lt;br /&gt;
&lt;br /&gt;
Diptrace besteht aus einem Schaltplan-, Layout-, Symbol- und Footprint-Programm.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Benutzer-Schnittstelle bietet pro Objekt (Symbol, Part, Pad, etc.) ein Kontext-Menü an. Dies ermöglicht oft eine unkomplizierte, geradlinige Bedienung. Trotzdem können grundlegende Arbeiten teils etwas umständlich und zweitaufwändig sein.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Programme bieten keine regelbasierten Konfigurationen oder (Script-)Programme. In andern Worten Diptrace ist wenig anpassbar.&amp;lt;br /&amp;gt;&lt;br /&gt;
Diptrace bietet ähnlich viele Funktionen wie Eagle.&amp;lt;br /&amp;gt;&lt;br /&gt;
Angeboten werden verschiedene Editionen auch für nichtkommerzielle Nutzung, siehe http://diptrace.com/buy/non-profit/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die kleinste und komplett kostenlose non-profit Version ist aktuell (Juni 2016) auf zwei Lagen und 500 Pins beschränkt. Zum Vergleich: ICs mit 48 Pinnen sind keine Seltenheit. Es gibt aber auch verbilligte erweiterte und volle non-profit Lizenzen. Die strikte Forderung &amp;quot;non profit&amp;quot; verbietet implizit eine Veröffentlichung.&lt;br /&gt;
&lt;br /&gt;
Unterstützte Betriebssysteme: Windows (Linux mit Wine, funktioniert mit Debian 8 &amp;quot;Jessie&amp;quot; hervorragend), Mac OS X.&lt;br /&gt;
&lt;br /&gt;
[http://www.diptrace.com/ DipTrace.com (Homepage)]&lt;br /&gt;
&lt;br /&gt;
[https://www.mikrocontroller.net/topic/319636#new Forumsbeitrag/Diskussion über Diptrace (2014)]&lt;br /&gt;
&lt;br /&gt;
[https://www.mikrocontroller.net/topic/320897/ Geeignete Schaltplan und Layoutsoftware für Hobbyprojekte]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Horizon ===&lt;br /&gt;
Ein open source CAD Prorgramm in Entwicklung, aber schon recht weit fortgeschritten.&lt;br /&gt;
Siehe Diskussion und Verlauf im Forum: http://www.mikrocontroller.net/topic/417908#new&lt;br /&gt;
Horizon direkt con GitHub: https://github.com/carrotIndustries/horizon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Schaltplan- und Leiterplattensoftware ==&lt;br /&gt;
&lt;br /&gt;
Diese integrieren zusätzlich spezielle Funktionen, wie FPGA-Entwicklung oder impedanzkontrollierten Layouts. Sie eigenen sich mit langer Einarbeitungszeit und mindestens vierstelligem Preis nur, wenn man sehr viel damit arbeitet. Die Übergänge zu den &#039;&#039;Platzhirschen&#039;&#039; aus der vorherigen Kategorie sind fließend.&lt;br /&gt;
&lt;br /&gt;
=== Altium Designer ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Altium&#039;&#039;&#039; (aus Protel hervorgegangen) ist eine kommerzielle EDA Suite die umfangreiche Funktionen beinhaltet.&lt;br /&gt;
Neben den Klassikern wie Schaltplan und Layouterzeugung werden auch elektronische Simulationen, FPGA Entwicklungstools, und diverse andere Features per PlugIn vom Hersteller angeboten. Seit 2011 ist der Sitz in China, dort sind auch die Programmierer.&lt;br /&gt;
Leider ist der Produktzyklus momentan sehr kurz, sodass fast jährlich neue Hauptrelease erscheinen (aktuell 15.1) und in Abständen von 2-6 Monaten &amp;quot;Zwischenupdates&amp;quot; veröffentlicht werden.&lt;br /&gt;
&lt;br /&gt;
* Diverse Formate können importiert und exportiert werden, sodass man u.A. &amp;quot;fast&amp;quot; nahtlos mit MCAD Systemen kooperieren kann [https://docs.google.com/viewer?url=http://www.altium.com/files/training/Module%2020%20-%203D%20Mechanical%20CAD.pdf LINK]&lt;br /&gt;
* Diverse Funktionen für HighSpeed Designs [http://fplreflib.findlay.co.uk/articles/37941%5CHiSpeedDesignTutorialforAltiumDesigner_long.pdf LINK]&lt;br /&gt;
&lt;br /&gt;
Leider wurde der Preis in der jüngsten Vergangenheit des Öfteren nach oben korrigiert.&amp;lt;BR&amp;gt;&lt;br /&gt;
2014-04-11: Achtung Altium erhöht zum 31.6.2014 schon wieder die Preise und dieses Mal um satte 34% (4000€ auf 5400€!). Das entspricht einer Erhöhung um +68% in 5 Jahren.&lt;br /&gt;
&lt;br /&gt;
=== BAE ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B&#039;&#039;&#039;artels &#039;&#039;&#039;A&#039;&#039;&#039;uto &#039;&#039;&#039;E&#039;&#039;&#039;ngineer ([[BAE-Tutorial|Artikel]]) unterstützt die Erstellung von Schaltplänen, Leiterplatten und integrierten Schaltungen und läuft unter Windows, Linux und verschiedenen X11-/Unix-Systemen. Der Schaltplaneditor kann Pläne auf beliebig vielen Blättern erstellen, wobei auch hierarchische Strukturen möglich sind. Der Autorouter erzeugt recht brauchbare Ergebnisse, wobei beliebige Teile mit der Hand vorab geroutet werden können. Ein Autoplacer ist ebenfalls vorhanden.&lt;br /&gt;
&lt;br /&gt;
Eine auf Schaltplaneingabe beschränkte Version und eine kastrierte Evaluierungsversion sind auf der [https://www.bartels.de/bae/bae_de.htm BAE Homepage] downloadbar.&lt;br /&gt;
&lt;br /&gt;
Die [https://www.bartels.de/bae/baeprice_de.htm preiswerteste] kostenpflichtige Version ist das &#039;&#039;&#039;&#039;&#039;BAE Light&#039;&#039;&#039;&#039;&#039;. Diese Version ist auf Leiterplatten der Größe 180x120 mm² und auf 2 Lagen beschränkt, eine Beschränkung auf eine bestimmte Pinanzahl gibt es aber nicht.&lt;br /&gt;
&lt;br /&gt;
Ansonsten wird eine Economy-, Professional- und Highendversion angeboten, die jeweiligen Eigenschaften sind im Abschnitt [https://www.bartels.de/baedoc/inst_de.htm#BAEINST_BAE Bartels AutoEngineer Softwarekonfigurationen] erklärt. Interessant ist z.&amp;amp;nbsp;B. der Bauteilhöhencheck.&lt;br /&gt;
Mit dem &#039;&#039;&#039;&#039;&#039;BAE IC Design&#039;&#039;&#039;&#039;&#039; dringt man bis in den Bereich der IC- und ASIC-Entwicklung vor.&lt;br /&gt;
&lt;br /&gt;
=== Pulsonix ===&lt;br /&gt;
[http://www.pulsonix.com PULSONIX] ist ein Schaltplan- und Layout-Werkzeug mit [http://www.pulsonix.com/downloads/datasheets/Pulsonix%20FPGA.pdf integriertem FPGA-Interface] zum Import von Pindefinitionen, sowie [http://www.pulsonix.com/downloads/datasheets/Pulsonix%20Spice%20V2.0%20UK.pdf integriertem Schaltungssimulator] auf PSpice-Basis.&lt;br /&gt;
&lt;br /&gt;
== Hilfsprogramme ==&lt;br /&gt;
&lt;br /&gt;
=== Fped ===&lt;br /&gt;
&lt;br /&gt;
Ein quelloffenes Programm nur als Hilfestellung zum Erstellen von Footprints. Das spezielle daran ist eine Beschreibungssprache für Footprintdateien. Exportmöglichkeiten in [[KiCad]] (2010) und Postscript. [http://downloads.qi-hardware.com/people/werner/fped/gui.html Homepage]   ([http://projects.qi-hardware.com/index.php/p/fped/source/tree/master/manual alternative Fped Seite]) aber das Debian Projekt enthält mehr [https://packages.debian.org/sid/electronics/fped Nebeninformationen zu Fped]. Autor ist Werner Almesberger. Betreuer des Debian Paketes ist Xiangfu Liu.&lt;br /&gt;
&lt;br /&gt;
== Integrierte Elektronikentwicklung ==&lt;br /&gt;
Komplette Entwicklungsumgebungen, die praktisch alle Facetten der Elektronikentwicklung (EDA), also z.B. auch Gehäusebau, Unterstützung zur EMV-Simulation, Bauteil und Lieferantenverwaltung abbilden und sich damit hauptsächlich für große Unternehmen eignen:&lt;br /&gt;
&lt;br /&gt;
=== Orcad Cadence Design Systems ===&lt;br /&gt;
[https://de.wikipedia.org/wiki/Cadence_Design_Systems Wikipedia-Artikel]&lt;br /&gt;
=== Mentor Graphics ===&lt;br /&gt;
[https://de.wikipedia.org/wiki/Mentor_Graphics Wikipedia-Artikel]&lt;br /&gt;
=== Zuken ===&lt;br /&gt;
[https://de.wikipedia.org/wiki/Zuken Wikipedia-Artikel]&lt;br /&gt;
&lt;br /&gt;
== Software-Entwicklungen hier im Forum ==&lt;br /&gt;
&lt;br /&gt;
Zuweilen stellen Forenmitglieder Eigenentwicklungen aus diesem Bereich vor.  In diesem Abschnitt finden sich Links auf die entsprechenden Threads.&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/417908 horizon]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/351306 HobbyCi]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Schaltungssimulation]]&lt;br /&gt;
* [[Dos and don&#039;ts - Platinenlayout]]&lt;br /&gt;
* [[Lochrasterplatine]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schaltplaneditoren]]&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multimeter&amp;diff=92793</id>
		<title>Multimeter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multimeter&amp;diff=92793"/>
		<updated>2016-04-20T10:57:44Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Wichtige Eigenschaften */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Multimeter dient zur Messung verschiedener elektrischer Größen. Die Grundfunktionen sind Messung von Spannung, Strom, Widerstand. Darüber hinaus bieten viele Geräte noch weitere Funktionen wie Diodentest, Durchgangsprüfer, Kapazitätsmessung, Temperaturmessung, Frequenz und noch mehr.&lt;br /&gt;
&lt;br /&gt;
== Wichtige Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
Bei der Auswahl eines Multimeters sollte man sich zuerst überlegen, was man damit machen möchte und welche Eigenschaften und Funktionen dafür benötigt werden. Neben der Funktionalität sollte das Multimeter auch bestimmten Sicherheitsanforderungen genügen.&lt;br /&gt;
&lt;br /&gt;
=== Sicherheit ===&lt;br /&gt;
&lt;br /&gt;
=== Spannungsfestigkeit ===&lt;br /&gt;
&lt;br /&gt;
Eine wesentliche Eigenschaft ist die Spannungfestigkeit des Geräts. Dazu gibt es üblicherweise eine Angabe der Nennspannung zusammen mit der [[Leiterbahnabstände#Überspannungskategorien|Überspannungskategorie]]. Diese Angabe bezieht sich nicht auf den Messbereich intern im Gerät, sondern auf die Stärke der Isolation nach außen.&lt;br /&gt;
&lt;br /&gt;
Solange man nur mit Kleinspannung (&amp;lt; 50V AC bzw &amp;lt;120V DC) und kleinen Strömen arbeitet sind die Sicherheitsanforderungen an das Multimeter nicht groß; da kann man eigentlich jedes Gerät einsetzen. So ziemlich alle Messgeräte sind für mindestens 300V Cat II spezifiziert, was auch für Messungen an Geräten, die über eine Steckdose am Niederspannungsnetz (230V) betrieben werden ausreichend ist.&lt;br /&gt;
&lt;br /&gt;
Für Messungen an Geräten, die fest mit dem Niederspannungsnetz verbunden sind, ist die Überspannungskategorie III notwendig. Kategorie IV braucht man für Messungen direkt an oder in der Nähe der Einspeisung in die elektrische Installation von Gebäuden, z.B. im bzw. vor dem Hauptverteiler.&lt;br /&gt;
&lt;br /&gt;
Die Nennspannung bezieht sich dabei auf die Spannung Leiter gegen Erde. Einen guten Sicherheitsstandard bieten üblicherweise Geräte mit 600V Cat III/1000V Cat II; noch bessere Geräte haben 600V Cat IV/1000V Cat III oder sogar 1000V Cat IV.&lt;br /&gt;
&lt;br /&gt;
=== Sicherung ===&lt;br /&gt;
&lt;br /&gt;
Weiterhin ist die Sicherung bei der Strommessung ein sicherheitsrelevantes Bauteil. Viele preiswerte Multimeter haben eine einfache Glasrohrsicherung (5 x 20 mm) mit einer Nennspannung von 250V. &lt;br /&gt;
&lt;br /&gt;
Diese Sicherungen haben nur eine begrenzte Abschaltfähigkeit, vor allem bei Messungen mit Gleichstrom und hoher Spannung bildet sich in so einer Sicherung ein Lichtbogen und die Sicherung trennt nicht. Das kann zur Zerstörung des Multimeters (Brand, Explosion) und ernsthaften Verletzungen führen.&lt;br /&gt;
&lt;br /&gt;
Vor allem bei Strommessungen bei hoher Gleichspannung sollte darauf geachtet werden, dass im Multimeter eine Sicherung eingebaut ist, die ein Trennvermögen von 1000V und 20 kA hat. Diese Sicherungen haben meistens die Abmessungen 10 x 38 mm.&lt;br /&gt;
&lt;br /&gt;
=== Analog oder Digital ===&lt;br /&gt;
&lt;br /&gt;
Die große Masse an Multimetern heute ist digital, daher auch die weit verbreitete Abkürzung DMM (&#039;&#039;&#039;D&#039;&#039;&#039;igital&#039;&#039;&#039;m&#039;&#039;&#039;ulti&#039;&#039;&#039;m&#039;&#039;&#039;eter). Dennoch gibt es noch ein paar wenige, neue Analoggeräte. Wo liegen nun die Vor- und Nachteile?&lt;br /&gt;
&lt;br /&gt;
==== Analoge Multimeter ====&lt;br /&gt;
&lt;br /&gt;
Diese Geräte sind rein passiv aufgebaut und bestehen nur aus einem Drehspulmesswerk und vielen Widerständen zur Messbereichsumschaltung.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* keine Stromversorgung nötig&lt;br /&gt;
* Intuitive Anzeige von Schwankungen des Messwerts, Trendanzeige&lt;br /&gt;
* unempfindlich gegen elektromagnetische Störungen&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* deutlich niedrigerer Innenwiderstand bei Spannungsmessungen&lt;br /&gt;
* Ablesefehler&lt;br /&gt;
* geringere Auflösung des Messwerts beim Ablesen&lt;br /&gt;
* keine automatische Bereichswahl möglich&lt;br /&gt;
* bedingt durch die Ablesefehler und mechanische Probleme nur eine begrenzte Genauigkeit erreichbar&lt;br /&gt;
&lt;br /&gt;
==== Digitale Multimeter ====&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Kein Ablesefehler&lt;br /&gt;
* Deutlich bessere Auflösung, dadurch mehr Genauigkeit möglich&lt;br /&gt;
* durch geeignete [[AD-Wandler]] sehr hohe [[Auflösung und Genauigkeit]] möglich&lt;br /&gt;
* sehr hoher Eingangswiderstand bei Spannungsmessungen&lt;br /&gt;
* hohe Empfindlichkeit durch Eingangsverstärker&lt;br /&gt;
* automatische Bereichswahl möglich&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt eine Stromversorgung&lt;br /&gt;
* keine intuitive Anzeige von Messwertschwankungen&lt;br /&gt;
* empfindlicher bezüglich Störeinkopplungen&lt;br /&gt;
* kann selber Störquelle bei extrem empfindlichen Messungen sein&lt;br /&gt;
&lt;br /&gt;
Teilweise hat man heute erfolgreich einige Vorteile der analogen Anzeige in die digitalen Multimeter übernehmen können. So bieten einge Messgeräte eine quasianaloge Bandanzeige des Messwerts, welcher das Verhalten eines Zeigerinstruments brauchbar nachbildet.&lt;br /&gt;
&lt;br /&gt;
==== Analoges Multimeter mit Messverstärker ====&lt;br /&gt;
&lt;br /&gt;
Bei diesen Geräten wird versucht einige Vorteile des DMM mit der Analoganzeige zu kombinieren.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Intuitive Anzeige von Schwankungen des Messwerts, Trendanzeige&lt;br /&gt;
* etwas unempfindlicher gegen elektromagnetische Störungen als digitale Multimeter&lt;br /&gt;
* sehr hoher Eingangswiderstand bei Spannungsmessungen&lt;br /&gt;
* hohe Empfindlichkeit durch Eingangsverstärker&lt;br /&gt;
* automatische Bereichswahl möglich&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* Ablesefehler&lt;br /&gt;
* geringere Auflösung des Messwerts beim Ablesen&lt;br /&gt;
* benötig eine Stromversorgung&lt;br /&gt;
* bedingt durch die Ablesefehler und mechanische Probleme nur eine begrenzte Genauigkeit erreichbar&lt;br /&gt;
&lt;br /&gt;
Die meisten Anwender kaufen sich ein Digitalmultimeter mit einer guten Genauigkeit. Nur für einfache Messungen, bei denen nicht die Genauigkeit sondern die intuitive Anzeige im Vordergrund steht kann ein Analoggerät besser geeignet sein.&lt;br /&gt;
&lt;br /&gt;
== Auflösung und Genauigkeit ==&lt;br /&gt;
&lt;br /&gt;
Zur wichtigen Unterscheidung von [[Auflösung und Genauigkeit]] gibt es einen eigenen Artikel.&lt;br /&gt;
&lt;br /&gt;
=== Auflösung ===&lt;br /&gt;
&lt;br /&gt;
Beim Digitalmultimeter wird ein digitaler Wert angezeigt; der Zusammenhang zwischen Auflösung und Messbereich wird durch die Anzahl der Stellen bzw. die Anzahl der darstellbaren Zahlenwerte bestimmt. Ein 3-1/2-stelliges Display hat einen Bereich von 0 - 1999, der Dezimalpunkt kann dabei an jeder beliebigen Stelle sein. Man spricht hier auch von 2000 Schritten (engl. counts). Geräte mit 4 1/2 Stellen haben 20.000 Counts, das ist ein Anzeigeumfang von 0 - 19.999. Anzeigen mit 4.000 Counts werden manchmal auch als 3 3/4 Stellen bezeichnet, Geräte mit 6.000 Counts als 3 5/6 Stellen usw.&amp;lt;br&amp;gt;&lt;br /&gt;
(Die &#039;&#039;1/2&#039;&#039;, &#039;&#039;3/4&#039;&#039; usw. sind dabei nicht als Brüche o.ä. zu verstehen, sondern als Angabe, welche Werte die linke, höchstwertigste Stelle des Geräts annehmen kann. So ist bei einer &#039;&#039;1/2&#039;&#039;-Angabe für die linke Stelle eine 0 oder 1 möglich, bei &#039;&#039;3/4&#039;&#039; ein 0, 1, 2 oder 3, und bei &#039;&#039;5/6&#039;&#039; entsprechend 0, 1, …, 5)&lt;br /&gt;
&lt;br /&gt;
Die Auflösung des Multimeters ist die kleinste Änderung im Messwert, die dargestellt werden kann. Ein Gerät mit z.B. 20.000 Counts hat im 2V-Messbereich eine Auflösung von 2V / 20000 = 0,1 mV.&lt;br /&gt;
&lt;br /&gt;
=== Grundgenauigkeit ===&lt;br /&gt;
&lt;br /&gt;
In den Datenblättern wird in der Regel die Grundgenauigkeit eines Multimeters angegeben. Damit wird die Genauigkeit der internen Referenz und des A/D-Wandler spezifiziert; meistens ist dieser Wert gleich der Genauigkeit bei DC-Spannungsmessung.&lt;br /&gt;
&lt;br /&gt;
Oft wird der zu erwartende Meßfehler auch in der Form &amp;quot;% Reading + % Range&amp;quot; angegeben. &lt;br /&gt;
&amp;quot;% Reading&amp;quot; entspricht dem Meßfehler bezogen auf den aktuellen Meßwert, &amp;quot;% Range&amp;quot; entspricht dem Meßfehler bezogen auf den eingestellten Meßbereich. Die Abweichung. Beide Werte müssen addiert werden, um den Gesamtmeßfehler zu ergeben.&lt;br /&gt;
&lt;br /&gt;
=== Toleranz ===&lt;br /&gt;
&lt;br /&gt;
Wichtiger als die Grundgenauigkeit ist aber die Toleranz in den einzelnen Messbereichen. Üblich sind dabei Angaben in der Form +/- (0,2% + 3 Digits). Das bedeutet, dass die maximale Abweichung 0,2% vom angezeigten Messwert und zusätzlich 3 Digits beträgt. Ein Digit ist dabei die niedrigste Einheit in der Anzeige des Messwertes in dem aktuellen Messbereich. Bei einer angezeigten Spannung von z.B. 2,000V und einem Fehler von 3 Digits würde die tatsächliche Spannung daher in einem Bereich von 1,997V bis 2,003V liegen.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise hat ein Multimeter bei der DC-Spannungsmessung die höchste Genauigkeit. Bei der DC-Strommessung wird ein Shunt-Widerstand verwendet, dieser muss eine hohe Belastbarkeit und gleichzeitig einen niedrigen Temperaturkoeffizienten haben, was relativ teuer ist. Deshalb ist die Genauigkeit hier meistens deutlich schlechter als bei der Spannungsmessung.&lt;br /&gt;
&lt;br /&gt;
Bei Wechselspannung bzw. -strom hängt die Genauigkeit vom verwendeten Messverfahren ab. Hier wird der Effektivwert angezeigt. Viele Multimeter messen die Signalamplitude oder einen Mittelwert und berechnen daraus den Effektivwert. Damit liefern diese Geräte nur bei einer exakten Sinusform einen genauen Messwert.&lt;br /&gt;
&lt;br /&gt;
=== True-RMS, Crest-Faktor ===&lt;br /&gt;
&lt;br /&gt;
Um bei anderen Kurvenformen einen genauen Effektivwert zu messen braucht man ein True-RMS Multimeter. Hier wird das Signal entweder analog quadriert oder digital mit einer hohen Frequenz abgetastet und ein quadratischer Mittelwert berechnet. Damit erhält man theoretisch für beliebige Signalformen einen genauen Messwert, allerdings gilt das nur in einem bestimmten Frequenzbereich. Im Datenblatt wird meistens auch ein maximaler Crest-Faktor angegeben, das ist das maximale Verhältnis zwischen dem Spitzenwert und dem Effektivwert, beim dem die Genauigkeit innerhalb der spezifizierten Toleranz liegt.&lt;br /&gt;
&lt;br /&gt;
== Weitere Funktionen ==&lt;br /&gt;
&lt;br /&gt;
=== Durchgangsprüfer ===&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird in der Elektronikpraxis sehr oft benötigt, demzufolge sollte das Multimeter sie haben. Wichtig ist, daß ein Pieper zur Signalisierung verfügbar ist und dieser ohne nennenswerte Verzögerung reagiert. Einige Multimeter sind da recht langsam, eine &amp;quot;Denkpause&amp;quot; von einer Sekunde ist da sehr störend wenn man viele Verbindungen durchmessen will.&lt;br /&gt;
&lt;br /&gt;
=== Diodentest ===&lt;br /&gt;
&lt;br /&gt;
Auch eine sehr nützliche Funktion, auf die man nicht verzichten sollte.&lt;br /&gt;
 &lt;br /&gt;
=== Widerstandsmessung ===&lt;br /&gt;
&lt;br /&gt;
Diese ist in vielen Multimetern vorhanden und für den Hobbybastler auch sehr wichtig.&lt;br /&gt;
&lt;br /&gt;
=== Temperatursensor ===&lt;br /&gt;
&lt;br /&gt;
Viele Multimeter werden mit einem [[Temperatursensor]] geliefert, dabei handelt es sich fast immer um ein Thermoelement. Damit kann man relativ einfach Temperaturen zwischen -50°C bis 350°C messen.&lt;br /&gt;
&lt;br /&gt;
=== Schnittstelle ===&lt;br /&gt;
&lt;br /&gt;
Einige Multimeter bieten eine Schnittstelle zum PC, damit können sie als per Software steuerbares Multimeter bzw. Datenschreiber verwendet werden. Diese Schnittstelle ist per [[Optokoppler]] [[Galvanische Trennung|galvanisch getrennt]], damit kann man gefahrlos messen. Will man das Multimeter per Mikrocontroller steuern, so sind Typen mit [[RS232]] Anschluß den Typen mit [[USB]] vorzuziehen.&lt;br /&gt;
&lt;br /&gt;
Ebenso gibt es Geräte, die per Bluetooth mit einem Smartphone kommunizieren können.&lt;br /&gt;
&lt;br /&gt;
Ältere Tischmultimeter, wie sie in der Industrie benutzt werden, besitzen hingegen stattdessen meist ein GPIB-Interface.  Dabei handelt es sich um einen Messgerätebus von Hewlet Packard (heute Agilent), der zwar eine eigene Interfacekarte im PC benötigt (billig als ISA zu bekommen, relativ teuer als PCI; auch USB-GPIB ist möglich), aber recht universell für verschiedenste Messgeräte genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Transistortester ===&lt;br /&gt;
&lt;br /&gt;
Damit kann man die Stromverstärkung eines Transistors bei kleinen Strömen messen. Bisweilen ganz nett, praktisch wird sie aber eher wenig gebraucht.&lt;br /&gt;
&lt;br /&gt;
=== Messung von Induktivität, Kapazität und Frequenz ===&lt;br /&gt;
&lt;br /&gt;
Diese Messmöglichkeiten sind in verschiedenster Kombination verfügbar, aber eher als nette Zugabe anzusehen. Sie erreicht meist keine sonderlich hohe Genauigkeit. Vor allem die Frequenzmessung ist eher eine Schätzung und hat mit einem echten Frequenzmesser wenig gemeinsam. Wer ernsthaft diese Größen messen will, kauft sich besser ein speziell dafür gebautes Messgerät. Zur groben Messung der Parameter sind die Funktionen ausreichend.&lt;br /&gt;
&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
&lt;br /&gt;
In bestimmten Situationen kann eine Beleuchtung der Anzeige recht nützlich sein, da aus Stromspargründen die Anzeige immer ein LCD ist. Die große Masse der Anwender braucht sie jedoch nicht. &lt;br /&gt;
&lt;br /&gt;
=== Messwertspeicher ===&lt;br /&gt;
&lt;br /&gt;
Viele Multimeter können auf Knopfdruck den Messwert einfrieren. Das ist dann hilfreich, wenn man an einem schwer zugänglichen Ort eine Messung machen muss und dabei das Display nicht ablesen kann, typisch an großen Maschinen und Anlagen.&lt;br /&gt;
&lt;br /&gt;
=== Auto Range ===&lt;br /&gt;
&lt;br /&gt;
Die meisten besseren Multimeter verfügen über eine automatische Messbereichswahl, d.h. das Multimeter stellt automatisch den optimalen Messbereich ein. Das hat Vor- und Nachteile.&lt;br /&gt;
&lt;br /&gt;
Vorteile&lt;br /&gt;
* einfache Messung unbekannter Größen&lt;br /&gt;
&lt;br /&gt;
Nachteile&lt;br /&gt;
* Durch die meist nötige Umschaltung des Messbereichs und Mehrfachmessung durch das Multimeter verlängert sich die Messzeit, welche man bei bestimmten Messungen nicht gebrauchen kann. Ausserdem schwankt dadurch die Anzeige zusätzlich, was das Ablesen bei sich ändernden Messwerten erschwert.&lt;br /&gt;
&lt;br /&gt;
Ein Multimeter sollte auf jeden Fall die Möglichkeit bieten, die Auto Range Funktion abzuschalten.&lt;br /&gt;
&lt;br /&gt;
== Vergleichstabelle Multimeter ==&lt;br /&gt;
&lt;br /&gt;
In den folgende Tabellen werden wichtige technischen Daten einiger aktueller Multimeter zusammengestellt. Um die Übersichtlichkeit zu erhöhen, werden die Geräte in drei Kategorien eingeteilt.&lt;br /&gt;
&lt;br /&gt;
Bei den Sicherungen ist entweder die Baugröße oder die Nennspannung und Abschaltstrom angegeben; wenn das Gerät mehrere Sicherungen enthält, dann kommt zuerst der Wert für den mA Messbereich und danach die Sicherung für den A Messbereich.&lt;br /&gt;
&lt;br /&gt;
=== Einsteigergeräte ===&lt;br /&gt;
&lt;br /&gt;
Das sind preiswerte Geräte, mit denen viele Messaufgaben durchgeführt werden können, wenn keine sehr hohen Anforderungen an Genauigkeit gestellt werden. Für Einsteiger und Fortgeschrittene findet sich im Bereich unter 50 Euro immer ein Gerät, das den Ansprüchen gerecht wird. &#039;&#039;&#039;Will man Messungen am 230V-Netz durchführen, sollte man auf keinen Fall Billigstgeräte aus der Ramschkiste verwenden sondern auf qualitativ hochwertige Ware zurückgreifen und.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;multimeter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller || Bezeichnung ||Preis &amp;lt;BR&amp;gt; [EUR] || Counts || Grundgenauigkeit [%] || Messbereich DC V || Spannungsklasse ||Sicherung&lt;br /&gt;
|-&lt;br /&gt;
|Keysight (vorm. Agilent)&lt;br /&gt;
|U1231A (1)&lt;br /&gt;
|122&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|30XR-A&lt;br /&gt;
|70&lt;br /&gt;
|2.000&lt;br /&gt;
|1&lt;br /&gt;
|600V&lt;br /&gt;
|300V Cat III, 600V Cat II&lt;br /&gt;
|10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|33XR-A&lt;br /&gt;
|95&lt;br /&gt;
|4.000&lt;br /&gt;
|0,7&lt;br /&gt;
|1000V&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 1&lt;br /&gt;
|70&lt;br /&gt;
|3.200&lt;br /&gt;
|0,5&lt;br /&gt;
|600V&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 2&lt;br /&gt;
|85&lt;br /&gt;
|2.000&lt;br /&gt;
|0,5&lt;br /&gt;
|1000V&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|6,35x32 mm / 6,35x32 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 3&lt;br /&gt;
|105&lt;br /&gt;
|2.000&lt;br /&gt;
|0,5&lt;br /&gt;
|600V&lt;br /&gt;
|300V Cat III&lt;br /&gt;
|6,35x32 mm / 6,35x32 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 4&lt;br /&gt;
|120&lt;br /&gt;
|4.200&lt;br /&gt;
|0,5&lt;br /&gt;
|600V&lt;br /&gt;
|300V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|1070&lt;br /&gt;
|10&lt;br /&gt;
|2.000&lt;br /&gt;
|0,5&lt;br /&gt;
|250V&lt;br /&gt;
|250V Cat II&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|2010&lt;br /&gt;
|25&lt;br /&gt;
|2.000&lt;br /&gt;
|0,5&lt;br /&gt;
|1000V&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|UNI-T&lt;br /&gt;
|UT61E&lt;br /&gt;
|62&lt;br /&gt;
|22.000&lt;br /&gt;
|0,1&lt;br /&gt;
|600V&lt;br /&gt;
|300V Cat III, 600V Cat II&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|}&lt;br /&gt;
1) keine Strommessung&lt;br /&gt;
&lt;br /&gt;
=== Mittelklasse-Geräte===&lt;br /&gt;
&lt;br /&gt;
Diese Geräte haben alle eine Grundgenauigkeit besser als 0,5 und sind besser ausgestattet als die Einsteigerklasse. Die Spannungsfestigkeit ist mindestens 600V Cat III.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;multimeter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller&lt;br /&gt;
!Bezeichnung&lt;br /&gt;
!Preis [EUR]&lt;br /&gt;
!Counts&lt;br /&gt;
!Grundgenauigkeit [%]&lt;br /&gt;
!TRMS&lt;br /&gt;
!Spannungsklasse&lt;br /&gt;
!Sicherung&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|34XR-A&lt;br /&gt;
|125&lt;br /&gt;
|4.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|37XR-A&lt;br /&gt;
|140&lt;br /&gt;
|10.000&lt;br /&gt;
|0,1&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|38XR-A&lt;br /&gt;
|165&lt;br /&gt;
|10.000&lt;br /&gt;
|0,25&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Keysight (vorm. Agilent)&lt;br /&gt;
|U1241B&lt;br /&gt;
|215&lt;br /&gt;
|10.000&lt;br /&gt;
|0,09&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|10x35 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Keysight (vorm. Agilent)&lt;br /&gt;
|U1232A&lt;br /&gt;
|166&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 7-1&lt;br /&gt;
|220&lt;br /&gt;
|6.000&lt;br /&gt;
|0,08&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|10x35 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 10&lt;br /&gt;
|165&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|6,35x32 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 11&lt;br /&gt;
|350&lt;br /&gt;
|20.000&lt;br /&gt;
|0,08&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|10x35 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|114&lt;br /&gt;
|145&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|115&lt;br /&gt;
|170&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|1000V / 15kA&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|117&lt;br /&gt;
|200&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|1000V / 15kA&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|77 IV&lt;br /&gt;
|400&lt;br /&gt;
|6000&lt;br /&gt;
|0,3&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|175&lt;br /&gt;
|225&lt;br /&gt;
|6000&lt;br /&gt;
|0,15&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|177&lt;br /&gt;
|270&lt;br /&gt;
|6000&lt;br /&gt;
|0,09&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|179&lt;br /&gt;
|300&lt;br /&gt;
|6000&lt;br /&gt;
|0,09&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|P3320&lt;br /&gt;
|55&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|P3360&lt;br /&gt;
|85&lt;br /&gt;
|40.000&lt;br /&gt;
|0,06&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|P3380&lt;br /&gt;
|190&lt;br /&gt;
|22.000&lt;br /&gt;
|0,12&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|UNI-T&lt;br /&gt;
|UT71B&lt;br /&gt;
|97&lt;br /&gt;
|20.000&lt;br /&gt;
|0,08&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|5x20 mm&lt;br /&gt;
|-&lt;br /&gt;
|UNI-T&lt;br /&gt;
|UT71C&lt;br /&gt;
|120&lt;br /&gt;
|40.000&lt;br /&gt;
|0,05&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|5x20 mm&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Oberklasse-Geräte ===&lt;br /&gt;
&lt;br /&gt;
Diese Geräte haben eine Grundgenauigkeit von mindestens 0,1 und bieten einen sehr hohen Sicherheitsstandard. Die Spannungsfestigkeit ist mindestens 1000V Cat III. Diese Geräte haben Zusatzfunktionen wie z.B. parametrierbare Tiefpassfilter, Messung der Grundfrequenz an Wechselrichtern, etc. Sie sind meist nur für Profis interessant und bezahlbar.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;multimeter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller&lt;br /&gt;
!Bezeichnung&lt;br /&gt;
!Preis [EUR]&lt;br /&gt;
!Counts&lt;br /&gt;
!Grundgenauigkeit [%]&lt;br /&gt;
!Bandbreite (TRMS)/kHz&lt;br /&gt;
!Zusatzfunktionen&lt;br /&gt;
|-&lt;br /&gt;
|Keysight&lt;br /&gt;
|U1251A/B&lt;br /&gt;
|350&lt;br /&gt;
|50.000&lt;br /&gt;
|0,025&lt;br /&gt;
|30&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|83 V&lt;br /&gt;
|380&lt;br /&gt;
|6.000&lt;br /&gt;
|0,1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|87 V&lt;br /&gt;
|450&lt;br /&gt;
|20.000&lt;br /&gt;
|0,05&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT PRO&lt;br /&gt;
|360&lt;br /&gt;
|10.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT Tech&lt;br /&gt;
|360&lt;br /&gt;
|12.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT ENERGY&lt;br /&gt;
|810&lt;br /&gt;
|60.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT 30M&lt;br /&gt;
|1046&lt;br /&gt;
|1.200.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT X-TRA&lt;br /&gt;
|360&lt;br /&gt;
|12.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT OUTDOOR&lt;br /&gt;
|549&lt;br /&gt;
|12.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
| IP65&lt;br /&gt;
|-&lt;br /&gt;
|Metrix&lt;br /&gt;
|MTX 3281&lt;br /&gt;
|ab 375,-&lt;br /&gt;
|100.000&lt;br /&gt;
|0,1%&lt;br /&gt;
|50&lt;br /&gt;
|versch. Ausführungen: Com, BT, Temp ect.&lt;br /&gt;
|-&lt;br /&gt;
|Metrix&lt;br /&gt;
|MTX 3282&lt;br /&gt;
|ab 500,-&lt;br /&gt;
|100.000&lt;br /&gt;
|0,03%&lt;br /&gt;
|100&lt;br /&gt;
|versch. Ausführungen: Com, BT, Temp ect.&lt;br /&gt;
|-&lt;br /&gt;
|Metrix&lt;br /&gt;
|MTX 3283&lt;br /&gt;
|ab 560,-&lt;br /&gt;
|100.000&lt;br /&gt;
|0,02%&lt;br /&gt;
|200&lt;br /&gt;
|versch. Ausführungen: Com, BT, Temp ect.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Tischmultimeter ===&lt;br /&gt;
&lt;br /&gt;
Tischmultimeter bieten eine sehr hohe Genauigkeit und eine hohe Geschwindigkeit. Für genaue Widerstandsmessung gibt es eine [http://de.wikipedia.org/wiki/Vierdrahtmessung Vierdrahtmessung],  &lt;br /&gt;
wodurch sich der Widerstand der Messleitungen nicht auf das Ergebnis auswirkt. Auf Grund ihrer sehr hohen Genauigkeit wird diese nicht in Prozent sondern ppm angegeben, u.a. weil niemand die vielen Nullen nach dem Komma zählen will.&lt;br /&gt;
&lt;br /&gt;
1ppm = 0,0001% (engl. one part per million, der millionste Teil) &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;multimeter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller&lt;br /&gt;
!Bezeichnung&lt;br /&gt;
!Preis [EUR]&lt;br /&gt;
!Counts&lt;br /&gt;
!Grundgenauigkeit [ppm]&lt;br /&gt;
!TRMS&lt;br /&gt;
|-&lt;br /&gt;
|Keysight&lt;br /&gt;
|34461A&lt;br /&gt;
|1050&lt;br /&gt;
|1.200.000&lt;br /&gt;
|19 (über 24 h)&lt;br /&gt;
|Ja&lt;br /&gt;
|-&lt;br /&gt;
|Keysight&lt;br /&gt;
|34401A&lt;br /&gt;
|985&lt;br /&gt;
|1.000.000&lt;br /&gt;
|15&lt;br /&gt;
|Ja&lt;br /&gt;
|-&lt;br /&gt;
|Keithley&lt;br /&gt;
|2000&lt;br /&gt;
|1050&lt;br /&gt;
|1.000.000&lt;br /&gt;
|20&lt;br /&gt;
|Ja&lt;br /&gt;
|-&lt;br /&gt;
|Picotest&lt;br /&gt;
|M3500A&lt;br /&gt;
|885&lt;br /&gt;
|1.000.000&lt;br /&gt;
|35&lt;br /&gt;
|Ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/204156#new Forumsbeitrag]: Welches Multimeter?&lt;br /&gt;
*[http://www.sprut.de/electronic/mess/spannung.htm Spannungsnormal - Betrachtungen zur Messgenauigkeit]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Oversampling&amp;diff=92792</id>
		<title>Oversampling</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Oversampling&amp;diff=92792"/>
		<updated>2016-04-20T10:52:45Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Digitale Datenübertragung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter dem sogenannten &#039;oversampling&#039; versteht man eine [[Überabtastung]] eines Signals, jenseits der nach dem Abtasttheorem minimal benötigten [[Abtastfrequenz]] des Signals.&lt;br /&gt;
&lt;br /&gt;
=Anwendungen=&lt;br /&gt;
==Digitale Datenübertragung==&lt;br /&gt;
Kommt ein stark [[jitter]]-belastetes Signal an einem Signaleingang an, so muss dieses mit mehr als dem Faktor 2 abgetastet werden, da die tatsächliche minimale Periode infolge des Jitters geringer als Faktor 1/2 ist. Theoretisch ist zumindest Faktor 2 nötig um beide Flanken eines Rechtecksignals zu sehen, jedoch haben beide Signale infolge des Jitters höhere Frequenzen als nominal. Daher wird das Signal gerne mit der dreifachen Frequenz abgetastet, um es sehr einfach in die Zieltaktdomain überführen und verarbeiten zu können.&lt;br /&gt;
&lt;br /&gt;
==Signalverarbeitung==&lt;br /&gt;
Mathematische [[Filter]] arbeiten um so genauer, je mehr TAPs - also Stützstellen - sie verwenden. Um Schwingungen und Phasenverläufe möglichst genau verarbeiten- und kumulierende Fehler reduzieren zu können, werden Daten bei hohen Anspüchen auf höheren Abtastraten verarbeitet, als sie am Eingang anliegen. Dabei ist zu beachten, dass die Zahl der Filter-TAPs bereits aufgrund der Abtastratenerhöhung linear mitwachsen muss, um wieder die gleiche Frequenzraum erfassen zu können und andererseits auch deshalb vergrössert werden muss, um den Filter selber qualitativ zu verbessern.&lt;br /&gt;
&lt;br /&gt;
==A/D bzw. D/A Wandler==&lt;br /&gt;
&lt;br /&gt;
=== Genauigkeit ===&lt;br /&gt;
&lt;br /&gt;
Vor einem A/D-Wandler, bzw. nach einem D/A-Wandler braucht man normalerweise einen Filter, um Frequenzen jenseits des Nyquist Limits (1/2 Samplingfrequenz) zu unterdrücken. Ein steiler analoger Filter ist aufwendig und braucht präzise Bauteile. Als Alternative wird oft Oversampling genutzt und der Wandler mit einer höheren Frequenz (z.B. 4 fach) betrieben, und dann ein digitaler Filter für den steilen Übergang genutzt - der analoge Filter für die höhere Samplingfrequenz ist deutlich einfacher, da er flacher ausfallen darf. Nebenbei ergibt das Oversampling noch eine  Erhöhung der Auflösung : für die 4-fach höhere Frequenz wird theoretisch 1 Bit gewonnen. Die Genauigkeit erhöht sich dabei allerdings nicht wesentlich. Reale AD-Wandler z.B. im Bereich Multimedia arbeiten mit bis zu 256-facher Überabtastung. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sinx/x-Korrektur ===&lt;br /&gt;
&lt;br /&gt;
Außerdem ist mit einer höheren Abtastrate weniger oder keine &amp;quot;sinx/x&amp;quot;-Korrektur mehr nötig, ein Filter, dass im analogen Bereich unmöglich zu entwerfen ist und im Digitalen zumindest etwas von der maximalen Amplitude verschenkt.&lt;br /&gt;
&lt;br /&gt;
=== Noise shaping ===&lt;br /&gt;
&lt;br /&gt;
Sigma-Delta-ADC?&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PLL&amp;diff=92791</id>
		<title>PLL</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PLL&amp;diff=92791"/>
		<updated>2016-04-20T10:51:28Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine &#039;&#039;&#039;PLL&#039;&#039;&#039; (engl.: phase locked loop) ist ein Regelkreis in Hardware oder Software, der sich auf einen Eingangstakt synchronisieren kann.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
PLLs sind als analoge Schaltkreise aufgebaut, die einen Eingangstakt hoch multiplizieren und wieder herunter dividieren und somit als nichtganzzahliger [[Taktteiler]] fungieren. Ferner wird in der Regel die Phase verschoben, so dass ein gewünschtes Verhältnis eingestellt wird. Durch eine sogenannte &amp;quot;feedback loop&amp;quot; wird erreicht, dass sich die Phase auf dem hohen Frequenzniveau stabil verhält und dem [[Jitter]] des Eingangstaktes nur langsam folgt. Zur Stabilisierung des hochfrequenten Zwischentaktes werden rückgekoppelte Filter benutzt, die genau in dem Frequenzbereich stabil sind. Bei FPGAs sind diese Filter oft parametier- und umschaltbar.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung erfolgt voll analog, also nicht zeitdiskret.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Solche Regelkreise lassen sich in SW nachbilden, wenn sich ein [[Mikrocontroller]] auf einen eingehenden seriellen Takt einstellt bzw ein [[FPGA]] einen Eingangstakt ausmisst und sich in die Mitte stellt, um parallele Daten zu verarbeiten. (siehe [[SERDES]], [[GTP]]).&lt;br /&gt;
&lt;br /&gt;
Die Verarbeitung erfolgt dann voll digital, also diskret mit dem Systemtakt des FPGAs / des Controllers.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
In dieser Tabelle werden die durch ganzzahlige Teiler und Multiplizierer erreichbaren Frequenzverhältnisse aufgelistet:&lt;br /&gt;
[[Settings for Multiplier and Divider]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Timer und Uhren]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Schwingkreis&amp;diff=92790</id>
		<title>Schwingkreis</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Schwingkreis&amp;diff=92790"/>
		<updated>2016-04-20T10:50:15Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Verhalten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Als &#039;&#039;Schwingkreis&#039;&#039; bezeichnet man eine elektronische Schaltung die selbsttätig schwingt, d.h. ihre Spannungs- und Stromzustände periodisch ändert. Meistens handelt es sich um sinusförmige Schwingungen, die der DGL 2. Ordnung genügen.&lt;br /&gt;
&lt;br /&gt;
== Funktion ==&lt;br /&gt;
Entscheidend für das Vorhandensein eines Schwingkreises ist der Umstand, dass jeder Momentanzustand der Anordnung zu einer Solländerung führt, die der aktuellen Bewegungsrichtung entgegen wirkt und mindestens ein Energiespeicher existiert, der periodisch geladen und entladen wird.&lt;br /&gt;
&lt;br /&gt;
Das klassische Beispiel ist eine Kombination einer idealen Spule und eines dazu parallel geschalteten idealen Kondensators. Kondensator und Spule treiben sich gegenseitig an und sorgen für eine ideale Sinusspannung.&lt;br /&gt;
&lt;br /&gt;
== Verhalten==&lt;br /&gt;
Die real verlustbelasteten Bauelemente sorgen für ein Abklingen der Amplitude. Die sich bildende [[Hüllkurve]] entspricht einer e-Funktion.&lt;br /&gt;
&lt;br /&gt;
Nur wenn genügend Energie zugeführt wird kann die [[Schwingung]] permanent aufrecht erhalten werden. In diesem Fall spricht man von [[Resonanz]]. Die sich einstellende [[Frequenz]] entspricht damit der, die bei idealen Bauelementen entstünde.&lt;br /&gt;
&lt;br /&gt;
Wird mehr Energie zugeführt, schwingt der Schwingkreis auf, d.h. er lädt sich mit Energie auf, was zu einer steigenden [[Amplitude]] bei geringfügig verringerter Frequenz führt, weil die Umkehrpunkte bei den sich aufweitenden Hüllkurven später erreicht werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Absolute_Beginner-AVR_Steckbrettprojekte&amp;diff=92789</id>
		<title>Absolute Beginner-AVR Steckbrettprojekte</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Absolute_Beginner-AVR_Steckbrettprojekte&amp;diff=92789"/>
		<updated>2016-04-20T10:39:55Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* LCD ansteuern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Als einfacher Anfang ist ein [[Steckbrett|Steckbrett]] und ein [[AVR_In_System_Programmer|USB Programmer]] erst mal ausreichend. Dazu ein [[AVR| Atmel Mega 88]] und ein bisschen Hühnerfutter und los geht es.&lt;br /&gt;
&lt;br /&gt;
Auf dem PC muss das [[AVR-Studio]], [[AVR-GCC‎|WinAvr]] und ggf. [[Pony-Prog_Tutorial|Ponyprog]] zum Übertragen der Hex-Files installiert sein. Die Beispielprogramme sind in &#039;&#039;&#039;C&#039;&#039;&#039; geschrieben. &amp;lt;br&amp;gt;&lt;br /&gt;
Die Programme können und sollen mit dem [[AVR-Simulation#AVR_Studio|AVR Studio simuliert]] werden, um etwas Gefühl für die Abarbeitungszeit der Programme zu bekommen. (Es muss nicht immer ein 20 MHz Quarz sein).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LED einschalten==&lt;br /&gt;
Siehe auch: [[AVR-GCC-Tutorial#Einf.C3.BChrungsbeispiel| AVR-GCC-Tutorial]]&lt;br /&gt;
&lt;br /&gt;
Die [[AVR_Fuses| Fuse Bits]] bleiben auf Auslieferungszustand. &lt;br /&gt;
&lt;br /&gt;
Der [[AVR| AtMega88]] wird aus einer 9V Block-Batterie und dem [[Standardbauelemente#Spannungsregler|7805]] mit 5V Spannung versorgt.&lt;br /&gt;
Eine [[LED]] wird nach GND geschaltet, diese leuchtet wenn der Portpin auf 1 oder High liegt.&lt;br /&gt;
Die andere [[LED]] wird nach Vcc geschaltet, diese leuchtet wenn der Portpin auf 0 oder Low liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Absolute_Beginner_01.png|320px]][[Bild:Absolute_Beginner_01.JPG|290px]]&lt;br /&gt;
&lt;br /&gt;
(Der Taster im Bild wird erst später gebraucht)&lt;br /&gt;
&lt;br /&gt;
Im Programm wird im [[AVR-GCC-Tutorial#Datenrichtung_bestimmen|DDRD]]-Register festgelegt, dass alle Pins des Port D Ausgänge sind. Durch den unterschiedlichen Anschluss der LED muss der Port D0 auf 1 und der Port D2 auf 0 gesetzt werden, damit beide LED leuchten.&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_01.c‎| C Programm]]&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_01.hex‎| Hex-File]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Hex-File in den Controller laden.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm im [[AVR-Simulation#AVR_Studio|AVR Studio simulieren]] und die Zustände von Port D im Einzelschrittmodus (F10) betrachten.&amp;lt;br&amp;gt;&lt;br /&gt;
C-Programm kompilieren und dann die neue Hex-Datei in den Controller laden.&amp;lt;br&amp;gt;&lt;br /&gt;
C Programm so ändern, dass die LEDs an einem anderen Port angeschlossen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eingang abfragen==&lt;br /&gt;
[[Bild:Absolute_Beginner_01.png|320px]][[Bild:Absolute_Beginner_01.JPG|290px]]&lt;br /&gt;
&lt;br /&gt;
In der Initialisierung wird mit dem [[AVR-GCC-Tutorial#Datenrichtung_bestimmen|DDRD]] festgelegt, dass Port D0 bis 3 Ausgänge und D4 bis 7 Eingänge sind. Der interne Pull Up Widerstand Port D7 wird eingeschaltet. &lt;br /&gt;
&lt;br /&gt;
Der Taster ist an Pin D7 angeschlossen. Der Taster schaltet nach Masse, daher ist der Pin D7 bei unbetätigtem Taster durch den internen Pull Up Widerstand (nach Vcc) auf High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_02.c‎| C Programm]]&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_02.hex‎| Hex-File]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Hex-File in Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm im [[AVR-Simulation#AVR_Studio|AVR Studio simulieren]] und die Abarbeitungszeit für das Hauptprogramm ermitteln. &amp;lt;br&amp;gt;&lt;br /&gt;
C-Programm kompilieren und dann den neuen Hex-File in den Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LED blinken lassen==&lt;br /&gt;
[[Bild:Absolute_Beginner_01.png|320px]][[Bild:Absolute_Beginner_01.JPG|290px]]&lt;br /&gt;
&lt;br /&gt;
Die [[AVR_Fuses| Fuse Bits]] bleiben auf Auslieferungszustand. Dadurch läuft der Controller auf 1Mhz internen Takt. Genutzt wird der Timer 1 . Der Takt-Vorteiler (pre-scaler ) wird auf 1024 eingestellt.&lt;br /&gt;
&lt;br /&gt;
Zeit = 1 / (1.000.000/(1024*488)) = 0,4997sec.&lt;br /&gt;
&lt;br /&gt;
Das heißt: die Timerinterrupt-Routine 1 wird alle 0,5 Sekunden aufgerufen, die LED blinken mit 1Hz.&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_03.c‎| C Programm]]&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_03.hex‎| Hex-File]]&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_03_1.c‎| C Programm mit Timer 0 und 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Hex-File in Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm im [[AVR-Simulation#AVR_Studio|AVR Studio simulieren]] und die Zeitabstände in der die Interruptroutine Timer 1 aufgerufen wird überprüfen, dann die Abarbeitungszeit für diese Routine ermitteln. &amp;lt;br&amp;gt;&lt;br /&gt;
Sich über die Vorgänge klar werden, wie ein Timer funktioniert ([[FAQ#Timer]]). &amp;lt;br&amp;gt;&lt;br /&gt;
C-Programm kompilieren und dann den neuen Hex-File in den Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
C Programm so ändern, dass andere Blinkzeiten entstehen. &amp;lt;br&amp;gt;&lt;br /&gt;
CLK/8 Fuse ändern, sodass der Controller 8-mal schneller läuft und die LED schnell blinken. &amp;lt;br&amp;gt;&lt;br /&gt;
Timer 0 konfigurieren und die LED an Port D0 mit ca. 4 Hz blinken lassen. Dazu das Programm um eine Variable &#039;&#039;&#039;blinkmerker2&#039;&#039;&#039; erweitern und damit den Port D0 im &#039;&#039;&#039;Hauptprogramm&#039;&#039;&#039; steuern  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LCD ansteuern==&lt;br /&gt;
Man mag sich fragen, warum die Ansteuerung eines LCD so weit am Anfang kommt. Ich halte die Vorteile für eine einfache Fehlersuche für recht groß. Oft sagt man nach ein paar Stunden Fehlersuche: „kaum macht man es richtig, schon funktioniert es“. Einfach ein paar Variablen im Display anzeigen lassen und schon gibt es ein Ahhaaa. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Absolute_Beginner_LCD_01.png|320px]][[Bild:Absolute_Beginner_04_LCD.JPG|320px]]&lt;br /&gt;
&lt;br /&gt;
Da man ein LCD häufig braucht und die benötigten Programmblöcke immer gleich sind, werden sie sinnvoller Weise in separate Programme ausgelagert. Die Bibliothek ist dann einmal getestet und kann wieder verwendet werden. In diesem Fall sind es die: [[AVR-GCC-Tutorial/LCD-Ansteuerung#Datei_lcd-routines.h| lcd-routines.h]] und [[AVR-GCC-Tutorial/LCD-Ansteuerung#Datei_lcd-routines.c:| lcd-routines.c]]. &lt;br /&gt;
&lt;br /&gt;
Das LCD wird im 4Bit Modus betrieben. Es kommt das Programm und der Anschluss hier aus dem Forum unter [[AVR-GCC-Tutorial/LCD-Ansteuerung]] zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute Beginner 4.zip| Programm als ZIP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm im [[AVR-Simulation#AVR_Studio|AVR Studio simulieren]] und die Abarbeitungszeit für das Hauptprogramm ermitteln. &amp;lt;br&amp;gt;&lt;br /&gt;
Das LCD an PortB anschließen und das Programm entsprechend ändern. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taster abfragen===&lt;br /&gt;
[[Bild:Absolute_Beginner_4_1.png|320px]][[Bild:Absolute_Beginner_04_1.JPG|320px]]&lt;br /&gt;
&lt;br /&gt;
Um für Programmerweiterungen Ports frei zu bekommen wird das LCD nun auf Port B angeschlossen. In der Datei [[AVR-GCC-Tutorial/LCD-Ansteuerung#Datei_lcd-routines.h| lcd-routines.h]] werden die entsprechenden Änderungen vorgenommen.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn man ein LCD im Einsatz hat, sind schon 6 Pin´s „verbraucht“. Da die vier Leitungen für die Datenbits des LCD nur dann das LCD interessieren, wenn auch die RW (Read/Write) oder E (Enable) Leitung geschaltet wird, werden diese vier Pin´s doppelt belegt und mittels eines weiten Pins abfragt. Hierzu werden die vier Taster mit 470Ω Widerständen mit den Datenleitungen verbunden. Durch die Widerstände werden Kurzschlüsse verhindert, falls die Taster betätigt werden, wenn gerade auf das LCD geschrieben wird. &amp;lt;br&amp;gt;&lt;br /&gt;
Der PinX.6 (in diesem Fall PinB.6)  ist als Eingang definiert und der zugehörige interne Pull-Up Widerstand ist aktiviert. Nun werden die vier Datenleitungen der Reihe nach auf Low gesetzt und geschaut, ob sich der PinX.6 ändert. Dies geschieht, wenn ein betätigter Taster eine Verbindung von der jeweiligen Datenleitung nach PinX.6 geschaltet hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute Beginner 4_1.zip| Programm als ZIP]]&lt;br /&gt;
&lt;br /&gt;
==Analogeingang einlesen==&lt;br /&gt;
Es kommt das Programm und der Anschluss hier aus dem Forum unter [[AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29]] zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Absolute_Beginner_05.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Das LCD ist jetzt am &#039;&#039;&#039;PortB&#039;&#039;&#039; angeschlossen.&amp;lt;br&amp;gt;&lt;br /&gt;
Zwischen Vcc und Gnd liegt ein Poti als Spannungsteiler. Der Mittelabgriff liegt am Analogeingang 1 (PortC0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_5.zip| Programm als ZIP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
zweiten Analogwert ebenfalls auf dem LCD anzeigen. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==PWM   Pulsweitenmodulation==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Absolute_Beginner_06.png|320px]] [[Bild:Absolute_Beginner_06.jpg|320px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einlesen des Analogengangs 0 (PinC0). Ausgabe des Analogwertes auf dem LCD. Erzeugung eines PWM Signals auf dem PortD6 mit Timer0. &amp;lt;br&amp;gt;&lt;br /&gt;
Der Wert des Analogeingangs wird durch 4 geteilt und als Sollwert für die [[AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR#Die_PWM-Betriebsart|PWM]] genutzt. Durch das [[LED-Fading|LED fading]] ist der Helligkeitsanstieg an der LED nicht linear. &lt;br /&gt;
&lt;br /&gt;
Durch den [[AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR|Timer Vor-Teiler]] von 256 (TCCR0B =(1&amp;lt;&amp;lt;CS02);) ist die PWM Frequenz sehr niedrig, sodass man mit dem Auge ein Flackern an der LED erkennen kann. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;fOCnxPWM=( fclk_I/O)/(Pre-Teiler * 256) &#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;fOCnxPWM= 1.000.000Hz/(256*256)=15,26Hz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_6.zip| Programm als ZIP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Hex-File in Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine Simulation der PWM ist mit meinem AVR Studio nicht gelungen siehe[[AVR-Studio_Bugs| AVR-Studio_Bugs]]&amp;lt;br&amp;gt;&lt;br /&gt;
C-Programm kompilieren und dann den neuen Hex-File in den Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Programm den Pre-Teiler heruntersetzen (TCCR0B =(1&amp;lt;&amp;lt;CS01|1&amp;lt;&amp;lt;CS00);), sodass das Flacken verschwindet. (fOCnxPWM =122,1Hz)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interrupt==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Absolute_Beginner-AVR_Steckbrettprojekte&amp;diff=92788</id>
		<title>Absolute Beginner-AVR Steckbrettprojekte</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Absolute_Beginner-AVR_Steckbrettprojekte&amp;diff=92788"/>
		<updated>2016-04-20T10:36:24Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* LED einschalten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Als einfacher Anfang ist ein [[Steckbrett|Steckbrett]] und ein [[AVR_In_System_Programmer|USB Programmer]] erst mal ausreichend. Dazu ein [[AVR| Atmel Mega 88]] und ein bisschen Hühnerfutter und los geht es.&lt;br /&gt;
&lt;br /&gt;
Auf dem PC muss das [[AVR-Studio]], [[AVR-GCC‎|WinAvr]] und ggf. [[Pony-Prog_Tutorial|Ponyprog]] zum Übertragen der Hex-Files installiert sein. Die Beispielprogramme sind in &#039;&#039;&#039;C&#039;&#039;&#039; geschrieben. &amp;lt;br&amp;gt;&lt;br /&gt;
Die Programme können und sollen mit dem [[AVR-Simulation#AVR_Studio|AVR Studio simuliert]] werden, um etwas Gefühl für die Abarbeitungszeit der Programme zu bekommen. (Es muss nicht immer ein 20 MHz Quarz sein).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LED einschalten==&lt;br /&gt;
Siehe auch: [[AVR-GCC-Tutorial#Einf.C3.BChrungsbeispiel| AVR-GCC-Tutorial]]&lt;br /&gt;
&lt;br /&gt;
Die [[AVR_Fuses| Fuse Bits]] bleiben auf Auslieferungszustand. &lt;br /&gt;
&lt;br /&gt;
Der [[AVR| AtMega88]] wird aus einer 9V Block-Batterie und dem [[Standardbauelemente#Spannungsregler|7805]] mit 5V Spannung versorgt.&lt;br /&gt;
Eine [[LED]] wird nach GND geschaltet, diese leuchtet wenn der Portpin auf 1 oder High liegt.&lt;br /&gt;
Die andere [[LED]] wird nach Vcc geschaltet, diese leuchtet wenn der Portpin auf 0 oder Low liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Absolute_Beginner_01.png|320px]][[Bild:Absolute_Beginner_01.JPG|290px]]&lt;br /&gt;
&lt;br /&gt;
(Der Taster im Bild wird erst später gebraucht)&lt;br /&gt;
&lt;br /&gt;
Im Programm wird im [[AVR-GCC-Tutorial#Datenrichtung_bestimmen|DDRD]]-Register festgelegt, dass alle Pins des Port D Ausgänge sind. Durch den unterschiedlichen Anschluss der LED muss der Port D0 auf 1 und der Port D2 auf 0 gesetzt werden, damit beide LED leuchten.&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_01.c‎| C Programm]]&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_01.hex‎| Hex-File]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Hex-File in den Controller laden.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm im [[AVR-Simulation#AVR_Studio|AVR Studio simulieren]] und die Zustände von Port D im Einzelschrittmodus (F10) betrachten.&amp;lt;br&amp;gt;&lt;br /&gt;
C-Programm kompilieren und dann die neue Hex-Datei in den Controller laden.&amp;lt;br&amp;gt;&lt;br /&gt;
C Programm so ändern, dass die LEDs an einem anderen Port angeschlossen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eingang abfragen==&lt;br /&gt;
[[Bild:Absolute_Beginner_01.png|320px]][[Bild:Absolute_Beginner_01.JPG|290px]]&lt;br /&gt;
&lt;br /&gt;
In der Initialisierung wird mit dem [[AVR-GCC-Tutorial#Datenrichtung_bestimmen|DDRD]] festgelegt, dass Port D0 bis 3 Ausgänge und D4 bis 7 Eingänge sind. Der interne Pull Up Widerstand Port D7 wird eingeschaltet. &lt;br /&gt;
&lt;br /&gt;
Der Taster ist an Pin D7 angeschlossen. Der Taster schaltet nach Masse, daher ist der Pin D7 bei unbetätigtem Taster durch den internen Pull Up Widerstand (nach Vcc) auf High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_02.c‎| C Programm]]&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_02.hex‎| Hex-File]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Hex-File in Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm im [[AVR-Simulation#AVR_Studio|AVR Studio simulieren]] und die Abarbeitungszeit für das Hauptprogramm ermitteln. &amp;lt;br&amp;gt;&lt;br /&gt;
C-Programm kompilieren und dann den neuen Hex-File in den Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LED blinken lassen==&lt;br /&gt;
[[Bild:Absolute_Beginner_01.png|320px]][[Bild:Absolute_Beginner_01.JPG|290px]]&lt;br /&gt;
&lt;br /&gt;
Die [[AVR_Fuses| Fuse Bits]] bleiben auf Auslieferungszustand. Dadurch läuft der Controller auf 1Mhz internen Takt. Genutzt wird der Timer 1 . Der Takt-Vorteiler (pre-scaler ) wird auf 1024 eingestellt.&lt;br /&gt;
&lt;br /&gt;
Zeit = 1 / (1.000.000/(1024*488)) = 0,4997sec.&lt;br /&gt;
&lt;br /&gt;
Das heißt: die Timerinterrupt-Routine 1 wird alle 0,5 Sekunden aufgerufen, die LED blinken mit 1Hz.&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_03.c‎| C Programm]]&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_03.hex‎| Hex-File]]&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_03_1.c‎| C Programm mit Timer 0 und 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Hex-File in Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm im [[AVR-Simulation#AVR_Studio|AVR Studio simulieren]] und die Zeitabstände in der die Interruptroutine Timer 1 aufgerufen wird überprüfen, dann die Abarbeitungszeit für diese Routine ermitteln. &amp;lt;br&amp;gt;&lt;br /&gt;
Sich über die Vorgänge klar werden, wie ein Timer funktioniert ([[FAQ#Timer]]). &amp;lt;br&amp;gt;&lt;br /&gt;
C-Programm kompilieren und dann den neuen Hex-File in den Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
C Programm so ändern, dass andere Blinkzeiten entstehen. &amp;lt;br&amp;gt;&lt;br /&gt;
CLK/8 Fuse ändern, sodass der Controller 8-mal schneller läuft und die LED schnell blinken. &amp;lt;br&amp;gt;&lt;br /&gt;
Timer 0 konfigurieren und die LED an Port D0 mit ca. 4 Hz blinken lassen. Dazu das Programm um eine Variable &#039;&#039;&#039;blinkmerker2&#039;&#039;&#039; erweitern und damit den Port D0 im &#039;&#039;&#039;Hauptprogramm&#039;&#039;&#039; steuern  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LCD ansteuern==&lt;br /&gt;
Man mag sich fragen, warum die Ansteuerung eines LCD so weit am Anfang kommt. Ich halte die Vorteile für eine einfache Fehlersuche recht groß. Oft sagt man nach ein paar Stunden Fehlersuche: „kaum macht man es richtig, schon funktioniert es“. Einfach ein paar Variablen aufs Display und schon gibt es ein Ahhaaa. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Absolute_Beginner_LCD_01.png|320px]][[Bild:Absolute_Beginner_04_LCD.JPG|320px]]&lt;br /&gt;
&lt;br /&gt;
Da man ein LCD häufig braucht und die benötigten Programmblöcke immer gleich sind, werden sie sinnvoller Weise in separate Programme ausgelagert. Die Bibliothek ist dann einmal getestet und kann wieder verwendet werden. In diesem Fall sind es die: [[AVR-GCC-Tutorial/LCD-Ansteuerung#Datei_lcd-routines.h| lcd-routines.h]] und [[AVR-GCC-Tutorial/LCD-Ansteuerung#Datei_lcd-routines.c:| lcd-routines.c]]. &lt;br /&gt;
&lt;br /&gt;
Das LCD wird im 4Bit Modus betrieben. Es kommt das Programm und der Anschluss hier aus dem Forum unter [[AVR-GCC-Tutorial/LCD-Ansteuerung]] zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute Beginner 4.zip| Programm als ZIP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm im [[AVR-Simulation#AVR_Studio|AVR Studio simulieren]] und die Abarbeitungszeit für das Hauptprogramm ermitteln. &amp;lt;br&amp;gt;&lt;br /&gt;
Das LCD an PortB anschließen und das Programm entsprechend ändern. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taster abfragen===&lt;br /&gt;
[[Bild:Absolute_Beginner_4_1.png|320px]][[Bild:Absolute_Beginner_04_1.JPG|320px]]&lt;br /&gt;
&lt;br /&gt;
Um für Programmerweiterungen Ports frei zu bekommen wird das LCD nun auf Port B angeschlossen. In der [[AVR-GCC-Tutorial/LCD-Ansteuerung#Datei_lcd-routines.h| lcd-routines.h]] Datei werden die entsprechenden Änderungen vorgenommen. &amp;lt;br&amp;gt;Wenn man ein LCD im Einsatz hat, sind schon 6 Pin´s „verbraucht“.  Da die vier Leitungen für die Datenbits des LCD nur dann das LCD interessieren, wenn auch die RW (Read/Write) oder E (Enable) Leitung geschaltet wird, werden diese vier Pin´s doppelt belegt und mittels eines weiten Pins abfragt. Hierzu werden die vier Taster mit 470Ω Widerständen mit den Datenleitungen verbunden. Durch die Widerstände werden Kurzschlüsse verhindert, falls die Taster betätigt werden, wenn gerade auf das LCD geschrieben wird. &amp;lt;br&amp;gt;&lt;br /&gt;
Der PinX.6 (in diesem Fall PinB.6)  ist als Eingang definiert und der zugehörige interne Pull-Up Widerstand ist aktiviert. Nun werden die vier Datenleitungen der Reihe nach auf Low gesetzt und geschaut, ob sich der PinX.6 ändert. Dies geschieht, wenn ein betätigter Taster eine Verbindung von der jeweiligen Datenleitung nach PinX.6 geschaltet hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute Beginner 4_1.zip| Programm als ZIP]]&lt;br /&gt;
&lt;br /&gt;
==Analogeingang einlesen==&lt;br /&gt;
Es kommt das Programm und der Anschluss hier aus dem Forum unter [[AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29]] zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Absolute_Beginner_05.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Das LCD ist jetzt am &#039;&#039;&#039;PortB&#039;&#039;&#039; angeschlossen.&amp;lt;br&amp;gt;&lt;br /&gt;
Zwischen Vcc und Gnd liegt ein Poti als Spannungsteiler. Der Mittelabgriff liegt am Analogeingang 1 (PortC0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_5.zip| Programm als ZIP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
zweiten Analogwert ebenfalls auf dem LCD anzeigen. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==PWM   Pulsweitenmodulation==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Absolute_Beginner_06.png|320px]] [[Bild:Absolute_Beginner_06.jpg|320px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einlesen des Analogengangs 0 (PinC0). Ausgabe des Analogwertes auf dem LCD. Erzeugung eines PWM Signals auf dem PortD6 mit Timer0. &amp;lt;br&amp;gt;&lt;br /&gt;
Der Wert des Analogeingangs wird durch 4 geteilt und als Sollwert für die [[AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR#Die_PWM-Betriebsart|PWM]] genutzt. Durch das [[LED-Fading|LED fading]] ist der Helligkeitsanstieg an der LED nicht linear. &lt;br /&gt;
&lt;br /&gt;
Durch den [[AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR|Timer Vor-Teiler]] von 256 (TCCR0B =(1&amp;lt;&amp;lt;CS02);) ist die PWM Frequenz sehr niedrig, sodass man mit dem Auge ein Flackern an der LED erkennen kann. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;fOCnxPWM=( fclk_I/O)/(Pre-Teiler * 256) &#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;fOCnxPWM= 1.000.000Hz/(256*256)=15,26Hz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download Software:  [[Media:Absolute_Beginner_6.zip| Programm als ZIP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufgaben:&#039;&#039;&#039;  &amp;lt;br&amp;gt;&lt;br /&gt;
Hex-File in Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine Simulation der PWM ist mit meinem AVR Studio nicht gelungen siehe[[AVR-Studio_Bugs| AVR-Studio_Bugs]]&amp;lt;br&amp;gt;&lt;br /&gt;
C-Programm kompilieren und dann den neuen Hex-File in den Controller laden. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Programm den Pre-Teiler heruntersetzen (TCCR0B =(1&amp;lt;&amp;lt;CS01|1&amp;lt;&amp;lt;CS00);), sodass das Flacken verschwindet. (fOCnxPWM =122,1Hz)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interrupt==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=K%C3%BChlk%C3%B6rper&amp;diff=92677</id>
		<title>Kühlkörper</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=K%C3%BChlk%C3%B6rper&amp;diff=92677"/>
		<updated>2016-04-04T10:30:16Z</updated>

		<summary type="html">&lt;p&gt;Eltio: toten Link angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel versteht sich als Unterpunkt zum Artikel [[Leistungselektronik]].&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ein Kühlkörper (engl. &#039;&#039;heat sink&#039;&#039;) dient der Begrenzung der Betriebstemperatur elektronischer Bauteile. Er wird immer dann benötigt, wenn die Verlustleistung so hoch ist, dass die sich aufgrund der herrschenden Randbedingungen wie Wärmeleitfähigkeit, Luftkonvektion und Umgebungstemperatur einstellende Bauteiltemperatur den  höchst zulässigen Wert übersteigen würde. Der Kühlkörper hat dabei die Aufgabe, die entstehende Wärme möglichst gut auf eine große Fläche zu verteilen, um sie besser an die Umgebung abgeben zu können. Damit wird der Unterschied zwischen Lufttemperatur und Bauteiltemperatur gesenkt. Technisch spricht man hierbei von einer Verringerung des Temperaturwiderstandes.&lt;br /&gt;
&lt;br /&gt;
[[bild: Rippenkuehlkoerper.png | thumb | 300px| Rippenkühlkörper, Schnittdarstellung]]&lt;br /&gt;
&lt;br /&gt;
Das grundlegende Prinzip sieht man an jedem Rippenkühlkörper. An der Stelle, wo das Kühlobjekt angeschraubt/gepresst ist (rotes Viereck), ist ein dicker &amp;quot;Klumpen&amp;quot; Material, der erstmal die Wärme auf eine etwas größere Fläche verteilen soll. Bei CPU-Lüftern ist dort teilweise Kupfer eingepresst, weil das noch besser als Aluminium Wärme leitet (engl. heat spreader, Wärmespreizer). Danach folgen viele, nach aussen dünner werdende Rippen. In der Mitte noch dick, dort muss die Wärme ja verlustarm durchgeleitet werden, aussen dünn, dort ist fast alle Wärme schon abgegeben. Ein guter Kühlkörper hat eine möglichst große Oberfläche bei möglichst kleiner Masse. Zudem sind sie so gefertigt und platziert, dass die Luftkonvektion unterstützt wird. Viele Kühlkörper werden aus preiswerten [http://de.wikipedia.org/wiki/Strangpressen Strangpressprofilen] hergestellt.&lt;br /&gt;
&lt;br /&gt;
== Wärmewiderstand ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Kennzahl eines Kühlkörpers ist der Wärmewiderstand. Er gibt an, um wie viel Kelvin sich die Temperatur zwischen Wärmequelle und Umgebung unterscheidet, wenn eine bestimmte Wärmeleistung abgeführt werden muss. Die Einheit ist K/W, Kelvin pro Watt. (Hinweis: Oft wird die Einheit °C/W angegeben, das ist allerdings nicht ganz korrekt. Temperaturdifferenzen werden in Kelvin angegeben). Je niedriger der Wärmewiderstand, umso besser der Kühlkörper, weil er die gleiche Wärmeleistung mit einem kleineren Temperaturunterschied abführen kann. Dadurch bleibt das Bauteil kühler, was der Lebensdauer und Funktionssicherheit zu Gute kommt.&lt;br /&gt;
&lt;br /&gt;
Allgemein gilt die Formel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Delta T = P_{\theta} \cdot R_{\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt; - Temperaturdifferenz zwischen Wärmequelle und Umgebung in K&lt;br /&gt;
*&amp;lt;math&amp;gt;P_{\theta}&amp;lt;/math&amp;gt; - Wärmeleistung in W&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta}&amp;lt;/math&amp;gt; - Wärmewiderstand in K/W&lt;br /&gt;
&lt;br /&gt;
Der griechische Buchstabe Theta wird als Symbol für Wärmekenngrößen verwendet, denn es geht bei diesen Rechnungen um Wärmewiderstände und Wärmeleistungen, keine elektrischen Widerstände und elektrische Leistungen.&lt;br /&gt;
&lt;br /&gt;
== Berechnung des Wärmewiderstands ==&lt;br /&gt;
&lt;br /&gt;
Für einen Kühlkörper ist der Wärmewiderstand im Datenblatt angegeben. Diesen rein aus dem Aufbau zu berechnen ist sehr schwierig, auch das Messen ist nicht so einfach. Was man jedoch berechnen kann und muss ist der Wärmewiderstand eines Gesamtaufbaus, d.h. Bauteil + Kühlkörper. Dazu muss man im Wesentlichen zwei Fälle unterscheiden.&lt;br /&gt;
&lt;br /&gt;
=== Bauteil ohne Kühlkörper ===&lt;br /&gt;
&lt;br /&gt;
Ohne Kühlkörper kann ein Bauteil seine Wärme über zwei Wege abgeben. Über das Gehäuse direkt an die Luft (Abstrahlung und Konvektion) oder über die Anschlüsse auf die Platine (Wärmeleitung). Dies alles findet parallel statt, aber je nach Gehäusetyp und Platinengestaltung ist die Verteilung auf die Kühlwege verschieden. Transistoren im Metallgehäuse (z.&amp;amp;nbsp;B. TO-3) oder mit Metallfahne (z.&amp;amp;nbsp;B. TO220) können recht viel Wärme über das Gehäuse abgeben (Konvektion). Effektive Abstrahlung braucht immer recht hohe Temperaturdifferenzen von 100K und mehr, wie sie meist nur von Leistungswiderständen und Elektronenröhren erreicht werden. Leistungsdioden im Plastikgehäuse hingegen können den Großteil der Wärme nur über die Anschlüsse abgeben. Deshalb sollten diese möglichst kurz sein, und auf der Platine an dicke Leiterbahnen oder gar Kupferflächen angeschlossen werden. Ähnliches gilt für leistungsverstärkte DIL- oder SOIC-[[IC-Gehäuseformen | Gehäuse]], welche oft für [[H-Brücken_Übersicht | Leistungstreiber]] oder [[FET | MOSFETs]] verwendet werden. In diesen Fällen sollten die Pins direkt an Kupferflächen &#039;&#039;&#039;ohne&#039;&#039;&#039; Wärmefallen ([https://de.wikipedia.org/wiki/Thermal_Pad Thermal Pad]) angeschlossen werden, auch wenn dadurch das [[Löten]] erschwert wird. &lt;br /&gt;
&lt;br /&gt;
Für die meisten Bauteile ist im Datenblatt der Wärmewiderstand zwischen dem eigentlichen Chip und der Umgebung angegeben.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta JA}&amp;lt;/math&amp;gt; - Wärmewiderstand (griechisches Zeichen [https://de.wikipedia.org/wiki/Theta Groß-Theta]) zwischen Sperrschicht und Umgebung ohne zusätzlichen Kühlkörper in K/W&lt;br /&gt;
&lt;br /&gt;
Damit kann man direkt in die oben genannte Formel gehen und die Temperaturdifferenz ausrechnen. Die Temperatur der Sperrschicht errechnet sich einfach aus der maximalen Umgebungstemperatur (meist Luft) und dem errechneten Temperaturunterschied.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_J = T_A + \Delta T &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;T_J&amp;lt;/math&amp;gt; - Temperatur der Sperrschicht in °C (engl. &amp;quot;&#039;&#039;&#039;j&#039;&#039;&#039;unction&amp;quot;)&lt;br /&gt;
*&amp;lt;math&amp;gt;T_A&amp;lt;/math&amp;gt; - Temperatur der Umgebung in °C (engl. &amp;quot;&#039;&#039;&#039;a&#039;&#039;&#039;mbient&amp;quot;)&lt;br /&gt;
*&amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt; - Temperaturdifferenz zwischen Wärmequelle und Umgebung in K&lt;br /&gt;
&lt;br /&gt;
=== Bauteil mit Kühlkörper ===&lt;br /&gt;
&lt;br /&gt;
Will man mit einem IC größere Verlustleistungen umsetzen (Linearer Spannungsregler, [[Transistor]], etc.] muss meist ein Kühlkörper her. Die jeweiligen Gehäuse besitzen dazu meist eine Kühlfahne, an die man den Kühlkörper anschrauben kann. Bei anderen gibt es Klemmen, die den Kühlkörper fest klemmen. Hier gibt es einiges zu beachten. Der Kühlkörper darf nicht zu schwach angeschraubt werden, sonst ist der Wärmewiderstand zwischen Gehäuse und Kühlkörper zu gross. Er darf aber auch nicht zu stark angeschraubt/angepresst werden, um das Gehäuse nicht zu deformieren. Wichtig ist der Übergang zwischen IC und Kühlkörper. Hier muss bei größeren Leistungen (&amp;gt;5W) Wärmeleitpaste verwendet werden. Ihre Aufgabe ist es, die Luft zwischen den Oberflächen zu verdrängen, welche sich in den mikroskopischen Unebenheiten befindet und den Wärmewiderstand &#039;&#039;&#039;deutlich&#039;&#039;&#039; erhöht. Dabei sollte die Schicht sehr dünn sein, denn die Wärmeleitpaste ist im Vergleich zu Aluminium oder Kupfer ein schlechter Wärmeleiter, allerdings deutlich besser als Luft. Das oft verwendete TO220 Gehäuse hat ca. 1cm^2 Kühlfläche. Wird ein Kühlkörper ohne Wärmeleitpaste aufgeschraubt und entsteht dabei ein angenommener Luftspalt von 10µm, hat dieser einen Wärmewiderstand von ca. 4K/W! Mit Wärmeleitpaste sind es rein rechnerisch nur 1/150tel, also etwa 0,026 K/W. Real muss man jedoch eher mit 0,5-1K/W rechnen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Material || Wärmeleitfähigkeit&amp;lt;br/&amp;gt;[W/(m*K)]&lt;br /&gt;
|-&lt;br /&gt;
| Luft            || 0,026&lt;br /&gt;
|-&lt;br /&gt;
| Wärmeleitpaste  ||   4 -  10&lt;br /&gt;
|-&lt;br /&gt;
| Aluminium       || 221*&lt;br /&gt;
|-&lt;br /&gt;
| ALMg3           || 140 - 160&lt;br /&gt;
|-&lt;br /&gt;
| ALMg4,5Mn       || 120 - 140&lt;br /&gt;
|-&lt;br /&gt;
| ALMgSi1         || 170 - 220&lt;br /&gt;
|-&lt;br /&gt;
| ALCuMg1         || 160 - 200&lt;br /&gt;
|-&lt;br /&gt;
| ALCu6,5Mn0,3    ||   95 - 130&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer          || 370*&lt;br /&gt;
|-&lt;br /&gt;
| Messing MS60    ||   90 - 113&lt;br /&gt;
|- &lt;br /&gt;
| Cu Be 2         ||   92 - 125&lt;br /&gt;
|-&lt;br /&gt;
| Cu Co 2 Be      || 192 - 239&lt;br /&gt;
|-&lt;br /&gt;
| Cu Cr 1 Zr      || 167 - 320&lt;br /&gt;
|-&lt;br /&gt;
| Cu Ni 2 Si      ||   67 - 120&lt;br /&gt;
|-&lt;br /&gt;
| Stahl 0,2%C     ||   50&lt;br /&gt;
|-&lt;br /&gt;
| Stahl 8%Cr      ||   21&lt;br /&gt;
|-&lt;br /&gt;
| Zinn            ||   65&lt;br /&gt;
|-&lt;br /&gt;
| Blei            ||   35&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Werte DIN V 4108-4, Achtung: bei den verfügbaren Legierungen sind weit geringere Wärmeleitfähigkeiten zu erwarten!&lt;br /&gt;
&lt;br /&gt;
Für die Berechnung des gesamten Wärmewiderstandes müssen hier drei Widerstände in Reihe betrachtet werden. Der Erste ist im Datenblatt zwischen Chip und Gehäuse angeben (engl. junction to case). Danach kommt der Übergang Gehäuse-Kühlkörper. Dieser ist von der Oberflächengüte und der Wärmeleitpaste abhängig und ist bei einigen Leistungsbauteilen im Datenblatt angegeben, manchmal kann er nur abgeschätzt werden. Ein TO220 Gehäuse mit dünner Schicht Wärmeleitpaste hat hier ca. 0,5-1K/W. Zum Schluss muss noch der Wärmewiderstand des Kühlkörpers addiert werden, dieser ist im Datenblatt angegeben. Vorsicht, bei größeren Kühlkörpern mit großen Rippen ist die Einbaulage wichtig, damit der Luftstrom frei strömen und gut kühlen kann (freie Konvektion, warme Luft strömt nach oben und kalte strömt unten nach). Die drei Wärmewiderstände werden addiert und über die oben angegebene Formel der Gesamtwärmewiderstand und damit die Temperaturerhöhung der Sperrschicht berechnet.&lt;br /&gt;
Dabei muss man aufpassen, dass man nicht aus Versehen den Wärmewiderstand ohne Kühlkörper (&amp;lt;math&amp;gt;R_{\theta JA}&amp;lt;/math&amp;gt;) in die Formel einsetzt!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_{\theta} = R_{\theta JC} + R_{\theta CS} + R_{\theta S}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta}&amp;lt;/math&amp;gt; - Gesamtwärmewiderstand in K/W&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta JC}&amp;lt;/math&amp;gt; - Wärmewiderstand zwischen Sperrschicht und Gehäuse (engl. &#039;&#039;&#039;j&#039;&#039;&#039;unction - &#039;&#039;&#039;c&#039;&#039;&#039;ase)&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta CS}&amp;lt;/math&amp;gt; - Wärmewiderstand zwischen Gehäuse und Kühlkörper (engl. &#039;&#039;&#039;c&#039;&#039;&#039;ase - heat &#039;&#039;&#039;s&#039;&#039;&#039;ink)&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta S}&amp;lt;/math&amp;gt; - Wärmewiderstand des Kühlkörpers (engl. heat &#039;&#039;&#039;s&#039;&#039;&#039;ink)&lt;br /&gt;
&lt;br /&gt;
Wird eine Schaltung in einem Gehäuse eingesetzt, muss man dafür sorgen dass die warme Luft abgeführt wird, vor allem in Kunststoffgehäusen. Ansonsten gibt es einen Wärmestau und die Temperatur steigt deutlich!&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta S}&amp;lt;/math&amp;gt; - max. Wärmewiderstand des Kühlkörpers&lt;br /&gt;
&lt;br /&gt;
Gegeben:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;P_{\theta}&amp;lt;/math&amp;gt; : 10 W&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta JC}&amp;lt;/math&amp;gt; : 3 K/W&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{\theta CS}&amp;lt;/math&amp;gt; : 0,5 K/W&lt;br /&gt;
*&amp;lt;math&amp;gt;T_J&amp;lt;/math&amp;gt; : 130 °C&lt;br /&gt;
*&amp;lt;math&amp;gt;T_A&amp;lt;/math&amp;gt; : 40 °C&lt;br /&gt;
&lt;br /&gt;
Rechnung:&lt;br /&gt;
&lt;br /&gt;
Um die Berechnung durchführen zu können, müssen wir zuerst die maximal zulässige  Temperaturdifferenz zwischen Sperrschicht und Umgebung festlegen. Je größer man diesen Wert wählt, umso kleiner kann der Kühlkörper sein, aber umso heißer wird auch das Bauteil im Inneren betrieben.&lt;br /&gt;
Eine Angabe dazu findet man manchmal im Datenblatt (Operating junction temperature). Achtung, manchmal wird nur die zulässige Umgebungstemperatur genannt (Operationg temperature)! Wenn nicht, kann man sich an folgenden Angaben orientieren&lt;br /&gt;
* Leistungsbauteile wie [[Transistor]]en, [[TRIAC]]s etc. sind meist bis 150°C Sperrschichttemperatur ausgelegt, teilweise auch bis 200°C&lt;br /&gt;
* Leistungs-LEDs verkraften dauerhaft nur um die 80°C&lt;br /&gt;
* Man sollte die maximalen Betriebstemperaturen nicht ausreizen, wenn man eine hohe Lebensdauer und Funktionssicherheit anstrebt und 10-30K unter den Maximalwerten bleiben&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Delta T = T_J - T_A = 130 ^\circ C - 40 ^\circ C = 90 K&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_{\theta} = \frac { \Delta T}{P_{\theta}}  = \frac {90K}{10W} = 9 K/W  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_{\theta S} = R_{\theta} - R_{\theta JC} - R_{\theta CS} = 9 K/W - 3 K/W - 0,5K/W = 5,5 K/W&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_{\theta S} \leqq 5,5 K/W&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Kühlkörper darf einen maximalen Wärmewiderstand von 5,5 K/W haben, wenn die oben genannten Bedingungen eingehalten werden sollen. Ein Kühlkörper mit einem kleineren Wärmewiderstand hält das Bauteil kühler.&lt;br /&gt;
&lt;br /&gt;
=== Zwangskühlung  ===&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Kühlkörper die Wärme auch abführen können. Was aber, wenn der für den Wärmeabtransport benötigte Kühlkörper mechanisch nicht ins Gehäuse paßt oder die entstehende Eigenkonvektion zu gering ist?&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Lüfter zum Einsatz, das Ganze nennt sich dann Zwangskühlung. Der Effekt beruht darauf, dass wesentlich mehr Luft am Kühlkörper vorbeiströmen kann und damit (bei gleicher Temperaturerhöhung des Luftvolumenelementes) insgesamt mehr Wärme abgegeben werden kann.&lt;br /&gt;
&lt;br /&gt;
Durch den Einsatz eines Lüfters lässt sich der effektive Wärmewiderstand eines Kühlkörpers etwa um mehrere Faktoren verbessern, bzw. der Kühlkörper kann in der Größe entsprechend reduziert werden. Dabei sind je nach Einbausituation des Kühlers und des Lüfters Faktoren zwischen 3-10 möglich. Ein typischer Wert, der sich bei durchschnittlich dimensionierten Kühlkörpern ergibt, ist ein Faktor 4-5. Die Temperaturüberhöhung schrumpft dabei z.B. von 80 Grad auf 20 Grad zusammen. Dies sind jedoch nur Richtwerte für den ersten Entwurf, eine Prüfung durch Messung ist unbedingt erforderlich. &lt;br /&gt;
&lt;br /&gt;
Beim Einsatz eines Lüfters ist auch daran zu denken, daß sowohl die Ansaugöffnung als auch der Kühlkörper verschmutzen und regelmäßig gereinigt werden müssen. Weiterhin erzeugt ein Lüfter natürlich auch Lärm. Je kleiner der Lüfter und je größer die benötigte Luftlieferleistung, umso lauter wird der Lüfter. Umgekehrt kann man aber mit einem großen, eher langsam laufenden Lüfter den Geräuschpegel stark absenken. Letztendlich kann ein Lüfter auch kaputt gehen, womit die Kühlung deutlich verschlechtert wird und das Bauteil überhitzt. Hier empfiehlt sich bei wertvolleren Objekten eine Lüfterüberwachung, wie sie seit längerem bei PCs eingesetzt wird oder das Verbauen mehrerer Lüfter, sodass der Ausfall eines einzigen nicht sofort zu einem Geräteausfall führt.&lt;br /&gt;
&lt;br /&gt;
==== Physikalischer Hintergrund der Zwangskühlung mit Luft ====&lt;br /&gt;
&lt;br /&gt;
Luft hat eine Wärmekapazität von ungefähr 1kJ/kg/K was bedeutet, daß für die Erwärmung von 1kg Luft um 1K eine Energiemenge von 1kJ = 1000Ws erforderlich ist. D.h. für den kontinuierlichen Abtransport von 100W Wärme werden mindestens 100g Luft pro Sekunde benötigt, wenn man diese nur um 1K erwärmen will. &lt;br /&gt;
Um also 100W von einem Kühlkörper abzuführen, der sich hier im Beispiel um 8K erwärmen darf, sind  100W / 8K  = 12,5g Luft pro Sekunde erforderlich. Ein Gramm Luft hat ein Volumen von etwa 0,77l, d.h. bei 12,5 g muss der Lüfter 9,6 l/s bzw. 34,5 m³/h liefern, die dann auch durch den gesamten Kühlkörper geblasen werden müssen.&lt;br /&gt;
&lt;br /&gt;
Diese Werte sind jedoch nur theoretisch von Interesse, da die Praxis gezeigt hat, dass die effektive Kühlwirkung sehr stark von den sich einstellenden Mikroturbulenzen am Bauteil abhängt. Diese sind für den Wärmegradienten zwischen Kühleroberfläche und Umgebungsluft verantwortlich. Durch eine stark laminare = gleichförmig strömende Luft wird ein Bauteil eher schlecht gekühlt. Bestimmte Bauformen von Bauelementen und Kühlern begünstigen die Turbulenzbildung, behindern damit zwar den Luftstrom, da der Widerstand steigt, kühlen aber letztlich besser. So ist es zu erklären, dass manche Bauteile ohne Kühlung auskommen, da sie die Eigenkonvektion fördern und günstig im Luftstrom sitzen und von einem Kühler weniger profitieren, als andere Problembauteile.&lt;br /&gt;
&lt;br /&gt;
Generell kann man sagen, dass flache, breite Bauteile zunehmend schlechter selbstkühlend sind, je größer sie werden und damit eher einen KK brauchen. FPGAs und Grafikchips sind solche Kandidaten. Hier empfehlen sich teilweise eigene Chipkühler. Auch RAM-Riegel mit sehr flachen Chips können so sehr effektiv kühl gehalten werden.&lt;br /&gt;
&lt;br /&gt;
== Die Platine als Kühlkörper ==&lt;br /&gt;
&lt;br /&gt;
Bei kleineren Leistungen (&amp;lt; 5W) kann man auch die Platine als Kühlkörper benutzten. Dabei muss jedoch die Wärme vom Bauteil möglichst schnell auf eine größere Fläche verteilt werden. Dazu nutzt man große Kupferflächen direkt am Bauteil. Diese werden teilweise beidseitig angebracht. Die Wärme muss man dann jedoch mit vielen Vias von der einen Seite, auf der das Bauteil sitzt, auf die andere geleitet werden. Diese Vias heißen thermische Vias, da sie nicht als elektrische Verbindung sondern als Wärmeleiter dienen. Das funktioniert deshalb so gut, weil die Vias innen mit Kupfer beschichtet sind, welches die Wärme wesentlich besser leitet als das Material der Leiterplatte (FR2, FR4).&lt;br /&gt;
Verfügt ein SMD-Bauteil über eine sogenannte &amp;quot;heat slug&amp;quot; oder thermal pad auf der Unterseite, muss dieses zur Wärmeableitung unbedingt angelötet werden. Dies ist mit einem normalen Lötkolben möglich, wenn die Platine an dieser Stelle mehrere Durchkontaktierungen mit einem Durchmesser von ca. 1,5mm aufweist. Durch diese Durchkontaktierungen kann genug Lötzinn auf die andere Seite fließen um diese Fläche mit der Platine zu verlöten. &lt;br /&gt;
&lt;br /&gt;
Mit modernen Technologien ist es auch möglich, deutlich größere Wärmeleistungen von der Platine abzuführen. Dazu werden z.&amp;amp;nbsp;B. Platinen mit Aluminium- oder Kupferkern  oder auf einen Metallträger laminierte PCBs benutzt (IMS = &#039;&#039;&#039;I&#039;&#039;&#039;nsulated &#039;&#039;&#039;M&#039;&#039;&#039;etal &#039;&#039;&#039;S&#039;&#039;&#039;ubstrat). Diese kommen z.&amp;amp;nbsp;B. bei Hochleistungs-[[LED]]s zum Einsatz. Für Hobbyzwecke sind sie aber noch wesentlich zu teuer, vor allem bei Einzelstücken.&lt;br /&gt;
&lt;br /&gt;
== Peltierelement ==&lt;br /&gt;
&lt;br /&gt;
Ein [http://de.wikipedia.org/wiki/Peltier-Element Peltierelement] arbeitet nach dem [http://de.wikipedia.org/wiki/Thermoelektrizit%C3%A4t#Peltier-Effekt Peltier-Effekt]. Dabei wird in einem Halbleiter durch Stromfluss eine Seite des Elements kalt, die andere heiß. Damit kann man ein kleines Objekt beliebig kühlen oder heizen. Allerdings sind Peltierelemente nur in eher kleinen Abmessungen und Leistung verfügbar (bis einige Dutzend Watt) und deren Effizienz ist auch nicht sonderlich hoch. Die allgemeine Auffassung, die könnten Wärme einfach verschwinden lassen ist falsch. Denn die heiße Seite muss klassisch gekühlt werden, je nach Temperaturunterschied mit mehr als der doppelten Kühlleistung als auf der kalten Seite an Wärme abgeführt wird.&lt;br /&gt;
&lt;br /&gt;
== Heat pipe ==&lt;br /&gt;
&lt;br /&gt;
Eine [http://de.wikipedia.org/wiki/Heatpipe Heat pipe],auf deutsch Wärmerohr genannt, ist ein Rohr, welches mit einer leicht verdampfenden Flüssigkeit gefüllt ist. Wird ein Ende erhitzt, verdampft die Flüssigkeit und nimmt dabei sehr viel Wärme auf. Der Dampf steigt im Rohr ans andere Ende, kondensiert dort und gibt dabei seine Wärme wieder ab.&lt;br /&gt;
&lt;br /&gt;
Heat pipes werden auch als Wärmesuperleiter bezeichnet, weil sie Wärme 100-10.000 mal besser leiten als ein massiver Kupferstab mit gleichen Abmessungen.&lt;br /&gt;
&lt;br /&gt;
Auch hier muss gesagt werden, dass eine Heat pipe allein &#039;&#039;&#039;kein&#039;&#039;&#039; Kühlsystem ist, denn die Seite, auf der das Wärmetransportmedium wieder kondensiert, muss auch wieder klassisch gekühlt werden. Der grosse Vorteil ist die Abführung großer Wärmemengen auf engstem Raum, wie z.&amp;amp;nbsp;B. bei CPUs in Laptops.&lt;br /&gt;
&lt;br /&gt;
== Flüssigkühlung ==&lt;br /&gt;
&lt;br /&gt;
Im PC-Bereich ist es unter einigen Enthusiasten verbreitet, den Rechner entweder zu übertakten, um eine höhere Leistung zu erzielen oder super leise zu machen, um angenehmer arbeiten oder spielen zu können. In beiden Fällen muss eine große Wärmemenge abgeführt werden. Dabei wird die sehr hohe Wärmekapazität von Wasser genutzt, um auf kleinem Raum die Wärme von CPU, GPU, Festplatten etc. abzuführen. Aber auch hier ist zu beachten, dass am Ende einer Flüssigkühlung praktisch immer ein klassischer Wärmetauscher steht, welcher die Wärme an die Umgebungsluft abgibt. Dieser kann sich aber deutlich weiter entfernt vom zu kühlenden Objekt befinden als ein einfacher, direkt montierter Kühlkörper. &lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung von Wasser statt Luft als Kühlmedium reduziert sich die Durchflußmasse in etwa um den Faktor 4,2, da die Wärmekapazität von Wasser bei ca. 4,182 kJ/kg/K liegt. Da Wasser aber auch eine deutlich höhere Dichte als Luft besitzt (Wasser = 1g/cm³; Luft = 1,3mg/cm³) kommt noch der Faktor von ~770 dazu, woraus sich ein Gesamtfaktor für das Durchflußvolumen von ~3230 ergibt.&lt;br /&gt;
&lt;br /&gt;
D.h. die Durchflußmenge in unserem oben genannten Beispiel (100W) sinkt auf ca. 2,9 ml/s bzw. 10,7 l/h.&lt;br /&gt;
&lt;br /&gt;
Vorteile&lt;br /&gt;
*Abtransport großer Wärmemengen auf kleinstem Raum&lt;br /&gt;
*nahezu lautlos&lt;br /&gt;
&lt;br /&gt;
Nachteile&lt;br /&gt;
*höherer Aufwand und Kosten&lt;br /&gt;
*Gefahr durch auslaufendes Kühlmittel&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Leistungselektronik wird Flüssigkühlung eingesetzt, im Hobbybereich nahezu nicht.&lt;br /&gt;
&lt;br /&gt;
== Bauteilmontage auf dem Kühlkörper ==&lt;br /&gt;
&lt;br /&gt;
Die Montage der klassischen Halbleitergehäuse nach TO220 und ähnlichen gestaltet sich augenscheinlich simpel: Die Kühlfahne hat ein Loch. Da ist es doch sehr verlockend, das Bauteil mit einer Schraube durch ebendieses Loch auf dem Kühlkörper zu befestigen...&lt;br /&gt;
&lt;br /&gt;
Bei fachgerechter Ausführung spricht auch wenig gegen diese Montageweise. Dazu gehört dann auch das richtige Anzugsmoment für die Schraube. Zu lose angezogen und zwischen Bauteilgehäuse und wärmeabführender Oberfläche entsteht ein Luftspalt. Ein Wärmeleitpad oder Wärmeleitpaste schaffen zwar Abhilfe, aber die Wärmeleitfähigkeit dieser Stoffe liegt um Größenordnungen unter der von Aluminium (Kühlkörper) und Kupfer (Kühlfahne). Ein vorhandenes Wärmeleitpad wird mitunter auch nicht weit genug zusammengedrückt, sodass auch noch Optimierung möglich wäre. Nämlich durch festeres Anziehen der Schraube.&lt;br /&gt;
Zu fest angezogen und die Kühlfahne wölbt sich minimal. Dabei hebt der Bauteilkörper von der Oberfläche des Kühlkörpers ab und es entsteht wieder ein Spalt. Ungünstigerweise liegt aber genau dort der Usprung des Wärmeflusses (Silizium-Chip). Bei Conrad gibt es [http://www.conrad.de/ce/de/overview/0205045/Transistor-Halteklammern-Haltefedern Klammern] zur Befestigung von Transistoren von [http://www.fischerelektronik.de/web_fischer/de_DE/K%C3%BChlk%C3%B6rper/A06/Transistorhaltefedern/$search_result_naviActualPage/1/$search_result_naviLinesPerPage/100/search.xhtml;jsessionid=2C868850DA0202334B26912FF6948496#search_result_naviPoint Fischer].&lt;br /&gt;
&lt;br /&gt;
[[Datei: kuehlkoerper-montage.jpeg | thumb | 300px | Montagebeispiel]] Weitaus einfacher zu handhaben ist folgende Montageweise: Die Bauteile werden, ungeachtet der Montagebohrung, lose auf den Kühlkörper gelegt. Falls notwending natürlich mit Isolierstoff dazwischen und in jedem Fall hauchdünn mit einem Wärmeleitmittel bestrichen. Über die Bauteile wird dann ein Aluminiumprofil gelegt und erst dieses wird, weiterhin mit einer Schraube pro Bauteil, auf den Kühlkörper gespannt. Abgesehen davon, dass so auch SMD-Bauteile (IPAK!) auf einem Kühlkörper Platz finden, entsteht Druck genau über dem Hot Spot.&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
&lt;br /&gt;
*Große Hochlastwiderstände mit Keramikgehäuse werden im Normalbetrieb recht heiß (200-350°C). Diese Temperaturen sollten nicht auf die Platine kommen, denn das macht das Material nicht lange mit. Hier muss genau das Gegenteil von dem gemacht werden, was weiter oben für Bauteile ohne Kühlkörper empfohlen wurde. Die Anschlüsse müssen möglichst lang sein, damit wenig Wärme über sie abgegeben werden kann. Die Kühlung erfolgt nahezu nur über den Keramikkörper durch Wärmestrahlung und Konvektion.&lt;br /&gt;
* Ein TO220 Gehäuse kann ca. 1W ohne Kühlkörper abgeben.&lt;br /&gt;
* Bei der Dimensionierung des Kühlkörpers sollte man sich nicht an der maximal zulässigen Sperrschichttemperatur orientieren, sondern möglichst um 10..50K kühler bleiben. Das verbessert die Funktionssicherheit und vor allem die Lebensdauer erheblich!&lt;br /&gt;
* Merksatz über den dicken Daumen: Pro 10 Grad Temperaturerhöhung halbiert sich die Lebenserwartung eines Bauteils. (Arrheniusgesetz, RGT-Regel, 10-Grad-Gesetz)&lt;br /&gt;
* Temperaturzyklen verkürzen die Lebensdauer von Schaltungen erheblich&lt;br /&gt;
* Meist sind mehrere kleine Kühlkkörper deutlich kleiner und billiger als ein Großer.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[Leistungselektronik]]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/84303 Forumsbeitrag]: Beispielrechnung&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/308826?goto=3325027#3325027 Forumsbeitrag]: Wärmewiderstand und Sperrschichttemperatur messen&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/351187#3905083 Forumsbeitrag]: Dicker MOSFET, dünnes Anschlusspin?&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/205307#4091697 Forumsbeitrag]: Wärmewiderstand einfacher Bleche&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://sound.westhost.com/heatsinks.htm The Design of Heat sinks]. Eine ausführliche Seite zum Thema Kühlkörper, englisch&lt;br /&gt;
* [http://ludens.cl/Electron/Thermal.html Thermal Design], englisch&lt;br /&gt;
* [http://wiki.oliverbetz.de/owiki.php/FormelSammlung Universelle Formelsammlung], mit kurzen Erklärungen&lt;br /&gt;
* [http://norel.de/index.php?seite=thermo&amp;amp;unter=1 technische Informationen] zur Berechnung bei der Entwärmung elektronischer Systeme, inhaltlich gut&lt;br /&gt;
* [http://tangentsoft.net/elec/diy-hs.html DIY Heat Sinks]&lt;br /&gt;
* [http://www.fischerelektronik.de/ Kühlkörper] bei Fischer Elektronik&lt;br /&gt;
* [http://www.leiton.de/leiterplatten_teaser_alu.html Leiterplatten mit Alukern] bei Leiton&lt;br /&gt;
*[http://www.shop.display3000.com/mikrocontrollerloesungen/uc-mit-21-tft/d074-mikrocontroller-atmega-tft-farbdisplay-212.html Berechnung in der Praxis]: Unter Downloads das Handbuch laden, dann Seite 14&lt;br /&gt;
* [http://www.zabex.de/site/kurios.html#wafeila Ungewöhnliche Hochlastwiderstände im Eigenbau]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Leistungselektronik]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=WinAVR&amp;diff=92016</id>
		<title>WinAVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=WinAVR&amp;diff=92016"/>
		<updated>2016-02-23T07:47:03Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* gcc plug-in: Error: Object file not found on expected location */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WinAVR ist die Windows-Distribution der [[C]] und C++ aus der GNU compiler-collection [[AVR-GCC]] für [[AVR]]-[[Mikrocontroller]]. Der [[AVR-Ada|Ada]]-Compiler war mal enthalten und kann inzwischen nachinstalliert werden. WinAVR enthält neben dem Compiler und den erforderlichen Zusatzprogrammen (sogen. Binutils) noch einige andere Pakete, z.&amp;amp;nbsp;B. die C-Standardbibliothek avr-libc (inkl. Dokumentation), die Programmiersoftware [[AVRDUDE]] und den Editor Programmer&#039;s Notepad.&lt;br /&gt;
&lt;br /&gt;
[http://winavr.sourceforge.net/ Download über die WinAVR-Startseite]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Auf 64bit-Windows darf WinAVR &#039;&#039;&#039;nicht&#039;&#039;&#039; im Standard-Programmverzeichnis &amp;quot;C:\Program Files (x86)&amp;quot; installiert werden, sonst [http://www.mikrocontroller.net/topic/83517#700417 funktioniert der Compiler nicht]. Es ist entweder das vom Installer vorgeschlagene Defaultverzeichnis zu verwenden, oder z.B. &amp;quot;C:\WinAVR&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nach dem Installieren sollten Win9X-Rechner neu gestartet werden, um die Erweiterung des Suchpfades um die WinAVR-Verzeichnisse zu aktivieren (autoexec.bat). Bei Windows NT/2000/XP ist üblicherweise kein Neustart erforderlich, sollte aber dennoch ausgeführt werden, wenn Probleme auftreten (Fehler in der Art: &#039;&#039;Der Befehl ist falsch geschrieben/kann nicht gefunden werden...&#039;&#039;). Danach kann man sofort im Programmer&#039;s Notepad z.&amp;amp;nbsp;B. mit dem Beispielcode anfangen. &lt;br /&gt;
&lt;br /&gt;
Zwei WinAVR Verzeichnisse müssen in der PATH-Umgebungsvariable aufgeführt sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\Dokumente und Einstellungen\willi&amp;gt;path&lt;br /&gt;
PATH=[...]C:\WinAVR\bin;C:\WinAVR\utils\bin;[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Umstieg von AVR-Studio mit avr-gcc zu WinAVR mit AVRISP ===&lt;br /&gt;
* Programmer&#039;s Notepad 2 hat konfigurierbare Menüpunkte, vorkonfiguriert sind: &lt;br /&gt;
**Make all&lt;br /&gt;
**Make clean&lt;br /&gt;
**Make program&lt;br /&gt;
* Man muss sich selbst um ein passendes Makefile kümmern. Dazu kann WinAVR/mfile/mfile.tcl genutzt werden (Achtung, F_CPU ist im Template bereits mit 8 MHz eingestellt und muss ggf. von Hand geändert werden). mfile benötigt TCL/TK ([http://www.activestate.com/Products/Download/Download.plex?id=ActiveTcl Win32 download], ca 20 MB). &lt;br /&gt;
* Zum Flashen wird AVRDUDE benutzt.&lt;br /&gt;
* Wenn es beim Flashen einen &#039;out of sync&#039; Fehler gibt, ist nicht der richtige AVRISP eingestellt (unterschiedliche Softwareversionen).&lt;br /&gt;
&lt;br /&gt;
=== WinAVR Version ===&lt;br /&gt;
&lt;br /&gt;
Die aktuelle WinAVR Version ist derzeit (Stand 02/2016) WinAVR-20100110. &lt;br /&gt;
[http://winavr.sourceforge.net/ SourceForge.net WinAVR Projekt-Seite] und [http://sourceforge.net/projects/winavr/files/ Download]&lt;br /&gt;
&lt;br /&gt;
Versionsnummern:&lt;br /&gt;
* avr-gcc 4.3.3&lt;br /&gt;
* AVR-LibC 1.6.7 &lt;br /&gt;
&lt;br /&gt;
Bekannte Probleme:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/163022#1554907]: AVRDUDE Fehler: avrdude was compiled without usb support. Abhilfe: Ältere Version nehmen oder selbst kompilieren [http://www.mikrocontroller.net/topic/163675#1561957].&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=40402&amp;amp;highlight=requested+runtime+terminate]: Fehlermeldung beim Aufruf von z. B: avr-gcc: Kommt es zur folgender Fehlermeldung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This application has requested the Runtime to terminate it in an unusual way.&lt;br /&gt;
Please contact the application&#039;s support team for more information.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
so ist das Temp-Verzeichnis als &amp;quot;Read-Only&amp;quot; markiert. Abhilfe: In einem Command-Window folgenden Befehl ausführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attrib -R %temp%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MAKE funktioniert nicht ===&lt;br /&gt;
&lt;br /&gt;
Siehe auch: &lt;br /&gt;
* http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles&lt;br /&gt;
* http://www.mikrocontroller.net/articles/Beispiel_Makefile&lt;br /&gt;
* http://www.mikrocontroller.net/articles/C_ohne_Makefile&lt;br /&gt;
&lt;br /&gt;
==== Richtiges Make Programm? ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; make all&lt;br /&gt;
MAKE Version 5.2  Copyright (c) 1987, 2000 Borland&lt;br /&gt;
Error makefile 461: Command syntax error&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn make mit dieser oder ähnlichen Fehlermeldung abbricht, ist der Pfad für ausführbare Programme nicht auf das make Programm aus dem GCC/Binutils Paket gesetzt. Es wird ganz banal das falsche Make-Programm (z.&amp;amp;nbsp;B. von Borland C oder Delphi) für das verwendete makefile aufgerufen. In diesem Fall ist die Umgebungsvariable PATH in Autoexec.Bat (Windows 98SE) bzw. in der Systemsteuerung (Windows XP, 2000) anzupassen.&lt;br /&gt;
&lt;br /&gt;
==== gcc plug-in: Error: Object file not found on expected location ====&lt;br /&gt;
&lt;br /&gt;
Diese Fehlermeldung kann nur auftauchen, wenn der GNU C Compiler aus dem AVR-Studio heraus bedient wird. Dass keine weiteren Fehlerursachen genannt werden, ist eigentlich ein [[AVR-Studio Bugs|AVR-Studio Bug]]. &lt;br /&gt;
&lt;br /&gt;
Eine Analyse des AVR-Studio Bugs hat [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=53658 Johan Ekdahl im avrfreaks.net Forum] beschrieben. AVR-Studio erkennt in gewissen Fällen beim &#039;&#039;&#039;Build&#039;&#039;&#039;-Vorgang auftretende Fehler nicht und erwartet eine nie hergestellte Ausgabedatei. &lt;br /&gt;
&lt;br /&gt;
Auf jeden Fall sollte man in AVR Studio mal zwischen dem Build- und Message-Fenster umschalten, ob in einem von beiden mehr Infos stehen, was wodurch den Fehler produziert.&lt;br /&gt;
&lt;br /&gt;
Wenn nicht mehr Infos aus AVR Studio herauszukitzeln sind, könnte man das Projekt beispielsweise als herkömmliches Make-Projekt aufsetzen, mit WinAVR kompilieren (Kommandozeile oder aus dem Programmers Notepad heraus) und auf Fehlermeldungen achten.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/80188 gcc plug-in: Error: Object file not found...] im Forum&lt;br /&gt;
&lt;br /&gt;
==== avr-gcc: _spawnvp: No such file or directory ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; &amp;quot;make.exe&amp;quot; all&lt;br /&gt;
&lt;br /&gt;
-------- begin --------&lt;br /&gt;
avr-gcc (GCC) 4.1.1 (WinAVR 20070122)&lt;br /&gt;
Copyright (C) 2006 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is&lt;br /&gt;
NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR&lt;br /&gt;
PURPOSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Linking: main.c.elf&lt;br /&gt;
avr-gcc -mmcu=at90s2313 -I. -gdwarf-2 -DF_CPU=7372800UL -Os&lt;br /&gt;
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall&lt;br /&gt;
-Wstrict-prototypes -Wa,-adhlns=  -std=gnu99 -Wundef -MMD -MP -MF&lt;br /&gt;
.dep/main.c.elf.d  --output main.c.elf -Wl,-Map=main.c.map,--cref&lt;br /&gt;
-lm&lt;br /&gt;
avr-gcc: _spawnvp: No such file or directory&lt;br /&gt;
make.exe: *** [main.c.elf] Error 1&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Process Exit Code: 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei WinAVR-20070122 und WinAVR-20070525 kann es unter VISTA und Windows98SE eine ähnliche Fehlermeldung wie oben gezeigt geben. &lt;br /&gt;
&lt;br /&gt;
Verschiedene Binärpatches können diese Probleme beheben:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/61716#508449 Forenbeitrag von MadWizard] und [http://www.madwizard.org/extern/winavr-vista/ Originalseite] für VISTA (32-Bit). Bei der 64-Bit Version von VISTA wird berichtet, dass der Linker mit Fehlermeldung abbricht.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/60163#490161 Forenbeitrag von Stefan] für Windows98SE&lt;br /&gt;
&lt;br /&gt;
WinAVR-20071221 funktioniert unter Windows98SE, wie erste Tests zeigen, wie aus der Tüte, d.h. ohne Binärpatch (Jippy!).&lt;br /&gt;
&lt;br /&gt;
==== ...\WinAVR\utils\bin\sh.exe: *** Couldn&#039;t reserve space for cygwin&#039;s heap, Win32 error 487 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; &amp;quot;make.exe&amp;quot; all&lt;br /&gt;
AllocationBase 0x0, BaseAddress 0x71590000, RegionSize 0x470000, State 0x10000&lt;br /&gt;
E:\WinAVR\utils\bin\sh.exe: *** Couldn&#039;t reserve space for cygwin&#039;s heap, Win32 error 487&lt;br /&gt;
&lt;br /&gt;
-------- begin --------&lt;br /&gt;
avr-gcc (GCC) 3.4.3&lt;br /&gt;
Copyright (C) 2004 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
&lt;br /&gt;
AllocationBase 0x0, BaseAddress 0x71590000, RegionSize 0x470000, State 0x10000&lt;br /&gt;
E:\WinAVR\utils\bin\sh.exe: *** Couldn&#039;t reserve space for cygwin&#039;s heap, Win32 error 487&lt;br /&gt;
make.exe: *** [sizebefore] Error 1&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Process Exit Code: 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn make mit dieser oder ähnlichen Fehlermeldung abbricht, ist es einen Versuch wert, die Hilfsdatei &#039;&#039;&#039;msys-1.0.dll&#039;&#039;&#039; im Ordner des Tools sh.exe (beim Beispiel E:\WinAVR\utils\bin\) auszutauschen. Eine Anleitung dazu gibt es von Madwizard (http://www.madwizard.org/extern/winavr-vista). Siehe auch im Forum die [http://www.mikrocontroller.net/topic/70505#573305 Frage von Lukas] und die [http://www.mikrocontroller.net/topic/79973#667605 Frage von werdlangsammüde].&lt;br /&gt;
&lt;br /&gt;
==== make: *** [####.eep] Error 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Build started 18.8.2007 at 20:14:23&lt;br /&gt;
avr-objcopy -j .eeprom --set-section-flags=.eeprom=&amp;quot;alloc,load&amp;quot;&lt;br /&gt;
--change-section-lma .eeprom=0 -O ihex I2C_Motor.elf I2C_Motor.eep&lt;br /&gt;
c:\Programme\WinAVR\bin\avr-objcopy.exe: there are no sections to be&lt;br /&gt;
copied!&lt;br /&gt;
c:\Programme\WinAVR\bin\avr-objcopy.exe: --change-section-lma&lt;br /&gt;
.eeprom=0x00000000 never used&lt;br /&gt;
make: *** [I2C_Motor.eep] Error 1&lt;br /&gt;
Build succeeded with 0 Warnings...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese oder eine ähnliche Fehlermeldung erscheint, wenn im erzeugten Programm der [[EEPROM]]-Abschnitt unbenutzt ist. Um die Fehlermeldung zu unterdrücken, kann man vor den Aufruf von avr-objcopy im Makefile ein Minuszeichen schreiben ([http://www.mikrocontroller.net/topic/76369#633387 Forenbeitrag von Jörg]).&lt;br /&gt;
&lt;br /&gt;
Beispielzeilen in einem Makefile &#039;&#039;&#039;ohne&#039;&#039;&#039; Fehlerunterdrückung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%.eep: %.elf&lt;br /&gt;
	@echo&lt;br /&gt;
	@echo $(MSG_EEPROM) $@&lt;br /&gt;
	$(OBJCOPY) -j .eeprom \&lt;br /&gt;
        --set-section-flags=.eeprom=&amp;quot;alloc,load&amp;quot; \&lt;br /&gt;
	--change-section-lma .eeprom=0 \&lt;br /&gt;
        --no-change-warnings -O $(FORMAT) \&lt;br /&gt;
        $&amp;lt; $@ || exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispielzeilen in einem Makefile &#039;&#039;&#039;mit&#039;&#039;&#039; Fehlerunterdrückung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%.eep: %.elf&lt;br /&gt;
	@echo&lt;br /&gt;
	@echo $(MSG_EEPROM) $@&lt;br /&gt;
	-$(OBJCOPY) -j .eeprom \&lt;br /&gt;
        --set-section-flags=.eeprom=&amp;quot;alloc,load&amp;quot; \&lt;br /&gt;
	--change-section-lma .eeprom=0 \&lt;br /&gt;
        --no-change-warnings -O $(FORMAT) \&lt;br /&gt;
        $&amp;lt; $@ || exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== make.exe: *** No rule to make target `main.elf&#039;, needed by `elf&#039;. ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-------- begin --------&lt;br /&gt;
avr-gcc (GCC) 4.2.2 (WinAVR 20071221rc1)&lt;br /&gt;
Copyright (C) 2007 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is NO warranty;&lt;br /&gt;
not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
&lt;br /&gt;
make.exe: *** No rule to make target `main.elf&#039;, needed by `elf&#039;.  Stop.&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Process Exit Code: 2&lt;br /&gt;
&amp;gt; Time Taken: 00:02&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese oder eine ähnliche Fehlermeldung erscheint, wenn der Quelltext NICHT main.c heisst und ein Makefile OHNE weitere Anpassung an den verwendeten Dateinamen der Quelltextdatei verwendet wird. &lt;br /&gt;
&lt;br /&gt;
Abhilfe ist also die Quelltextdatei in main.c umbenennen oder das Makefile anzupassen (siehe [[AVR-GCC-Tutorial]]).&lt;br /&gt;
&lt;br /&gt;
Eine weitere Fehlerursache könnte auch eine Ordnerstruktur mit Leerzeichen und/oder Sonderzeichen im Pfad sein.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Ursache kann das benutzte Makefile sein. Es ist da anscheinend eins im Umlauf mit falscher Einrückung der Anweisungen ([http://www.mikrocontroller.net/topic/123719#1126830] und [http://www.mikrocontroller.net/topic/116346#1043825])&lt;br /&gt;
&lt;br /&gt;
==== fatal error: opening dependency file .dep/main.o.d: No such file or directory ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avr-gcc (GCC) 4.2.2 (WinAVR 20071221)&lt;br /&gt;
Copyright (C) 2007 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is&lt;br /&gt;
NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR&lt;br /&gt;
PURPOSE.&lt;br /&gt;
&lt;br /&gt;
Compiling: main.c&lt;br /&gt;
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2   -Os -funsigned-char&lt;br /&gt;
-funsigned-bitfiel&lt;br /&gt;
ds -fpack-struct -fshort-enums -Wall -Wstrict-prototypes&lt;br /&gt;
-Wa,-adhlns=main.lst  -&lt;br /&gt;
std=gnu99 -DF_OSC=3686400 -MD -MP -MF .dep/main.o.d main.c -o main.o&lt;br /&gt;
main.c:21: fatal error: opening dependency file .dep/main.o.d: No such&lt;br /&gt;
file or directory&lt;br /&gt;
compilation terminated.&lt;br /&gt;
make: *** [main.o] Error 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind Leerzeichen oder Sonderzeichen im Verzeichnispfad ([http://www.mikrocontroller.net/topic/99642#864556])?&lt;br /&gt;
&lt;br /&gt;
Wird VISTA 64 benutzt? Obige Fehlermeldung kann als zweite Fehlermeldung nach der eigentlichen VISTA-spezifischen Fehlermeldung (sync_with_child Problem) kommen. Die Lösung hat dann [http://www.madwizard.org/electronics/articles/winavrvista MADWIZARD].&lt;br /&gt;
&lt;br /&gt;
==== make: Interrupt/Exception caught (code = 0xc00000fd, addr = 0x4217b3) ====&lt;br /&gt;
&lt;br /&gt;
WinAVR darf nicht im Standard-Programmverzeichnis &amp;quot;C:\Program Files (x86)&amp;quot; installiert werden, sonst kommt dieser Fehler. Es ist entweder das vom Installer vorgeschlagene Defaultverzeichnis zu verwenden, oder z.B. &amp;quot;C:\WinAVR&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Portable Installation ===&lt;br /&gt;
&lt;br /&gt;
Das Hauptproblem beim Ausführen von WinAVR von einem USB-Stick ist der fehlende Eintrag für den Compilerpfad in der Windowsumgebungsvariable PATH. &lt;br /&gt;
&lt;br /&gt;
Die folgende Batchdatei zum Starten des Programmers Notepad extrahiert mit %~dp0 das Laufwerk und den Pfad vom Aufruf der Batchdatei und setzt damit PATH neu. &lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, das die neu gesetzte PATH Variable nicht systemweit etabliert wird, sondern nur für Prozesse gilt, die aus dieser Batch (mit dieser cmd Session) aufgerufen werden (in diesem Fall pn.exe)&lt;br /&gt;
&lt;br /&gt;
....\WinAVR\pn.bat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@echo off&lt;br /&gt;
echo PN.BAT Version 1.0&lt;br /&gt;
&lt;br /&gt;
set BatchPath=%~dp0&lt;br /&gt;
set BinDir=pn\&lt;br /&gt;
set BinDir=%BatchPath%%BinDir%&lt;br /&gt;
set PATH=%BatchPath%\bin;%BatchPath%\utils\bin;%PATH%&lt;br /&gt;
&lt;br /&gt;
start %BinDir%pn.exe&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code-Größe anzeigen ===&lt;br /&gt;
* [[WinAVR: Code-Größe anzeigen]]&lt;br /&gt;
* Das Tool [[AVR-GCC#Tipps_.26_Tricks|avr-nm]]&lt;br /&gt;
&lt;br /&gt;
=== WinAVR-2010 soll die letzte Version sein? [http://www.mikrocontroller.net/topic/178763] ===&lt;br /&gt;
&lt;br /&gt;
[http://www.makehackvoid.com/group-projects/mhvavrtools MHV AVR Tools] - A WinAVR Replacement. With WinAVR marked as inactive, and no official release yet from Atmel, we (Make Hack Void, an association of geeks &amp;amp; artists. We are forming a Hackerspace* in Canberra) have built our own set of tools in a WinAVR-like layout suitable for use as a replacement. Please note that no guarantees as to fitness or suitability are being made. In particular,GCC 4.5.1 has not been tested as extensively as GCC 4.4.x, so use our builds at your own risk.&lt;br /&gt;
&lt;br /&gt;
Update 5/2011: Laut [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=107269 Beitrag bei avrfreaks.net] wird die Entwicklung von WinAVR fortgesetzt.&lt;br /&gt;
&lt;br /&gt;
08/2015: WinAVR mit aktueller Toolchain (Compiler + Bibliothken) von Atmel versehen: http://www.mikrocontroller.net/topic/372924#4215881&lt;br /&gt;
&lt;br /&gt;
;Please browse to the present location for files originally found at: &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/190059#1855064&lt;br /&gt;
* http://www.mikrocontroller.net/topic/177315#1706751&lt;br /&gt;
* http://www.mikrocontroller.net/topic/206499#2039704&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC]]&lt;br /&gt;
* [[AVR-Studio]]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/gcc GCC-Forum]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/winavr/files/WinAVR/ sourceforge.net: deep link zum Downloads der verfügbaren WinAVR-Versionen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=WinAVR&amp;diff=92015</id>
		<title>WinAVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=WinAVR&amp;diff=92015"/>
		<updated>2016-02-23T07:45:12Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* WinAVR Version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WinAVR ist die Windows-Distribution der [[C]] und C++ aus der GNU compiler-collection [[AVR-GCC]] für [[AVR]]-[[Mikrocontroller]]. Der [[AVR-Ada|Ada]]-Compiler war mal enthalten und kann inzwischen nachinstalliert werden. WinAVR enthält neben dem Compiler und den erforderlichen Zusatzprogrammen (sogen. Binutils) noch einige andere Pakete, z.&amp;amp;nbsp;B. die C-Standardbibliothek avr-libc (inkl. Dokumentation), die Programmiersoftware [[AVRDUDE]] und den Editor Programmer&#039;s Notepad.&lt;br /&gt;
&lt;br /&gt;
[http://winavr.sourceforge.net/ Download über die WinAVR-Startseite]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Auf 64bit-Windows darf WinAVR &#039;&#039;&#039;nicht&#039;&#039;&#039; im Standard-Programmverzeichnis &amp;quot;C:\Program Files (x86)&amp;quot; installiert werden, sonst [http://www.mikrocontroller.net/topic/83517#700417 funktioniert der Compiler nicht]. Es ist entweder das vom Installer vorgeschlagene Defaultverzeichnis zu verwenden, oder z.B. &amp;quot;C:\WinAVR&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nach dem Installieren sollten Win9X-Rechner neu gestartet werden, um die Erweiterung des Suchpfades um die WinAVR-Verzeichnisse zu aktivieren (autoexec.bat). Bei Windows NT/2000/XP ist üblicherweise kein Neustart erforderlich, sollte aber dennoch ausgeführt werden, wenn Probleme auftreten (Fehler in der Art: &#039;&#039;Der Befehl ist falsch geschrieben/kann nicht gefunden werden...&#039;&#039;). Danach kann man sofort im Programmer&#039;s Notepad z.&amp;amp;nbsp;B. mit dem Beispielcode anfangen. &lt;br /&gt;
&lt;br /&gt;
Zwei WinAVR Verzeichnisse müssen in der PATH-Umgebungsvariable aufgeführt sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\Dokumente und Einstellungen\willi&amp;gt;path&lt;br /&gt;
PATH=[...]C:\WinAVR\bin;C:\WinAVR\utils\bin;[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Umstieg von AVR-Studio mit avr-gcc zu WinAVR mit AVRISP ===&lt;br /&gt;
* Programmer&#039;s Notepad 2 hat konfigurierbare Menüpunkte, vorkonfiguriert sind: &lt;br /&gt;
**Make all&lt;br /&gt;
**Make clean&lt;br /&gt;
**Make program&lt;br /&gt;
* Man muss sich selbst um ein passendes Makefile kümmern. Dazu kann WinAVR/mfile/mfile.tcl genutzt werden (Achtung, F_CPU ist im Template bereits mit 8 MHz eingestellt und muss ggf. von Hand geändert werden). mfile benötigt TCL/TK ([http://www.activestate.com/Products/Download/Download.plex?id=ActiveTcl Win32 download], ca 20 MB). &lt;br /&gt;
* Zum Flashen wird AVRDUDE benutzt.&lt;br /&gt;
* Wenn es beim Flashen einen &#039;out of sync&#039; Fehler gibt, ist nicht der richtige AVRISP eingestellt (unterschiedliche Softwareversionen).&lt;br /&gt;
&lt;br /&gt;
=== WinAVR Version ===&lt;br /&gt;
&lt;br /&gt;
Die aktuelle WinAVR Version ist derzeit (Stand 02/2016) WinAVR-20100110. &lt;br /&gt;
[http://winavr.sourceforge.net/ SourceForge.net WinAVR Projekt-Seite] und [http://sourceforge.net/projects/winavr/files/ Download]&lt;br /&gt;
&lt;br /&gt;
Versionsnummern:&lt;br /&gt;
* avr-gcc 4.3.3&lt;br /&gt;
* AVR-LibC 1.6.7 &lt;br /&gt;
&lt;br /&gt;
Bekannte Probleme:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/163022#1554907]: AVRDUDE Fehler: avrdude was compiled without usb support. Abhilfe: Ältere Version nehmen oder selbst kompilieren [http://www.mikrocontroller.net/topic/163675#1561957].&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=40402&amp;amp;highlight=requested+runtime+terminate]: Fehlermeldung beim Aufruf von z. B: avr-gcc: Kommt es zur folgender Fehlermeldung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This application has requested the Runtime to terminate it in an unusual way.&lt;br /&gt;
Please contact the application&#039;s support team for more information.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
so ist das Temp-Verzeichnis als &amp;quot;Read-Only&amp;quot; markiert. Abhilfe: In einem Command-Window folgenden Befehl ausführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attrib -R %temp%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MAKE funktioniert nicht ===&lt;br /&gt;
&lt;br /&gt;
Siehe auch: &lt;br /&gt;
* http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles&lt;br /&gt;
* http://www.mikrocontroller.net/articles/Beispiel_Makefile&lt;br /&gt;
* http://www.mikrocontroller.net/articles/C_ohne_Makefile&lt;br /&gt;
&lt;br /&gt;
==== Richtiges Make Programm? ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; make all&lt;br /&gt;
MAKE Version 5.2  Copyright (c) 1987, 2000 Borland&lt;br /&gt;
Error makefile 461: Command syntax error&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn make mit dieser oder ähnlichen Fehlermeldung abbricht, ist der Pfad für ausführbare Programme nicht auf das make Programm aus dem GCC/Binutils Paket gesetzt. Es wird ganz banal das falsche Make-Programm (z.&amp;amp;nbsp;B. von Borland C oder Delphi) für das verwendete makefile aufgerufen. In diesem Fall ist die Umgebungsvariable PATH in Autoexec.Bat (Windows 98SE) bzw. in der Systemsteuerung (Windows XP, 2000) anzupassen.&lt;br /&gt;
&lt;br /&gt;
==== gcc plug-in: Error: Object file not found on expected location ====&lt;br /&gt;
&lt;br /&gt;
Diese Fehlermeldung kann nur auftauchen, wenn der GNU C Compiler aus dem AVR-Studio heraus bedient wird. Dass keine weiteren Fehlerursachen genannt werden, ist eigentlich ein [[AVR-Studio Bugs|AVR-Studio Bug]]. &lt;br /&gt;
&lt;br /&gt;
Eine Analyse des AVR-Studio Bugs hat [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=53658 Johan Ekdahl im avrfreaks.net Forum] beschrieben. AVR-Studio erkennt in gewissen Fällen beim &#039;&#039;&#039;Build&#039;&#039;&#039;-Vorgang auftretende Fehler nicht und erwartet eine nie hergestellte Ausgabedatei. &lt;br /&gt;
&lt;br /&gt;
Auf jeden Fall sollte man in AVR Studio mal zwischen dem Build und Message-Fenster umschalten, ob ein einem von beiden mehr Infos stehen, was wodurch den Fehler produziert.&lt;br /&gt;
&lt;br /&gt;
Wenn nicht mehr Infos aus AVR Studio herauszukitzeln sind, könnte man das Projekt beispielsweise als herkömmliches Make-Projekt aufsetzen, mit WinAVR kompilieren (Kommandozeile oder aus dem Programmers Notepad heraus) und auf Fehlermeldungen achten.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/80188 gcc plug-in: Error: Object file not found...] im Forum&lt;br /&gt;
&lt;br /&gt;
==== avr-gcc: _spawnvp: No such file or directory ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; &amp;quot;make.exe&amp;quot; all&lt;br /&gt;
&lt;br /&gt;
-------- begin --------&lt;br /&gt;
avr-gcc (GCC) 4.1.1 (WinAVR 20070122)&lt;br /&gt;
Copyright (C) 2006 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is&lt;br /&gt;
NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR&lt;br /&gt;
PURPOSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Linking: main.c.elf&lt;br /&gt;
avr-gcc -mmcu=at90s2313 -I. -gdwarf-2 -DF_CPU=7372800UL -Os&lt;br /&gt;
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall&lt;br /&gt;
-Wstrict-prototypes -Wa,-adhlns=  -std=gnu99 -Wundef -MMD -MP -MF&lt;br /&gt;
.dep/main.c.elf.d  --output main.c.elf -Wl,-Map=main.c.map,--cref&lt;br /&gt;
-lm&lt;br /&gt;
avr-gcc: _spawnvp: No such file or directory&lt;br /&gt;
make.exe: *** [main.c.elf] Error 1&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Process Exit Code: 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei WinAVR-20070122 und WinAVR-20070525 kann es unter VISTA und Windows98SE eine ähnliche Fehlermeldung wie oben gezeigt geben. &lt;br /&gt;
&lt;br /&gt;
Verschiedene Binärpatches können diese Probleme beheben:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/61716#508449 Forenbeitrag von MadWizard] und [http://www.madwizard.org/extern/winavr-vista/ Originalseite] für VISTA (32-Bit). Bei der 64-Bit Version von VISTA wird berichtet, dass der Linker mit Fehlermeldung abbricht.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/60163#490161 Forenbeitrag von Stefan] für Windows98SE&lt;br /&gt;
&lt;br /&gt;
WinAVR-20071221 funktioniert unter Windows98SE, wie erste Tests zeigen, wie aus der Tüte, d.h. ohne Binärpatch (Jippy!).&lt;br /&gt;
&lt;br /&gt;
==== ...\WinAVR\utils\bin\sh.exe: *** Couldn&#039;t reserve space for cygwin&#039;s heap, Win32 error 487 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; &amp;quot;make.exe&amp;quot; all&lt;br /&gt;
AllocationBase 0x0, BaseAddress 0x71590000, RegionSize 0x470000, State 0x10000&lt;br /&gt;
E:\WinAVR\utils\bin\sh.exe: *** Couldn&#039;t reserve space for cygwin&#039;s heap, Win32 error 487&lt;br /&gt;
&lt;br /&gt;
-------- begin --------&lt;br /&gt;
avr-gcc (GCC) 3.4.3&lt;br /&gt;
Copyright (C) 2004 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
&lt;br /&gt;
AllocationBase 0x0, BaseAddress 0x71590000, RegionSize 0x470000, State 0x10000&lt;br /&gt;
E:\WinAVR\utils\bin\sh.exe: *** Couldn&#039;t reserve space for cygwin&#039;s heap, Win32 error 487&lt;br /&gt;
make.exe: *** [sizebefore] Error 1&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Process Exit Code: 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn make mit dieser oder ähnlichen Fehlermeldung abbricht, ist es einen Versuch wert, die Hilfsdatei &#039;&#039;&#039;msys-1.0.dll&#039;&#039;&#039; im Ordner des Tools sh.exe (beim Beispiel E:\WinAVR\utils\bin\) auszutauschen. Eine Anleitung dazu gibt es von Madwizard (http://www.madwizard.org/extern/winavr-vista). Siehe auch im Forum die [http://www.mikrocontroller.net/topic/70505#573305 Frage von Lukas] und die [http://www.mikrocontroller.net/topic/79973#667605 Frage von werdlangsammüde].&lt;br /&gt;
&lt;br /&gt;
==== make: *** [####.eep] Error 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Build started 18.8.2007 at 20:14:23&lt;br /&gt;
avr-objcopy -j .eeprom --set-section-flags=.eeprom=&amp;quot;alloc,load&amp;quot;&lt;br /&gt;
--change-section-lma .eeprom=0 -O ihex I2C_Motor.elf I2C_Motor.eep&lt;br /&gt;
c:\Programme\WinAVR\bin\avr-objcopy.exe: there are no sections to be&lt;br /&gt;
copied!&lt;br /&gt;
c:\Programme\WinAVR\bin\avr-objcopy.exe: --change-section-lma&lt;br /&gt;
.eeprom=0x00000000 never used&lt;br /&gt;
make: *** [I2C_Motor.eep] Error 1&lt;br /&gt;
Build succeeded with 0 Warnings...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese oder eine ähnliche Fehlermeldung erscheint, wenn im erzeugten Programm der [[EEPROM]]-Abschnitt unbenutzt ist. Um die Fehlermeldung zu unterdrücken, kann man vor den Aufruf von avr-objcopy im Makefile ein Minuszeichen schreiben ([http://www.mikrocontroller.net/topic/76369#633387 Forenbeitrag von Jörg]).&lt;br /&gt;
&lt;br /&gt;
Beispielzeilen in einem Makefile &#039;&#039;&#039;ohne&#039;&#039;&#039; Fehlerunterdrückung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%.eep: %.elf&lt;br /&gt;
	@echo&lt;br /&gt;
	@echo $(MSG_EEPROM) $@&lt;br /&gt;
	$(OBJCOPY) -j .eeprom \&lt;br /&gt;
        --set-section-flags=.eeprom=&amp;quot;alloc,load&amp;quot; \&lt;br /&gt;
	--change-section-lma .eeprom=0 \&lt;br /&gt;
        --no-change-warnings -O $(FORMAT) \&lt;br /&gt;
        $&amp;lt; $@ || exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispielzeilen in einem Makefile &#039;&#039;&#039;mit&#039;&#039;&#039; Fehlerunterdrückung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%.eep: %.elf&lt;br /&gt;
	@echo&lt;br /&gt;
	@echo $(MSG_EEPROM) $@&lt;br /&gt;
	-$(OBJCOPY) -j .eeprom \&lt;br /&gt;
        --set-section-flags=.eeprom=&amp;quot;alloc,load&amp;quot; \&lt;br /&gt;
	--change-section-lma .eeprom=0 \&lt;br /&gt;
        --no-change-warnings -O $(FORMAT) \&lt;br /&gt;
        $&amp;lt; $@ || exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== make.exe: *** No rule to make target `main.elf&#039;, needed by `elf&#039;. ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-------- begin --------&lt;br /&gt;
avr-gcc (GCC) 4.2.2 (WinAVR 20071221rc1)&lt;br /&gt;
Copyright (C) 2007 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is NO warranty;&lt;br /&gt;
not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
&lt;br /&gt;
make.exe: *** No rule to make target `main.elf&#039;, needed by `elf&#039;.  Stop.&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Process Exit Code: 2&lt;br /&gt;
&amp;gt; Time Taken: 00:02&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese oder eine ähnliche Fehlermeldung erscheint, wenn der Quelltext NICHT main.c heisst und ein Makefile OHNE weitere Anpassung an den verwendeten Dateinamen der Quelltextdatei verwendet wird. &lt;br /&gt;
&lt;br /&gt;
Abhilfe ist also die Quelltextdatei in main.c umbenennen oder das Makefile anzupassen (siehe [[AVR-GCC-Tutorial]]).&lt;br /&gt;
&lt;br /&gt;
Eine weitere Fehlerursache könnte auch eine Ordnerstruktur mit Leerzeichen und/oder Sonderzeichen im Pfad sein.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Ursache kann das benutzte Makefile sein. Es ist da anscheinend eins im Umlauf mit falscher Einrückung der Anweisungen ([http://www.mikrocontroller.net/topic/123719#1126830] und [http://www.mikrocontroller.net/topic/116346#1043825])&lt;br /&gt;
&lt;br /&gt;
==== fatal error: opening dependency file .dep/main.o.d: No such file or directory ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avr-gcc (GCC) 4.2.2 (WinAVR 20071221)&lt;br /&gt;
Copyright (C) 2007 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is&lt;br /&gt;
NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR&lt;br /&gt;
PURPOSE.&lt;br /&gt;
&lt;br /&gt;
Compiling: main.c&lt;br /&gt;
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2   -Os -funsigned-char&lt;br /&gt;
-funsigned-bitfiel&lt;br /&gt;
ds -fpack-struct -fshort-enums -Wall -Wstrict-prototypes&lt;br /&gt;
-Wa,-adhlns=main.lst  -&lt;br /&gt;
std=gnu99 -DF_OSC=3686400 -MD -MP -MF .dep/main.o.d main.c -o main.o&lt;br /&gt;
main.c:21: fatal error: opening dependency file .dep/main.o.d: No such&lt;br /&gt;
file or directory&lt;br /&gt;
compilation terminated.&lt;br /&gt;
make: *** [main.o] Error 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind Leerzeichen oder Sonderzeichen im Verzeichnispfad ([http://www.mikrocontroller.net/topic/99642#864556])?&lt;br /&gt;
&lt;br /&gt;
Wird VISTA 64 benutzt? Obige Fehlermeldung kann als zweite Fehlermeldung nach der eigentlichen VISTA-spezifischen Fehlermeldung (sync_with_child Problem) kommen. Die Lösung hat dann [http://www.madwizard.org/electronics/articles/winavrvista MADWIZARD].&lt;br /&gt;
&lt;br /&gt;
==== make: Interrupt/Exception caught (code = 0xc00000fd, addr = 0x4217b3) ====&lt;br /&gt;
&lt;br /&gt;
WinAVR darf nicht im Standard-Programmverzeichnis &amp;quot;C:\Program Files (x86)&amp;quot; installiert werden, sonst kommt dieser Fehler. Es ist entweder das vom Installer vorgeschlagene Defaultverzeichnis zu verwenden, oder z.B. &amp;quot;C:\WinAVR&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Portable Installation ===&lt;br /&gt;
&lt;br /&gt;
Das Hauptproblem beim Ausführen von WinAVR von einem USB-Stick ist der fehlende Eintrag für den Compilerpfad in der Windowsumgebungsvariable PATH. &lt;br /&gt;
&lt;br /&gt;
Die folgende Batchdatei zum Starten des Programmers Notepad extrahiert mit %~dp0 das Laufwerk und den Pfad vom Aufruf der Batchdatei und setzt damit PATH neu. &lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, das die neu gesetzte PATH Variable nicht systemweit etabliert wird, sondern nur für Prozesse gilt, die aus dieser Batch (mit dieser cmd Session) aufgerufen werden (in diesem Fall pn.exe)&lt;br /&gt;
&lt;br /&gt;
....\WinAVR\pn.bat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@echo off&lt;br /&gt;
echo PN.BAT Version 1.0&lt;br /&gt;
&lt;br /&gt;
set BatchPath=%~dp0&lt;br /&gt;
set BinDir=pn\&lt;br /&gt;
set BinDir=%BatchPath%%BinDir%&lt;br /&gt;
set PATH=%BatchPath%\bin;%BatchPath%\utils\bin;%PATH%&lt;br /&gt;
&lt;br /&gt;
start %BinDir%pn.exe&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code-Größe anzeigen ===&lt;br /&gt;
* [[WinAVR: Code-Größe anzeigen]]&lt;br /&gt;
* Das Tool [[AVR-GCC#Tipps_.26_Tricks|avr-nm]]&lt;br /&gt;
&lt;br /&gt;
=== WinAVR-2010 soll die letzte Version sein? [http://www.mikrocontroller.net/topic/178763] ===&lt;br /&gt;
&lt;br /&gt;
[http://www.makehackvoid.com/group-projects/mhvavrtools MHV AVR Tools] - A WinAVR Replacement. With WinAVR marked as inactive, and no official release yet from Atmel, we (Make Hack Void, an association of geeks &amp;amp; artists. We are forming a Hackerspace* in Canberra) have built our own set of tools in a WinAVR-like layout suitable for use as a replacement. Please note that no guarantees as to fitness or suitability are being made. In particular,GCC 4.5.1 has not been tested as extensively as GCC 4.4.x, so use our builds at your own risk.&lt;br /&gt;
&lt;br /&gt;
Update 5/2011: Laut [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=107269 Beitrag bei avrfreaks.net] wird die Entwicklung von WinAVR fortgesetzt.&lt;br /&gt;
&lt;br /&gt;
08/2015: WinAVR mit aktueller Toolchain (Compiler + Bibliothken) von Atmel versehen: http://www.mikrocontroller.net/topic/372924#4215881&lt;br /&gt;
&lt;br /&gt;
;Please browse to the present location for files originally found at: &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/190059#1855064&lt;br /&gt;
* http://www.mikrocontroller.net/topic/177315#1706751&lt;br /&gt;
* http://www.mikrocontroller.net/topic/206499#2039704&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC]]&lt;br /&gt;
* [[AVR-Studio]]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/gcc GCC-Forum]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/winavr/files/WinAVR/ sourceforge.net: deep link zum Downloads der verfügbaren WinAVR-Versionen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=92014</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=92014"/>
		<updated>2016-02-23T07:40:57Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* ‎STM32Cube / HAL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1588.jsp STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1169.jsp STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1575 STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1521.jsp STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/SC1169/SS1858 STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 200MHz (428 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** DMA&#039;s auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1817 STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295 STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/web/en/web/catalog/mmc/FM141/SC1169/SS1580 STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Ultra Low Power (bis zu 30nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 256KB...1MB Flash, 128KB SRAM&lt;br /&gt;
** mit Segment-LCD Treiber&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* [http://http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1582 STM32T]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1581 STM32W]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 256KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind über &#039;&#039;&#039;500&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle prefetch-hardware bis 120/168 MHz eine Geschwindigkeit erzielen soll, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für 8x40 Punkte (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei STM32F429 / STM32F439&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 2x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* RNG - Random Number Generator (STM32F2/4xx)&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF164486 STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00191185.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/CD00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403c/index.html ARMv7M Architecture Reference Manual] beschreibt detailliert den Prozessorkern, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/web/en/resource/technical/document/application_note/CD00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
Der GCC (in seinen verschiedenen Binärdistributionen) ist der einzige ARM Compiler der [http://de.wikipedia.org/wiki/C%2B%2B11 C++11] unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [http://gnuarmeclipse.livius.net/blog/ GNU ARM Plug-in] (Bei Verwendung vom GCC-ARM-Embedded als Toolchain &amp;quot;Sourcery G++ Lite&amp;quot; auswählen, dieser sieht für eclipse gleich aus) (Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Turtelizer2 oder andere JTAG Programmieradapter&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDE&#039;s ====&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse basierten IDE&#039;s gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es im [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD Debugger - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie Register anzeigen) beim Debuggen, Project Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heisst jetzt EmBitz beta 0.42 -&amp;gt; http://www.emblocks.org/web/downloads-main&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDE&#039;s zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic] (Lite Version (bis V2.3.0) ohne Code-Limit, auf GCC basierend. Die neueste Version ab V3 hat fast keine Beschränkungen mehr außer jetzt einen Code-Limit von 32kB. Außerdem werden jetzt die meisten ARM Familien unterstützt. )&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.code-red-tech.com Code Red] (GCC basierend)&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeFx Libraries, nicht mit den alten Standard Peripheral Libraries.&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
Die Software kann [http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF259242 bei ST heruntergeladen] werden. Sie wird im Windows Executable Format angeboten und erweckt daher den Eindruck, ausschließlich für Windows geeignet zu sein, ist aber tatsächlich Java-basiert und daher betriebssystem-unabhängig.&lt;br /&gt;
==== STM32CubeMX unter Linux ====&lt;br /&gt;
Ab der Version 4.13 liegt jetzt ein Linux-Installer mit bei.&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann STM32CubeMX installiert werden, indem man das heruntergeladene .zip-Archiv entpackt, und den enthaltenen Installer per Java über ein Terminal startet:&lt;br /&gt;
&amp;lt;pre&amp;gt;java -jar SetupSTM32CubeMX-4.5.0.exe&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Anlegen der Desktop/Startmenü-Shortcuts funktioniert unter Linux nicht richtig und kann daher deaktiviert werden. Um STM32CubeMX nach der Installation zu starten, wechselt man im Terminal in den Installationsort und gibt ein:&lt;br /&gt;
&amp;lt;pre&amp;gt;java -jar STM32CubeMX.exe&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit das funktioniert, muss die Oracle Java Runtime Environment 1.8 installiert sein (Siehe z.B. [http://wiki.ubuntuusers.de/Java/Installation/Oracle_Java/Java_8#Java-8-JRE hier] für Ubuntu). Nicht benötigt wird wine.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50,- zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), Keil, ... Der J-Link ist mit Abstand der schnellste Debugger den ich bisher testen konnte. Wer es beim Debuggen eilig hat, ist mit dem J-Link von Segger auf den besten Seite.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber denn sie nutzen geschickt das HID-Device des Betriebssystems. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang. Dieser lässt sich aber auch in Verbindung mit anderen IDE&#039;s  (GDB, usw) einsetzten. &lt;br /&gt;
* [http://www.st.com/internet/evalboard/product/219866.jsp ST-LINK],  [http://www.st.com/internet/evalboard/product/251168.jsp ST-LINK/V2]&lt;br /&gt;
* Jedes STM32 Discovery board hat einen ST-Link für Programmierung/Debugging per SWD on-board, welcher auch für eigene STM32 Target Hardware benutzt werden kann (ca. 12,- bis 19,-€, je nach Typ). Diese ist jedoch mit 1.8Mhz Takt ein sehr langsamer Vertreter seiner Art. Mit ihm lässt sich jedoch sowohl Debuggen als auch Flashen von fremden Hex- und Binary-Files. Er unterstützt aber nur MCU&#039;s von ST. NXP, Atmel oder TI lassen sich damit nicht programmieren. Der Discovery-JTAG beherrscht nur SWD, kein JTAG und hat keine Treiber, die den Programmierprozessor vom Zielsystem elektrisch entkoppelt. Der ST-Link in der Adapterversion hat diese Nachteile nicht und kostet auch nur um 20 €.&lt;br /&gt;
* [http://www.raisonance.com/~rlink-debugger-programmer__microcontrollers__tool~tool__T018:4cn9ziz4bnx6.html Raisonance RLink]&lt;br /&gt;
* [http://www.amontec.com Amontec] (Achtung: keine Reaktion auf Bestellung, Telefon, Email...)&lt;br /&gt;
* [http://www.hjtag.com H-JTAG] Personal Edition für ca. 60,- zu haben, läuft mit ADS, SDT, IAR, Vision und RVDS &lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50.- bei Amazon zu bestellen, oder als Eigenbau version (offenes Design) läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-Poligen Stecker, den man direkt auf die Demo-Boards, die auch einen 20-Poligen [[JTAG]]-Anschluss haben, einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber zumindest für das STM32F4 Discovery kann man sich leicht einen Adapter Pinheader-&amp;gt;JTAG Stecker selber bauen.&lt;br /&gt;
&lt;br /&gt;
Andere [[JTAG]] Adapter wie z.B. der ULink2 von Keil funktionieren nur mit dem Keil Compiler. Leider kann dieser auch kein fremdes Binary oder Hex-File in den Controller schreiben.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/colinkEx.htm unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.oocdlink.com/ OOCDLink]  [_Link ist derzeit nicht verfügbar_]&lt;br /&gt;
* [https://github.com/texane/stlink Stlink]&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
* [http://capitanio.org/mlink/ Linux Demo Code für die Discovery&#039;s ST-Link Programmierung]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&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;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen . Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 1000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://code.google.com/p/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20.&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISR&#039;s, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und dem GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versand Europaweit im endasmedia.ch Shop&lt;br /&gt;
* STM32F105 Controller für 2.50€ [http://shop.endasmedia.ch/index.php?id_product=8&amp;amp;controller=product&amp;amp;id_lang=1 shop.endasmedia.ch]&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [http://www.hbe-shop.de HBE (Farnell Programm für Private)] &lt;br /&gt;
* [http://www.sander-electronic.de/be00069.html Sander]&lt;br /&gt;
* [http://www.tme.eu/de/katalog/index.phtml#cleanParameters%3D1%26search%3DSTM32F10%26bf_szukaj%3D+ TME] &lt;br /&gt;
* [http://teske-electronics.de/index.php?cPath=3_9_53 Teske electronics]&lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Mouser, Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* Siehe [[:Kategorie:ARM-Boards]]&lt;br /&gt;
* [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=gruppe&amp;amp;id=14 Im Shop von Embedded Projects]&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/ARM/ARM-Cortex-M3 Cortex M3 bei Watterott]&lt;br /&gt;
* [http://www.raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer und Primer2 von Raisonance]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.propox.com/products/t_174.html Propox, Header-Boards für 103R und 103V sowie Trägerplatine dafür]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://olimex.com/dev/index.html STM32 bei Olimex]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [http://www.de.rs-online.com/web/p/products/7458434/ STM32Discovery bei RS-Components] 12,65 € +MwSt.&lt;br /&gt;
* [http://www.segor.de/#Q=STM32 VL DISCOVERY] STM32 Discovery bei Segor&lt;br /&gt;
* [http://www.watterott.com/de/STM32F4Discovery STM32F4DISCOVERY] STM32F4 Cortex M4 Controller mit JTAG-Debugger auf der Platine bei Watterott für 16,66EUR.&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/443910/ STM32F4 Discovery Kit bei Conrad] 17,11 €&lt;br /&gt;
* [http://www.ST.com/stm32l152c-discovery STM32 L1 Discovery] mit kleiner LCD-Anzeige; [http://www.ST.com/web/en/catalog/tools/PF250990 Weitere Informationen dazu]&lt;br /&gt;
* [http://www.mcu-raisonance.com/~open4-development-platform__microcontrollers__tool~tool__T018:g65gu6ghg2n.html/ Open 4 oder auch genannt Evo-Primer]&lt;br /&gt;
* [http://www.wayengineer.com/index.php?main_page=index&amp;amp;cPath=50_66&amp;amp;page=1&amp;amp;sort=3a WayEngineer]&lt;br /&gt;
* [http://thinkembedded.ch/ST-STMicroelectronics:::24.html Im Thinkembedded Shop] in der Schweiz / DiscoveryF4, div. ETT und Olimex Boarde ab 20,18 CHF / 16,15 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://shop.myavr.de/ARM-Produktlinie/STM32F4-Discovery.htm?sp=article.sp.php&amp;amp;artID=200072 Im myAVR Shop] DiscoveryF4 mit möglichem Zubehör 16,45 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://www.keil.com/boards/cortexm.asp Keil/ARM Demoboards]&lt;br /&gt;
* [http://www.phytec.de Phytec]&lt;br /&gt;
* [http://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=37 verschiedene ARM Produkte und Erweiterungen bei myAVR]&lt;br /&gt;
* [http://re.reworld.eu/de/produkte/s64dil-405/index.htm S64DIL-405 STM32Fxxx ARM Cortex M3 Mikrocontrollermodul mit USB-Schnittstelle, Steckbretttauglich] (Leerplatine eignet sich auch für STM32F1xx Prozessoren.)&lt;br /&gt;
* [http://www.amazon.de/STM32F4-DISCOVERY-STM32F429-Cortex-M4-Development/dp/B00HGG0KHY STM32F429 DISCOVERY Cortex M4 mit 2,4&amp;quot; Touch-TFT, 3-Achs Sensor, 64 MBit SDRAM ab ~25 EUR bei Amazon, Ebay u.a.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/173753 Diskussion zum Artikel]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/AllItems.aspx Forum auf der ST Homepage] &lt;br /&gt;
* [http://www.stm32circle.com/hom/index.php STM32 Community] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://www.ebv.com/fileadmin/products/Press_Print/Brochures/Product_Brochures/EBV_Cortex%20Collection_V2.pdf Übersicht der Cortex Prozessoren und deren Hersteller (nicht nur ST, von EBV)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/258652 Tutorial]&lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net STM32F4 Quellcode-Librarys und CooCox-Projekte in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=92013</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=92013"/>
		<updated>2016-02-23T07:39:39Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Struktur der Dokumentation: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1588.jsp STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1169.jsp STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1575 STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1521.jsp STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/SC1169/SS1858 STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 200MHz (428 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** DMA&#039;s auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1817 STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295 STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www.st.com/web/en/web/catalog/mmc/FM141/SC1169/SS1580 STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Ultra Low Power (bis zu 30nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 256KB...1MB Flash, 128KB SRAM&lt;br /&gt;
** mit Segment-LCD Treiber&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* [http://http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1582 STM32T]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1581 STM32W]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 256KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind über &#039;&#039;&#039;500&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle prefetch-hardware bis 120/168 MHz eine Geschwindigkeit erzielen soll, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für 8x40 Punkte (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei STM32F429 / STM32F439&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 2x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* RNG - Random Number Generator (STM32F2/4xx)&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF164486 STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00191185.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/CD00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403c/index.html ARMv7M Architecture Reference Manual] beschreibt detailliert den Prozessorkern, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/web/en/resource/technical/document/application_note/CD00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Löst SPL ab, wird kritisiert.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
Der GCC (in seinen verschiedenen Binärdistributionen) ist der einzige ARM Compiler der [http://de.wikipedia.org/wiki/C%2B%2B11 C++11] unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [http://gnuarmeclipse.livius.net/blog/ GNU ARM Plug-in] (Bei Verwendung vom GCC-ARM-Embedded als Toolchain &amp;quot;Sourcery G++ Lite&amp;quot; auswählen, dieser sieht für eclipse gleich aus) (Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Turtelizer2 oder andere JTAG Programmieradapter&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDE&#039;s ====&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse basierten IDE&#039;s gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es im [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD Debugger - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie Register anzeigen) beim Debuggen, Project Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heisst jetzt EmBitz beta 0.42 -&amp;gt; http://www.emblocks.org/web/downloads-main&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDE&#039;s zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic] (Lite Version (bis V2.3.0) ohne Code-Limit, auf GCC basierend. Die neueste Version ab V3 hat fast keine Beschränkungen mehr außer jetzt einen Code-Limit von 32kB. Außerdem werden jetzt die meisten ARM Familien unterstützt. )&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.code-red-tech.com Code Red] (GCC basierend)&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeFx Libraries, nicht mit den alten Standard Peripheral Libraries.&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
Die Software kann [http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF259242 bei ST heruntergeladen] werden. Sie wird im Windows Executable Format angeboten und erweckt daher den Eindruck, ausschließlich für Windows geeignet zu sein, ist aber tatsächlich Java-basiert und daher betriebssystem-unabhängig.&lt;br /&gt;
==== STM32CubeMX unter Linux ====&lt;br /&gt;
Ab der Version 4.13 liegt jetzt ein Linux-Installer mit bei.&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann STM32CubeMX installiert werden, indem man das heruntergeladene .zip-Archiv entpackt, und den enthaltenen Installer per Java über ein Terminal startet:&lt;br /&gt;
&amp;lt;pre&amp;gt;java -jar SetupSTM32CubeMX-4.5.0.exe&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Anlegen der Desktop/Startmenü-Shortcuts funktioniert unter Linux nicht richtig und kann daher deaktiviert werden. Um STM32CubeMX nach der Installation zu starten, wechselt man im Terminal in den Installationsort und gibt ein:&lt;br /&gt;
&amp;lt;pre&amp;gt;java -jar STM32CubeMX.exe&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit das funktioniert, muss die Oracle Java Runtime Environment 1.8 installiert sein (Siehe z.B. [http://wiki.ubuntuusers.de/Java/Installation/Oracle_Java/Java_8#Java-8-JRE hier] für Ubuntu). Nicht benötigt wird wine.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50,- zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), Keil, ... Der J-Link ist mit Abstand der schnellste Debugger den ich bisher testen konnte. Wer es beim Debuggen eilig hat, ist mit dem J-Link von Segger auf den besten Seite.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber denn sie nutzen geschickt das HID-Device des Betriebssystems. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang. Dieser lässt sich aber auch in Verbindung mit anderen IDE&#039;s  (GDB, usw) einsetzten. &lt;br /&gt;
* [http://www.st.com/internet/evalboard/product/219866.jsp ST-LINK],  [http://www.st.com/internet/evalboard/product/251168.jsp ST-LINK/V2]&lt;br /&gt;
* Jedes STM32 Discovery board hat einen ST-Link für Programmierung/Debugging per SWD on-board, welcher auch für eigene STM32 Target Hardware benutzt werden kann (ca. 12,- bis 19,-€, je nach Typ). Diese ist jedoch mit 1.8Mhz Takt ein sehr langsamer Vertreter seiner Art. Mit ihm lässt sich jedoch sowohl Debuggen als auch Flashen von fremden Hex- und Binary-Files. Er unterstützt aber nur MCU&#039;s von ST. NXP, Atmel oder TI lassen sich damit nicht programmieren. Der Discovery-JTAG beherrscht nur SWD, kein JTAG und hat keine Treiber, die den Programmierprozessor vom Zielsystem elektrisch entkoppelt. Der ST-Link in der Adapterversion hat diese Nachteile nicht und kostet auch nur um 20 €.&lt;br /&gt;
* [http://www.raisonance.com/~rlink-debugger-programmer__microcontrollers__tool~tool__T018:4cn9ziz4bnx6.html Raisonance RLink]&lt;br /&gt;
* [http://www.amontec.com Amontec] (Achtung: keine Reaktion auf Bestellung, Telefon, Email...)&lt;br /&gt;
* [http://www.hjtag.com H-JTAG] Personal Edition für ca. 60,- zu haben, läuft mit ADS, SDT, IAR, Vision und RVDS &lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50.- bei Amazon zu bestellen, oder als Eigenbau version (offenes Design) läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-Poligen Stecker, den man direkt auf die Demo-Boards, die auch einen 20-Poligen [[JTAG]]-Anschluss haben, einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber zumindest für das STM32F4 Discovery kann man sich leicht einen Adapter Pinheader-&amp;gt;JTAG Stecker selber bauen.&lt;br /&gt;
&lt;br /&gt;
Andere [[JTAG]] Adapter wie z.B. der ULink2 von Keil funktionieren nur mit dem Keil Compiler. Leider kann dieser auch kein fremdes Binary oder Hex-File in den Controller schreiben.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/colinkEx.htm unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.oocdlink.com/ OOCDLink]  [_Link ist derzeit nicht verfügbar_]&lt;br /&gt;
* [https://github.com/texane/stlink Stlink]&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
* [http://capitanio.org/mlink/ Linux Demo Code für die Discovery&#039;s ST-Link Programmierung]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&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;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen . Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 1000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://code.google.com/p/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20.&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISR&#039;s, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und dem GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versand Europaweit im endasmedia.ch Shop&lt;br /&gt;
* STM32F105 Controller für 2.50€ [http://shop.endasmedia.ch/index.php?id_product=8&amp;amp;controller=product&amp;amp;id_lang=1 shop.endasmedia.ch]&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [http://www.hbe-shop.de HBE (Farnell Programm für Private)] &lt;br /&gt;
* [http://www.sander-electronic.de/be00069.html Sander]&lt;br /&gt;
* [http://www.tme.eu/de/katalog/index.phtml#cleanParameters%3D1%26search%3DSTM32F10%26bf_szukaj%3D+ TME] &lt;br /&gt;
* [http://teske-electronics.de/index.php?cPath=3_9_53 Teske electronics]&lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Mouser, Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* Siehe [[:Kategorie:ARM-Boards]]&lt;br /&gt;
* [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=gruppe&amp;amp;id=14 Im Shop von Embedded Projects]&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/ARM/ARM-Cortex-M3 Cortex M3 bei Watterott]&lt;br /&gt;
* [http://www.raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer und Primer2 von Raisonance]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.propox.com/products/t_174.html Propox, Header-Boards für 103R und 103V sowie Trägerplatine dafür]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://olimex.com/dev/index.html STM32 bei Olimex]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [http://www.de.rs-online.com/web/p/products/7458434/ STM32Discovery bei RS-Components] 12,65 € +MwSt.&lt;br /&gt;
* [http://www.segor.de/#Q=STM32 VL DISCOVERY] STM32 Discovery bei Segor&lt;br /&gt;
* [http://www.watterott.com/de/STM32F4Discovery STM32F4DISCOVERY] STM32F4 Cortex M4 Controller mit JTAG-Debugger auf der Platine bei Watterott für 16,66EUR.&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/443910/ STM32F4 Discovery Kit bei Conrad] 17,11 €&lt;br /&gt;
* [http://www.ST.com/stm32l152c-discovery STM32 L1 Discovery] mit kleiner LCD-Anzeige; [http://www.ST.com/web/en/catalog/tools/PF250990 Weitere Informationen dazu]&lt;br /&gt;
* [http://www.mcu-raisonance.com/~open4-development-platform__microcontrollers__tool~tool__T018:g65gu6ghg2n.html/ Open 4 oder auch genannt Evo-Primer]&lt;br /&gt;
* [http://www.wayengineer.com/index.php?main_page=index&amp;amp;cPath=50_66&amp;amp;page=1&amp;amp;sort=3a WayEngineer]&lt;br /&gt;
* [http://thinkembedded.ch/ST-STMicroelectronics:::24.html Im Thinkembedded Shop] in der Schweiz / DiscoveryF4, div. ETT und Olimex Boarde ab 20,18 CHF / 16,15 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://shop.myavr.de/ARM-Produktlinie/STM32F4-Discovery.htm?sp=article.sp.php&amp;amp;artID=200072 Im myAVR Shop] DiscoveryF4 mit möglichem Zubehör 16,45 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://www.keil.com/boards/cortexm.asp Keil/ARM Demoboards]&lt;br /&gt;
* [http://www.phytec.de Phytec]&lt;br /&gt;
* [http://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=37 verschiedene ARM Produkte und Erweiterungen bei myAVR]&lt;br /&gt;
* [http://re.reworld.eu/de/produkte/s64dil-405/index.htm S64DIL-405 STM32Fxxx ARM Cortex M3 Mikrocontrollermodul mit USB-Schnittstelle, Steckbretttauglich] (Leerplatine eignet sich auch für STM32F1xx Prozessoren.)&lt;br /&gt;
* [http://www.amazon.de/STM32F4-DISCOVERY-STM32F429-Cortex-M4-Development/dp/B00HGG0KHY STM32F429 DISCOVERY Cortex M4 mit 2,4&amp;quot; Touch-TFT, 3-Achs Sensor, 64 MBit SDRAM ab ~25 EUR bei Amazon, Ebay u.a.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/173753 Diskussion zum Artikel]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* [https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/AllItems.aspx Forum auf der ST Homepage] &lt;br /&gt;
* [http://www.stm32circle.com/hom/index.php STM32 Community] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://www.ebv.com/fileadmin/products/Press_Print/Brochures/Product_Brochures/EBV_Cortex%20Collection_V2.pdf Übersicht der Cortex Prozessoren und deren Hersteller (nicht nur ST, von EBV)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/258652 Tutorial]&lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net STM32F4 Quellcode-Librarys und CooCox-Projekte in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso&amp;diff=92012</id>
		<title>LPC1xxx Entwicklungskit LPCXpresso</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso&amp;diff=92012"/>
		<updated>2016-02-23T07:38:34Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Unterstriche entfernt...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:LPCXpresso_board_NXP.jpg|thumb|right|550px|LPCXpresso ©NXP.com]]&lt;br /&gt;
==LPCXpresso ==&lt;br /&gt;
&lt;br /&gt;
NXP hat das hier beschriebene Entwicklungskit zusammen mit Embedded Artists entwickelt. Dazu wurde von Code-Red - im Auftrag von NXP - eine passende Entwicklungsumgebung erstellt, die kostenlos erhältlich ist. Hier eine &#039;&#039;&#039;[http://ics.nxp.com/support/documents/microcontrollers/pdf/lpcxpresso.getting.started.pdf erste Einführung]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das preiswerte Board (ca. 25€) ist z.B. hier erhältlich &#039;&#039;&#039;[http://www.watterott.com/index.php?page=search&amp;amp;keywords=LPCXpresso&amp;amp;cat=&amp;amp;mnf=&amp;amp;x=0&amp;amp;y=0 Watterott]&#039;&#039;&#039;. Hier die &#039;&#039;&#039;[http://www.nxp.com/documents/leaflet/75016842.pdf Dokumentation]&#039;&#039;&#039; (PDF) von NXP.&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
===Aufbau des Boards===&lt;br /&gt;
&lt;br /&gt;
Das Board ist als teilbare Platine ausgeführt. Der obere Teil - der LPC-Link - hat sowohl die Funktion eines USB-Programmers, als auch die eines USB-Debuggers. &lt;br /&gt;
&lt;br /&gt;
Der untere Teil ist ein reines Eval-Board, das - je nach Wunsch - mit einem LPC1114, LPC1343, oder LPC1769 ausgestattet ist.&lt;br /&gt;
&lt;br /&gt;
LPC-Link und Eval-Board können an der markierten Stelle zwischen dem 2x8-Poligen Stecker getrennt, und separat eingesetzt werden. Über einen 8x Jumper ist jederzeit wieder eine Verbindung möglich.&lt;br /&gt;
&lt;br /&gt;
===Der LPC-Link===&lt;br /&gt;
[[Bild:LPC_Xpresso_lpc-link_NXP.jpg|thumb|right|550px|LPC-Link ©NXP.com]]&lt;br /&gt;
Der LPC-Link (inzwischen durch LPC-Link 2 abgelöst, siehe unten) enthält den Programmer und Debugger. Die PCB enthält einen LPC3154, eine USB-Schnittstelle, ein JTAG/SWD-Interface und ein paar LEDs.  &lt;br /&gt;
Das Programmier-Interface ist sowohl im 2,54mm Raster (8-polige Lochreihe an der schmalen Seite zum Target, &amp;quot;J4&amp;quot;), als auch im 1,27mm Raster (2x5-polig, als SMD-Stiftleiste &amp;quot;J5&amp;quot;) vorhanden. Pin 1 ist jeweils deutlich gekennzeichnet.&lt;br /&gt;
Hier die Pinbelegung:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Steckerbelegung&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Pin Nummer ||J5 (2x5-polig) || J4 (1x8-polig)&lt;br /&gt;
|-&lt;br /&gt;
| Pin  1|| V_Target || V_Target&lt;br /&gt;
|-&lt;br /&gt;
| Pin  2|| SWDIO/TMS|| SWDIO/TMS&lt;br /&gt;
|-&lt;br /&gt;
| Pin  3|| GND|| SWDCLK/TCLK&lt;br /&gt;
|-&lt;br /&gt;
| Pin  4|| SWDCLK/TCLK|| SWO/TDO&lt;br /&gt;
|-&lt;br /&gt;
| Pin  5|| GND|| nc/TDI&lt;br /&gt;
|-&lt;br /&gt;
| Pin  6|| SWO/TDO|| nRESET&lt;br /&gt;
|-&lt;br /&gt;
| Pin  7|| nc|| EXT Power&lt;br /&gt;
|-&lt;br /&gt;
| Pin  8|| nc/TDI|| GND&lt;br /&gt;
|-&lt;br /&gt;
| Pin  9|| GND|| -&lt;br /&gt;
|-&lt;br /&gt;
| Pin 10|| nRESET|| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Achtung: die Pinnummer für J4 entspricht dem GETRENNTEN Zustand der PCB. Die Nummerierung auf der Platine beginnt aber bei 1, und endet bei 15 (siehe auch Foto rechts).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Der LPC-Link 2===&lt;br /&gt;
&lt;br /&gt;
Der im Oktober 2015 eingeführte LPC-Link 2 ist die neue Version des Programmers/Debuggers für die LPC-Familie.&lt;br /&gt;
Der LPC-Link 2 ist auch kompatibel zu Seggers J-Link, den Tools und der IDE.&lt;br /&gt;
Details dazu findet Ihr &#039;&#039;&#039;[http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-arm-cortex-m-mcus/lpc-dual-core-cortex-m0-m4f/lpc4300/lpc-link2:OM13054?fsrch=1&amp;amp;sr=2&amp;amp;pageNum=1 hier]&#039;&#039;&#039;.&lt;br /&gt;
Dort sind auch weiterführende Links wie z.B die Schaltpläne/Pinbelegung zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Board kann auch als Evaluation-Board mit einem LPC4370 oder als Lab-Tool mit diversen digitalen und analogen IOs eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Eine passende Entwicklungsumgebung===&lt;br /&gt;
Code-Red hat einen speziell angepaßten C-Compiler entwickelt. &lt;br /&gt;
NXP hat die Firma und das Projekt aufgekauft und in eine eigene/gemeinsame Entwicklungsumgebung integriert, und damit langfristig Unterstützung für die Community gesichert. Die SW wird stetig weiterentwickelt.&lt;br /&gt;
Die IDE basiert auf Eclipse und ist ohne Registrierung bis 8kB freigeschaltet. Nach einer kostenlosen Registrierung erhält man eine eingeschränkte Lizenz die auch für den kommerziellen Einsatz zugelassen ist. Aktuell ist die Version 8.x, die Freie Version hat den vollen Funktionsumfang, ist aber auf Codegröße von 256 kB limitiert. In älteren Versionen gab es keinen C++ Support, keine Library Projekte und eine eingeschränkte CPU Auswahl, das wurde in der 8.x aufgehoben. Das Codelimit kann durch ein kostenpflichtiges Upgrade auf die &#039;Pro&#039; Version aufgehoben werden.&lt;br /&gt;
Hier die &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung]&#039;&#039;&#039;.&lt;br /&gt;
Weitere Compiler sind verfügbar, hier eine &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/LPC1xxx#Entwicklungsumgebungen Übersicht]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[LPC1xxx]]&lt;br /&gt;
* [[Installationsanleitung C-Entwicklungsumgebung f%C3%BCr LPC1xxx von Code Red]]&lt;br /&gt;
* [[Codebase f%C3%BCr LPC1xxx]]&lt;br /&gt;
&lt;br /&gt;
Suche im Forum nach&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=LPC11* LPC11xx]&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=LPC12* LPC12xx]&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=LPC13* LPC13xx]&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=LPC17* LPC17xx]&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=LPC18* LPC18xx]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.elpro.org/shop/shop.php?p=32BitMicrocontroller elpro]&lt;br /&gt;
* [http://darisusgmbh.de/shop/advanced_search_result.php?keywords=LPC1&amp;amp;x=0&amp;amp;y=0 Darisus]&lt;br /&gt;
* [http://www.hbe-shop.de HBE] &lt;br /&gt;
* [http://www.tme.eu/de/katalog#cleanParameters%3D1%26searchClick%3D1%26search%3DLPC1%26bf_szukaj%3D+ TME]&lt;br /&gt;
* [http://de.mouser.com/_/?Keyword=LPC1&amp;amp;Ns=Pricing|0&amp;amp;FS=True Mouser]&lt;br /&gt;
* [http://www.soselectronic.eu/?searchstring=LPC1&amp;amp;str=378 SOS]&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;page_action=query&amp;amp;desc=off&amp;amp;sdesc=on&amp;amp;keywords=LPCXpresso Watterott (24€ inclusive JTAG-Programmiergerät UND JTAG Debugger für kostenlose &amp;quot;LPCWare&amp;quot; Entwicklungsplattform)], dazu hier die &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso Beschreibung]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.lpctools.com/evaluationboardskitsforlpc17xx.aspx LPC-Tools]&lt;br /&gt;
* [http://thinkembedded.ch/NXP:::25.html thinkembedded.ch] div. Olimex NXP Boards&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsplattformen ===&lt;br /&gt;
* [http://www.lpcware.com/lpcxpresso/home LPDXpresso Download (Kostenlos mit Debugger)]&lt;br /&gt;
* [http://www.lpcware.com LPCXpresso Homepage]&lt;br /&gt;
* [http://support.code-red-tech.com/CodeRedWiki/WikiHome CR-WIKI]&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp ARM/Keil MDK-ARM]&lt;br /&gt;
* IAR EWARM&lt;br /&gt;
* [http://www.rowley.co.uk/arm/index.htm Rowley Crossworks]&lt;br /&gt;
* Green Hills Software &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:LPC1x]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&amp;diff=91019</id>
		<title>AVR-GCC-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&amp;diff=91019"/>
		<updated>2016-01-07T09:19:17Z</updated>

		<summary type="html">&lt;p&gt;Eltio: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Tutorial soll den Einstieg in die Programmierung von Atmel [[AVR]]-Mikrocontrollern in der Programmiersprache [[C]] mit dem freien C-Compiler [[avr-gcc]] aus der [http://gcc.gnu.org/ GNU Compiler Collection] (GCC) erleichtern.&lt;br /&gt;
&lt;br /&gt;
Vorausgesetzt werden Grundkenntnisse der Programmiersprache C. Diese Kenntnisse kann man sich online erarbeiten, z. B. mit dem [http://www.schellong.de/c.htm C Tutorial von Helmut Schellong] ([[C|Liste von C-Tutorials]]). Nicht erforderlich sind Vorkenntnisse in der Programmierung von Mikrocontrollern.&lt;br /&gt;
&lt;br /&gt;
= Vorwort =&lt;br /&gt;
&lt;br /&gt;
In diesem Text wird häufig auf die Standardbibliothek avr-libc verwiesen, für die es eine [http://www.nongnu.org/avr-libc/user-manual/index.html Online-Dokumentation] gibt, in der sich auch viele nützliche Informationen zum Compiler und zur Programmierung von AVR-Controllern finden. Beim Paket [[WinAVR]] gehört die avr-libc Dokumentation zum Lieferumfang und wird mitinstalliert.&lt;br /&gt;
&lt;br /&gt;
Der Compiler und die Standardbibliothek avr-libc werden ständig weiterentwickelt. Einige Unterschiede, die sich im Verlauf der Entwicklung ergeben haben, werden hier und im Artikel [[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen]] zwar angesprochen, Anfängern und Umsteigern sei jedoch empfohlen, eine aktuelle Versionen zu nutzen.&lt;br /&gt;
&lt;br /&gt;
Das ursprüngliche Tutorial stammt von Christian Schifferle, viele neue Abschnitte und aktuelle Anpassungen von Martin Thomas.&lt;br /&gt;
&lt;br /&gt;
Dieses Tutorial ist in [[Media:AVR-GCC-Tutorial.pdf|PDF-Form]] erhältlich (zur Zeit nur eine sehr veraltete Version).&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Kapitel ==&lt;br /&gt;
&lt;br /&gt;
Um dieses riesige Tutorial etwas überschaubarer zu gestalten, wurden einige Kapitel ausgelagert, die nicht unmittelbar mit den Grundlagen von avr-gcc in Verbindung stehen. All diese Seiten gehören zur [[:Kategorie:avr-gcc Tutorial]].&lt;br /&gt;
&lt;br /&gt;
;UART: → Hauptartikel: &#039;&#039;[[AVR-GCC-Tutorial/Der UART|Der UART]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;ADC: → Hauptartikel: &#039;&#039;[[AVR-GCC-Tutorial/Analoge Ein- und Ausgabe|Analoge Ein- und Ausgabe (ADC)]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Timer: → Hauptartikel: &#039;&#039;[[AVR-GCC-Tutorial/Die Timer und Zähler des AVR|Die Timer und Zähler des AVR]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;LCD: → Hauptartikel: &#039;&#039;[[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Ansteuerung]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Watchdog: → Hauptartikel: &#039;&#039;[[AVR-GCC-Tutorial/Der Watchdog|Der Watchdog]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Assembler: → Hauptartikel: &#039;&#039;[[AVR-GCC-Tutorial/Assembler und Inline-Assembler|Assembler und Inline-Assembler]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;alte Quellen anpassen: → Hauptartikel: &#039;&#039;[[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen anpassen]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Makefiles: → Hauptartikel: &#039;&#039;[[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]]&#039;&#039; sowie als Alternative für sehr kleine Projekte → Hauptartikel: &#039;&#039;[[C ohne Makefile]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Benötigte Werkzeuge =&lt;br /&gt;
&lt;br /&gt;
Um eigene Programme für AVRs mittels einer AVR-Toolchain zu erstellen wird folgende Hard- und Software benötigt:&lt;br /&gt;
&lt;br /&gt;
* Eine AVR-Toolchain bestehend aus avr-gcc, den avr-Binutils (Assembler, Linker, etc) und einer Standard-C Bibliothek.  Üblich ist die AVR-LibC, die auch quasi in allen avr-gcc Distributionen enthalten ist.&lt;br /&gt;
&lt;br /&gt;
Hardware wird keine benötigt – bis auf einen PC natürlich, auf dem der Compiler ablaufen kann.  Selbst ohne AVR-Hardware kann man also bereits C-Programme für AVRs schreiben, compiliern und sich das Look-and-Feel von avr-gcc sowie von IDEs wie [[Atmel Studio]], Eclipse oder leichtgewichtigeren Entwicklungsumbgebungen anschauen. Selbst das Debuggen und Simulieren ist mithilfe entsprechender Tools wie Debugger und Simulator in gewissen Grenzen möglich.&lt;br /&gt;
&lt;br /&gt;
Um Programme für AVRs mittels einer AVR-Toolchain zu testen, wird folgende Hard- und Software benötigt:&lt;br /&gt;
&lt;br /&gt;
* Platine oder Versuchsaufbau für die Aufnahme eines AVR-Controllers, der vom avr-gcc Compiler unterstützt wird.&amp;lt;ref&amp;gt;Für eine Liste der unterstützten COntroller siehe die Dokumentation des Compilers oder [http://www.nongnu.org/avr-libc/user-manual/index.html#supported_devices AVR-Libc: Supported Devices].&amp;lt;/ref&amp;gt; Dieses Testboard kann durchaus auch selbst gelötet oder auf einem Steckbrett aufgebaut werden. Einige Registerbeschreibungen dieses Tutorials beziehen sich auf den inzwischen veralteten AT90S2313. Der weitaus größte Teil des Textes ist aber für alle Controller der AVR-Familie gültig. &lt;br /&gt;
&lt;br /&gt;
:Brauchbare Testplattformen sind auch das [[STK500]] und der [[AVR Butterfly]] von Atmel. Weitere Infos findet man in den Artikeln [[AVR#Starterkits|AVR Starterkits]] und [[AVR-Tutorial: Equipment]].&lt;br /&gt;
&lt;br /&gt;
* Programmiersoftware und -[[AVR In System Programmer |hardware]] z. B. PonyProg (siehe auch: [[Pony-Prog Tutorial]]) oder [[AVRDUDE]] mit [[STK200]]-Dongle oder die von Atmel verfügbare Hard- und Software ([[STK500]], Atmel AVRISP, [[AVR-Studio]]).&lt;br /&gt;
&lt;br /&gt;
* Nicht unbedingt erforderlich, aber zur Simulation und zum Debuggen unter MS-Windows recht nützlich: [[AVR-Studio]].&lt;br /&gt;
&lt;br /&gt;
* Wer unter Windows und Linux gleichermassen 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, siehe auch [[AVR Eclipse]]. Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks]&amp;lt;ref&amp;gt;Aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar.&amp;lt;/ref&amp;gt;. Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden. Für Linux gibt es auch noch das [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25220 KontrollerLab].&lt;br /&gt;
&lt;br /&gt;
= Was tun, wenn&#039;s nicht klappt? =&lt;br /&gt;
&lt;br /&gt;
* Herausfinden, ob es tatsächlich ein avr(-gcc) spezifisches Problem ist oder nur die eigenen C-Kenntnisse einer Auffrischung bedürfen. Allgemeine C-Fragen kann man eventuell &amp;quot;beim freundlichen Programmierer zwei Büro-, Zimmer- oder Haustüren weiter&amp;quot; loswerden. Ansonsten: [[C]]-Buch (gibt&#039;s auch &amp;quot;gratis&amp;quot; online) lesen.&lt;br /&gt;
&lt;br /&gt;
* Die [[AVR Checkliste]] durcharbeiten.&lt;br /&gt;
&lt;br /&gt;
* Die &#039;&#039;&#039;[http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc]&#039;&#039;&#039; lesen, vor allem (aber nicht nur) den Abschnitt Related Pages/&#039;&#039;&#039;Frequently Asked Questions&#039;&#039;&#039; = Oft gestellte Fragen (und Antworten dazu). Z.Zt leider nur in englischer Sprache verfügbar.&lt;br /&gt;
&lt;br /&gt;
* Den Artikel [[AVR-GCC]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Das [http://www.mikrocontroller.net/forum/gcc GCC-Forum auf  www.mikrocontroller.net] nach vergleichbaren Problemen absuchen.&lt;br /&gt;
&lt;br /&gt;
* Das avr-gcc-Forum bei [http://www.avrfreaks.net AVRfreaks] nach vergleichbaren Problemen absuchen.&lt;br /&gt;
&lt;br /&gt;
* Das [http://lists.gnu.org/archive/html/avr-gcc-list/ Archiv der avr-gcc Mailing-Liste] nach vergleichbaren Problemen absuchen.&lt;br /&gt;
&lt;br /&gt;
* Nach Beispielcode suchen. Vor allem im &#039;&#039;Projects&#039;&#039;-Bereich von [http://www.avrfreaks.net AVRfreaks] (anmelden).&lt;br /&gt;
&lt;br /&gt;
* Google oder yahoo befragen schadet nie.&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen mit der Ansteuerung interner AVR-Funktionen mit C-Code: das Datenblatt des Controllers lesen (ganz und am Besten zweimal). Datenblätter sind  auf den [http://www.atmel.com Atmel Webseiten] als pdf-Dateien verfügbar. Das komplette Datenblatt (complete) und nicht die Kurzfassung (summary) verwenden.&lt;br /&gt;
&lt;br /&gt;
* Die Beispielprogramme im [[AVR-Tutorial]] sind zwar in AVR-Assembler verfasst, Erläuterungen und Vorgehensweisen sind aber auch auf C-Programme übertragbar.&lt;br /&gt;
&lt;br /&gt;
* Einen Beitrag in eines der Foren oder eine Mail an die Mailing-Liste schreiben. Dabei möglichst viel Information geben: Controller, Compilerversion, genutzte Bibliotheken, Ausschnitte aus dem Quellcode oder besser ein [http://www.mikrocontroller.net/topic/72767#598986 Testprojekt] mit allen notwendigen Dateien, um das Problem nachzuvollziehen, sowie genaue Fehlermeldungen bzw. Beschreibung des Fehlverhaltens. Bei Ansteuerung externer Geräte die Beschaltung beschreiben oder skizzieren (z. B. mit [http://www.tech-chat.de/ Andys ASCII Circuit]). Siehe dazu auch: &#039;&#039;&#039;[http://www.tty1.net/smart-questions_de.html &amp;quot;Wie man Fragen richtig stellt&amp;quot;]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Erzeugen von Maschinencode =&lt;br /&gt;
&lt;br /&gt;
Aus dem C-Quellcode erzeugt der avr-gcc Compiler (zusammen mit Hilfsprogrammen wie z.&amp;amp;nbsp;B. Präprozessor, Assembler und Linker) Maschinencode für den AVR-Controller. Üblicherweise liegt dieser Code dann im Intel Hex-Format vor (&amp;quot;Hex-Datei&amp;quot;). Die Programmiersoftware (z.&amp;amp;nbsp;B. [[AVRDUDE]], PonyProg oder AVRStudio/STK500-plugin) liest diese Datei ein und überträgt die enthaltene Information (den Maschinencode) in den Speicher des Controllers. Im Prinzip sind also &amp;quot;nur&amp;quot; der avr-gcc-Compiler (und wenige Hilfsprogramme) mit den &amp;quot;richtigen&amp;quot; Optionen aufzurufen, um aus C-Code eine &amp;quot;Hex-Datei&amp;quot; zu erzeugen. Grundsätzlich stehen dazu drei verschiedene Ansätze zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* Die Verwendung einer integrierten Entwicklungsumgebung (IDE = &#039;&#039;&#039;I&#039;&#039;&#039;ntegrated &#039;&#039;&#039;D&#039;&#039;&#039;evelopment &#039;&#039;&#039;E&#039;&#039;&#039;nvironment), bei der alle Einstellungen z.&amp;amp;nbsp;B. in Dialogboxen durchgeführt werden können. Unter Anderem kann AVRStudio ab Version 4.12 (kostenlos auf [http://www.atmel.com/ atmel.com]) zusammen mit WinAVR als integrierte Entwicklungsumgebung für den Compiler avr-gcc genutzt werden (dazu müssen AVRStudio und WinAVR auf dem Rechner installiert sein). Weitere IDEs (ohne Anspruch auf Vollständigkeit): [http://www.eclipse.org/ Eclipse for C/C++ Developers] (d.h. inkl. CDT) und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] (für diverse Plattformen, u.a. Linux und MS Windows, IDE und Plugin kostenlos), [http://sourceforge.net/projects/kontrollerlab KontrollerLab] (Linux/KDE, kostenlos). [http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm AtmanAvr] (MS Windows, relativ günstig), KamAVR (MS-Windows, kostenlos, wird augenscheinlich nicht mehr weiterentwickelt), [http://www.amctools.com/vmlab.htm VMLab] (MS Windows, ab Version 3.12 ebenfalls kostenlos). Integrierte Entwicklungsumgebungen unterscheiden sich stark in Ihrer Bedienung und stehen auch nicht für alle Plattformen zur Verfügung, auf denen der Compiler  ausführbar ist (z.&amp;amp;nbsp;B. AVRStudio nur für MS-Windows). Zur Anwendung des avr-gcc Compilers mit IDEs sei hier auf deren Dokumentation verwiesen. &lt;br /&gt;
&lt;br /&gt;
* Die Nutzung des Programms make mit passenden Makefiles. In den folgenden Abschnitten wird die Generierung von Maschinencode für einen AVR (&amp;quot;hex-Datei&amp;quot;) aus C-Quellcode (&amp;quot;c-Dateien&amp;quot;) anhand von &amp;quot;make&amp;quot; und den &amp;quot;Makefiles&amp;quot; näher erläutert. Viele der darin beschriebenen Optionen findet man auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio (AVRStudio generiert ein makefile in einem Unterverzeichnis des Projektverzeichnisses). &lt;br /&gt;
&lt;br /&gt;
* Das Generieren des Programms ohne IDE und ohne Makefile. In diesem Fall muss die Quellcodedatei durch eine vorgefertigte Kommandofolge an den Compiler übergeben werden. Der Artikel [[C ohne Makefile]] zeigt, wie das funktioniert. Diese Vorgehensweise empfiehlt sich jedoch nur für kleine Programme, die nicht auf verschiedene Quellcodedateien verteilt sind.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom makefile-Ansatz nach WinAVR-Vorlage zu AVRStudio ist darauf zu achten, dass AVRStudio (Stand: AVRStudio Version 4.13) bei einem neuen Projekt die Optimierungsoption (vgl. Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|AVR-GCC-Tutorial/Exkurs: Makefiles]], typisch: -Os) nicht einstellt und die mathematische Bibliothek der avr-libc (libm.a, Linker-Option -lm) nicht einbindet. (Hinweis: Bei Version 4.16 wird beides bereits gesetzt). Beides ist Standard bei Verwendung von makefiles nach WinAVR-Vorlage und sollte daher auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio &amp;quot;manuell&amp;quot; eingestellt werden, um auch mit AVRStudio kompakten Code zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
= Einführungsbeispiel =&lt;br /&gt;
&lt;br /&gt;
Zum Einstieg ein kleines Beispiel, an dem die Nutzung des Compilers und der Hilfsprogramme (der sogenannten &#039;&#039;Toolchain&#039;&#039;) demonstriert wird. Detaillierte Erläuterungen folgen in den weiteren Abschnitten dieses Tutorials.&lt;br /&gt;
&lt;br /&gt;
Das Programm soll auf einem AVR Mikrocontroller einige Ausgänge ein- und andere ausschalten. Das Beispiel ist für einen ATmega16 programmiert ([http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf Datenblatt]), kann aber sinngemäß für andere Controller der AVR-Familie modifiziert werden. &lt;br /&gt;
&lt;br /&gt;
Ein kurzes Wort zur Hardware: Bei diesem Programm werden alle Pins von PORTB auf Ausgang gesetzt, und einige davon werden auf HIGH andere auf LOW gesetzt. Das kann je nach angeschlossener Hardware an diesen Pins kritisch sein. Am ungefährlichsten ist es, wenn nichts an den Pins angeschlossen ist und man die Funktion des Programmes durch eine Spannungsmessung mit einem Multimeter kontrolliert. Die Spannung wird dabei zwischen GND-Pin und den einzelnen Pins von PORTB gemessen.&lt;br /&gt;
&lt;br /&gt;
Zunächst der Quellcode der Anwendung, der in einer Text-Datei mit dem Namen &#039;&#039;main.c&#039;&#039; abgespeichert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* Alle Zeichen zwischen Schrägstrich-Stern &lt;br /&gt;
   und Stern-Schrägstrich sind Kommentare */&lt;br /&gt;
&lt;br /&gt;
// Zeilenkommentare sind ebenfalls möglich&lt;br /&gt;
// alle auf die beiden Schrägstriche folgenden&lt;br /&gt;
// Zeichen einer Zeile sind Kommentar&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;          // (1)&lt;br /&gt;
&lt;br /&gt;
int main (void) {            // (2)&lt;br /&gt;
&lt;br /&gt;
   DDRB  = 0xFF;             // (3)&lt;br /&gt;
   PORTB = 0x03;             // (4)&lt;br /&gt;
&lt;br /&gt;
   while(1) {                // (5)&lt;br /&gt;
     /* &amp;quot;leere&amp;quot; Schleife*/   // (6)&lt;br /&gt;
   }                         // (7)&lt;br /&gt;
&lt;br /&gt;
   /* wird nie erreicht */&lt;br /&gt;
   return 0;                 // (8)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In dieser Zeile wird eine sogenannte Header-Datei eingebunden. In &amp;lt;code&amp;gt;avr/io.h&amp;lt;/code&amp;gt; sind die Registernamen definiert, die im späteren Verlauf genutzt werden. Auch unter Windows wird ein&amp;amp;nbsp;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; zur Kennzeichnung von Unterverzeichnissen in Include-Dateinamen verwendet und kein&amp;amp;nbsp;&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Hier beginnt das eigentliche Programm. Jedes C-Programm beginnt mit den Anweisungen in der Funktion &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Die Anschlüsse eines AVR (Pins) werden zu Blöcken zusammengefasst, einen solchen Block bezeichnet man als Port. Beim ATmega16 hat jeder Port 8 Anschlüsse, bei kleineren AVRs können einem Port auch weniger als 8 Anschlüsse zugeordnet sein. Da per Definition (Datenblatt) alle gesetzten Bits in einem Datenrichtungsregister den entsprechenden Anschluss auf Ausgang schalten, werden mit DDRB=0xff alle Anschlüsse des Ports B als Ausgänge eingestellt.&lt;br /&gt;
# Die den ersten beiden Bits des Ports zugeordneten Anschlüsse (PB0 und PB1) werden 1, alle anderen Anschlüsse des Ports B (PB2-PB7) zu 0. Aktivierte Ausgänge (logisch 1 oder &amp;quot;high&amp;quot;) liegen auf Betriebsspannung (VCC, meist 5 Volt), nicht aktivierte Ausgänge führen 0 Volt (GND, Bezugspotential). Es ist sinnvoll, sich möglichst frühzeitig eine alternative Schreibweise beizubringen, die wegen der leichteren Überprüfbarkeit und Portierbarkeit oft im weiteren Tutorial und in Forenbeiträgen benutzt wird. Die Zuordnung sieht in diesem Fall so aus, Näheres dazu im Artikel [[Bitmanipulation]]:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;PORTB = (1&amp;lt;&amp;lt;PB1) | (1&amp;lt;&amp;lt;PB0);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# ist der Beginn der sogenannte &#039;&#039;Hauptschleife&#039;&#039; (main-loop). Dies ist eine Endlosschleife, welche kontinuierlich wiederkehrende Befehle enthält.&lt;br /&gt;
# In diesem Beispiel ist die Hauptschleife leer. Der Controller durchläuft die Schleife immer wieder, ohne dass etwas passiert. Eine solche Schleife ist notwendig, da es auf dem Controller kein Betriebssystem gibt, das nach Beendigung des Programmes die Kontrolle übernehmen könnte. Ohne diese Schleife kehrt das Programm aus &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; zurück, alle Interrupts werden deaktiviert und eine Endlosschleife betreten.&lt;br /&gt;
# Ende der Hauptschleife und Sprung zur passenden, öffnenden Klammer, also zu 5.&lt;br /&gt;
# ist das Programmende. Die Zeile ist nur aus Gründen der C-Kompatibilität enthalten: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main(void)&amp;lt;/syntaxhighlight&amp;gt; besagt, dass die Funktion einen int-Wert zurückgibt. Die Anweisung wird aber nicht erreicht, da das Programm die Hauptschleife nie verlässt.&lt;br /&gt;
&lt;br /&gt;
Um diesen Quellcode in ein lauffähiges Programm zu übersetzen, wird hier ein Makefile genutzt. Das verwendete Makefile findet sich auf der Seite [[Beispiel Makefile]] und basiert auf der Vorlage, die in WinAVR mitgeliefert wird und wurde bereits angepasst (Controllertyp ATmega16). Man kann das Makefile bearbeiten und an andere Controller anpassen oder sich mit dem Programm MFile menügesteuert ein Makefile &amp;quot;zusammenklicken&amp;quot;. Das Makefile speichert man unter dem Namen &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; (ohne Endung) im selben Verzeichnis, in dem auch die Datei &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; mit dem Programmcode abgelegt ist. Detailliertere Erklärungen zur Funktion von Makefiles finden sich im Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|Exkurs: Makefiles]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D:\beispiel&amp;gt;dir&lt;br /&gt;
&lt;br /&gt;
 Verzeichnis von D:\beispiel&lt;br /&gt;
&lt;br /&gt;
28.11.2006  22:53    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
28.11.2006  22:53    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
28.11.2006  20:06               118 main.c&lt;br /&gt;
28.11.2006  20:03            16.810 Makefile&lt;br /&gt;
               2 Datei(en)         16.928 Bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun gibt man &#039;&#039;make all&#039;&#039; ein. Falls das mit WinAVR installierte Programmers Notepad genutzt wird, gibt es dazu einen Menüpunkt im Tools Menü. Sind alle Einstellungen korrekt, entsteht eine Datei &amp;lt;code&amp;gt;main.hex&amp;lt;/code&amp;gt;, in welcher der Code für den AVR enthalten ist. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D:\beispiel&amp;gt;make all&lt;br /&gt;
&lt;br /&gt;
-------- begin --------&lt;br /&gt;
avr-gcc (GCC) 3.4.6&lt;br /&gt;
Copyright (C) 2006 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
&lt;br /&gt;
Compiling C: main.c&lt;br /&gt;
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -f&lt;br /&gt;
unsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef&lt;br /&gt;
 -Wa,-adhlns=obj/main.lst  -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d main.c -&lt;br /&gt;
o obj/main.o&lt;br /&gt;
&lt;br /&gt;
Linking: main.elf&lt;br /&gt;
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funs&lt;br /&gt;
igned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -W&lt;br /&gt;
a,-adhlns=obj/main.o  -std=gnu99 -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o&lt;br /&gt;
--output main.elf -Wl,-Map=main.map,--cref    -lm&lt;br /&gt;
&lt;br /&gt;
Creating load file for Flash: main.hex&lt;br /&gt;
avr-objcopy -O ihex -R .eeprom main.elf main.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Inhalt der hex-Datei kann nun zum Controller übertragen werden. Dies kann z.&amp;amp;nbsp;B. über In-System-Programming ([[ISP]]) erfolgen, das im [[AVR-Tutorial: Equipment]] beschrieben ist. Makefiles nach der WinAVR/MFile-Vorlage sind für die Nutzung des Programms [[AVRDUDE]] vorbereitet. Wenn man den Typ und Anschluss des Programmiergerätes richtig eingestellt hat, kann mit &#039;&#039;make program&#039;&#039; die Übertragung mittels AVRDUDE gestartet werden. Jede andere Software, die hex-Dateien lesen und zu einem AVR übertragen kann&amp;lt;ref&amp;gt;z.&amp;amp;nbsp;B. [[Pony-Prog_Tutorial|Ponyprog]], yapp, AVRStudio&amp;lt;/ref&amp;gt;, kann natürlich ebenfalls genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Startet man nun den Controller (Reset-Taster oder Stromzufuhr aus/an), werden vom Programm die Anschlüsse PB0 und PB1 auf 1 gesetzt. Man kann mit einem Messgerät nun an diesem Anschluss die Betriebsspannung messen oder eine [[LED]] leuchten lassen (Anode an den Pin, Vorwiderstand nicht vergessen). An den Anschlüssen PB2-PB7 misst man 0 Volt. Eine mit der Anode mit einem dieser Anschlüsse verbundene LED leuchtet nicht.&lt;br /&gt;
&lt;br /&gt;
= Ganzzahlige Datentypen (Integer) =&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung von Mikrokontrollern ist die Definition einiger ganzzahliger Datentypen sinnvoll, an denen eindeutig die Bit-Länge abgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
Standardisierte Datentypen werden in der Header-Datei &amp;lt;code&amp;gt;stdint.h&amp;lt;/code&amp;gt; definiert, die folgendermaßen eingebunden werden kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;lt;stdint.h&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;int-Typen aus &amp;lt;code&amp;gt;stdint.h&amp;lt;/code&amp;gt; (C99)&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;| Vorzeichenbehaftete int-Typen&lt;br /&gt;
|- bgcolor=&amp;quot;#e8e8ff&amp;quot;&lt;br /&gt;
! Typname || Bit-Breite ||colspan=&amp;quot;2&amp;quot;| Wertebereich&lt;br /&gt;
|align=&amp;quot;center| &#039;&#039;&#039;C-Entsprechung&#039;&#039;&#039; (avr-gcc)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; ||align=&amp;quot;right&amp;quot;| 8 || −128 ⋯ 127 || −2&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt; ⋯ 2&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt;−1 || &amp;lt;code&amp;gt;signed char&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int16_t&amp;lt;/code&amp;gt; ||align=&amp;quot;right&amp;quot;| 16 || −32768 ⋯ 32767 || −2&amp;lt;sup&amp;gt;15&amp;lt;/sup&amp;gt; ⋯ 2&amp;lt;sup&amp;gt;15&amp;lt;/sup&amp;gt;−1 || &amp;lt;code&amp;gt;signed short&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;signed int&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int32_t&amp;lt;/code&amp;gt; ||align=&amp;quot;right&amp;quot;| 32 || −2147483648 ⋯ 2147483647 || −2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt; ⋯ 2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt;−1 || &amp;lt;code&amp;gt;signed long&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int64_t&amp;lt;/code&amp;gt; ||align=&amp;quot;right&amp;quot;| 64 || −9223372036854775808 ⋯ 9223372036854775807 || −2&amp;lt;sup&amp;gt;63&amp;lt;/sup&amp;gt; ⋯ 2&amp;lt;sup&amp;gt;63&amp;lt;/sup&amp;gt;−1 || &amp;lt;code&amp;gt;signed long long&amp;lt;/code&amp;gt;&lt;br /&gt;
|- bgcolor=&amp;quot;#d0d0ff&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;| Vorzeichenlose int-Typen&lt;br /&gt;
|- bgcolor=&amp;quot;#e8e8ff&amp;quot;&lt;br /&gt;
! Typname || Bit-Breite ||colspan=&amp;quot;2&amp;quot;| Wertebereich&lt;br /&gt;
|align=&amp;quot;center| &#039;&#039;&#039;C-Entsprechung&#039;&#039;&#039; (avr-gcc)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; ||align=&amp;quot;right&amp;quot;| 8 || 0 ⋯ 255 || 0 ⋯ 2&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt;−1 || &amp;lt;code&amp;gt;unsigned char&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; ||align=&amp;quot;right&amp;quot;| 16 || 0 ⋯ 65535 || 0 ⋯ 2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt;−1 || &amp;lt;code&amp;gt;unsigned short&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;unsigned int&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; ||align=&amp;quot;right&amp;quot;| 32 || 0 ⋯ 4294967295 || 0 ⋯ 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;−1 || &amp;lt;code&amp;gt;unsigned long&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64_t&amp;lt;/code&amp;gt; ||align=&amp;quot;right&amp;quot;| 64 || 0 ⋯ 18446744073709551615 || 0 ⋯ 2&amp;lt;sup&amp;gt;64&amp;lt;/sup&amp;gt;−1 || &amp;lt;code&amp;gt;unsigned long long&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Neben den Typen gibt es auch Makros für die Bereichsgrenzen wie &amp;lt;code&amp;gt;INT8_MIN&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;UINT16_MAX&amp;lt;/code&amp;gt;. Siehe dazu auch: [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html Dokumentation der avr-libc: Standard Integer Types].&lt;br /&gt;
&lt;br /&gt;
= Grundsätzlicher Programmaufbau eines µC-Programms =&lt;br /&gt;
&lt;br /&gt;
Wir unterscheiden zwischen 2 verschiedenen Methoden, um ein&lt;br /&gt;
Mikrocontroller-Programm zu schreiben, und zwar völlig unabhängig davon, in&lt;br /&gt;
welcher Programmiersprache das Programm geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
== Sequentieller Programmablauf ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Sequentielle Programme.gif|left]]&lt;br /&gt;
Bei dieser Programmiertechnik wird eine Endlosschleife programmiert, welche im&lt;br /&gt;
Wesentlichen immer den gleichen Aufbau hat. Es wird hier nach dem sogenannten EVA-Prinzip gehandelt. EVA steht für &amp;quot;Eingabe, Verarbeitung, Ausgabe&amp;quot;.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Interruptgesteuerter Programmablauf ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Interrupt Programme.gif|left]]&lt;br /&gt;
Bei dieser Methode werden beim Programmstart zuerst die gewünschten Interruptquellen aktiviert und dann in eine Endlosschleife gegangen, in welcher Dinge erledigt werden können, welche nicht zeitkritisch sind. Wenn ein Interrupt ausgelöst wird, so wird automatisch die zugeordnete Interruptfunktion ausgeführt.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
= Zugriff auf Register =&lt;br /&gt;
&lt;br /&gt;
Die AVR-Controller verfügen über eine Vielzahl von Registern. Die meisten&lt;br /&gt;
davon sind sogenannte Schreib-/Leseregister. Das heißt, das Programm kann die&lt;br /&gt;
Inhalte der Register sowohl auslesen als auch beschreiben.&lt;br /&gt;
&lt;br /&gt;
Register haben einen besonderen Stellenwert bei den AVR Controllern. Sie dienen dem Zugriff auf die Ports und die Schnittstellen des Controllers. Wir unterscheiden zwischen 8-Bit und 16-Bit Registern. Vorerst behandeln wir die 8-Bit Register.&lt;br /&gt;
&lt;br /&gt;
Einzelne Register sind bei allen AVRs vorhanden, andere wiederum nur bei bestimmten Typen. So sind beispielsweise die Register, welche für den Zugriff auf den UART notwendig sind, selbstverständlich nur bei denjenigen Modellen vorhanden, welche über einen integrierten Hardware UART bzw. USART verfügen.&lt;br /&gt;
&lt;br /&gt;
Die Namen der Register sind in den Headerdateien zu den entsprechenden AVR-Typen definiert. Dazu muss man den Namen der controllerspezifischen Headerdatei nicht kennen. Es reicht aus, die allgemeine Headerdatei &#039;&#039;avr/io.h&#039;&#039; einzubinden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist im Makefile der MCU-Typ z.&amp;amp;nbsp;B. mit dem Inhalt atmega8 definiert (und wird somit per -mmcu=atmega8 an den Compiler übergeben), wird beim Einlesen der io.h-Datei implizit (&amp;quot;automatisch&amp;quot;) auch die iom8.h-Datei mit den Register-Definitionen für den ATmega8 eingelesen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Wohl besser als Anhang - spaeter... --&amp;gt;&lt;br /&gt;
Intern wird diese &amp;quot;Automatik&amp;quot; wie folgt realisiert: Der Controllertyp wird dem Compiler als Parameter übergeben (vgl. &#039;&#039;avr-gcc -c -mmcu=atmega16 [...]&#039;&#039; im Einführungsbeispiel). Wird ein Makefile nach der WinAVR/mfile-Vorlage verwendet, setzt man die Variable &#039;&#039;MCU&#039;&#039;, der Inhalt dieser Variable wird dann an passender Stelle für die Compilerparameter verwendet. Der Compiler definiert intern eine dem mmcu-Parameter zugeordnete &amp;quot;Variable&amp;quot; (genauer: ein Makro) mit dem Namen des Controllers, vorangestelltem &#039;&#039;__AVR_&#039;&#039; und angehängten Unterstrichen (z.&amp;amp;nbsp;B. wird bei &#039;&#039;-mmcu=atmega16&#039;&#039; das Makro &#039;&#039;__AVR_ATmega16__&#039;&#039; definiert). Beim Einbinden der Header-Datei &#039;&#039;avr/io.h&#039;&#039; wird geprüft, ob das jeweilige Makro definiert ist und die zum Controller passende Definitionsdatei eingelesen. Zur Veranschaulichung einige Ausschnitte aus einem Makefile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# MCU Type (&amp;quot;name&amp;quot;) setzen:&lt;br /&gt;
MCU = atmega16&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
## Verwendung des Inhalts von MCU (hier atmega16) fuer die &lt;br /&gt;
## Compiler- und Assembler-Parameter&lt;br /&gt;
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)&lt;br /&gt;
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)&lt;br /&gt;
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
## Aufruf des Compilers:&lt;br /&gt;
## mit den Parametern ($(ALL_CFLAGS) ist -mmcu=$(MCU)[...] = -mmcu=atmega16[...]&lt;br /&gt;
$(OBJDIR)/%.o : %.c&lt;br /&gt;
	@echo&lt;br /&gt;
	@echo $(MSG_COMPILING) $&amp;lt;&lt;br /&gt;
	$(CC) -c $(ALL_CFLAGS) $&amp;lt; -o $@ &lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da --mmcu=atmega16 übergeben wurde, wird __AVR_ATmega16__ definiert und kann in avr/io.h zur Fallunterscheidung genutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// avr/io.h &lt;br /&gt;
// (bei WinAVR-Standardinstallation in C:\WinAVR\avr\include\avr)&lt;br /&gt;
[...]&lt;br /&gt;
#if defined (__AVR_AT94K__)&lt;br /&gt;
#  include &amp;lt;avr/ioat94k.h&amp;gt;&lt;br /&gt;
// [...]&lt;br /&gt;
#elif defined (__AVR_ATmega16__)&lt;br /&gt;
// da __AVR_ATmega16__ definiert ist, wird avr/iom16.h eingebunden:&lt;br /&gt;
#  include &amp;lt;avr/iom16.h&amp;gt;&lt;br /&gt;
// [...]&lt;br /&gt;
#else&lt;br /&gt;
#  if !defined(__COMPILING_AVR_LIBC__)&lt;br /&gt;
#    warning &amp;quot;device type not defined&amp;quot;&lt;br /&gt;
#  endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beispiele in den folgenden Abschnitten demonstrieren den Zugriff auf Register anhand der Register für I/O-Ports (PORTx, DDRx, PINx), die Vorgehensweise ist jedoch für alle Register (z.&amp;amp;nbsp;B. die des UART, ADC, SPI) analog.&lt;br /&gt;
&lt;br /&gt;
== Schreiben in Register ==&lt;br /&gt;
&lt;br /&gt;
Zum Schreiben kann man Register einfach wie eine Variable setzen.&amp;lt;ref&amp;gt;In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Schreibzugriff über die Funktion outp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt, outp() ist nicht mehr erforderlich.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    /* Setzt das Richtungsregister des Ports A auf 0xff &lt;br /&gt;
       (alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */&lt;br /&gt;
    DDRA = 0xff;    &lt;br /&gt;
&lt;br /&gt;
    /* Setzt PortA auf 0x03, Bit 0 und 1 &amp;quot;high&amp;quot;, restliche &amp;quot;low&amp;quot;: */&lt;br /&gt;
    PORTA = 0x03;   &lt;br /&gt;
&lt;br /&gt;
    // Setzen der Bits 0,1,2,3 und 4&lt;br /&gt;
    // Binär 00011111 = Hexadezimal 1F&lt;br /&gt;
    DDRB = 0x1F;    /* direkte Zuweisung - unübersichtlich */&lt;br /&gt;
&lt;br /&gt;
    /* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit&lt;br /&gt;
       aber übersichtlicher und selbsterklärend: */&lt;br /&gt;
    DDRB = (1 &amp;lt;&amp;lt; DDB0) | (1 &amp;lt;&amp;lt; DDB1) | (1 &amp;lt;&amp;lt; DDB2) | (1 &amp;lt;&amp;lt; DDB3) | (1 &amp;lt;&amp;lt; DDB4);&lt;br /&gt;
&lt;br /&gt;
    while (1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die ausführliche Schreibweise sollte bevorzugt verwendet werden, da dadurch die Zuweisungen selbsterklärend sind und somit der Code leichter nachvollzogen werden kann. Atmel verwendet sie auch bei Beispielen in Datenblätten und in den allermeisten Quellcodes zu Application-Notes. Mehr zu der Schreibweise mit &amp;quot;|&amp;quot; und &amp;quot;&amp;lt;&amp;lt;&amp;quot; findet man unter [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
Der gcc C-Compiler unterstützt ab Version 4.3.0 Konstanten im Binärformat, z.&amp;amp;nbsp;B. DDRB&amp;amp;nbsp;=&amp;amp;nbsp;0b00011111. Diese Schreibweise ist jedoch nur in GNU-C verfügbar und nicht in ISO-C definiert. Man sollte sie daher nicht verwenden, wenn Code mit anderen ausgetauscht oder mit anderen Compilern bzw. älteren Versionen des gcc genutzt werden soll.&lt;br /&gt;
&lt;br /&gt;
== Verändern von Registerinhalten ==&lt;br /&gt;
&lt;br /&gt;
Einzelne Bits setzt und löscht man &amp;quot;Standard-C-konform&amp;quot; mittels logischer (Bit-) Operationen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 x |= (1 &amp;lt;&amp;lt; Bitnummer);  // Hiermit wird ein Bit in x gesetzt&lt;br /&gt;
 x &amp;amp;= ~(1 &amp;lt;&amp;lt; Bitnummer); // Hiermit wird ein Bit in x geloescht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird jeweils nur der Zustand des angegebenen Bits geändert, der vorherige Zustand der anderen Bits bleibt erhalten. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
#define MEINBIT 2&lt;br /&gt;
...&lt;br /&gt;
PORTA |= (1 &amp;lt;&amp;lt; MEINBIT);    /* setzt Bit 2 an PortA auf 1 */&lt;br /&gt;
PORTA &amp;amp;= ~(1 &amp;lt;&amp;lt; MEINBIT);   /* loescht Bit 2 an PortA */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Methode lassen sich auch mehrere Bits eines Registers gleichzeitig setzen und löschen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
DDRA &amp;amp;= ~( (1&amp;lt;&amp;lt;PA0) | (1&amp;lt;&amp;lt;PA3) );  /* PA0 und PA3 als Eingaenge */&lt;br /&gt;
PORTA |= ( (1&amp;lt;&amp;lt;PA0) | (1&amp;lt;&amp;lt;PA3) );  /* Interne Pull-Up fuer beide einschalten */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei bestimmten AVR Registern mit Bits, die durch Beschreiben mit einer logischen 1 gelöscht werden, muss eine absolute Zuweisung benutzt werden. Ein ODER löscht in diesen Registern ALLE gesetzten Bits!&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
TIFR2 = (1&amp;lt;&amp;lt;OCF2A); // Nur Bit OCF2A löschen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind nicht mehr erforderlich.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [[Bitmanipulation]]&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers&lt;br /&gt;
&lt;br /&gt;
== Lesen aus Registern ==&lt;br /&gt;
&lt;br /&gt;
Zum Lesen kann man auf Register einfach wie auf eine Variable zugreifen. In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Lesezugriff über die Funktion inp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt und inp() ist nicht mehr erforderlich.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint8_t foo;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    /* kopiert den Status der Eingabepins an PortB &lt;br /&gt;
       in die Variable foo: */&lt;br /&gt;
    foo = PINB;    &lt;br /&gt;
    //...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abfrage der Zustände von Bits erfolgt durch Einlesen des gesamten Registerinhalts und ausblenden der Bits deren Zustand nicht von Interesse ist. Einige Beispiele zum Prüfen ob Bits gesetzt oder gelöscht sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define MEINBIT0 0 &lt;br /&gt;
#define MEINBIT2 2&lt;br /&gt;
&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
extern test1();&lt;br /&gt;
&lt;br /&gt;
// Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist&lt;br /&gt;
i = PINA;         // Inhalt in Arbeitsvariable&lt;br /&gt;
i = i &amp;amp; 0x01;     // alle Bits bis auf Bit 0 ausblenden (bitweise und)&lt;br /&gt;
                  // falls das Bit gesetzt war, hat i den Inhalt 1&lt;br /&gt;
if ( i != 0 ) {   // Ergebnis ungleich 0 (wahr)? &lt;br /&gt;
  test1();         // dann muss Bit 0 in i gesetzt sein -&amp;gt; Funktion aufrufen&lt;br /&gt;
}&lt;br /&gt;
// verkürzt:&lt;br /&gt;
if ( ( PINA &amp;amp; 0x01 ) != 0 ) {&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
// nochmals verkürzt:&lt;br /&gt;
if ( PINA &amp;amp; 0x01 ) {&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
// mit definierter Bitnummer:&lt;br /&gt;
if ( PINA &amp;amp; ( 1 &amp;lt;&amp;lt; MEINBIT0 ) ) {&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion aufrufen, wenn Bit 0 und/oder Bit 2 gesetzt ist. (Bit 0 und 2 also Wert 5) &lt;br /&gt;
// (Bedenke: Bit 0 hat Wert 1, Bit 1 hat Wert 2 und Bit 2 hat Wert 4)&lt;br /&gt;
if ( PINA &amp;amp; 0x05 ) {&lt;br /&gt;
  test1();  // Vergleich &amp;lt;&amp;gt; 0 (wahr), also mindestens eines der Bits gesetzt&lt;br /&gt;
}&lt;br /&gt;
// mit definierten Bitnummern:&lt;br /&gt;
if ( PINA &amp;amp; ( ( 1 &amp;lt;&amp;lt; MEINBIT0 ) | ( 1 &amp;lt;&amp;lt; MEINBIT2 ) ) ) {&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion aufrufen, wenn Bit 0 und Bit 2 gesetzt sind&lt;br /&gt;
if ( ( PINA &amp;amp; 0x05 ) == 0x05 ) {  // nur wahr, wenn beide Bits gesetzt&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion test2() aufrufen, wenn Bit 0 gelöscht (0) ist&lt;br /&gt;
i = PINA;        // einlesen in temporäre Variable&lt;br /&gt;
i = i &amp;amp; 0x01;    // maskieren von Bit 0&lt;br /&gt;
if ( i == 0 ) {  // Vergleich ist wahr, wenn Bit 0 nicht gesetzt ist&lt;br /&gt;
  test2();&lt;br /&gt;
}&lt;br /&gt;
// analog mit not-Operator&lt;br /&gt;
if ( !i ) {&lt;br /&gt;
  test2();&lt;br /&gt;
}&lt;br /&gt;
// nochmals verkürzt:&lt;br /&gt;
if ( !( PINA &amp;amp; 0x01 ) ) {&lt;br /&gt;
  test2();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Warten auf einen bestimmten Zustand ==&lt;br /&gt;
&lt;br /&gt;
Es gibt in der Bibliothek avr-libc Funktionen, die warten, bis ein bestimmter Zustand eines Bits erreicht ist. Es ist allerdings normalerweise eine eher unschöne Programmiertechnik, da in diesen Funktionen &amp;quot;blockierend&amp;quot; gewartet wird. Der Programmablauf bleibt also an dieser Stelle stehen, bis das maskierte Ereignis erfolgt ist. Setzt man den [[Watchdog]] ein, muss man darauf achten, dass dieser auch noch getriggert wird (Zurücksetzen des Watchdogtimers). &lt;br /&gt;
&lt;br /&gt;
Die Funktion &#039;&#039;&#039;loop_until_bit_is_set&#039;&#039;&#039; wartet in einer Schleife, bis das definierte Bit gesetzt ist. Wenn das Bit beim Aufruf der Funktion bereits gesetzt ist, wird die Funktion sofort wieder verlassen. Das niederwertigste Bit hat die Bitnummer 0. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
/* Warten bis Bit Nr. 2 (das dritte Bit) in Register PINA gesetzt (1) ist */&lt;br /&gt;
&lt;br /&gt;
#define WARTEPIN PINA&lt;br /&gt;
#define WARTEBIT PA2&lt;br /&gt;
&lt;br /&gt;
// mit der avr-libc Funktion:&lt;br /&gt;
loop_until_bit_is_set(WARTEPIN, WARTEBIT);&lt;br /&gt;
&lt;br /&gt;
// dito in &amp;quot;C-Standard&amp;quot;:&lt;br /&gt;
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN&lt;br /&gt;
// _nicht_ ungleich 0 (also 0) ist.&lt;br /&gt;
while ( !(WARTEPIN &amp;amp; (1 &amp;lt;&amp;lt; WARTEBIT)) ) {}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &#039;&#039;&#039;loop_until_bit_is_clear&#039;&#039;&#039; wartet in einer Schleife, bis das definierte Bit gelöscht ist. Wenn das Bit beim Aufruf der Funktion bereits gelöscht ist, wird die Funktion sofort wieder verlassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
/* Warten bis Bit Nr. 4 (das fuenfte Bit) in Register PINB geloescht (0) ist */&lt;br /&gt;
#define WARTEPIN PINB&lt;br /&gt;
#define WARTEBIT PB4&lt;br /&gt;
&lt;br /&gt;
// avr-libc-Funktion:&lt;br /&gt;
loop_until_bit_is_clear(WARTEPIN, WARTEBIT);&lt;br /&gt;
&lt;br /&gt;
// dito in &amp;quot;C-Standard&amp;quot;:&lt;br /&gt;
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN&lt;br /&gt;
// gesetzt (1) ist &lt;br /&gt;
while ( WARTEPIN &amp;amp; (1&amp;lt;&amp;lt;WARTEBIT) ) {}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Universeller und auch auf andere Plattformen besser übertragbar ist die Verwendung von C-Standardoperationen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: &lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers&lt;br /&gt;
* [[Bitmanipulation]]&lt;br /&gt;
&lt;br /&gt;
== 16-Bit Register (ADC, ICR1, OCR1x, TCNT1, UBRR) ==&lt;br /&gt;
&lt;br /&gt;
Einige der Portregister in den AVR-Controllern sind 16 Bit breit. Im Datenblatt sind diese Register üblicherweise mit dem Suffix &amp;quot;L&amp;quot; (Low-Byte) und &amp;quot;H&amp;quot; (High-Byte) versehen. Die avr-libc definiert zusätzlich die meisten dieser Variablen die Bezeichnung ohne &amp;quot;L&amp;quot; oder &amp;quot;H&amp;quot;. Auf diese Register kann dann direkt zugegriffen werden. Dies ist zum Beispiel der Fall für Register wie ADC oder TCNT1.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    uint16_t foo;&lt;br /&gt;
&lt;br /&gt;
    /* setzt die Wort-Variable foo auf den Wert der letzten AD-Wandlung */&lt;br /&gt;
    foo = ADC; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei anderen Registern, wie zum Beispiel Baudraten-Register, liegen High- und Low-Teil nicht direkt nebeneinander im SFR-Bereich, so dass ein 16-Bit Zugriff nicht möglich ist und der Zugriff zusammengebastelt werden muss:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
#endif&lt;br /&gt;
#define UART_BAUD_RATE 9600&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
   uint16_t baud = F_CPU / (UART_BAUD_RATE * 16L) -1;&lt;br /&gt;
&lt;br /&gt;
   UBRRH = (uint8_t) (baud &amp;gt;&amp;gt; 8);&lt;br /&gt;
   UBRRL = (uint8_t) baud;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einigen AVR-Typen wie ATmega8 oder ATmega16 teilen sich UBRRH und UCSRC die gleiche Speicher-Adresse. Damit der AVR trotzdem zwischen den beiden Registern unterscheiden kann, bestimmt das Bit7 (URSEL), welches Register tatsächlich beschrieben werden soll. &#039;&#039;1000 0011&#039;&#039; (0x83) adressiert demnach UCSRC und übergibt den Wert &#039;&#039;3&#039;&#039;. Und &#039;&#039;0000 0011&#039;&#039; (0x3) adressiert UBRRH und übergibt ebenfalls den Wert &#039;&#039;3&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Speziell bei den 16-Bit-Timern und auch beim ADC ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.&amp;amp;nbsp;B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann. &lt;br /&gt;
&lt;br /&gt;
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.&lt;br /&gt;
&lt;br /&gt;
Um diese Datenmüllproduktion zu verhindern, gibt es in beiden Fällen eine Synchronisation, die jeweils durch den Zugriff auf das Low-Byte ausgelöst wird:&lt;br /&gt;
* Bei den Timer-Registern (das gilt für alle TCNT-, OCR- und ICR-Register bei den 16-Bit-Timern) wird bei einem &#039;&#039;Lesezugriff&#039;&#039; auf das Low-Byte automatisch das High-Byte in ein temporäres Register, das ansonsten nach außen nicht sichtbar ist, geschoben. Greift man nun &#039;&#039;anschließend&#039;&#039; auf das High-Byte zu, dann wird eben dieses temporäre Register gelesen.&lt;br /&gt;
* Bei einem &#039;&#039;Schreibzugriff&#039;&#039; auf eines der genannten Register wird das High-Byte in besagtem temporären Register zwischengespeichert und erst beim Schreiben des Low-Bytes werden &#039;&#039;beide&#039;&#039; gleichzeitig in das eigentliche Register übernommen.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet für die Reihenfolge:&lt;br /&gt;
* Lesezugriff: Erst Low-Byte, dann High-Byte&lt;br /&gt;
* Schreibzugriff: Erst High-Byte, dann Low-Byte&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist zu beachten, dass es für all diese 16-Bit-Register nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.d.R. zu Datenmüll führt. 16-Bit-Zugriffe sind generell nicht atomar! Wenn mit Interrupts gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
Beim ADC-Datenregister ADCH/ADCL ist die Synchronisierung anders gelöst. Hier wird beim Lesezugriff (ADCH/ADCL sind logischerweise read-only) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!&lt;br /&gt;
&lt;br /&gt;
Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen – also sowohl bei den Timern als auch beim ADC – werden vom C-Compiler 16-Bit Pseudo-Register zur Verfügung gestellt (z.&amp;amp;nbsp;B. TCNT1H/TCNT1L → TCNT1, ADCH/ADCL → ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden! Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.&lt;br /&gt;
&lt;br /&gt;
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass u.U. die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis &amp;quot;linksbündig&amp;quot; in ADCH/ADCL auszurichten, so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens &#039;&#039;adc&#039;&#039; gibt. &lt;br /&gt;
&lt;br /&gt;
Im Umgang mit 16-Bit Registern siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Related Pages/Frequently Asked Questions/Nr. 8&lt;br /&gt;
* Datenblatt Abschnitt &#039;&#039;Accessing 16-bit Registers&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== IO-Register als Parameter und Variablen ==&lt;br /&gt;
&lt;br /&gt;
Um Register als Parameter für eigene Funktionen übergeben zu können, muss man sie als einen volatile uint8_t Pointer übergeben. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint8_t key_pressed (volatile uint8_t *inputreg, uint8_t inputbit)&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t last_state = 0;&lt;br /&gt;
 &lt;br /&gt;
  if (last_state == (*inputreg &amp;amp; (1&amp;lt;&amp;lt;inputbit)))&lt;br /&gt;
     return 0; /* keine Änderung */&lt;br /&gt;
 &lt;br /&gt;
  /* Wenn doch, warten bis etwaiges Prellen vorbei ist: */&lt;br /&gt;
  _delay_ms(20);&lt;br /&gt;
&lt;br /&gt;
  /* Zustand für nächsten Aufruf merken: */&lt;br /&gt;
  last_state = *inputreg &amp;amp; (1&amp;lt;&amp;lt;inputbit);&lt;br /&gt;
 &lt;br /&gt;
  /* und den entprellten Tastendruck zurückgeben: */&lt;br /&gt;
  return *inputreg &amp;amp; (1&amp;lt;&amp;lt;inputbit);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Beispiel für einen Funktionsaufruf: */&lt;br /&gt;
&lt;br /&gt;
void foo (void)&lt;br /&gt;
{&lt;br /&gt;
   uint8_t i = key_pressed (&amp;amp;PINB, PB1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Aufruf der Funktion mit call by value würde Folgendes bewirken: Beim Funktionseintritt wird nur eine Kopie des momentanen Portzustandes angefertigt, die sich unabhängig vom tatsächlichen Zustand das Ports nicht mehr ändert, womit die Funktion wirkungslos wäre. Die Übergabe eines Zeigers wäre die Lösung, wenn der Compiler nicht optimieren würde. Denn dadurch wird im Programm nicht von der Hardware gelesen, sondern wieder nur von einem Abbild im Speicher. Das Ergebnis wäre das gleiche wie oben. Mit dem Schlüsselwort volatile sagt man nun dem Compiler, dass die entsprechende Variable entweder durch andere Softwareroutinen (Interrupts) oder durch die Hardware verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass avr-libc FAQ: &amp;quot;How do I pass an IO port as a parameter to a function?&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
= Zugriff auf IO-Ports =&lt;br /&gt;
&lt;br /&gt;
Jeder AVR implementiert eine unterschiedliche Menge an GPIO-Registern&lt;br /&gt;
(GPIO - General Purpose Input/Output). Diese Register dienen dazu:&lt;br /&gt;
* einzustellen welche der Anschlüsse (&amp;quot;Beinchen&amp;quot;) des Controllers als Ein- oder Ausgänge dienen&lt;br /&gt;
* bei Ausgängen deren Zustand festzulegen&lt;br /&gt;
* bei Eingängen deren Zustand zu erfassen&lt;br /&gt;
&lt;br /&gt;
Mittels GPIO werden digitale Zustände gesetzt und erfasst, d.h. die Spannung an einem Ausgang wird ein- oder ausgeschaltet und an einem Eingang wird erfasst, ob die anliegende Spannung über oder unter einem bestimmten Schwellwert liegt. Im Datenblatt Abschnitt Electrical Characteristics/DC Characteristics finden sich die Spannungswerte (V_OL, V_OH für Ausgänge, V_IL, V_IH für Eingänge).&lt;br /&gt;
&lt;br /&gt;
Die Verarbeitung von analogen Eingangswerten und die Ausgabe von Analogwerten wird in Kapitel [[AVR-GCC-Tutorial#Analoge_Ein-_und_Ausgabe|Analoge Ein- und Ausgabe]] behandelt.&lt;br /&gt;
&lt;br /&gt;
Die physischen Ein- und Ausgänge werden bei AVR-Controllern zu logischen Ports gruppiert.&lt;br /&gt;
&lt;br /&gt;
Alle Ports werden über Register gesteuert. Dazu sind jedem Port 3 Register zugeordnet:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! DDRx&lt;br /&gt;
| Datenrichtungsregister für Port&#039;&#039;&#039;x&#039;&#039;&#039;. &lt;br /&gt;
&#039;&#039;&#039;x&#039;&#039;&#039; entspricht &#039;&#039;&#039;A&#039;&#039;&#039;, &#039;&#039;&#039;B&#039;&#039;&#039;, &#039;&#039;&#039; C&#039;&#039;&#039;, &#039;&#039;&#039;D&#039;&#039;&#039; usw. (abhängig von der Anzahl der Ports des verwendeten AVR). Bit im Register gesetzt (1) für Ausgang, Bit gelöscht (0) für Eingang.&lt;br /&gt;
|- &lt;br /&gt;
! PINx&lt;br /&gt;
| Eingangsadresse für Port&#039;&#039;&#039;x&#039;&#039;&#039;. &lt;br /&gt;
Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als Eingang definierten Portpins. Bit 1 wenn Pin &amp;quot;high&amp;quot;, Bit 0 wenn Portpin low.&lt;br /&gt;
|-&lt;br /&gt;
! PORTx&lt;br /&gt;
| Datenregister für Port&#039;&#039;&#039;x&#039;&#039;&#039;. &lt;br /&gt;
Dieses Register wird verwendet, um die Ausgänge eines Ports anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden, können über PORTx&lt;br /&gt;
die internen Pull-Up Widerstände aktiviert oder deaktiviert werden (1 = aktiv).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele gehen von einem AVR aus, der sowohl Port A als auch Port B besitzt. Sie müssen für andere AVRs (zum Beispiel ATmega8/48/88/168) entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Datenrichtung bestimmen ==&lt;br /&gt;
&lt;br /&gt;
Zuerst muss die Datenrichtung der verwendeten Pins bestimmt werden. Um dies zu erreichen, wird das Datenrichtungsregister des entsprechenden Ports beschrieben.&lt;br /&gt;
&lt;br /&gt;
Für jeden Pin, der als Ausgang verwendet werden soll, muss dabei das&lt;br /&gt;
entsprechende Bit auf dem Port gesetzt werden. Soll der Pin als Eingang&lt;br /&gt;
verwendet werden, muss das entsprechende Bit gelöscht sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Angenommen am Port B sollen die Pins 0 bis 4 als Ausgänge definiert werden, die noch verbleibenden Pins 5 bis 7 sollen als Eingänge fungieren. Dazu ist es daher notwendig, im für das Port B zuständigen Datenrichtungsregister DDRB folgende Bitkonfiguration einzutragen&lt;br /&gt;
&lt;br /&gt;
   +---+---+---+---+---+---+---+---+&lt;br /&gt;
   | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |&lt;br /&gt;
   +---+---+---+---+---+---+---+---+&lt;br /&gt;
   | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |&lt;br /&gt;
&lt;br /&gt;
In C liest sich das dann so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// in io.h wird u.a. DDRB definiert:&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  // Setzen der Bits 0,1,2,3 und 4&lt;br /&gt;
  // Binär 00011111 = Hexadezimal 1F&lt;br /&gt;
  // direkte Zuweisung - standardkonform */&lt;br /&gt;
  DDRB = 0x1F;    /* &lt;br /&gt;
&lt;br /&gt;
  // übersichtliche Alternative - Binärschreibweise, aber kein ISO-C&lt;br /&gt;
  DDRB = 0b00011111;&lt;br /&gt;
&lt;br /&gt;
  // Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit&lt;br /&gt;
  // aber übersichtlicher und selbsterklärend:&lt;br /&gt;
  DDRB |= (1 &amp;lt;&amp;lt; DDB0) | (1 &amp;lt;&amp;lt; DDB1) | (1 &amp;lt;&amp;lt; DDB2) | (1 &amp;lt;&amp;lt; DDB3) | (1 &amp;lt;&amp;lt; DDB4); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pins 5 bis 7 werden (da 0) als Eingänge geschaltet. Weitere Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  // Alle Pins des Ports B als Ausgang definieren:&lt;br /&gt;
  DDRB = 0xff; &lt;br /&gt;
  // Pin0 wieder auf Eingang und andere im ursprünglichen Zustand belassen:&lt;br /&gt;
  DDRB &amp;amp;= ~(1 &amp;lt;&amp;lt; DDB0);&lt;br /&gt;
  // Pin 3 und 4 auf Eingang und andere im ursprünglichen Zustand belassen:&lt;br /&gt;
  DDRB &amp;amp;= ~((1 &amp;lt;&amp;lt; DDB3) | (1 &amp;lt;&amp;lt; DDB4));&lt;br /&gt;
  // Pin 0 und 3 wieder auf Ausgang und andere im ursprünglichen Zustand belassen:&lt;br /&gt;
  DDRB |= (1 &amp;lt;&amp;lt; DDB0) | (1 &amp;lt;&amp;lt; DDB3);&lt;br /&gt;
  // Alle Pins auf Eingang:&lt;br /&gt;
  DDRB = 0x00;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vordefinierte Bitnummern für I/O-Register ==&lt;br /&gt;
&lt;br /&gt;
Die Bitnummern (z.&amp;amp;nbsp;B. PCx, PINCx und DDCx für den Port C) sind in den io*.h-Dateien der avr-libc definiert und dienen lediglich der besseren Lesbarkeit. Man muss diese Definitionen nicht verwenden oder kann auch einfach &amp;quot;immer&amp;quot; PAx, PBx, PCx usw. nutzen, auch wenn der Zugriff auf Bits in DDRx- oder PINx-Registern erfolgt. Für den Compiler sind die Ausdrücke (1&amp;lt;&amp;lt;PC7), (1&amp;lt;&amp;lt;DDC7) und (1&amp;lt;&amp;lt;PINC7) identisch zu (1&amp;lt;&amp;lt;7) (genauer: der Präprozessor ersetzt die Ausdrücke (1&amp;lt;&amp;lt;PC7),... zu (1&amp;lt;&amp;lt;7)). Ein Ausschnitt der Definitionen für Port C eines ATmega32 aus der iom32.h-Datei zur Verdeutlichung (analog für die weiteren Ports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
/* PORTC */&lt;br /&gt;
#define PC7     7&lt;br /&gt;
#define PC6     6&lt;br /&gt;
#define PC5     5&lt;br /&gt;
#define PC4     4&lt;br /&gt;
#define PC3     3&lt;br /&gt;
#define PC2     2&lt;br /&gt;
#define PC1     1&lt;br /&gt;
#define PC0     0&lt;br /&gt;
&lt;br /&gt;
/* DDRC */&lt;br /&gt;
#define DDC7    7&lt;br /&gt;
#define DDC6    6&lt;br /&gt;
#define DDC5    5&lt;br /&gt;
#define DDC4    4&lt;br /&gt;
#define DDC3    3&lt;br /&gt;
#define DDC2    2&lt;br /&gt;
#define DDC1    1&lt;br /&gt;
#define DDC0    0&lt;br /&gt;
&lt;br /&gt;
/* PINC */&lt;br /&gt;
#define PINC7   7&lt;br /&gt;
#define PINC6   6&lt;br /&gt;
#define PINC5   5&lt;br /&gt;
#define PINC4   4&lt;br /&gt;
#define PINC3   3&lt;br /&gt;
#define PINC2   2&lt;br /&gt;
#define PINC1   1&lt;br /&gt;
#define PINC0   0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Digitale Signale ==&lt;br /&gt;
&lt;br /&gt;
Am einfachsten ist es, digitale Signale mit dem Mikrocontroller zu erfassen bzw. auszugeben.&lt;br /&gt;
&lt;br /&gt;
== Ausgänge ==&lt;br /&gt;
Will man als Ausgang definierte Pins (entsprechende DDRx-Bits = 1) auf Logisch 1 setzen, setzt man die  entsprechenden Bits im Portregister.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    PORTB = 0x04; /* besser PORTB=(1&amp;lt;&amp;lt;PB2) */&lt;br /&gt;
&lt;br /&gt;
    // übersichtliche Alternative - Binärschreibweise&lt;br /&gt;
    PORTB = 0b00000100;    /* direkte Zuweisung - übersichtlich */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird also der Ausgang an Pin PB2 gesetzt (Beachte, dass die Bits immer &#039;&#039;von 0 an&#039;&#039; gezählt werden, das niederwertigste Bit ist also Bitnummer 0 und nicht etwa Bitnummer 1).&lt;br /&gt;
&lt;br /&gt;
Man beachte, dass bei der Zuweisung mittels &#039;&#039;&#039;=&#039;&#039;&#039; immer alle Pins gleichzeitig angegeben werden. Man sollte also, wenn nur bestimmte Ausgänge geschaltet werden sollen, zuerst den aktuellen Wert des Ports einlesen und das Bit des gewünschten Ports in diesen Wert einfließen lassen. Will man also nur den dritten Pin (Bit Nr. 2) an Port B auf &amp;quot;high&amp;quot; setzen und den Status der anderen Ausgänge unverändert lassen, nutze man diese Form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    PORTB = PORTB | 0x04; /* besser: PORTB = PORTB | ( 1&amp;lt;&amp;lt;PB2 ) */&lt;br /&gt;
    /* vereinfacht durch Nutzung des |= Operators : */&lt;br /&gt;
    PORTB |= (1&amp;lt;&amp;lt;PB2);&lt;br /&gt;
&lt;br /&gt;
    /* auch mehrere &amp;quot;gleichzeitig&amp;quot;: */&lt;br /&gt;
    PORTB |= (1&amp;lt;&amp;lt;PB4) | (1&amp;lt;&amp;lt;PB5); /* Pins PB4 und PB5 &amp;quot;high&amp;quot; */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Ausschalten&amp;quot;, also  Ausgänge auf &amp;quot;low&amp;quot; setzen, erfolgt analog:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;PB2); /* löscht Bit 2 in PORTB und setzt damit Pin PB2 auf low */ &lt;br /&gt;
    PORTB &amp;amp;= ~( (1&amp;lt;&amp;lt;PB4) | (1&amp;lt;&amp;lt;PB5) ); /* Pin PB4 und Pin PB5 &amp;quot;low&amp;quot; */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[Bitmanipulation]]&lt;br /&gt;
&lt;br /&gt;
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind in aktuellen Versionen der avr-libc nicht mehr enthalten und auch nicht mehr erforderlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Falls der Anfangszustand von Ausgängen kritisch ist, muss die Reihenfolge beachtet werden, mit der die Datenrichtung (DDRx) eingestellt und der Ausgabewert (PORTx) gesetzt wird:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für Ausgangspins, die mit Anfangswert &amp;quot;high&amp;quot; initialisiert werden sollen:&lt;br /&gt;
* zuerst die Bits im PORTx-Register setzen&lt;br /&gt;
* anschließend die Datenrichtung auf Ausgang stellen&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich die Abfolge für einen Pin, der bisher als Eingang mit abgeschaltetem Pull-Up konfiguriert war:&lt;br /&gt;
* setze PORTx: interner Pull-Up aktiv&lt;br /&gt;
* setze DDRx: Ausgang (&amp;quot;high&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Bei der Reihenfolge erst DDRx und dann PORTx kann es zu einem kurzen &amp;quot;low-Puls&amp;quot; kommen, der auch externe Pull-Up-Widerstände &amp;quot;überstimmt&amp;quot;. Die (ungünstige) Abfolge: Eingang -&amp;gt; setze DDRx: Ausgang (auf &amp;quot;low&amp;quot;, da PORTx nach Reset 0) -&amp;gt; setze PORTx: Ausgang auf high. Vergleiche dazu auch das Datenblatt Abschnitt &#039;&#039;Configuring the Pin&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Eingänge (Wie kommen Signale in den &amp;amp;micro;C) ==&lt;br /&gt;
&lt;br /&gt;
Die digitalen Eingangssignale können auf verschiedene Arten zu unserer Logik gelangen.&lt;br /&gt;
&lt;br /&gt;
=== Signalkopplung ===&lt;br /&gt;
&lt;br /&gt;
Am einfachsten ist es, wenn die Signale direkt aus einer anderen digitalen Schaltung übernommen werden können. Hat der Ausgang der entsprechenden Schaltung TTL-Pegel dann können wir sogar direkt den Ausgang der Schaltung mit einem Eingangspin von unserem Controller verbinden.&lt;br /&gt;
&lt;br /&gt;
Hat der Ausgang der anderen Schaltung keinen TTL-Pegel so müssen wir den Pegel über entsprechende Hardware (z.&amp;amp;nbsp;B. Optokoppler, [[Widerstand#Spannungsteiler|Spannungsteiler]], &amp;quot;Levelshifter&amp;quot; aka [[Pegelwandler]]) anpassen.&lt;br /&gt;
&lt;br /&gt;
Die Masse der beiden Schaltungen muss selbstverständlich miteinander verbunden werden. Der Software selber ist es natürlich letztendlich egal, wie das Signal eingespeist wird. Wir können ja ohnehin lediglich prüfen, ob an einem Pin unseres Controllers eine logische 1 (Spannung größer ca. 0,7*Vcc) oder eine logische 0 (Spannung kleiner ca. 0,2*Vcc) anliegt. Detaillierte Informationen darüber, ab welcher Spannung ein Eingang als 0 (&amp;quot;low&amp;quot;) bzw. 1 (&amp;quot;high&amp;quot;) erkannt wird, liefert die Tabelle DC Characteristics im Datenblatt des genutzten Controllers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Spannungstabelle&#039;&#039;&#039; &amp;lt;br /&amp;gt; &amp;lt;small&amp;gt;(ca. Grenzwerte)&amp;lt;/small&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
! Low || High&lt;br /&gt;
|-&lt;br /&gt;
! bei 5 V&lt;br /&gt;
| 1 V || 3,5 V&lt;br /&gt;
|-&lt;br /&gt;
! bei 3,3 V&lt;br /&gt;
| 0,66 V || 2,31 V&lt;br /&gt;
|-&lt;br /&gt;
! bei 1,8 V&lt;br /&gt;
| 0,36 V || 1,26 V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abfrage der Zustände der Portpins erfolgt direkt über den Registernamen.&lt;br /&gt;
&lt;br /&gt;
{{Warnung|Dabei ist wichtig, zur Abfrage der Eingänge &#039;&#039;nicht&#039;&#039; etwa Portregister &#039;&#039;&#039;PORTx&#039;&#039;&#039; zu verwenden, sondern Eingangsregister &#039;&#039;&#039;PINx&#039;&#039;&#039;. Ansonsten liest man nicht den Zustand der Eingänge, sondern den Status der internen Pull-Up-Widerstände. Die Abfrage der Pinzustände über PORTx statt PINx ist ein häufiger Fehler beim AVR-&amp;quot;Erstkontakt&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
Will man also die aktuellen Signalzustände von Port D abfragen und in eine Variable namens bPortD abspeichern, schreibt man folgende Befehlszeilen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
uint8_t bPortD;&lt;br /&gt;
...&lt;br /&gt;
bPortD = PIND;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit den C-Bitoperationen kann man den Status der Bits abfragen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das &amp;quot;zweite&amp;quot; Bit) in PINC gesetzt (1) ist */&lt;br /&gt;
if ( PINC &amp;amp; (1&amp;lt;&amp;lt;PINC1) ) {&lt;br /&gt;
  /* Aktion */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das &amp;quot;dritte&amp;quot; Bit) in PINB geloescht (0) ist */&lt;br /&gt;
if ( !(PINB &amp;amp; (1&amp;lt;&amp;lt;PINB2)) ) {&lt;br /&gt;
  /* Aktion */&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[Bitmanipulation#Bits_prüfen]]&lt;br /&gt;
&lt;br /&gt;
=== Interne Pull-Up Widerstände ===&lt;br /&gt;
&lt;br /&gt;
Portpins für Ein- und Ausgänge (GPIO) eines AVR verfügen über zuschaltbare interne Pull-Up Widerstände (nominal mehrere 10kOhm, z.&amp;amp;nbsp;B. ATmega16 20-50kOhm). Diese können in vielen Fällen statt externer Widerstände genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Die internen Pull-Up Widerstände von Vcc zu den einzelnen Portpins werden über das Register &#039;&#039;&#039; PORTx&#039;&#039;&#039; aktiviert bzw. deaktiviert, wenn ein Pin als &#039;&#039;&#039; Eingang&#039;&#039;&#039; geschaltet ist.&lt;br /&gt;
&lt;br /&gt;
Wird der Wert des entsprechenden Portpins auf 1 gesetzt, so ist der Pull-Up Widerstand aktiviert. Bei einem Wert von 0 ist der Pull-Up Widerstand nicht aktiv. Man sollte jeweils entweder den internen oder einen externen Pull-Up Widerstand verwenden, aber nicht beide zusammen.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden alle Pins des Ports D als Eingänge geschaltet und alle Pull-Up Widerstände aktiviert. Weiterhin wird Pin PC7 als Eingang geschaltet und dessen interner Pull-Up Widerstand aktiviert, ohne die Einstellungen für die anderen Portpins (PC0-PC6) zu verändern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
DDRD  = 0x00; /* alle Pins von Port D als Eingang */&lt;br /&gt;
PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */&lt;br /&gt;
...&lt;br /&gt;
DDRC  &amp;amp;= ~(1&amp;lt;&amp;lt;PC7);  /* Pin PC7 als Eingang */&lt;br /&gt;
PORTC |= (1&amp;lt;&amp;lt;PC7);    /* internen Pull-Up an PC7 aktivieren */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Taster und Schalter ===&lt;br /&gt;
&lt;br /&gt;
Der Anschluss mechanischer Kontakte an den Mikrocontroller, ist zwischen zwei unterschiedliche Methoden zu unterscheiden: &#039;&#039;Active Low&#039;&#039; und &#039;&#039;Active High&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;300&amp;quot; caption=&amp;quot;Anschluss mechanischer Kontakte an einen µC&amp;quot;&amp;gt;&lt;br /&gt;
Image:Active Low.gif|&#039;&#039;&#039;Active Low:&#039;&#039;&#039; Bei dieser Methode wird der Kontakt zwischen den Eingangspin des Controllers und Masse geschaltet. Damit bei offenem Schalter der Controller kein undefiniertes Signal bekommt, wird zwischen die Versorgungsspannung und den Eingangspin ein sogenannter &#039;&#039;&#039;Pull-Up&#039;&#039;&#039; Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffnetem Schalter auf logisch 1 zu ziehen.&lt;br /&gt;
Image:Active High.gif|&#039;&#039;&#039;Active High:&#039;&#039;&#039; Hier wird der Kontakt zwischen die Versorgungsspannung und den Eingangspin geschaltet. Damit bei offener Schalterstellung kein undefiniertes Signal am Controller ansteht, wird zwischen den Eingangspin und die Masse ein &#039;&#039;&#039;Pull-Down&#039;&#039;&#039; Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffneter Schalterstellung auf logisch 0 zu halten. &lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Widerstandswert von Pull-Up- und Pull-Down-Widerständen ist an sich nicht kritisch. Wird er allerdings zu hoch gewählt, ist die Wirkung eventuell nicht gegeben. Als üblicher Wert haben sich 10 kOhm eingebürgert. Die AVRs verfügen an den meisten Pins über zuschaltbare interne Pull-Up Widerstände (vgl. Abschnitt [[AVR-GCC-Tutorial#Interne Pull-Up Widerstände|Interne Pull-Up Widerstände]]), welche insbesondere wie hier bei Tastern und ähnlichen Bauteilen (z.&amp;amp;nbsp;B. Drehgebern) statt externer Bauteile verwendet werden können. Interne Pull-Down-Widerstand sind nicht verfügbar und müssen daher in Form zusätzlicher Bauteile in die Schaltung eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
==== Taster entprellen ====&lt;br /&gt;
&lt;br /&gt;
Siehe: &#039;&#039;[[Entprellung#Warteschleifen-Verfahren|Entprellung: Warteschleifen-Verfahren]]&lt;br /&gt;
&lt;br /&gt;
= Warteschleifen (delay.h) =&lt;br /&gt;
&lt;br /&gt;
Der Programmablauf kann verschiedene Arten von Wartefunktionen erfordern:&lt;br /&gt;
&lt;br /&gt;
* Warten im Sinn von Zeitvertrödeln&lt;br /&gt;
* Warten auf einen bestimmten Zustand an den I/O-Pins&lt;br /&gt;
* Warten auf einen bestimmten Zeitpunkt (siehe Timer)&lt;br /&gt;
* Warten auf einen bestimmten Zählerstand (siehe Counter)&lt;br /&gt;
&lt;br /&gt;
Der einfachste Fall, das Zeitvertrödeln, kann in vielen Fällen und mit großer Genauigkeit anhand der avr-libc Bibliotheksfunktionen _delay_ms() und _delay_us() erledigt werden. Die Bibliotheksfunktionen sind einfachen Zählschleifen (Warteschleifen) vorzuziehen, da leere Zählschleifen ohne besondere Vorkehrungen sonst bei eingeschalteter Optimierung vom avr-gcc-Compiler wegoptimiert werden. Weiterhin sind die Bibliotheksfunktionen bereits darauf vorbereitet, die in F_CPU definierte Taktfrequenz zu verwenden. Außerdem sind die Funktionen der Bibliothek wirklich getestet.&lt;br /&gt;
&lt;br /&gt;
Einfach!? Schon, aber während gewartet wird, macht der µC nichts anderes mehr (abgesehen von möglicherweise auftretenden Interrupts, falls welche aktiviert sind). Die Wartefunktion blockiert den Programmablauf. Möchte man einerseits warten, um z.&amp;amp;nbsp;B. eine LED blinken zu lassen und gleichzeitig andere Aktionen ausführen z.&amp;amp;nbsp;B. weitere LED bedienen, sollten die Timer/Counter des AVR verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden. Der Quellcode muss mit eingeschalteter Optimierung übersetzt werden, sonst wird sehr viel Maschinencode erzeugt, und die Wartezeiten stimmen nicht mehr mit dem Parameter überein.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Einschränkung liegt darin, daß sie möglicherweise länger warten, als erwartet, nämlich in dem Fall, daß Interrupts auftreten und die _delay...()-Funktion unterbrechen. Genau genommen warten diese nämlich nicht eine bestimmte Zeit, sondern verbrauchen eine bestimmte Anzahl von Prozessortakten. Die wiederum ist so bemessen, daß ohne Unterbrechung durch Interrupts die gewünschte Wartezeit erreicht wird.&lt;br /&gt;
Wird das Warten aber durch eine oder mehrere ISR unterbrochen, die zusammen 1% Prozessorzeit verbrauchen, dann dauert das Warten etwa 1% länger. Bei 50% Last durch die ISR dauert das Warten doppelt solange wie gewünscht, bei 90% zehnmal solange...&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Version der Bibliothek verhalten sich die Bibliotheksfunktionen etwas unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
== avr-libc Versionen bis 1.6 ==&lt;br /&gt;
&lt;br /&gt;
Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 38,4µs warten. Längere Wartezeiten müssen dann über einen mehrfachen Aufruf in einer Schleife gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert &lt;br /&gt;
   (z.&amp;amp;nbsp;B. durch Übergabe als Parameter zum Compiler innerhalb &lt;br /&gt;
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die&lt;br /&gt;
   &amp;quot;nachträgliche&amp;quot; Definition hinweist */&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 3686400 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz */&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;     /* in älteren avr-libc Versionen &amp;lt;avr/delay.h&amp;gt; */ &lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 lange, variable Verzögerungszeit, Einheit in Millisekunden&lt;br /&gt;
&lt;br /&gt;
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf &lt;br /&gt;
262.14 ms / F_CPU in MHz (im Beispiel: &lt;br /&gt;
262.1 / 3.6864 = max. 71 ms) &lt;br /&gt;
&lt;br /&gt;
Daher wird die kleine Warteschleife mehrfach aufgerufen,&lt;br /&gt;
um auf eine längere Wartezeit zu kommen. Die zusätzliche &lt;br /&gt;
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig&lt;br /&gt;
ungenau werden (macht hier vielleicht 2-3ms aus).&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void long_delay(uint16_t ms)&lt;br /&gt;
{&lt;br /&gt;
    for(; ms&amp;gt;0; ms--) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
    DDRB = ( 1 &amp;lt;&amp;lt; PB0 );        // PB0 an PORTB als Ausgang setzen&lt;br /&gt;
&lt;br /&gt;
    while( 1 )                  // Endlosschleife&lt;br /&gt;
    {                &lt;br /&gt;
        PORTB ^= ( 1 &amp;lt;&amp;lt; PB0 );  // Toggle PB0 z.&amp;amp;nbsp;B. angeschlossene LED&lt;br /&gt;
        long_delay(1000);       // Eine Sekunde warten...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== avr-libc Versionen ab 1.7 ==&lt;br /&gt;
&lt;br /&gt;
_delay_ms() kann mit einem Argument bis 6553,5 ms (= 6,5535 Sekunden) benutzt werden. Es ist nicht möglich, eine Variable als Argument zu übergeben. Wird die früher gültige Grenze von 262,14 ms/F_CPU (in MHz) überschritten, so arbeitet _delay_ms() einfach etwas ungenauer und zählt nur noch mit einer Auflösung von 1/10 ms. Eine Verzögerung von 1000,10 ms ließe sich nicht mehr von einer von 1000,19 ms unterscheiden. Ein Verlust, der sich im Allgemeinen verschmerzen lässt. Dem Programmierer wird keine Rückmeldung gegeben, dass die Funktion ggf. gröber arbeitet, d.h. wenn es darauf ankommt, bitte den Parameter wie bisher geschickt wählen.&lt;br /&gt;
&lt;br /&gt;
Die Funktion _delay_us() wurde ebenfalls erweitert. Wenn deren maximal als genau behandelbares Argument überschritten wird, benutzt diese intern _delay_ms(). Damit gelten in diesem Fall die _delay_ms() Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus, avr-libc ab Version 1.6&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert &lt;br /&gt;
   (z.B. durch Übergabe als Parameter zum Compiler innerhalb &lt;br /&gt;
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die&lt;br /&gt;
   &amp;quot;nachträgliche&amp;quot; Definition hinweist */&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 3686400 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz */&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
    DDRB = ( 1 &amp;lt;&amp;lt; PB0 );        // PB0 an PORTB als Ausgang setzen&lt;br /&gt;
&lt;br /&gt;
    while( 1 ) {                // Endlosschleife&lt;br /&gt;
        PORTB ^= ( 1 &amp;lt;&amp;lt; PB0 );  // Toggle PB0 z.B. angeschlossene LED&lt;br /&gt;
        _delay_ms(1000);        // Eine Sekunde +/-1/10000 Sekunde warten...&lt;br /&gt;
                                // funktioniert nicht mit Bibliotheken vor 1.6&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trick zur Übergabe einer Variablen an _delay_ms():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 3686400 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz */&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void sleep ( uint8_t ms )&lt;br /&gt;
{&lt;br /&gt;
    for(; ms &amp;gt; 0; ms--) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
    int x = 0;                  // Variable als Wartezeit erstellen&lt;br /&gt;
    DDRB = ( 1 &amp;lt;&amp;lt; PB0 );        // PB0 an PORTB als Ausgang setzen&lt;br /&gt;
&lt;br /&gt;
    while( 1 ) {                // Endlosschleife&lt;br /&gt;
        PORTB ^= ( 1 &amp;lt;&amp;lt; PB0 );  // Toggle PB0 z.B. angeschlossene LED&lt;br /&gt;
        sleep(x); &lt;br /&gt;
        x++;       &lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die _delay_ms() und die _delay_us aus &#039;&#039;&#039;avr-libc 1.7.0&#039;&#039;&#039; sind fehlerhaft. _delay_ms () läuft 4x schneller als erwartet. Abhilfe ist eine korrigierte Includedatei: [http://www.mikrocontroller.net/topic/196738#1943039]&lt;br /&gt;
&lt;br /&gt;
= Programmieren mit Interrupts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; margin:2em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Interrupt Programme.gif]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Nachdem wir nun alles Wissenswerte für die serielle Programmerstellung&lt;br /&gt;
gelernt haben nehmen wir jetzt ein völlig anderes Thema in Angriff, nämlich&lt;br /&gt;
die Programmierung unter Zuhilfenahme der Interrupts des AVR.&lt;br /&gt;
&lt;br /&gt;
Tritt ein Interrupt auf, unterbricht (engl. interrupts) der Controller die Verarbeitung des Hauptprogramms und verzweigt zu einer Interruptroutine. Das Hauptprogramm wird also beim Eintreffen eines Interrupts unterbrochen, die Interruptroutine ausgeführt und danach erst wieder das Hauptprogramm an der Unterbrechungsstelle fortgesetzt (vgl. die Abbildung).&lt;br /&gt;
&lt;br /&gt;
Um Interrupts verarbeiten zu können, ist folgendes zu beachten:&lt;br /&gt;
&lt;br /&gt;
* Für jede aktivierte Interruptquelle ist eine Funktion zu programmieren, in der die beim Auftreten des jeweiligen Interrupts erforderlichen Verarbeitungsschritte enthalten sind. Für diese Funktion existieren verschiedene Bezeichnungen. Üblich sind die englischen Begriffe Interrupt-Handler oder Interrupt-Service-Routinen (ISR), man findet aber auch die Bezeichnungen Interruptverarbeitungs- oder -behandlungsroutine oder auch kurz Interruptroutine. Zum Beispiel wird üblicherweise in der ISR zur Verarbeitung des Empfangsinterrupts eines UARTs (UART-RX Interrupt) das empfangene Zeichen in einen Zwischenspeicher (FIFO-Buffer) kopiert, dessen Inhalt später von anderen Programmteilen geleert wird. Sofern der Zwischenspeicher ausreichend groß ist, geht also kein Zeichen verloren, auch wenn im Hauptprogramm zeitintensive Operationen durchgeführt werden.&lt;br /&gt;
* Die benötigten Interrupts sind in den jeweiligen Funktionsbausteinen einzuschalten. Dies erfolgt über das jeweilige Aktivierungsbit (Interrupt Enable) in einem der Hardwareregister (z.B. RX(Complete)Interrupt Enable eines UARTs)&lt;br /&gt;
* Sämtliche Interrupts werden über einen weiteren globalen Schalter aktiviert und deaktiviert. Zur Verarbeitung der Interrupts ist dieser Schalter zu aktivieren (sei(), siehe unten).&lt;br /&gt;
 &lt;br /&gt;
Alle Punkte sind zu beachten. Fehlt z.B. die globale Aktivierung, werden Interruptroutinen auch dann nicht aufgerufen, wenn sie im Funktionsbaustein eingeschaltet sind und eine Behandlungsroutine verhanden ist.&lt;br /&gt;
&lt;br /&gt;
Siehe auch&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-235092.html#new Ausführlicher Thread im Forum]&lt;br /&gt;
* Artikel [[Interrupt]]&lt;br /&gt;
* Artikel [[Multitasking]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Anforderungen an Interrupt-Routinen ==&lt;br /&gt;
&lt;br /&gt;
Um unliebsamen Überraschungen vorzubeugen, sollten einige Grundregeln bei der Implementierung der Interruptroutinen beachtet werden. Interruptroutinen sollten möglichst kurz und schnell abarbeitbar sein, daraus folgt:&lt;br /&gt;
&lt;br /&gt;
* Keine umfangreichen Berechnungen innerhalb der Interruptroutine. (*)&lt;br /&gt;
* Keine langen Programmschleifen.&lt;br /&gt;
* Obwohl es möglich ist, während der Abarbeitung einer Interruptroutine andere oder sogar den gleichen Interrupt wieder zuzulassen, wird davon ohne genaue Kenntnis der internen Abläufe dringend abgeraten.&lt;br /&gt;
&lt;br /&gt;
Interruptroutinen (ISRs) sollten also möglichst kurz sein und keine Schleifen mit vielen Durchläufen enthalten. Längere Operationen können meist in einen &amp;quot;Interrupt-Teil&amp;quot; in einer ISR und einen &amp;quot;Arbeitsteil&amp;quot; im Hauptprogramm aufgetrennt werden. Z.B. Speichern des Zustands aller Eingänge im EEPROM in bestimmten Zeitabständen: ISR-Teil: Zeitvergleich (Timer,RTC) mit Logzeit/-intervall. Bei Übereinstimmung ein globales Flag setzen (volatile bei Flag-Deklaration nicht vergessen, s.u.). Dann im Hauptprogramm prüfen, ob das Flag gesetzt ist. Wenn ja: die Daten im EEPROM ablegen und Flag löschen.&lt;br /&gt;
&lt;br /&gt;
(*)&lt;br /&gt;
Hinweis: &lt;br /&gt;
Es gibt allerdings die seltene Situation, dass man gerade eingelesene&lt;br /&gt;
ADC-Werte sofort verarbeiten muss. Besonders dann, wenn man mehrere Werte sehr&lt;br /&gt;
schnell hintereinander bekommt. Dann bleibt einem nichts anderes übrig, als die&lt;br /&gt;
Werte noch in der ISR zu verarbeiten. Kommt aber sehr selten vor und sollte&lt;br /&gt;
durch geeignete Wahl des Systemtaktes bzw. Auswahl des Controllers vermieden werden!&lt;br /&gt;
&lt;br /&gt;
== Interrupt-Quellen ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse können einen Interrupt auf einem AVR AT90S2313 auslösen, wobei die Reihenfolge der Auflistung auch die Priorität der Interrupts aufzeigt.&lt;br /&gt;
&lt;br /&gt;
* Reset&lt;br /&gt;
* Externer Interrupt 0&lt;br /&gt;
* Externer Interrupt 1&lt;br /&gt;
* Timer/Counter 1 Capture Ereignis&lt;br /&gt;
* Timer/Counter 1 Compare Match&lt;br /&gt;
* Timer/Counter 1 Überlauf&lt;br /&gt;
* Timer/Counter 0 Überlauf&lt;br /&gt;
* UART Zeichen empfangen&lt;br /&gt;
* UART Datenregister leer&lt;br /&gt;
* UART Zeichen gesendet&lt;br /&gt;
* Analoger Komparator&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der möglichen Interruptquellen variiert zwischen den verschiedenen Microcontroller-Typen. Im Zweifel hilft ein Blick ins Datenblatt (&amp;quot;Interrupt Vectors&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Register ==&lt;br /&gt;
&lt;br /&gt;
Der AT90S2313 verfügt über 2 Register die mit den&lt;br /&gt;
Interrupts zusammenhängen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;GIMSK&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;M&#039;&#039;&#039;a&#039;&#039;&#039;sk&#039;&#039;&#039; Register.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit &lt;br /&gt;
| 7 || 6|| 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;INT1&#039;&#039;&#039; || &#039;&#039;&#039;INT0&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W || R/W || R || R || R || R || R || R&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INT1&#039;&#039;&#039; (External &#039;&#039;&#039;Int&#039;&#039;&#039;errupt Request &#039;&#039;&#039;1&#039;&#039;&#039; Enable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am &#039;&#039;&#039;INT1&#039;&#039;&#039;-Pin eine steigende oder fallende (je nach Konfiguration im &#039;&#039;&#039;MCUCR&#039;&#039;&#039;) Flanke erkannt wird.&lt;br /&gt;
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INT0&#039;&#039;&#039; (External &#039;&#039;&#039;Int&#039;&#039;&#039;errupt Request &#039;&#039;&#039;0&#039;&#039;&#039; Enable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am &#039;&#039;&#039;INT0&#039;&#039;&#039;-Pin eine steigende oder fallende (je nach Konfiguration im &#039;&#039;&#039;MCUCR&#039;&#039;&#039;) Flanke erkannt wird.&lt;br /&gt;
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;GIFR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;F&#039;&#039;&#039;lag &#039;&#039;&#039;R&#039;&#039;&#039;egister.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;INTF1&#039;&#039;&#039; || &#039;&#039;&#039;INTF0&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039; || &#039;&#039;&#039;-&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W || R/W || R || R || R || R || R || R&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INTF1&#039;&#039;&#039; (External &#039;&#039;&#039;Int&#039;&#039;&#039;errupt Flag &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird gesetzt, wenn am &#039;&#039;&#039;INT1&#039;&#039;&#039;-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.&lt;br /&gt;
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert &#039;&#039;&#039;1(!)&#039;&#039;&#039; eingeschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INTF0&#039;&#039;&#039; (External &#039;&#039;&#039;Int&#039;&#039;&#039;errupt Flag &#039;&#039;&#039;0&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird gesetzt, wenn am &#039;&#039;&#039;INT0&#039;&#039;&#039;-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.&lt;br /&gt;
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert &#039;&#039;&#039;1(!)&#039;&#039;&#039; eingeschrieben wird.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;MCUCR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;MCU&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister.&lt;br /&gt;
&lt;br /&gt;
Das MCU Control Register enthält Kontrollbits für allgemeine MCU-Funktionen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;SE&#039;&#039;&#039;|| &#039;&#039;&#039;SM&#039;&#039;&#039;|| &#039;&#039;&#039;ISC11&#039;&#039;&#039;|| &#039;&#039;&#039;ISC10&#039;&#039;&#039;|| &#039;&#039;&#039;ISC01&#039;&#039;&#039;|| &#039;&#039;&#039;ISC00&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R || R || R/W || R/W || R/W || R/W || R/W || R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SE&#039;&#039;&#039; (&#039;&#039;&#039;S&#039;&#039;&#039;leep &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Dieses Bit muss gesetzt sein, um den Controller mit dem &#039;&#039;&#039;SLEEP&#039;&#039;&#039;-Befehl in den Schlafzustand versetzen zu können.&lt;br /&gt;
:Um den Schlafmodus nicht irrtümlich einzuschalten, wird empfohlen, das Bit erst unmittelbar vor Ausführung des &#039;&#039;&#039;SLEEP&#039;&#039;&#039;-Befehls zu setzen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SM&#039;&#039;&#039; (&#039;&#039;&#039;S&#039;&#039;&#039;leep &#039;&#039;&#039;M&#039;&#039;&#039;ode)&lt;br /&gt;
:Dieses Bit bestimmt über den Schlafmodus.&lt;br /&gt;
:Ist das Bit gelöscht, so wird der &#039;&#039;&#039;Idle&#039;&#039;&#039;-Modus ausgeführt. Ist das Bit gesetzt, so wird der &#039;&#039;&#039;Power-Down&#039;&#039;&#039;-Modus ausgeführt. (für andere AVR Controller siehe Abschnitt &amp;quot;Sleep-Mode&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISC11&#039;&#039;&#039;, &#039;&#039;&#039;ISC10&#039;&#039;&#039; (&#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;S&#039;&#039;&#039;ense &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;1&#039;&#039;&#039; Bits)&lt;br /&gt;
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am &#039;&#039;&#039;INT1&#039;&#039;&#039;-Pin ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! ISC11 || ISC10 || Bedeutung&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Low Level an &#039;&#039;&#039;INT1&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
&lt;br /&gt;
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Reserviert&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Die fallende Flanke an &#039;&#039;&#039;INT1&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Die steigende Flanke an &#039;&#039;&#039;INT1&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISC01&#039;&#039;&#039;, &#039;&#039;&#039;ISC00&#039;&#039;&#039; (&#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;S&#039;&#039;&#039;ense &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;0&#039;&#039;&#039; Bits)&lt;br /&gt;
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am &#039;&#039;&#039;INT0&#039;&#039;&#039;-Pin ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! ISC01 || ISC00 || Bedeutung&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Low Level an &#039;&#039;&#039;INT0&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
&lt;br /&gt;
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Reserviert&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Die fallende Flanke an &#039;&#039;&#039;INT0&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Die steigende Flanke an &#039;&#039;&#039;INT0&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Allgemeines über die Interrupt-Abarbeitung ==&lt;br /&gt;
&lt;br /&gt;
Wenn ein Interrupt eintrifft, wird automatisch das &#039;&#039;&#039;Global Interrupt Enable&#039;&#039;&#039; Bit im Status Register &#039;&#039;&#039;SREG&#039;&#039;&#039; gelöscht und alle weiteren Interrupts unterbunden. Dieses wird automatisch wieder gesetzt, wenn die Interruptroutine beendet wird. Wenn in der Zwischenzeit weitere Interrupts eintreffen, werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt. Dies kann&lt;br /&gt;
eigentlich nur dann zu Problemen führen, wenn ein hoch priorisierter Interrupt ständig und in kurzer Folge auftritt. Dieser sperrt dann möglicherweise alle anderen Interrupts mit niedrigerer Priorität. Dies ist einer der Gründe, weshalb die Interrupt-Routinen sehr kurz gehalten werden sollen.  Es ist möglich das GIE-Bit in der ISR zu setzen und so schon wieder weitere Interrupts zuzulassen - allerdings sollte man damit vorsichtig sein und genau wissen was man damit macht. Kritisch wird es vor allem wenn der gleiche Interrupt noch einmal kommt, bevor die ISR abgearbeitet ist. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Das Status-Register ===&lt;br /&gt;
&lt;br /&gt;
Es gilt auch zu beachten, dass das Status-Register während der Abarbeitung einer Interruptroutine nicht automatisch gesichert wird. Falls notwendig, muss dies vom Programmierer selber vorgesehen werden. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupts mit avr-gcc ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &#039;&#039;Anmerkung eines Nutzers: Ich habe mir das Thema hier angearbeitet und hatte am Anfang starke Probleme: Jeder Interrupt muss nochmals einzeln aktiviert werden. Es reicht nicht nur per &#039;&#039;sei()&#039;&#039; die Interrupts global zu aktiveren.&#039;&#039; - mthomas: Hoffentlich duch die modifizerte Einleitung etwas offensichtlicher erläutert. Ansonsten bitte per Eintrag auf die Diskussionseite nochmals melden) --&amp;gt; &lt;br /&gt;
&amp;lt;!-- Selbstverständlich können alle interruptspezifischen Registerzugriffe wie gewohnt über I/O-Adressierung vorgenommen werden. Etwas einfacher geht es jedoch, wenn wir die vom Compiler zur Verfügung gestellten Mittel einsetzen.--&amp;gt;&lt;br /&gt;
Funktionen zur Interrupt-Verarbeitung werden in den Includedateien &#039;&#039;interrupt.h&#039;&#039;  der avr-libc zur Verfügung gestellt (bei älterem Quellcode zusätzlich &#039;&#039;signal.h&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fuer sei(), cli() und ISR():&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Makro &#039;&#039;&#039;sei()&#039;&#039;&#039; schaltet die Interrupts ein. Eigentlich wird nichts anderes gemacht, als das &#039;&#039;&#039;Global Interrupt Enable&#039;&#039;&#039; Bit im Status Register gesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    sei();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Makro &#039;&#039;&#039;cli()&#039;&#039;&#039; schaltet die Interrupts aus, oder anders gesagt, das &#039;&#039;&#039;Global Interrupt Enable&#039;&#039;&#039; Bit im Status Register wird gelöscht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    cli();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft steht man vor der Aufgabe, dass eine Codesequenz nicht unterbrochen werden darf. Es liegt dann nahe, zu Beginn dieser Sequenz ein cli() und am Ende ein sei() einzufügen. Dies ist jedoch ungünstig, wenn die Interrupts vor Aufruf der Sequenz deaktiviert waren und danach auch weiterhin deaktiviert bleiben sollen. Ein sei() würde ungeachtet des vorherigen  Zustands die Interrupts aktivieren, was zu unerwünschten Seiteneffekten führen kann. Die aus dem folgenden Beispiel ersichtliche Vorgehensweise ist in solchen Fällen vorzuziehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
void NichtUnterbrechenBitte(void)&lt;br /&gt;
{&lt;br /&gt;
   uint8_t tmp_sreg;  // temporaerer Speicher fuer das Statusregister&lt;br /&gt;
&lt;br /&gt;
   tmp_sreg = SREG;   // Statusregister (also auch das I-Flag darin) sichern&lt;br /&gt;
   cli();             // Interrupts global deaktivieren&lt;br /&gt;
&lt;br /&gt;
   /* hier &amp;quot;unterbrechnungsfreier&amp;quot; Code */&lt;br /&gt;
&lt;br /&gt;
   /* Beispiel Anfang&lt;br /&gt;
     JTAG-Interface eines ATmega16 per Software deaktivieren &lt;br /&gt;
     und damit die JTAG-Pins an PORTC für &amp;quot;general I/O&amp;quot; nutzbar machen&lt;br /&gt;
     ohne die JTAG-Fuse-Bit zu aendern. Dazu ist eine &amp;quot;timed sequence&amp;quot;&lt;br /&gt;
     einzuhalten (vgl Datenblatt ATmega16, Stand 10/04, S. 229): &lt;br /&gt;
     Das JTD-Bit muss zweimal innerhalb von 4 Taktzyklen geschrieben &lt;br /&gt;
     werden. Ein Interrupt zwischen den beiden Schreibzugriffen wuerde &lt;br /&gt;
     die erforderliche Sequenz &amp;quot;brechen&amp;quot;, das JTAG-Interface bliebe&lt;br /&gt;
     weiterhin aktiv und die IO-Pins weiterhin für JTAG reserviert. */&lt;br /&gt;
&lt;br /&gt;
   MCUCSR |= (1&amp;lt;&amp;lt;JTD);&lt;br /&gt;
   MCUCSR |= (1&amp;lt;&amp;lt;JTD); // 2 mal in Folge ,vgl. Datenblatt fuer mehr Information&lt;br /&gt;
&lt;br /&gt;
   /* Beispiel Ende */&lt;br /&gt;
  &lt;br /&gt;
   SREG = tmp_sreg;     // Status-Register wieder herstellen &lt;br /&gt;
                      // somit auch das I-Flag auf gesicherten Zustand setzen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void NichtSoGut(void)&lt;br /&gt;
{&lt;br /&gt;
   cli();&lt;br /&gt;
   &lt;br /&gt;
   /* hier &amp;quot;unterbrechnungsfreier&amp;quot; Code */&lt;br /&gt;
   &lt;br /&gt;
   sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   //...&lt;br /&gt;
&lt;br /&gt;
   cli();  &lt;br /&gt;
   // Interrupts global deaktiviert &lt;br /&gt;
&lt;br /&gt;
   NichtUnterbrechenBitte();&lt;br /&gt;
   // auch nach Aufruf der Funktion deaktiviert&lt;br /&gt;
&lt;br /&gt;
   sei();&lt;br /&gt;
   // Interrupts global aktiviert &lt;br /&gt;
&lt;br /&gt;
   NichtUnterbrechenBitte();&lt;br /&gt;
   // weiterhin aktiviert&lt;br /&gt;
   //...&lt;br /&gt;
&lt;br /&gt;
   /* Verdeutlichung der unguenstigen Vorgehensweise mit cli/sei: */&lt;br /&gt;
   cli();  &lt;br /&gt;
   // Interrupts jetzt global deaktiviert &lt;br /&gt;
&lt;br /&gt;
   NichtSoGut();&lt;br /&gt;
   // nach Aufruf der Funktion sind Interrupts global aktiviert &lt;br /&gt;
   // dies ist mglw. ungewollt!&lt;br /&gt;
   //...&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- mt: besser so nicht(?), lieber &amp;quot;datenblattkonform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;&#039;&#039;&#039;timer_enable_int (unsigned char ints);&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;/font&amp;gt;Schaltet Timerbezogene Interrupts ein bzw. aus.&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn als Argument &#039;&#039;&#039;ints&#039;&#039;&#039; der Wert 0 übergeben wird so werden alle&lt;br /&gt;
Timerinterrupts ausgeschaltet, ansonsten muss in &#039;&#039;&#039;ints&#039;&#039;&#039; angegeben werden,&lt;br /&gt;
welche Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu&lt;br /&gt;
setzenden Bits definiert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispiel: &#039;&#039;&#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;timer_enable_int (1 &amp;lt;&amp;lt; TOIE1));&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&#039;&#039;&#039;Achtung: Wenn ein Timerinterrupt eingeschaltet wird während ein&lt;br /&gt;
anderer Timerinterrupt bereits läuft, dann müssen beide Bits angegeben werden&lt;br /&gt;
sonst wird der andere Timerinterrupt versehentlich ausgeschaltet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;&#039;&#039;&#039;enable_external_int (unsigned char ints);&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;/font&amp;gt;Schaltet die externen Interrupts ein bzw. aus.&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn als Argument &#039;&#039;&#039;ints&#039;&#039;&#039; der Wert 0 übergeben wird so werden alle externen&lt;br /&gt;
Interrrups ausgeschaltet, ansonsten muss in &#039;&#039;&#039;ints&#039;&#039;&#039; angegeben werden, welche&lt;br /&gt;
Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu&lt;br /&gt;
setzenden Bits definiert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispiel: &#039;&#039;&#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;enable_external_int ((1&amp;lt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&#039;&#039;&#039;Schaltet die externen Interrupts 0 und 1 ein.&lt;br /&gt;
&lt;br /&gt;
Nachdem nun die Interrupts aktiviert sind, braucht es selbstverständlich noch den auszuführenden Code, der ablaufen soll, wenn ein Interrupt eintrifft.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Zu den aktivierten Interrupts ist eine Funktion zu programmieren, deren Code aufgerufen wird, wenn der betreffende Interrupt auftritt (Interrupt-Handler, Interrupt-Service-Routine). Dazu existiert die Definition (ein Makro) &#039;&#039;&#039;ISR&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== ISR ===&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;ISR()&#039;&#039; ersetzt bei neueren Versionen der avr-libc &#039;&#039;SIGNAL()&#039;&#039;. SIGNAL sollte nicht mehr genutzt werden, zur Portierung von SIGNAL nach ISR siehe den [[AVR-GCC-Tutorial#Anhang|Anhang]].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
ISR(Vectorname) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &#039;&#039;ISR&#039;&#039; wird eine Funktion für die Bearbeitung eines Interrupts eingeleitet. Als Argument muss dabei die Benennung des entsprechenden Interruptvektors angegeben werden. Diese sind in den jeweiligen Includedateien IOxxxx.h zu finden. Die Bezeichnung entspricht dem Namen aus dem Datenblatt, bei dem die Leerzeichen durch Unterstriche ersetzt sind und ein &#039;&#039;_vect&#039;&#039; angehängt ist.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Ausschnitt aus der Datei für den ATmega8 (bei WinAVR Standardinstallation in C:\WinAVR\avr\include\avr\iom8.h) in der neben den aktuellen Namen für &#039;&#039;ISR&#039;&#039; (*_vect) noch die Bezeichnungen für das inzwischen nicht mehr aktuelle &#039;&#039;SIGNAL&#039;&#039; (SIG_*) enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */&lt;br /&gt;
&lt;br /&gt;
/* avr/iom8.h  - definitions for ATmega8 */&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
/* Interrupt vectors */&lt;br /&gt;
&lt;br /&gt;
/* External Interrupt Request 0 */&lt;br /&gt;
#define INT0_vect                       _VECTOR(1)&lt;br /&gt;
#define SIG_INTERRUPT0                  _VECTOR(1)&lt;br /&gt;
&lt;br /&gt;
/* External Interrupt Request 1 */&lt;br /&gt;
#define INT1_vect                       _VECTOR(2)&lt;br /&gt;
#define SIG_INTERRUPT1                  _VECTOR(2)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter2 Compare Match */&lt;br /&gt;
#define TIMER2_COMP_vect                _VECTOR(3)&lt;br /&gt;
#define SIG_OUTPUT_COMPARE2             _VECTOR(3)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter2 Overflow */&lt;br /&gt;
#define TIMER2_OVF_vect                 _VECTOR(4)&lt;br /&gt;
#define SIG_OVERFLOW2                   _VECTOR(4)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter1 Capture Event */&lt;br /&gt;
#define TIMER1_CAPT_vect                _VECTOR(5)&lt;br /&gt;
#define SIG_INPUT_CAPTURE1              _VECTOR(5)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter1 Compare Match A */&lt;br /&gt;
#define TIMER1_COMPA_vect               _VECTOR(6)&lt;br /&gt;
#define SIG_OUTPUT_COMPARE1A            _VECTOR(6)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter1 Compare Match B */&lt;br /&gt;
#define TIMER1_COMPB_vect               _VECTOR(7)&lt;br /&gt;
#define SIG_OUTPUT_COMPARE1B            _VECTOR(7)&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Vor Nutzung von SIGNAL muss ebenfalls die Header-Datei signal.h eingebunden werden.--&amp;gt; &lt;br /&gt;
Mögliche Funktionsrümpfe für Interruptfunktionen sind zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
/* veraltet: #include &amp;lt;avr/signal.h&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect)       /* veraltet: SIGNAL(SIG_INTERRUPT0) */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// und so weiter und so fort...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf die korrekte Schreibweise der Vektorbezeichnung ist zu achten. Der gcc-Compiler prüft erst ab Version 4.x, ob ein Signal/Interrupt der angegebenen Bezeichnung tatsächlich in der Includedatei definiert ist und gibt andernfalls eine Warnung aus. Bei WinAVR (ab 2/2005) wurde die Überprüfung auch in den mitgelieferten Compiler der Version 3.x integriert. Aus dem gcc-Quellcode Version 3.x selbst erstellte Compiler enthalten die Prüfung nicht (vgl. [[AVR-GCC]]). &lt;br /&gt;
&lt;br /&gt;
Während der Ausführung der Funktion sind alle weiteren Interrupts automatisch gesperrt. Beim Verlassen der Funktion werden die Interrupts wieder zugelassen.&lt;br /&gt;
&lt;br /&gt;
Sollte während der Abarbeitung der Interruptroutine ein weiterer Interrupt (gleiche oder andere Interruptquelle) auftreten, so wird das entsprechende Bit im zugeordneten Interrupt Flag Register gesetzt und die entsprechende Interruptroutine automatisch nach dem Beenden der aktuellen Funktion aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Ein Problem ergibt sich eigentlich nur dann, wenn während der Abarbeitung der aktuellen Interruptroutine mehrere gleichartige Interrupts auftreten. Die entsprechende Interruptroutine wird im Nachhinein zwar aufgerufen jedoch wissen wir nicht, ob nun der entsprechende Interrupt einmal, zweimal oder gar noch öfter aufgetreten ist. Deshalb soll hier noch einmal betont werden, dass Interruptroutinen so schnell wie nur irgend möglich wieder verlassen werden sollten.&lt;br /&gt;
&lt;br /&gt;
=== Unterbrechbare Interruptroutinen ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Faustregel&amp;quot;: im Zweifel &#039;&#039;&#039;ISR&#039;&#039;&#039;. Die nachfolgend beschriebene Methode nur dann verwenden, wenn man sich über die unterschiedliche Funktionsweise im Klaren ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR(XXX,ISR_NOBLOCK) /* veraltet: INTERRUPT(SIG_OVERFLOW0) */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt-Code */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei steht XXX für den oben beschriebenen Namen des Vektors (also z.&amp;amp;nbsp;B. &#039;&#039;TIMER0_OVF_vect&#039;&#039;). Der Unterschied im Vergleich zu einer herkömmlichen ISR ist, dass hier beim Aufrufen der Funktion das &#039;&#039;&#039;Global Enable Interrupt&#039;&#039;&#039; Bit durch Einfügen einer SEI-Anweisung direkt wieder gesetzt und somit alle Interrupts zugelassen werden &amp;amp;ndash; auch XXX-Interrupts. &lt;br /&gt;
&lt;br /&gt;
Bei unsachgemässer Handhabung kann dies zu erheblichen Problemen durch Rekursion wie einem Stack-Overflow oder anderen unerwarteten Effekten führen und sollte wirklich nur dann eingesetzt werden, wenn man sich sicher ist, das Ganze auch im Griff zu haben.&lt;br /&gt;
&lt;br /&gt;
Insbesondere sollte möglichst am ISR-Anfang die auslösende IRQ-Quelle deaktiviert und erst am Ende der ISR wieder aktiviert werden. Robuster als die Verwendung einer NOBLOCK-ISR ist daher folgender ISR-Aufbau:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR (XXX) &lt;br /&gt;
{&lt;br /&gt;
    // Implementiere die ISR ohne zunaechst weitere IRQs zuzulassen&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;&amp;lt;Deaktiviere die XXX-IRQ&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    // Erlaube alle Interrupts (ausser XXX)&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    //... Code ...&lt;br /&gt;
&lt;br /&gt;
    // IRQs global deaktivieren um die XXX-IRQ wieder gefahrlos &lt;br /&gt;
    // aktivieren zu koennen&lt;br /&gt;
    cli();&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;&amp;lt;Aktiviere die XXX-IRQ&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf diese Weise kann sich die XXX-IRQ nicht selbst unterbrechen, was zu einer Art Endlosschleife führen würde.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: Hinweise in [[AVR-GCC]]&lt;br /&gt;
&lt;br /&gt;
siehe dazu: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html&lt;br /&gt;
&lt;br /&gt;
== Datenaustausch mit Interrupt-Routinen ==&lt;br /&gt;
&lt;br /&gt;
Variablen, die sowohl in Interrupt-Routinen (ISR = Interrupt Service Routine(s)) als auch vom übrigen Programmcode geschrieben oder gelesen werden, müssen mit einem &#039;&#039;&#039;volatile&#039;&#039;&#039; deklariert werden. Damit wird dem Compiler mitgeteilt, dass der Inhalt der Variablen vor jedem Lesezugriff aus dem Speicher gelesen und nach jedem Schreibzugriff in den Speicher geschrieben wird. Ansonsten könnte der Compiler den Code so optimieren, dass der Wert der Variablen nur in Prozessorregistern zwischengespeichert wird, die nichts von der Änderung woanders mitbekommen.&lt;br /&gt;
&lt;br /&gt;
Zur Veranschaulichung ein Codefragment für eine Tastenentprellung mit Erkennung einer &amp;quot;lange gedrückten&amp;quot; Taste.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// Schwellwerte&lt;br /&gt;
// Entprellung: &lt;br /&gt;
#define CNTDEBOUNCE 10&lt;br /&gt;
// &amp;quot;lange gedrueckt:&amp;quot;&lt;br /&gt;
#define CNTREPEAT 200&lt;br /&gt;
&lt;br /&gt;
// hier z.&amp;amp;nbsp;B. Taste an Pin2 PortA &amp;quot;active low&amp;quot; = 0 wenn gedrueckt&lt;br /&gt;
#define KEY_PIN  PINA&lt;br /&gt;
#define KEY_PINNO PA2&lt;br /&gt;
&lt;br /&gt;
// beachte: volatile! &lt;br /&gt;
volatile uint8_t gKeyCounter;&lt;br /&gt;
&lt;br /&gt;
// Timer-Compare Interrupt ISR, wird z.B. alle 10ms ausgefuehrt&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
   // hier wird gKeyCounter veraendert. Die übrigen&lt;br /&gt;
   // Programmteile müssen diese Aenderung &amp;quot;sehen&amp;quot;:&lt;br /&gt;
   // volatile -&amp;gt; aktuellen Wert immer in den Speicher schreiben&lt;br /&gt;
   if ( !(KEY_PIN &amp;amp; (1&amp;lt;&amp;lt;KEY_PINNO)) ) {&lt;br /&gt;
      if (gKeyCounter &amp;lt; CNTREPEAT) gKeyCounter++;&lt;br /&gt;
   }&lt;br /&gt;
   else {&lt;br /&gt;
      gKeyCounter = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
//...&lt;br /&gt;
    /* hier: Initialisierung der Ports und des Timer-Interrupts */&lt;br /&gt;
//... &lt;br /&gt;
   // hier wird auf gKeyCounter zugegriffen. Dazu muss der in der&lt;br /&gt;
   // ISR geschriebene Wert bekannt sein:&lt;br /&gt;
   // volatile -&amp;gt; aktuellen Wert immer aus dem Speicher lesen&lt;br /&gt;
   if ( gKeyCounter &amp;gt; CNTDEBOUNCE ) { // Taste mind. 10*10 ms &amp;quot;prellfrei&amp;quot;&lt;br /&gt;
       if (gKeyCounter == CNTREPEAT) {&lt;br /&gt;
          /* hier: Code fuer &amp;quot;Taste lange gedrueckt&amp;quot; */&lt;br /&gt;
       }&lt;br /&gt;
       else {&lt;br /&gt;
          /* hier: Code fuer &amp;quot;Taste kurz gedrueckt&amp;quot; */&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird innerhalb einer ISR mehrfach auf eine mit volatile deklarierte Variable zugegriffen, wirkt sich dies ungünstig auf die Verarbeitungsgeschwindigkeit aus, da bei jedem Zugriff mit dem Speicherinhalt abgeglichen wird. Da bei AVR-Controllern &#039;&#039;innerhalb&#039;&#039; einer ISR keine Unterbrechungen zu erwarten sind, bietet es sich an, einen Zwischenspeicher in Form einer lokalen Variable zu verwenden, deren Inhalt zu Beginn und am Ende mit dem der volatile Variable synchronisiert wird. Lokale Variable werden bei eingeschalteter Optimierung mit hoher Wahrscheinlichkeit in Prozessorregistern verwaltet und der Zugriff darauf ist daher nur mit wenigen internen Operationen verbunden. Die ISR aus dem vorherigen Beispiel lässt sich so optimieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
   uint8_t tmp_kc;&lt;br /&gt;
&lt;br /&gt;
   tmp_kc = gKeyCounter; // Uebernahme in lokale Arbeitsvariable&lt;br /&gt;
&lt;br /&gt;
   if ( !(KEY_PIN &amp;amp; (1&amp;lt;&amp;lt;KEY_PINNO)) ) {&lt;br /&gt;
      if (tmp_kc &amp;lt; CNTREPEAT) {&lt;br /&gt;
         tmp_kc++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else {&lt;br /&gt;
      tmp_kc = 0;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   gKeyCounter = tmp_kc; // Zurueckschreiben&lt;br /&gt;
}&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Vergleich die Disassemblies (Ausschnitte der &amp;quot;lss-Dateien&amp;quot;, compiliert für ATmega162) im Anschluss. Man erkennt den viermaligen Zugriff auf die Speicheraddresse von &#039;&#039;gKeyCounter&#039;&#039; (hier 0x032A) in der ISR ohne &amp;quot;Cache&amp;quot;-Variable und den zweimaligen Zugriff in der Variante mit Zwischenspeicher. Im Beispiel ist der Vorteil gering, bei komplexeren Routinen kann die Zwischenspeicherung in lokalen Variablen jedoch zu deutlicheren Verbesserungen führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
     86a:	1f 92       	push	r1&lt;br /&gt;
     86c:	0f 92       	push	r0&lt;br /&gt;
     86e:	0f b6       	in	r0, 0x3f	; 63&lt;br /&gt;
     870:	0f 92       	push	r0&lt;br /&gt;
     872:	11 24       	eor	r1, r1&lt;br /&gt;
     874:	8f 93       	push	r24&lt;br /&gt;
    if ( !(KEY_PIN &amp;amp; (1&amp;lt;&amp;lt;KEY_PINNO)) ) {&lt;br /&gt;
     876:	ca 99       	sbic	0x19, 2	; 25&lt;br /&gt;
     878:	0a c0       	rjmp	.+20     	; 0x88e &amp;lt;__vector_13+0x24&amp;gt;&lt;br /&gt;
      if (gKeyCounter &amp;lt; CNTREPEAT) gKeyCounter++;&lt;br /&gt;
     87a:	80 91 2a 03 	lds	r24, 0x032A&lt;br /&gt;
     87e:	88 3c       	cpi	r24, 0xC8	; 200 &lt;br /&gt;
     880:	40 f4       	brcc	.+16     	; 0x892 &amp;lt;__vector_13+0x28&amp;gt;&lt;br /&gt;
     882:	80 91 2a 03 	lds	r24, 0x032A&lt;br /&gt;
     886:	8f 5f       	subi	r24, 0xFF	; 255&lt;br /&gt;
     888:	80 93 2a 03 	sts	0x032A, r24&lt;br /&gt;
     88c:	02 c0       	rjmp	.+4      	; 0x892 &amp;lt;__vector_13+0x28&amp;gt;&lt;br /&gt;
   }&lt;br /&gt;
   else {&lt;br /&gt;
      gKeyCounter = 0;&lt;br /&gt;
     88e:	10 92 2a 03 	sts	0x032A, r1&lt;br /&gt;
     892:	8f 91       	pop	r24&lt;br /&gt;
     894:	0f 90       	pop	r0&lt;br /&gt;
     896:	0f be       	out	0x3f, r0	; 63&lt;br /&gt;
     898:	0f 90       	pop	r0&lt;br /&gt;
     89a:	1f 90       	pop	r1&lt;br /&gt;
     89c:	18 95       	reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
     86a:	1f 92       	push	r1&lt;br /&gt;
     86c:	0f 92       	push	r0&lt;br /&gt;
     86e:	0f b6       	in	r0, 0x3f	; 63&lt;br /&gt;
     870:	0f 92       	push	r0&lt;br /&gt;
     872:	11 24       	eor	r1, r1&lt;br /&gt;
     874:	8f 93       	push	r24&lt;br /&gt;
   uint8_t tmp_kc;&lt;br /&gt;
 &lt;br /&gt;
   tmp_kc = gKeyCounter;&lt;br /&gt;
     876:	80 91 2a 03 	lds	r24, 0x032A&lt;br /&gt;
 &lt;br /&gt;
   if ( !(KEY_PIN &amp;amp; (1&amp;lt;&amp;lt;KEY_PINNO)) ) {&lt;br /&gt;
     87a:	ca 9b       	sbis	0x19, 2	; 25&lt;br /&gt;
     87c:	02 c0       	rjmp	.+4      	; 0x882 &amp;lt;__vector_13+0x18&amp;gt;&lt;br /&gt;
     87e:	80 e0       	ldi	r24, 0x00	; 0&lt;br /&gt;
     880:	03 c0       	rjmp	.+6      	; 0x888 &amp;lt;__vector_13+0x1e&amp;gt;&lt;br /&gt;
      if (tmp_kc &amp;lt; CNTREPEAT) {&lt;br /&gt;
     882:	88 3c       	cpi	r24, 0xC8	; 200&lt;br /&gt;
     884:	08 f4       	brcc	.+2      	; 0x888 &amp;lt;__vector_13+0x1e&amp;gt;&lt;br /&gt;
         tmp_kc++;&lt;br /&gt;
     886:	8f 5f       	subi	r24, 0xFF	; 255&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else {&lt;br /&gt;
      tmp_kc = 0;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   gKeyCounter = tmp_kc;&lt;br /&gt;
     888:	80 93 2a 03 	sts	0x032A, r24&lt;br /&gt;
     88c:	8f 91       	pop	r24&lt;br /&gt;
     88e:	0f 90       	pop	r0&lt;br /&gt;
     890:	0f be       	out	0x3f, r0	; 63&lt;br /&gt;
     892:	0f 90       	pop	r0&lt;br /&gt;
     894:	1f 90       	pop	r1&lt;br /&gt;
     896:	18 95       	reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== volatile und Pointer ===&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;volatile&#039;&#039;&#039; in Verbindung mit Pointern ist zu beachten, ob der Pointer selbst oder die Variable, auf die der Pointer zeigt, &#039;&#039;&#039;volatile&#039;&#039;&#039; ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
volatile uint8_t *a;   // das Ziel von a ist volatile&lt;br /&gt;
&lt;br /&gt;
uint8_t *volatile a;   // a selbst ist volatile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls der Pointer volatile ist (zweiter Fall im Beispiel), ist zu beachten, dass der Wert des Pointers, also eine Speicheradresse, intern in mehr als einem Byte verwaltet wird. Lese- und Schreibzugriffe im Hauptprogramm (außerhalb von Interrupt-Routinen) sind daher so zu implementieren, dass alle Teilbytes der Adresse konsistent bleiben, vgl. dazu den folgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
=== Variablen größer 1 Byte ===&lt;br /&gt;
&lt;br /&gt;
Bei Variablen größer ein Byte, auf die in Interrupt-Routinen und im Hauptprogramm zugegriffen wird, muss darauf geachtet werden, dass die Zugriffe auf die einzelnen Bytes außerhalb der ISR nicht durch einen Interrupt unterbrochen werden. (Allgemeinplatz: AVRs sind 8-bit Controller). Zur Veranschaulichung ein Codefragment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
volatile uint16_t gMyCounter16bit;&lt;br /&gt;
//...&lt;br /&gt;
ISR(...)&lt;br /&gt;
{&lt;br /&gt;
//...&lt;br /&gt;
   gMyCounter16Bit++;&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   uint16_t tmpCnt;&lt;br /&gt;
//...&lt;br /&gt;
   // nicht gut: Mglw. hier ein Fehler, wenn ein Byte von MyCounter &lt;br /&gt;
   // schon in tmpCnt kopiert ist aber vor dem Kopieren des zweiten Bytes &lt;br /&gt;
   // ein Interrupt auftritt, der den Inhalt von MyCounter verändert.&lt;br /&gt;
   tmpCnt = gMyCounter16bit; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // besser: Änderungen &amp;quot;außerhalb&amp;quot; verhindern -&amp;gt; alle &amp;quot;Teilbytes&amp;quot;&lt;br /&gt;
   // bleiben konsistent&lt;br /&gt;
   cli();  // Interrupts deaktivieren&lt;br /&gt;
   tmpCnt = gMyCounter16Bit;&lt;br /&gt;
   sei();  // wieder aktivieren&lt;br /&gt;
&lt;br /&gt;
   // oder: vorheriger Status des globalen Interrupt-Flags bleibt erhalten&lt;br /&gt;
   uint8_t sreg_tmp;&lt;br /&gt;
   sreg_tmp = SREG;    /* Sichern */&lt;br /&gt;
   cli()&lt;br /&gt;
   tmpCnt = gMyCounter16Bit;&lt;br /&gt;
   SREG = sreg_tmp;    /* Wiederherstellen */&lt;br /&gt;
&lt;br /&gt;
   // oder: mehrfach lesen, bis man konsistente Daten hat&lt;br /&gt;
   uint16_t count1 = gMyCounter16Bit;&lt;br /&gt;
   uint16_t count2 = gMyCounter16Bit;&lt;br /&gt;
   while (count1 != count2) {&lt;br /&gt;
       count1 = count2;&lt;br /&gt;
       count2 = gMyCounter16Bit;&lt;br /&gt;
   }&lt;br /&gt;
   tmpCnt = count1;&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die avr-libc bietet ab Version 1.6.0(?) einige Hilfsfunktionen/Makros, mit der im Beispiel oben gezeigten Funktionalität, die zusätzlich auch sogenannte [http://en.wikipedia.org/wiki/Memory_barrier memory barriers] beinhalten. Diese stehen nach #include &amp;lt;util/atomic.h&amp;gt; zur Verfügung.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
#include &amp;lt;util/atomic.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
    // analog zu cli, Zugriff, sei:&lt;br /&gt;
    ATOMIC_BLOCK(ATOMIC_FORCEON) {&lt;br /&gt;
        tmpCnt = gMyCounter16Bit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// oder:&lt;br /&gt;
&lt;br /&gt;
    // analog zu Sicherung des SREG, cli, Zugriff und Zurückschreiben des SREG:&lt;br /&gt;
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {&lt;br /&gt;
        tmpCnt = gMyCounter16Bit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* siehe auch [http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html Dokumentation der avr-libc zu atomic.h]&lt;br /&gt;
&lt;br /&gt;
== Interrupt-Routinen und Registerzugriffe ==&lt;br /&gt;
&lt;br /&gt;
Falls Register sowohl im Hauptprogramm als auch in Interrupt-Routinen verändert werden, ist darauf zu achten, dass diese Zugriffe sich nicht überlappen. Nur wenige Anweisungen lassen sich in sogenannte &amp;quot;atomare&amp;quot; Zugriffe übersetzen, die nicht von Interrupt-Routinen unterbrochen werden können. &lt;br /&gt;
&lt;br /&gt;
Zur Veranschaulichung eine Anweisung, bei der ein Bit und im Anschluss drei Bits in einem Register gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
//...&lt;br /&gt;
	PORTA |= (1&amp;lt;&amp;lt;PA0);&lt;br /&gt;
	&lt;br /&gt;
	PORTA |= (1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3)|(1&amp;lt;&amp;lt;PA4);&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Compiler übersetzt diese Anweisungen für einen ATmega128 bei Optimierungsstufe &amp;quot;S&amp;quot; nach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
        PORTA |= (1&amp;lt;&amp;lt;PA0);&lt;br /&gt;
  d2:	d8 9a       	sbi	0x1b, 0	; 27 (a)&lt;br /&gt;
	&lt;br /&gt;
        PORTA |= (1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3)|(1&amp;lt;&amp;lt;PA4);&lt;br /&gt;
  d4:	8b b3       	in	r24, 0x1b	; 27 (b)&lt;br /&gt;
  d6:	8c 61       	ori	r24, 0x1C	; 28 (c)&lt;br /&gt;
  d8:	8b bb       	out	0x1b, r24	; 27 (d)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Setzen des einzelnen Bits wird bei eingeschalteter Optimierung für Register im unteren Speicherbereich in eine einzige Assembler-Anweisung (sbi) übersetzt und ist nicht anfällig für Unterbrechungen durch Interrupts. Die Anweisung zum Setzen von drei Bits wird jedoch in drei abhängige Assembler-Anweisungen übersetzt und bietet damit zwei &amp;quot;Angriffspunkte&amp;quot; für Unterbrechungen. Eine Interrupt-Routine könnte nach dem Laden des Ausgangszustands in den Zwischenspeicher (hier Register 24) den Wert des Registers ändern, z.&amp;amp;nbsp;B. ein Bit löschen. Damit würde der Zwischenspeicher nicht mehr mit dem tatsächlichen Zustand übereinstimmen aber dennoch nach der Bitoperation (hier ori) in das Register zurückgeschrieben. &lt;br /&gt;
&lt;br /&gt;
Beispiel: PORTA sei anfangs 0b00000000. Die erste Anweisung (a) setzt Bit 0 auf &#039;&#039;&#039;1&#039;&#039;&#039;, PORTA ist danach 0b0000000&#039;&#039;&#039;1&#039;&#039;&#039;. Nun wird im ersten Teil der zweiten Anweisung der Portzustand in ein Register eingelesen (b). Unmittelbar darauf (vor (c)) &amp;quot;feuert&amp;quot; ein Interrupt, in dessen Interrupt-Routine Bit 0 von PORTA gelöscht wird. Nach Verlassen der Interrupt-Routine hat PORTA den Wert 0b00000000. In den beiden noch folgenden Anweisungen des Hauptprogramms wird nun der zwischengespeicherte &amp;quot;alte&amp;quot; Zustand 0b00000001 mit 0b00011100 logisch-&#039;&#039;&#039;ODER&#039;&#039;&#039;-verknüft (c) und das Ergebnis 0b00011101 in PortA geschrieben (d). Obwohl zwischenzeitlich Bit 0 gelöscht wurde, ist es nach (d) wieder gesetzt. &lt;br /&gt;
&lt;br /&gt;
Lösungsmöglichkeiten:&lt;br /&gt;
* Register ohne besondere Vorkehrungen nicht in Interruptroutinen &#039;&#039;und&#039;&#039; im Hauptprogramm verändern.&lt;br /&gt;
* Interrupts vor Veränderungen in Registern, die auch in ISRs verändert werden, deaktivieren (&amp;quot;cli&amp;quot;).&lt;br /&gt;
* Bits einzeln löschen oder setzen. sbi und cbi können nicht unterbrochen werden. Vorsicht: nur Register im unteren Speicherbereich sind mittels sbi/cbi ansprechbar. Der Compiler kann nur für diese sbi/cbi-Anweisungen generieren. Für Register außerhalb dieses Adressbereichs (&amp;quot;Memory-Mapped&amp;quot;-Register) werden auch zur Manipulation einzelner Bits abhängige Anweisungen erzeugt (lds,...,sts).&lt;br /&gt;
&lt;br /&gt;
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Frequently asked Questions/Fragen Nr. 1 und 8. (Stand: avr-libc Vers. 1.0.4)&lt;br /&gt;
&lt;br /&gt;
== Interruptflags löschen ==&lt;br /&gt;
&lt;br /&gt;
Beim Löschen von Interruptflags haben AVRs eine Besonderheit, die auch im Datenblatt beschrieben ist: Es wird zum Löschen eine 1 in das betreffende Bit geschrieben. &lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br /&amp;gt;&lt;br /&gt;
Bei Registern mit mehreren Interrupt-Flag-Bits (wie die Timer Interrupt Flag Register)  &#039;&#039;&#039;nicht&#039;&#039;&#039;  die übliche bitweise VerODERung nehmen, sondern eine direkte Zuweisung machen. Da sonst weitere Flags, als nur das gewünschte, ebenfalls gelöscht werden könnten.&amp;lt;br /&amp;gt;&lt;br /&gt;
([http://www.mikrocontroller.net/topic/171148#1640133 Erklärung]).&lt;br /&gt;
&lt;br /&gt;
== Was macht das Hauptprogramm? ==&lt;br /&gt;
&lt;br /&gt;
Im einfachsten (Ausnahme-)Fall gar nichts mehr. Es ist also durchaus denkbar, ein Programm zu schreiben, welches in der main-Funktion lediglich noch die Interrupts aktiviert und dann in einer Endlosschleife verharrt. Sämtliche Funktionen werden dann in den ISRs abgearbeitet. Diese Vorgehensweise ist jedoch bei den meisten Anwendungen schlecht: man verschenkt eine Verarbeitungsebene und hat außerdem möglicherweise Probleme durch Interruptroutinen, die zu viel Verarbeitungszeit benötigen.&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird man in den Interruptroutinen nur die bei Auftreten des jeweiligen Interruptereignisses unbedingt notwendigen Operationen ausführen lassen. Alle weniger kritischen Aufgaben werden dann im Hauptprogramm abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Interrupts and Signals&lt;br /&gt;
&lt;br /&gt;
= Sleep-Modes =&lt;br /&gt;
&lt;br /&gt;
AVR Controller verfügen über eine Reihe von sogenannten [[Sleep Mode |&#039;&#039;Sleep-Modes&#039;&#039;]] (&amp;quot;Schlaf-Modi&amp;quot;). Diese ermöglichen es, Teile des Controllers abzuschalten. Zum Einen kann damit besonders bei Batteriebetrieb Strom gespart werden, zum Anderen können Komponenten des Controllers deaktiviert werden, die die Genauigkeit des Analog-Digital-Wandlers bzw. des Analog-Comparators negativ beeinflussen. Der Controller wird durch Interrupts aus dem Schlaf geweckt. Welche Interrupts den jeweiligen Schlafmodus beenden, ist einer Tabelle im Datenblatt des jeweiligen Controllers zu entnehmen.&lt;br /&gt;
Die Funktionen (eigentlich Makros) der avr-libc stehen nach Einbinden der header-Datei &#039;&#039;sleep.h&#039;&#039; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
;set_sleep_mode (uint8_t mode): Setzt den Schlafmodus, der bei Aufruf von sleep() aktiviert wird. In sleep.h sind einige Konstanten definiert (z.&amp;amp;nbsp;B. SLEEP_MODE_PWR_DOWN). Die definierten Modi werden jedoch nicht alle von sämtlichten AVR-Controllern unterstützt.&lt;br /&gt;
;sleep_enable(): Aktiviert den gesetzten Schlafmodus, versetzt den Controller aber noch nicht in den Schlafmodus&lt;br /&gt;
;sleep_cpu(): Versetzt den Controller in den Schlafmodus .sleep_cpu wird im Prinzip durch die Assembler-Anweisung &#039;&#039;sleep&#039;&#039; ersetzt.&lt;br /&gt;
;sleep_disable(): Deaktiviert den gesetzten Schlafmodus&lt;br /&gt;
;sleep_mode(): Versetzt den Controller in den mit set_sleep_mode gewählten Schlafmodus. Das Makro entspricht sleep_enable()+sleep_cpu()+sleep_disable(), beinhaltet also nicht die Aktivierung von Interrupts (besser nicht benutzen).&lt;br /&gt;
&lt;br /&gt;
Bei Anwendung von sleep_cpu() müssen Interrupts also bereits freigeben sein (sei()), da der Controller sonst nicht mehr &amp;quot;aufwachen&amp;quot; kann. sleep_mode() ist nicht geeignet für die Verwendung in ISR Interrupt-Service-Routinen, da bei deren Abarbeitung Interrupts global deaktiviert sind und somit auch die möglichen &amp;quot;Aufwachinterrupts&amp;quot;. Abhilfe: stattdessen sleep_enable(), sei(), sleep_cpu(), sleep_disable() und evtl. cli() verwenden (vgl. Dokumentation der avr-libc).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
...&lt;br /&gt;
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);&lt;br /&gt;
      sleep_mode();&lt;br /&gt;
   &lt;br /&gt;
      // Code hier wird erst nach Auftreten eines entsprechenden&lt;br /&gt;
      // &amp;quot;Aufwach-Interrupts&amp;quot; verarbeitet&lt;br /&gt;
...&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In älteren Versionenen der avr-libc wurden nicht alle AVR-Controller durch die sleep-Funktionen richtig angesteuert. Mit avr-libc 1.2.0 wurde die Anzahl der unterstützten Typen jedoch deutlich erweitert. Bei nicht-unterstützten Typen erreicht man die gewünschte Funktionalität durch direkte &amp;quot;[[Bitmanipulation]]&amp;quot; der entsprechenden Register (vgl. Datenblatt) und Aufruf des Sleep-Befehls via Inline-Assembler oder sleep_cpu():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
   // Sleep-Mode &amp;quot;Power-Save&amp;quot; beim ATmega169 &amp;quot;manuell&amp;quot; aktivieren&lt;br /&gt;
   SMCR = (3&amp;lt;&amp;lt;SM0) | (1&amp;lt;&amp;lt;SE);&lt;br /&gt;
   asm volatile (&amp;quot;sleep&amp;quot;::); // alternativ sleep_cpu() aus sleep.h&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sleep Modi ==&lt;br /&gt;
Zu beachten ist, dass unterschiedliche Prozessoren aus der AVR Familie unterschiedliche Sleep-Modi unterstützen oder nicht unterstützen. Auskunft über die tatsächlichen Gegebenheiten gibt, wie immer, das zum Prozessor gehörende Datenblatt. Die unterschiedlichen Modi unterscheiden sich dadurch, welche Bereiche des Prozessors abgeschaltet werden. Damit korrespondiert unmittelbar welche Möglichkeiten es gibt, den Prozessor aus den jeweiligen Sleep Modus wieder aufzuwecken.&lt;br /&gt;
&lt;br /&gt;
;Idle Mode (SLEEP_MODE_IDLE): Die CPU kann durch SPI, USART, Analog Comperator, ADC, TWI, Timer, Watchdog und irgendeinen anderen Interrupt wieder aufgeweckt werden.&lt;br /&gt;
&lt;br /&gt;
;ADC Noise Reduction Mode (SLEEP_MODE_ADC): In diesem Modus liegt das Hauptaugenmerk darauf, die CPU soweit stillzulegen, dass der ADC möglichst keine Störungen aus dem inneren der CPU auffangen kann. Aufwachen aus diesem Modus kann ausgelöst werden durch den ADC, externe Interrupts, TWI, Timer und Watchdog.&lt;br /&gt;
&lt;br /&gt;
;Power-Down Mode (SLEEP_MODE_PWR_DOWN): In diesem Modus wird ein externer Oszillator (Quarz, Quarzoszillator) gestoppt. Geweckt werden kann die CPU durch einen externen Level Interrupt, TWI, Watchdog, Brown-Out-Reset&lt;br /&gt;
&lt;br /&gt;
;Power-Save-Mode (SLEEP_MODE_PWR_SAVE): Power-Save ist identisch zu Power-Down mit einer Ausnahme: Ist der Timer 2 auf die Verwendung eines externen Taktes konfiguriert, so läuft dieser Timer auch im Power-Save weiter und kann die CPU mit einem Interrupt aufwecken.&lt;br /&gt;
&lt;br /&gt;
;Standby-Mode (SLEEP_MODE_STANDBY, SLEEP_MODE_EXT_STANDBY): Voraussetzung für den Standby-Modus ist die Verwendung eines Quarzes oder eines Quarzoszillators (also einer externen Taktquelle). Ansonsten ist dieser Modus identisch zum Power-Down Modus. Vorteil dieses Modus ist eine kürzere Aufwachzeit.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Power Management and Sleep-Modes&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/96369#832712 Forenbeitrag] zur &amp;quot;Nichtverwendung&amp;quot; von sleep_mode in ISRs.&lt;br /&gt;
&lt;br /&gt;
= Zeiger =&lt;br /&gt;
Zeiger (engl. &#039;&#039;Pointer&#039;&#039;) sind Variablen, die die Adresse von Daten oder Funktionen enthalten und belegen 16 Bits. Die Größe hängt mit dem adressierbaren Speicherbereich zusammen und der GCC reserviert dann den entsprechenden Platz.&lt;br /&gt;
Ggf. ist es also günstiger, Indizes auf Arrays (Listen) zu verwenden, so dass der GCC für die Zeigerarithmetik den erforderlichen RAM nur temporär benötigt.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Zeiger]]&lt;br /&gt;
&lt;br /&gt;
= Speicherzugriffe =&lt;br /&gt;
&lt;br /&gt;
Atmel AVR-Controller verfügen typisch über drei Speicher:&lt;br /&gt;
&lt;br /&gt;
* [[RAM]]: Im RAM (genauer statisches RAM/SRAM) wird vom gcc-Compiler Platz für Variablen reserviert. Auch der Stack befindet sich im RAM. Dieser Speicher ist &amp;quot;flüchtig&amp;quot;, d.h. der Inhalt der Variablen geht beim Ausschalten oder einem Zusammenbruch der Spannungsversorgung verloren.&lt;br /&gt;
&lt;br /&gt;
* Programmspeicher: Ausgeführt als FLASH-Speicher, seitenweise wiederbeschreibbar. Darin ist das Anwendungsprogramm abgelegt.&lt;br /&gt;
&lt;br /&gt;
* [[EEPROM]]: Nichtflüchtiger Speicher, d.h. der einmal geschriebene Inhalt bleibt auch ohne Stromversorgung erhalten. Byte-weise schreib/lesbar. Im EEPROM werden typischerweise gerätespezifische Werte wie z.&amp;amp;nbsp;B. Kalibrierungswerte von Sensoren abgelegt.&lt;br /&gt;
&lt;br /&gt;
Einige AVRs besitzen keinen RAM-Speicher, lediglich die Register können als &amp;quot;Arbeitsvariablen&amp;quot;&lt;br /&gt;
genutzt werden. Da die Anwendung des avr-gcc auf solch &amp;quot;kleinen&amp;quot; Controllern ohnehin selten sinnvoll ist und auch nur bei einigen RAM-losen Typen nach [http://lightner.net/avr/ATtinyAvrGcc.html &amp;quot;Bastelarbeiten&amp;quot;] möglich ist, werden diese Controller hier nicht weiter berücksichtigt. Auch EEPROM-Speicher ist nicht auf allen Typen verfügbar. Generell sollten die nachfolgenden Erläuterungen auf alle ATmega-Controller und die größeren AT90-Typen übertragbar sein. Für die Typen ATtiny2313, ATtiny26 und viele weitere der &amp;quot;ATtiny-Reihe&amp;quot; gelten die Ausführungen ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [[Binäre Daten zum Programm hinzufügen]]&lt;br /&gt;
== RAM ==&lt;br /&gt;
&lt;br /&gt;
Die Verwaltung des RAM-Speichers erfolgt durch den Compiler, im Regelfall ist beim Zugriff auf Variablen im RAM nichts Besonderes zu beachten. Die Erläuterungen in jedem brauchbaren C-Buch gelten auch für den vom avr-gcc-Compiler erzeugten Code.&lt;br /&gt;
&lt;br /&gt;
Um Speicher dynamisch (während der Laufzeit) zu reservieren, kann &#039;&#039;&#039;malloc()&#039;&#039;&#039; verwendet werden. malloc(size) &amp;quot;alloziert&amp;quot; (~reserviert) einen gewissen Speicherblock mit &#039;&#039;&#039;size&#039;&#039;&#039; Bytes. Ist kein Platz für den neuen Block, wird NULL (0) zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Wird der angelegte Block zu klein (groß), kann die Größe mit realloc() verändert werden. Den allozierten Speicherbereich kann man mit free() wieder freigeben. Wenn das Freigeben eines Blocks vergessen wird spricht man von einem &amp;quot;Speicherleck&amp;quot; (memory leak).&lt;br /&gt;
&lt;br /&gt;
malloc() legt Speicherblöcke im &#039;&#039;&#039;Heap&#039;&#039;&#039; an, belegt man zuviel Platz, dann wächst der Heap zu weit nach oben und überschreibt den Stack, und der Controller kommt in Teufels Küche. Das kann leider nicht nur passieren wenn man insgesamt zu viel Speicher anfordert, sondern auch wenn man Blöcke unterschiedlicher Größe in ungünstiger Reihenfolge alloziert/freigibt (siehe Artikel [[Heap-Fragmentierung]]). Aus diesem Grund sollte man malloc() auf Mikrocontrollern sehr sparsam (am besten gar nicht) verwenden.&lt;br /&gt;
&lt;br /&gt;
Beispiel zur Verwendung von malloc():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void foo(void) {&lt;br /&gt;
  // neuen speicherbereich anlegen,&lt;br /&gt;
  // platz für 10 uint16&lt;br /&gt;
  uint16_t* pBuffer = malloc(10 * sizeof(uint16_t));&lt;br /&gt;
&lt;br /&gt;
  // darauf zugreifen, als wärs ein gewohnter Buffer&lt;br /&gt;
  pBuffer[2] = 5;&lt;br /&gt;
&lt;br /&gt;
  // Speicher (unbedingt!) wieder freigeben&lt;br /&gt;
  free(pBuffer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn (wie in obigem Beispiel) dynamischer Speicher nur für die Dauer einer Funktion benötigt und am Ende wieder freigegeben wird, bietet es sich an, statt malloc() &#039;&#039;&#039;alloca()&#039;&#039;&#039; zu verwenden. Der Unterschied zu malloc() ist, dass der Speicher auf dem Stack reserviert wird, und beim Verlassen der Funktion automatisch wieder freigegeben wird. Es kann somit kein Speicherleck und keine Fragmentierung entstehen.&lt;br /&gt;
&lt;br /&gt;
siehe auch:&lt;br /&gt;
* http://www.nongnu.org/avr-libc/user-manual/malloc.html&lt;br /&gt;
&lt;br /&gt;
== Flash mit PROGMEM und pgm_read ==&lt;br /&gt;
&lt;br /&gt;
→ [http://nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html avr-libc: Doku zu avr/pgmspace.h]&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf Konstanten im Programmspeicher ist mittels avr-gcc erst ab Version 4.7 &amp;quot;transparent&amp;quot; möglich. Um Daten aus dem Flash zu lesen, muss die AVR-Instruktion LPM (&#039;&#039;Load from Program Memory&#039;&#039;) erzeugt werden, bei Controllern mit mehr als 64kiB Flash auch ELMP.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt es das AVR-spezifische GCC-Attribut &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt;, mit dem eine Variablendeklaration im &#039;&#039;static storage&#039;&#039;&amp;lt;ref&amp;gt;Variablen der Speicherklasse &#039;&#039;static storage&#039;&#039; haben eine unbegrenzte Lebensdauer.  Beispiel für solche Variablen sind globale Variablen, aber auch static-Variablen innerhalb einer Funktion gehören dazu.  Beispiele für Variablen, die nicht &#039;&#039;static storage&#039;&#039; sind: auto-Variablen (&amp;quot;normale&amp;quot; lokale Variablen), register-Variablen, durch malloc geschaffene Objekte, etc.&amp;lt;/ref&amp;gt; markiert werden kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
const int value __attribute__((progmem)) = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Effekt ist, dass die so markierte Variable nicht im RAM sondern im Flash angelegt wird.  Wird durch &amp;quot;normalen&amp;quot; C-Code auf solch eine Variable zugegriffen, wird jedoch aus dem RAM gelesen und nicht aus dem Flash!&lt;br /&gt;
&lt;br /&gt;
Zum Lesen aus dem Flash stellt die avr-libc daher zahlreiche Makros zur Verfügung.  Zudem wird das Makro &amp;lt;tt&amp;gt;PROGMEM&amp;lt;/tt&amp;gt; definiert, das etwas Tipparbeit spart:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const int value PROGMEM = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt; funktioniert im Wesentlichen wie ein Section-Attribut, das die Daten in der Section &amp;lt;tt&amp;gt;.progmem.data&amp;lt;/tt&amp;gt; ablegt.  Im Gegensatz zum Section-Attribut werden jedoch noch weitere Prüfungen unternommen, ab avr-gcc 4.6 etwa muss die entsprechende Variable &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; sein.&lt;br /&gt;
&lt;br /&gt;
=== Integer und float ===&lt;br /&gt;
&lt;br /&gt;
Zum Lesen von Skalaren stellt die avr-libc folgende Makros zu Verfügung, die jeweils ein Argument erhalten: Die 16-Bit Adresse des zu lesenden Wertes&amp;lt;ref&amp;gt;Damit ist der mögliche Speicherbereich für Flash-Konstanten auf 64kiB begrenzt. Einige pgmspace-Funktionen ermöglichen den Lesezugriff auf den gesamten Flash-Speicher, intern via Assembler-Anweisung ELPM. Die Initialisierungswerte des Speicherinhalts jenseits der 64kiB-Marke müssen dann jedoch auf anderem Weg angelegt werden, d.h. nicht per PROGMEM. Evtl. eigene Section und Linker-Optionen. Alt und nicht ganz korrekt: Die avr-libc pgmspace-Funktionen unterstützen nur die unteren 64kiB Flash bei Controllern mit mehr als 64kiB.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{| {{Tabelle}}&lt;br /&gt;
|+ Übersicht der &amp;lt;tt&amp;gt;pgm_read&amp;lt;/tt&amp;gt; Funktionen aus&amp;lt;br/&amp;gt;dem Header &amp;lt;tt&amp;gt;avr/pgmspace.h&amp;lt;/tt&amp;gt; der avr-libc&lt;br /&gt;
|-&lt;br /&gt;
! Gelesener Wert || &amp;lt;tt&amp;gt;pgm_read_xxx&amp;lt;/tt&amp;gt; || Anzahl Bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;uint8_t&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;pgm_read_byte&amp;lt;/tt&amp;gt; || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;uint16_t&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;pgm_read_word&amp;lt;/tt&amp;gt; || 2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;pgm_read_dword&amp;lt;/tt&amp;gt; || 4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;pgm_read_float&amp;lt;/tt&amp;gt;&amp;lt;ref&amp;gt;ab avr-libc 1.7.0&amp;lt;/ref&amp;gt; || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Soll ein Zeiger gelesen werden, so verwendet man &amp;lt;tt&amp;gt;pgm_read_word&amp;lt;/tt&amp;gt; und castet das Ergebnis zum gewünschten Zeiger-Typ.&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Byte */&lt;br /&gt;
const uint8_t aByte PROGMEM = 123;&lt;br /&gt;
&lt;br /&gt;
/* int-Array */&lt;br /&gt;
const int anArray[] PROGMEM = { 18, 3 ,70 };&lt;br /&gt;
&lt;br /&gt;
void foo (void)&lt;br /&gt;
{&lt;br /&gt;
  /* Zeiger */&lt;br /&gt;
  static const uint8_t* const aPointer PROGMEM = &amp;amp;aByte;&lt;br /&gt;
&lt;br /&gt;
  uint8_t a        = pgm_read_byte (&amp;amp;aByte);&lt;br /&gt;
  int a2           = (int) pgm_read_word (&amp;amp;anArray[2]);&lt;br /&gt;
  const uint8_t* p = (const uint8_t*) pgm_read_word (&amp;amp;aPointer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blöcke ===&lt;br /&gt;
&lt;br /&gt;
In den Flash-Funktionen der avr-libc sind keine der pgm_read_xxxx Nomenklatur folgenden Funktionen, die Speicherblöcke auslesen oder vergleichen. Die enstprechende Funktionen sind Varianten von &amp;lt;tt&amp;gt;memcpy&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;memcmp&amp;lt;/tt&amp;gt; und heißt &amp;lt;tt&amp;gt;memcpy_P&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;memcmp_P&amp;lt;/tt&amp;gt;, usw.  Für weitere Funktionen und deren Prototypen siehe die Dokumentation der avr-libc.&lt;br /&gt;
&lt;br /&gt;
=== Strings ===&lt;br /&gt;
&lt;br /&gt;
Strings sind in C nichts anderes als eine Abfolge von Zeichen und einem &amp;lt;tt&amp;gt;&#039;\0&#039;&amp;lt;/tt&amp;gt; als Stringende. Der prinzipielle Weg ist daher identisch zum  Lesen von Bytes, wobei auf die [[FAQ#Wie funktioniert String-Verarbeitung in C?|Besonderheiten von Strings]] wie 0-Terminierung geachtet werden muss.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
size_t my_string_length (const char* addr)&lt;br /&gt;
{&lt;br /&gt;
    size_t length = 0;&lt;br /&gt;
&lt;br /&gt;
    while (pgm_read_byte (addr++))&lt;br /&gt;
    {&lt;br /&gt;
        len++;&lt;br /&gt;
    }&lt;br /&gt;
    return length;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung des Programmierers steht das Repertoire der str-Funktionen auch in jeweils eine Variante zur Verfügung, die mit dem Flash-Speicher arbeiten kann. Die Funktionsnamen tragen den Suffix &amp;lt;tt&amp;gt;_P&amp;lt;/tt&amp;gt;. Darüber hinaus gibt es das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt;, das ein String-Literal im Flash-Speicher ablegt und die Adresse des Strings liefert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Liefert true zurück, wenn string_im_ram gleich &amp;quot;Hallo Welt&amp;quot; ist. */&lt;br /&gt;
int foo (const char* string_im_ram)&lt;br /&gt;
{&lt;br /&gt;
    return strcmp_P (string_im_ram, PSTR (&amp;quot;Hallo Welt&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; nur innerhalb von Funktionen verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
; Array aus Strings:&lt;br /&gt;
&lt;br /&gt;
Arrays aus Strings im Flash-Speicher werden in zwei Schritten angelegt:&lt;br /&gt;
&lt;br /&gt;
# Zuerst die einzelnen Elemente des Arrays und&lt;br /&gt;
# im Anschluss ein Array, in dem die Startaddressen der Strings abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen wird zuerst die Adresse des gewünschten Elements aus dem Array im Flash-Speicher gelesen, die im Anschluss dazu genutzt wird, um auf das Element (den String) selbst zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static const char str1[] PROGMEM = &amp;quot;Hund&amp;quot;;&lt;br /&gt;
static const char str2[] PROGMEM = &amp;quot;Katze&amp;quot;;&lt;br /&gt;
static const char str3[] PROGMEM = &amp;quot;Maus&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const char * const array[] PROGMEM = &lt;br /&gt;
{&lt;br /&gt;
   str1, str2, str3&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]&lt;br /&gt;
void read_string (char* buf, size_t i)&lt;br /&gt;
{&lt;br /&gt;
    // Lese die Adresse des i-ten Strings aus array[]&lt;br /&gt;
    const char *parray = (const char*) pgm_read_word (&amp;amp;array[i]);&lt;br /&gt;
&lt;br /&gt;
    // Kopiere den Inhalt der Zeichenkette vom Flash ins RAM&lt;br /&gt;
    strcpy_P (buf, parray);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist, die Strings in einem 2-dimensionalen char-Array abzulegen anstatt deren Adresse in einem 1-dimensionalen Adress-Array zu speichern.&lt;br /&gt;
&lt;br /&gt;
Vorteil ist, dass der Code einfacher wird.  Nachteil ist, dass bei unterschiedlich langen Strings Speicherplatz verschwendet wird, weil sich die Array-Dimension and der Länge des längsten Strings orientieret.  Bei in etwa gleich langen Strings kann es aber sogar Speicherplatz sparen, denn es die Adressen der einzelnen Strings müssen nicht abgespeichert werden.&amp;lt;ref&amp;gt;In unserem Hund-Katze-Maus Beispiel belegt die erste Variante 22 Bytes Daten und 18 Bytes Code, die zweite Variante mit 2-dimensionalem Array belegt 18 Bytes Daten und 20 Bytes Code. Gemessen wurde mit avr-gcc 4.8 -Os für ATmega8.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Die &amp;quot;6&amp;quot; ist 1 plus die Länge des längsten Strings (&amp;quot;Katze&amp;quot;)&lt;br /&gt;
const char array[][6] PROGMEM = &lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;Hund&amp;quot;, &amp;quot;Katze&amp;quot;, &amp;quot;Maus&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]&lt;br /&gt;
void read_string (char* buf, size_t i)&lt;br /&gt;
{&lt;br /&gt;
    // Kopiere den Inhalt der i-ten Zeichenkette vom Flash ins RAM&lt;br /&gt;
    strcpy_P (buf, array[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch die avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array How do I put an array of strings completely in ROM?]&lt;br /&gt;
&lt;br /&gt;
=== Warum so kompliziert? ===&lt;br /&gt;
&lt;br /&gt;
Zu dem Thema, warum die Verabeitung von Werten aus dem Flash-Speicher so kompliziert ist, sei hier nur kurz erläutert: Die Harvard-Architektur des AVR weist getrennte Adressräume für Programm (Flash) und Datenspeicher (RAM) auf. Der C-Standard sieht keine unterschiedlichen Adressräume vor.&lt;br /&gt;
&lt;br /&gt;
Hat man zum Beispiel eine Funktion string_an_uart (const char* s) und übergibt an diese Funktion die Adresse einer Zeichenkette, dann weiß die Funktion nicht, ob die Adresse in den Flash-Speicher oder das RAM zeigt. Weder aus dem Pointer-Wert, also dem Zahlenwert, noch aus dem &amp;quot;const&amp;quot; kann auf den Ort der Ablage geschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Einige AVR-Compiler bilden die Harvard-Architektur ab, indem sie in einen Pointer nicht nur die Adresse speichern, sondern auch den Ablageort wie &#039;&#039;Flash&#039;&#039; oder &#039;&#039;RAM&#039;&#039;. In einem Aufruf einer Funktion wird dann bei Pointer-Parametern neben der Adresse auch der Speicherbereich, auf den der Pointer zeigt, übergeben.&lt;br /&gt;
&lt;br /&gt;
Dies hat jedoch auch Nachteile, denn bei jedem Zugriff über einen Zeiger muss zur &#039;&#039;Laufzeit&#039;&#039; entschieden werden, wie der Zugriff auszuführen ist und entsprechend länglicher und langsamer wird der erzeugte Code.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitte Modules/Program Space String Utilities und Abschnitt Modules/Bootloader Support Utilities&lt;br /&gt;
&lt;br /&gt;
=== Variablenzugriff &amp;gt;64kB ===&lt;br /&gt;
&lt;br /&gt;
Die Zeiger beim avr-gcc sind nur 16 Bit breit, können somit also nur 64kiB Datenspeicher adressieren. Als Funktionspointer können sie beim AVR bis zu 128 kiB Programmspeicher adressieren, weil Funktionsadressen immer 16-Bit Worte adressieren und nicht Bytes. Um Flashzugriff jenseits von 64KiB zu bewerkstelligen gibt es mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
* Address-Spaces wie &amp;lt;tt&amp;gt;__flash1&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;__memx&amp;lt;/tt&amp;gt;, siehe Abschnitt &amp;quot;[[#Jenseits von flash|Jenseits von __flash]]&amp;quot;.&lt;br /&gt;
* Die Funktionen bzw. Makros &amp;lt;tt&amp;gt;pgm_read_xxx_far&amp;lt;/tt&amp;gt; der AVR-Libc, wie im folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
Unverständlicherweise gibt es in der AVR-Libc keine Funktion, um 32-Bit Pointer zu erhalten. Hier schafft ein eigenes GNU-C99 Makro Abhilfe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//====================================================================&lt;br /&gt;
// Macro to access strings defined in PROGMEM above 64kB&lt;br /&gt;
//--------------------------------------------------------------------&lt;br /&gt;
#define FAR(var)                     \&lt;br /&gt;
({ uint_farptr_t tmp;                \&lt;br /&gt;
   __asm__ (                         \&lt;br /&gt;
       &amp;quot;ldi    %A0, lo8(%1)&amp;quot;  &amp;quot;\n\t&amp;quot; \&lt;br /&gt;
       &amp;quot;ldi    %B0, hi8(%1)&amp;quot;  &amp;quot;\n\t&amp;quot; \&lt;br /&gt;
       &amp;quot;ldi    %C0, hh8(%1)&amp;quot;         \&lt;br /&gt;
       : &amp;quot;=d&amp;quot; (tmp)                  \&lt;br /&gt;
       : &amp;quot;i&amp;quot;  (&amp;amp;(var)));             \&lt;br /&gt;
   tmp;                              \&lt;br /&gt;
})&lt;br /&gt;
//-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
//===================================================================&lt;br /&gt;
// Define a section above 64kiB (FAR_SECTION)&lt;br /&gt;
// and add the required linker argument below&lt;br /&gt;
// -Wl,--section-start=.far_section=0x10000&lt;br /&gt;
//--------------------------------------------------------------------&lt;br /&gt;
#define FAR_SECTION   __attribute__((__section__(&amp;quot;.far_section&amp;quot;)))&lt;br /&gt;
//--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
//====================================================================&lt;br /&gt;
// Just a Sample&lt;br /&gt;
//--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
const char MyString[] FAR_SECTION = &amp;quot;Hier liegt mein FAR-Teststring!&amp;quot;;&lt;br /&gt;
const char MyBmp64[]  FAR_SECTION = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00};&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  char MyChar;&lt;br /&gt;
  DDRC = 0xFF;&lt;br /&gt;
  do&lt;br /&gt;
  {&lt;br /&gt;
    MyChar = pgm_read_byte_far(FAR(MyBmp64));&lt;br /&gt;
    PORTC  = MyChar;&lt;br /&gt;
  }&lt;br /&gt;
  while(MyChar);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.h. man muss&lt;br /&gt;
* Das Makro &amp;lt;tt&amp;gt;FAR&amp;lt;/tt&amp;gt; im Quellcode einfügen&lt;br /&gt;
* Die Definition der neuen Section &amp;lt;tt&amp;gt;FAR_SECTION&amp;lt;/tt&amp;gt; einfügen&lt;br /&gt;
* Die Variablen mit dieser Section kennzeichnen&lt;br /&gt;
* Dem Linker mittels Kommandozeilenoption die Startadrese dieser Section mitteilen&lt;br /&gt;
&lt;br /&gt;
Der Zugriff auf diese Variablen kann nur mittels direkter Pointerarithmetik erfolgen, eine Indizierung von Arrays mit variablem Index ist nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int n=3;&lt;br /&gt;
MyChar = pgm_read_byte_far(FAR(MyBmp64)+n);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash mit __flash und Embedded-C ==&lt;br /&gt;
&lt;br /&gt;
Ab Version 4.7 unterstützt avr-gcc &#039;&#039;Adress-Spaces&#039;&#039; gemäß dem Embedded-C Dokument ISO/IEC TR18037.  Der geläufigste Adress-Space ist &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt;, der im Gegensatz zu &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt; kein GCC-Attribut ist, sondern ein Qualifier und damit syntaktisch ähnlich verwendet wird wie &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
GCC kennt keine eigene Option zum Aktivieren von Embedded-C, es wird als GNU-C Erweiterung behandelt. Daher müssen C-Module, die Address-Spaces verwenden, mit &amp;lt;tt&amp;gt;-std=gnu99&amp;lt;/tt&amp;gt; o.ä. compiliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static const __flash int value = 10;&lt;br /&gt;
&lt;br /&gt;
int get_value (void)&lt;br /&gt;
{&lt;br /&gt;
  return value;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Im Gegensatz zu &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt; sind keine speziellen Bibliotheksfunktionen oder -makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable ist &amp;quot;normales&amp;quot; C.&lt;br /&gt;
# Die Variable wird im richtigen Speicherbereich (Flash) angelegt.&lt;br /&gt;
# &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt; ist nur zusammen mit read-only Objekten oder Zeigern, d.h. nur zusammen mit &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;, erlaubt.&lt;br /&gt;
# Zugriffe wie im obigen Beispiel können (weg)optimiert werden.  Das Beispiel entspricht einem &amp;quot;&amp;lt;tt&amp;gt;return 10&amp;lt;/tt&amp;gt;&amp;quot;.  Es besteht keine Notwendigkeit, für &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; überhaupt Flash-Speicher zu reservieren.&lt;br /&gt;
&lt;br /&gt;
Auch Zeiger-Indirektionen sind problemlos möglich.  Zu beachten ist, dass &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt; auf der richtigen Seite des &amp;quot;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;&amp;quot; in der Zeigerdeklaration bzw. -definition steht:&lt;br /&gt;
* &#039;&#039;&#039;Rechts vom &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;:&#039;&#039;&#039; Der Zeiger selbst liegt im Flash&lt;br /&gt;
* &#039;&#039;&#039;Links vom &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;:&#039;&#039;&#039; Der Zeiger enthält eine Flash-Adresse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// val ist eine Variable im Flash&lt;br /&gt;
const __flash int val = 42;&lt;br /&gt;
&lt;br /&gt;
// pval liegt auch im Flash und enthält die Adresse von val&lt;br /&gt;
const __flash int* const __flash pval = &amp;amp;val;&lt;br /&gt;
&lt;br /&gt;
char get_val (void)&lt;br /&gt;
{&lt;br /&gt;
  // liest den Wert von val über die in pval abgelegte Adresse&lt;br /&gt;
  return *pval;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blöcke ===&lt;br /&gt;
&lt;br /&gt;
Um Speicherbereiche vom Flash in den RAM zu kopieren, gibt es zwei Möglichkeiten: Zum einen können wie bei &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt; beschreiben die Funktionen der avr-libc wie &amp;lt;tt&amp;gt;memcpy_P&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;memcmp_P&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;movmem_P&amp;lt;/tt&amp;gt;, etc. verwendet werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Eine Datenstruktur&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
    int id;&lt;br /&gt;
    char buf[10];&lt;br /&gt;
} data_t;&lt;br /&gt;
&lt;br /&gt;
extern void uart_send (const void*, size_t);&lt;br /&gt;
&lt;br /&gt;
void send_data (const __flash data_t *pdata)&lt;br /&gt;
{&lt;br /&gt;
    // buf wird auf dem Stack angelegt&lt;br /&gt;
    data_t buf;&lt;br /&gt;
    &lt;br /&gt;
    // Kopiere Daten vom Flash nach buf ins RAM&lt;br /&gt;
    memcpy_P (&amp;amp;buf, pdata, sizeof (data_t));&lt;br /&gt;
 &lt;br /&gt;
    // Sende die Daten in buf&lt;br /&gt;
    uart_send (&amp;amp;buf, sizeof (data_t));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine Struktur auch über direktes Kopieren ins RAM geladen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Eine Datenstruktur&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
    int id;&lt;br /&gt;
    char buf[10];&lt;br /&gt;
} data_t;&lt;br /&gt;
&lt;br /&gt;
extern void uart_send (const void*, size_t);&lt;br /&gt;
&lt;br /&gt;
void send_data (const __flash data_t *pdata)&lt;br /&gt;
{&lt;br /&gt;
    // Kopiere Daten ins RAM.  buf wird auf dem Stack angelegt&lt;br /&gt;
    const data_t buf = *pdata;&lt;br /&gt;
    &lt;br /&gt;
    // Verwendet die Daten in buf&lt;br /&gt;
    uart_send (&amp;amp;buf, sizeof (data_t));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Strings ===&lt;br /&gt;
&lt;br /&gt;
Natürlich können auch Strings im Flash abgelegt werden und auch mit Funktionen wie &amp;lt;tt&amp;gt;strcpy_P&amp;lt;/tt&amp;gt; aus der avr-libc verarbeitet werden.  Zudem ist es möglich, Flash-Zeiger mit der Adresse eines String-Literals zu initialisieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define FSTR(X) ((const __flash char[]) { X } )&lt;br /&gt;
&lt;br /&gt;
const __flash char * const __flash array[] = &lt;br /&gt;
{&lt;br /&gt;
    FSTR (&amp;quot;Hund&amp;quot;), FSTR (&amp;quot;Katze&amp;quot;), FSTR (&amp;quot;Maus&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
size_t get_len (uint8_t tier)&lt;br /&gt;
{&lt;br /&gt;
    return strlen_P (array[tier]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider sieht der Embedded-C Draft nicht vor, String-Literale direkt in einem anderen Adress-Space als &#039;&#039;generic&#039;&#039; anzulegen, so dass hier der Umweg über &amp;lt;tt&amp;gt;FSTR&amp;lt;/tt&amp;gt; genommen werden muss.  Dieses Konstrukt ist nur ausserhalb von Funktionen möglich und kann daher nicht als Ersatz für &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; aus der avr-libc dienen.&lt;br /&gt;
&lt;br /&gt;
Soll &amp;lt;tt&amp;gt;array&amp;lt;/tt&amp;gt; ein 2-dimensonales Array sein anstatt ein 1-dimensionales Array von Zeigern, dann geht das ohne große Verrenkungen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Die 6 ergibt sich aus 1 plus der Länge des längsten Strings &amp;quot;Katze&amp;quot;&lt;br /&gt;
const __flash char array[][6] = &lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Hund&amp;quot;, &amp;quot;Katze&amp;quot;, &amp;quot;Maus&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiters besteht die Möglichkeit, &amp;lt;tt&amp;gt;array&amp;lt;/tt&amp;gt; analog anzulegen, wie man es mit &amp;lt;tt&amp;gt;PROGMEM&amp;lt;/tt&amp;gt; machen würde:  Jeder String wird explizit angelegt und seine Adresse bei der Initialisierung von &amp;lt;tt&amp;gt;array&amp;lt;/tt&amp;gt; verwendet.  Dies entspricht dem ersten Beispiel eines 1-dimensionalen Zeigerarrays:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static const __flash char strHund[]  = &amp;quot;Hund&amp;quot;;&lt;br /&gt;
static const __flash char strKatze[] = &amp;quot;Katze&amp;quot;;&lt;br /&gt;
static const __flash char strMaus[]  = &amp;quot;Maus&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const __flash char * const __flash array[] = &lt;br /&gt;
{&lt;br /&gt;
    strHund, strKatze, strMaus&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Casts ===&lt;br /&gt;
&lt;br /&gt;
Embedded C fordert, dass zwei Adress-Spaces entweder disjunkt sind – d.h. sie enthalten keine gemeinsamen Adressen – oder aber ein Space komplett im anderen enthalten ist, also eine Teilmengen-Beziehung besteht.  Die Adress-Spaces von avr-gcc sind so implementiert, dass jeder Space Teilmenge jedes anderes ist.  Zwar haben Spaces wie RAM und Flash physikalisch keinen Speicherbereich gemein, allerdings ermöglicht diese Implementierung das Casten von Zeigern zu unterschiedlichen Adress-Spaces&amp;lt;ref&amp;gt;Im Gegensatz zu einem Attribute wie &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt; ist ein (Adress Space) Qualifier Teil des Zeiger-Typs.&amp;lt;/ref&amp;gt;:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char read_char (const char *address, bool data_in_flash)&lt;br /&gt;
{&lt;br /&gt;
    if (data_in_flash)&lt;br /&gt;
        return *(const __flash char*) address;&lt;br /&gt;
    else&lt;br /&gt;
        return *address;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Cast selbst erzeugt keinen zusätzlichen Code, da eine RAM-Adresse und eine Flash-Adresse die gleiche Binärdarstellung haben.  Allerdings wird über den nach &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt; gecasteten Zeiger anders zugegriffen, nämlich per LPM.&lt;br /&gt;
&lt;br /&gt;
=== Jenseits von __flash ===&lt;br /&gt;
&lt;br /&gt;
Ausser &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt; gibt es auch folgende Address-Spaces:&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt;&#039;&#039;N&#039;&#039;: Mit &#039;&#039;N&#039;&#039; = 1..5 sind fünf weitere Spaces, die analog zu &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt; funktionieren und deren Zeiger ebenfalls 16 Bit breit sind.  avr-gcc erwartet, dass die zugehörigen Daten, welche in die Section &amp;lt;tt&amp;gt;.progmem&amp;lt;/tt&amp;gt;&#039;&#039;N&#039;&#039;&amp;lt;tt&amp;gt;.data&amp;lt;/tt&amp;gt; abgelegt werden, so lokatiert sind, dass das high-Byte der Adresse (Bits 16..23) gerade &#039;&#039;N&#039;&#039; ist.  Dies wird in Binutils noch nicht unterstützt&amp;lt;ref&amp;gt;[http://sourceware.org/PR14406 Binutils PR14406]: Support .progmem&amp;lt;N&amp;gt;.data sections to work with GCC&#039;s [http://gcc.gnu.org/PR49868 PR49868].&amp;lt;/ref&amp;gt; (Stand Binutils 2.24) Die Unterstützung kann durch ein eigenes Linker-Skript erreicht werden, welches diese Sections wie vom Compiler erwartet lokatiert.&lt;br /&gt;
; &amp;lt;tt&amp;gt;__memx&amp;lt;/tt&amp;gt;: Dieser Address-Space implementiert 3-Byte Zeiger und unterstützt Lesen über 64KiB-Segmentgrenzen hinweg.  Das MSB (Bit 23) gibt dabei an, ob der &amp;lt;tt&amp;gt;__memx&amp;lt;/tt&amp;gt;-Zeiger eine Flash-Adresse enthält (Bit23 = 0) oder eine RAM-Adresse (Bit23 = 1), was folgenden Code erlaubt:&lt;br /&gt;
&amp;lt;!-- Bitte die Tabelle belassen, damit der Code richtig eingerückt wird! --&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;
const __memx int a_flash = 42;&lt;br /&gt;
const        int a_ram   = 100;&lt;br /&gt;
&lt;br /&gt;
static int get_a (const __memx int* pa)&lt;br /&gt;
{&lt;br /&gt;
    return *pa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    return get_a (&amp;amp;a_flash) + get_a (&amp;amp;a_ram);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}Dies bedeutet, dass erst zur &#039;&#039;Laufzeit&#039;&#039; entschieden werden kann, ob aus dem RAM oder aus dem Flash gelesen werden soll, was &amp;lt;tt&amp;gt;__memx&amp;lt;/tt&amp;gt; im Vergleich zu den anderen Address-Spaces langsamer macht. Ausserdem ist zu beachten, dass &amp;lt;tt&amp;gt;__memx&amp;lt;/tt&amp;gt;-Zeiger zwar 24-Bit Zeiger sind, die zugrundeliegende Adress-Arithmetik jedoch gemäß dem C-Standard erfolgt, also als 16-Bit Arithmetik.&lt;br /&gt;
&lt;br /&gt;
=== __flash, progmem und Portierbarkeit ===&lt;br /&gt;
&lt;br /&gt;
Da ab er aktuellen Compilerversion 4.7 sowohl &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt; als auch &amp;lt;tt&amp;gt;PROGMEM&amp;lt;/tt&amp;gt; und die &amp;lt;tt&amp;gt;pgm_read&amp;lt;/tt&amp;gt;-Funktionen zur Verfügung stehen, ergibt sich die Frage, welche Variante &amp;quot;besser&amp;quot; ist und wie zwischen ihnen hin- und her zu portieren ist.&lt;br /&gt;
&lt;br /&gt;
Zunächst sei erwähnt, dass &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt; kein Ersatz für &amp;lt;tt&amp;gt;PROGMEM&amp;lt;/tt&amp;gt; ist, sondern lediglich eine Alternative dazu.  Das &amp;quot;alte&amp;quot; progmem wird weiterhin mir gleicher Semantik unterstützt, so dass alter Code ohne Änderungen mit den neueren Compilerversionen übersetzbar bleibt.&lt;br /&gt;
&lt;br /&gt;
Von der Codegüte her dürften sich keine großen Unterschiede ergeben.  Es ist nicht zu erwarten, dass die eine oder die andere Variante wesentlich besseren oder schlechteren Code erzeugt — von einer Ausnahme abgesehen:  Der Wert beim Zugriff ist zur Compilezeit bekannt und kann daher eliminiert werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static const __flash char x[] = { &#039;A&#039;, &#039;V&#039;, &#039;R&#039; };&lt;br /&gt;
&lt;br /&gt;
char foo (void)&lt;br /&gt;
{&lt;br /&gt;
    return x[2];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies wird übersetzt wie &amp;quot;&amp;lt;tt&amp;gt;return &#039;R&#039;;&amp;lt;/tt&amp;gt;&amp;quot;, und das Array &amp;lt;tt&amp;gt;x[]&amp;lt;/tt&amp;gt; kann komplett wegoptimiert werden und entfallen.&lt;br /&gt;
&lt;br /&gt;
==== progmem → __flash ====&lt;br /&gt;
&lt;br /&gt;
Portierung in diese Richtung bedeutet, alten Code anzupassen.  Zwingend ist die Portierung nicht, da &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt; weiterhin unterstützt wird.&lt;br /&gt;
Allerdings ist eine Quelle mit &amp;lt;tt&amp;gt;__flash&amp;lt;/tt&amp;gt; besser lesbar, denn der Code wird von den &amp;lt;tt&amp;gt;pgm_read&amp;lt;/tt&amp;gt;-Funktionen befreit, die vor allem bei Mehrfach-Indirektion den Code ziemlich verunstalten und unleserlich machen können.&lt;br /&gt;
Weiterer Vorteil von &amp;lt;tt&amp;gt;_flash&amp;lt;/tt&amp;gt; ist, daß eine striktere Typprüfung erfolgen kann.&lt;br /&gt;
&lt;br /&gt;
Eine Portierung wird man in zwei Schritten vornehmen:&lt;br /&gt;
&lt;br /&gt;
;1. Definitionen von Flash-Variablen werden angepasst:&lt;br /&gt;
&lt;br /&gt;
Vorher:&lt;br /&gt;
:{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
static const char hund[]  PROGMEM = &amp;quot;Hund&amp;quot;;&lt;br /&gt;
static const char katze[] PROGMEM = &amp;quot;Katze&amp;quot;;&lt;br /&gt;
static const char maus[]  PROGMEM = &amp;quot;Maus&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const char * const tier[] PROGMEM = &lt;br /&gt;
{&lt;br /&gt;
   hund, katze, maus&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nachher:&lt;br /&gt;
:{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static const __flash char hund[]  = &amp;quot;Hund&amp;quot;;&lt;br /&gt;
static const __flash char katze[] = &amp;quot;Katze&amp;quot;;&lt;br /&gt;
static const __flash char maus[]  = &amp;quot;Maus&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
const __flash char * const __flash tier[] = &lt;br /&gt;
{&lt;br /&gt;
   hund, katze, maus&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Header &amp;lt;tt&amp;gt;avr/pgmspace.h&amp;lt;/tt&amp;gt; wird nicht mehr benötigt.  Im Gegensatz zu &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt; müssen Qualifier immer links von der definierten Variablen stehen; bei Attributen wie &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt; ist das mehr oder weniger egal.&lt;br /&gt;
&lt;br /&gt;
Nachdem diese Anpassung erfolgreich abgeschlossen ist, folgt Schritt&lt;br /&gt;
&lt;br /&gt;
; 2. Der Code wird von &amp;lt;tt&amp;gt;pgm_read&amp;lt;/tt&amp;gt;-Aufrufen bereinigt:&lt;br /&gt;
&lt;br /&gt;
Vorher:&lt;br /&gt;
:{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
extern const char *tier[];&lt;br /&gt;
 &lt;br /&gt;
char first_letter (uint8_t i)&lt;br /&gt;
{&lt;br /&gt;
    const char* ptier = (const char*) pgm_read_word (&amp;amp;tier[i]);&lt;br /&gt;
    return (char) pgm_read_byte (&amp;amp;ptier[0]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nachher:&lt;br /&gt;
:{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
extern const __flash char * const __flash tier[];&lt;br /&gt;
 &lt;br /&gt;
char first_letter (uint8_t i)&lt;br /&gt;
{&lt;br /&gt;
    return tier[i][0];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dateien direkt im Flash einbinden ==&lt;br /&gt;
&lt;br /&gt;
Wenn man größere Dateien direkt im Programm einbinden will, ohne sie vorher in C Quelltext umzuwandeln, muss man das mit dem Linker machen. Wie das geht steht hier.&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/webdoc/avrlibcreferencemanual/FAQ_1faq_binarydata.html Atmel, avr gcc Dokumentation]&lt;br /&gt;
* [http://nongnu.org/avr-libc/user-manual/FAQ.html#faq_binarydata Nongnu avr gcc Dokumentation]&lt;br /&gt;
&lt;br /&gt;
Wie man das dann praktisch umsetzt, sieht man in diesem Beitrag.&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056910 Forumsbeitrag]: Binärdateien mittels Linker einbinden&lt;br /&gt;
&lt;br /&gt;
== Flash in der Anwendung schreiben ==&lt;br /&gt;
&lt;br /&gt;
Bei AVRs mit &amp;quot;self-programming&amp;quot;-Option – auch bekannt als [[Bootloader]]-Support – können Teile des Flash-Speichers vom Anwendungsprogramm beschrieben werden. Dies ist nur möglich, wenn die Schreibfunktion in einem besonderen Speicherbereich, der Boot-Section des Programmspeichers/Flash, abgelegt ist.&lt;br /&gt;
&lt;br /&gt;
Bei einigen kleinen AVRs gibt es keine gesonderte Boot-Section, bei diesen kann der Flashspeicher von jeder Stelle des Programms geschrieben werden. Für Details sei hier auf das jeweilige Controller-Datenblatt und die Erläuterungen zum Modul boot.h der avr-libc verwiesen. Es existieren auch Application-Notes dazu bei atmel.com, die auf avr-gcc-Code übertragbar sind.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: &lt;br /&gt;
* Forumsbeitrag [http://www.mikrocontroller.net/topic/163632#1561622 Daten in Programmspeicher speichern]&lt;br /&gt;
&lt;br /&gt;
== EEPROM ==&lt;br /&gt;
&lt;br /&gt;
Möchte man Werte aus einem Programm heraus so speichern, dass sie auch nach dem Abschalten der Versorgungsspannung noch erhalten bleiben und nach dem Wiederherstellen der Versorgungsspannung bei erneutem Programmstart wieder zur Verfügung stehen, dann benutzt man das EEPROM.&lt;br /&gt;
&lt;br /&gt;
Schreib- und Lesezugriffe auf den EEPROM-Speicher erfolgen über die im Modul eeprom.h der avr-libc definierten Funktionen. Mit diesen Funktionen können einzelne Bytes, Datenworte (16 Bit), Fließkommawerte (32 Bit, single-precision, float) und Datenblöcke geschrieben und gelesen werden.&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen kümmern sich auch um diverse Details, die bei der Benutzung des EEPROMs normalerweise notwendig sind:&lt;br /&gt;
* EEPROM-Operationen sind im Vergleich relativ langsam. Man muss daher darauf achten, dass eine vorhergehende Operation abgeschlossen ist, ehe die nächste Operation mit dem EEPROM gestartet wird. Die in der avr-libc implementierten Funktionen aus eeprom.h berücksichtigten dies. Soll beim Aufruf einer EEPROM-Funktion sichergestellt werden, dass diese nicht intern in einer Warteschleife auf den Abschluss der vorherigen Operation wartet, kann vorher per eeprom_is_ready testen, ob der Zugriff auf den EEPROM-Speicher sofort möglich ist.&lt;br /&gt;
* Es ist darauf zu achten, dass die EEPROM-Funktionen nicht durch einen Interrupt unterbrochen werden. Einige Phasen des Zugriffs sind zeitkritisch und müssen in einer definierten bzw. begrenzten Anzahl von Takten durchgeführt werden. Durch einen unterbrechenden Interrupt würde diese Restriktion nicht mehr eingehalten. Auch dieses Detail wird von den avr-libc Funktionen berücksichtigt, so dass man sich als C-Programmierer nicht darum kümmern muss. Innerhalb der Funktionen werden Interrupts vor der &amp;quot;EEPROM-Sequenz&amp;quot; global deaktiviert und im Anschluss, falls vorher auch schon eingeschaltet, wieder aktiviert.&lt;br /&gt;
&lt;br /&gt;
Man beachte, dass der EEPROM-Speicher nur eine begrenzte Anzahl von Schreibzugriffen zulässt. Beschreibt man eine EEPROM-Zelle öfter als die im Datenblatt zugesicherte Anzahl (typisch 100.000), wird die Funktion der Zelle nicht mehr garantiert. Dies gilt für jede einzelne Zelle. &lt;br /&gt;
&lt;br /&gt;
Bei geschickter Programmierung (z.&amp;amp;nbsp;B. Ring-Puffer), bei der die zu beschreibenden Zellen regelmäßig gewechselt werden, kann man eine deutlich höhere Anzahl an Schreibzugriffen, bezogen auf den gesamten EEPROM-Speicher, erreichen. Auf jeden Fall sollte man aber eine Abschätzung über die zu erwartende Lebensdauer des EEPROM durchführen. Wird ein Wert im EEPROM im Durchschnitt nur einmal pro Woche verändert, wird die garantierte Anzahl der Schreibzyklen innerhalb der voraussichtlichen Verwendungszeit des Controllers sicherlich nicht erreicht werden. Welcher Controller ist schon 100000 / 52 = 1923 Jahre im Einsatz? In diesem Fall lohnt es sich daher nicht, erweiterte Programmfunktionen zu implementieren, mit denen die Anzahl der Schreibzugriffe minimiert wird.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit, Schreibzyklen einzusparen, besteht in der Vorabprüfung, ob der zu speichernde Wert im EEPROM bereits enthalten ist und nur veränderte Werte zu schreiben. In aktuelleren Versionen der avr-libc sind bereits Funktionen enthalten, die solche Prüfungen enthalten (eeprom_update_*).&lt;br /&gt;
&lt;br /&gt;
Lesezugriffe können beliebig oft durchgeführt werden. Sie unterliegen keinen Einschränkungen in Bezug auf deren Anzahl. &lt;br /&gt;
&lt;br /&gt;
=== EEMEM ===&lt;br /&gt;
Um eine Variable im EEPROM anzulegen, stellt die avr-libc das Makro EEMEM zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/eeprom.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Byte */&lt;br /&gt;
uint8_t eeFooByte EEMEM = 123;&lt;br /&gt;
&lt;br /&gt;
/* Wort */&lt;br /&gt;
uint16_t eeFooWord EEMEM = 12345;&lt;br /&gt;
&lt;br /&gt;
/* float */&lt;br /&gt;
float eeFooFloat EEMEM;&lt;br /&gt;
&lt;br /&gt;
/* Byte-Array */&lt;br /&gt;
uint8_t eeFooByteArray1[] EEMEM = { 18, 3, 70 };&lt;br /&gt;
uint8_t eeFooByteArray2[] EEMEM = { 30, 7, 79 };&lt;br /&gt;
&lt;br /&gt;
/* 16-bit unsigned short feld */&lt;br /&gt;
uint16_t eeFooWordArray1[4] EEMEM;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die grundsätzliche Vorgehensweise ist identisch zur Verwendung von PROGMEM. Auch hier erzeugt man sich spezielle attributierte Variablen (EEMEM erledigt das), die vom Compiler/Linker nicht wie normale Variablen behandelt werden. Compiler/Linker kümmern sich zwar darum, dass diesen Variablen eine Adresse zugewiesen wird, diese Adresse ist dann aber die Adresse der &#039;Variablen&#039; im EEPROM. Um die dort gespeicherten Werte zu lesen bzw. zu schreiben, übergibt man diese Adresse an spezielle Funktionen, die die entsprechenden Werte aus dem EEPROM holen bzw. das EEPROM neu beschreiben.&lt;br /&gt;
&lt;br /&gt;
Die mittels EEMEM erzeugten &#039;Variablen&#039; sind also mehr als Platzhalter zu verstehen, denn als echte Variablen. Es geht nur darum, im C-Programm symbolische Namen zur Verfügung zu haben, anstatt mit echten EEPROM-Adressen hantieren zu müssen, etwas, das grundsätzlich aber auch genauso gut möglich ist. Nur muss man sich in diesem Fall dann selbst darum kümmern, dass mehrere &#039;Variablen&#039; ohne Überschneidung im EEPROM angeordnet werden.&lt;br /&gt;
&lt;br /&gt;
=== Bytes lesen/schreiben ===&lt;br /&gt;
&lt;br /&gt;
Die avr-libc Funktion zum Lesen eines Bytes heißt eeprom_read_byte. Parameter ist die Adresse des Bytes im EEPROM. Geschrieben wird über die Funktion eeprom_write_byte mit den Parametern Adresse und Inhalt. Anwendungsbeispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EEPROM_DEF 0xFF&lt;br /&gt;
&lt;br /&gt;
void eeprom_example (void)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t myByte;&lt;br /&gt;
&lt;br /&gt;
    // myByte lesen (Wert = 123)&lt;br /&gt;
    myByte = eeprom_read_byte (&amp;amp;eeFooByte);&lt;br /&gt;
&lt;br /&gt;
    // der Wert 99 wird im EEPROM an die Adresse der&lt;br /&gt;
    // Variablen eeFooByte geschrieben&lt;br /&gt;
    myByte = 99;&lt;br /&gt;
    eeprom_write_byte(&amp;amp;eeFooByte, myByte); // schreiben&lt;br /&gt;
&lt;br /&gt;
    myByte = eeprom_read_byte (&amp;amp;eeFooByteArray1[1]); &lt;br /&gt;
    // myByte hat nun den Wert 3&lt;br /&gt;
&lt;br /&gt;
    // Beispiel fuer eeprom_update_byte: die EEPROM-Zelle wird nur&lt;br /&gt;
    // dann beschrieben, wenn deren Inhalt sich vom Parameterwert&lt;br /&gt;
    // unterscheidet. In diesem Beispiel erfolgt also kein Schreib-&lt;br /&gt;
    // zugriff, da die Werte gleich sind.&lt;br /&gt;
    eeprom_update_byte(&amp;amp;eeFooByte, myByte);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Beispiel zur &amp;quot;Sicherung&amp;quot; gegen leeres EEPROM nach &amp;quot;Chip Erase&amp;quot;&lt;br /&gt;
    // (z. B. wenn die .eep-Datei nach Programmierung einer neuen Version&lt;br /&gt;
    // des Programms nicht in den EEPROM uebertragen wurde und EESAVE&lt;br /&gt;
    // deaktiviert ist (unprogrammed/1)&lt;br /&gt;
    // &lt;br /&gt;
    // Vorsicht: wenn EESAVE &amp;quot;programmed&amp;quot; ist, hilft diese Sicherung nicht&lt;br /&gt;
    // weiter, da die Speicheraddressen in einem neuen/erweiterten Programm&lt;br /&gt;
    // moeglicherweise verschoben wurden. An der Stelle &amp;amp;eeFooByte steht&lt;br /&gt;
    // dann u.U. der Wert einer anderen Variable aus einer &amp;quot;alten&amp;quot; Version.&lt;br /&gt;
&lt;br /&gt;
    uint8_t fooByteDefault = 222;&lt;br /&gt;
    if ((myByte = eeprom_read_byte (&amp;amp;eeFooByte)) == EEPROM_DEF)&lt;br /&gt;
    {&lt;br /&gt;
        myByte = fooByteDefault;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wort lesen/schreiben ===&lt;br /&gt;
&lt;br /&gt;
Schreiben und Lesen von Datenworten erfolgt analog zur Vorgehensweise bei Bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    // lesen&lt;br /&gt;
    uint16_t myWord = eeprom_read_word (&amp;amp;eeFooWord);&lt;br /&gt;
&lt;br /&gt;
    // schreiben&lt;br /&gt;
    eeprom_write_word (&amp;amp;eeFooWord, 2222);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Block lesen/schreiben ===&lt;br /&gt;
&lt;br /&gt;
Lesen und Schreiben von Datenblöcken erfolgt über die Funktionen &amp;lt;code&amp;gt;eeprom_read_block()&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;eeprom_write_block()&amp;lt;/code&amp;gt;. Die Funktionen erwarten drei Parameter: die Adresse der Quell- bzw. Zieldaten im RAM, die EEPROM-Adresse und die Länge des Datenblocks in Bytes als &amp;lt;code&amp;gt;size_t&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t  myByteBuffer[3];&lt;br /&gt;
uint16_t myWordBuffer[4];&lt;br /&gt;
&lt;br /&gt;
void eeprom_block_example (void)&lt;br /&gt;
{&lt;br /&gt;
    /* Datenblock aus EEPROM lesen  */&lt;br /&gt;
&lt;br /&gt;
    /* liest 3 Bytes ab der von eeFooByteArray1 definierten EEPROM-Adresse&lt;br /&gt;
       in das RAM-Array myByteBuffer */&lt;br /&gt;
    eeprom_read_block (myByteBuffer, eeFooByteArray1, 3);&lt;br /&gt;
&lt;br /&gt;
    /* dito mit etwas Absicherung betr. der Länge */&lt;br /&gt;
    eeprom_read_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));&lt;br /&gt;
&lt;br /&gt;
    /* und nun mit 16-Bit Array */&lt;br /&gt;
    eeprom_read_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));&lt;br /&gt;
&lt;br /&gt;
    /* Datenblock in EEPROM schreiben */&lt;br /&gt;
    eeprom_write_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));&lt;br /&gt;
    eeprom_write_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fließkommawerte lesen/schreiben ===&lt;br /&gt;
&lt;br /&gt;
In der avr-libc stehen auch EEPROM-Funktionen für Variablen des Typs float (Fließkommazahlen mit &amp;quot;einfacher&amp;quot; Genauigkeit) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/eeprom.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
float eeFloat EEMEM = 12.34f;&lt;br /&gt;
&lt;br /&gt;
float void eeprom_float_example(float value)&lt;br /&gt;
{&lt;br /&gt;
   /* float in EEPROM schreiben */&lt;br /&gt;
   eeprom_write_float(&amp;amp;eeFloat, value);&lt;br /&gt;
&lt;br /&gt;
   /* float aus EEPROM lesen */&lt;br /&gt;
   return  eeprom_read_float(&amp;amp;eeFloat);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EEPROM-Speicherabbild in .eep-Datei ===&lt;br /&gt;
&lt;br /&gt;
Mit den zum Compiler gehörenden Werkzeugen kann der aus den Variablendeklarationen abgeleitete EEPROM-Inhalt in eine Datei geschrieben werden. Die übliche Dateiendung ist .eep, Daten im Intel Hex-Format. Damit können Standardwerte für den EEPROM-Inhalt im Quellcode definiert werden. &lt;br /&gt;
&lt;br /&gt;
Makefiles nach WinAVR/MFile-Vorlage enthalten bereits die notwendigen Einstellungen, siehe dazu die Erläuterungen im [[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]].&lt;br /&gt;
&lt;br /&gt;
Der Inhalt der eep-Datei muss ebenfalls zum Mikrocontroller übertragen werden, wenn die Initialisierungswerte aus der Deklaration vom Programm erwartet werden. Ansonsten enthält der EEPROM-Speicher nach der Übertragung des Programmers mittels ISP abhängig von der Einstellung der EESAVE-Fuse&amp;lt;ref&amp;gt;vgl. Datenblatt Abschnitt Fuse Bits&amp;lt;/ref&amp;gt; nicht die korrekten Werte:&lt;br /&gt;
; EESAVE = 0 (programmed): Die Daten im EEPROM bleiben erhalten. Werden sie nicht neu geschrieben, so enthält das EEPROM evtl. Daten, die nicht mehr zum Programm passen.&lt;br /&gt;
; EESAVE = 1 (unprogrammed): Beim Programmieren werden die Daten im EEPROM gelöscht, also auf 0xff gesetzt.&lt;br /&gt;
&lt;br /&gt;
Als Sicherung kann man im Programm nochmals die Standardwerte vorhalten, beim Lesen auf 0xFF prüfen und gegebenenfalls einen Standardwert nutzen. Das geht natürlich nur, wenn 0xFF selbst nicht als Datenwert vorkommen kann.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DUTY_CYCLE_DEFAULT 0x80&lt;br /&gt;
&lt;br /&gt;
uint8_t eeDutyCycle EEMEM;   // Platzhalter für EEPROM&lt;br /&gt;
uint8_t DutyCycle;           // die echte Variable&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DutyCycle = eeprom_read_byte( &amp;amp;eeDutyCycle );&lt;br /&gt;
  if( DutyCycle == 0xFF )                     // das allererste mal. Im EEPROM steht noch kein gültiger Wert&lt;br /&gt;
  {&lt;br /&gt;
    DutyCycle = DUTY_CYCLE_DEFAULT;&lt;br /&gt;
    eeprom_writeByte( &amp;amp;eeDutyCycle, DutyCycle );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Direkter Zugriff auf EEPROM-Adressen ===&lt;br /&gt;
&lt;br /&gt;
Will man direkt auf bestimmte EEPROM Adressen zugreifen, dann sind folgende Funktionen hilfreich, um sich die Typecasts zu ersparen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/eeprom.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Byte aus dem EEPROM lesen&lt;br /&gt;
uint8_t EEPReadByte(uint16_t addr)&lt;br /&gt;
{&lt;br /&gt;
  return eeprom_read_byte((uint8_t *)addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Byte in das EEPROM schreiben&lt;br /&gt;
void EEPWriteByte(uint16_t addr, uint8_t val)&lt;br /&gt;
{&lt;br /&gt;
  eeprom_write_byte((uint8_t *)addr, val);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder als Makro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define   EEPReadByte(addr)         eeprom_read_byte((uint8_t *)addr)     &lt;br /&gt;
#define   EEPWriteByte(addr, val)   eeprom_write_byte((uint8_t *)addr, val)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwendung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EEPWriteByte(0x20, 128);   // Byte an die Adresse 0x20 schreiben&lt;br /&gt;
...&lt;br /&gt;
Val=EEPReadByte(0x20);     // EEPROM-Wert von Adresse 0x20 lesen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Was steckt dahinter? - EEPROM-Register ===&lt;br /&gt;
Auch wenn es normalerweise keinen Grund gibt, in C selbst an den Steuerregistern herumzuschrauben - die eeprom Funktionen erledigen das alles zuverlässig - der Vollständigkeit halber der registermässige technische Unterbau.&lt;br /&gt;
Um das EEPROM anzusteuern, sind drei Register von Bedeutung:&lt;br /&gt;
;EEAR: Hier werden die Adressen eingetragen zum Schreiben oder Lesen. Dieses Register unterteilt sich nochmal in EEARH und EEARL, da in einem 8-Bit-Register keine 512 Adressen adressiert werden können.&lt;br /&gt;
;EEDR: Hier werden die Daten eingetragen, die geschrieben werden sollen, bzw. es enthält die gelesenen Daten.&lt;br /&gt;
;EECR: Ist das Kontrollregister für das EEPROM&lt;br /&gt;
&lt;br /&gt;
Das EECR steuert den Zugriff auf das EEPROM und ist wie folgt aufgebaut:&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Aufbau des EECR-Registers&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
| - || - || - ||- || EERIE || EEMWE || EEWE || EERE&lt;br /&gt;
|-&lt;br /&gt;
! Read/Write&lt;br /&gt;
| R || R || R || R || R/W || R/W || R/W || R/W&lt;br /&gt;
|-&lt;br /&gt;
!Init Value&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedeutung der Bits&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Bit 4-7: nicht belegt&lt;br /&gt;
&lt;br /&gt;
;Bit 3 (EERIE): &#039;&#039;EEPROM Ready Interrupt Enable&#039;&#039;: Wenn das Bit gesetzt ist und globale Interrupts erlaubt sind in Register SREG (Bit 7), wird ein Interrupt ausgelöst nach Beendigung des Schreibzyklus (EEPROM Ready Interrupt). Ist einer der beiden Bits 0, wird kein Interrupt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
;Bit 2 EEMWE): &#039;&#039;EEPROM Master Write Enable&#039;&#039;: Dieses Bit bestimmt, dass, wenn EEWE = 1 gesetzt wird (innerhalb von 4 Taktzyklen), das EEPROM beschrieben wird mit den Daten in EEDR bei Adresse EEAR. Wenn EEMWE = 0 ist und EEWE = 1 gesetzt wird, hat das keine Auswirkungen. Der Schreibvorgang wird dann nicht ausgelöst. Nach 4 Taktzyklen wird das Bit EEMWE automatisch wieder auf 0 gesetzt. Dieses Bit löst den Schreibvorgang nicht aus, es dient sozusagen als Sicherungsbit für EEWE.&lt;br /&gt;
&lt;br /&gt;
;Bit 1 (EEWE): &#039;&#039;EEPROM Write Enable&#039;&#039;: Dieses Bit löst den Schreibvorgang aus, wenn es auf 1 gesetzt wird, sofern vorher EEMWE gesetzt wurde und seitdem nicht mehr als 4 Taktzyklen vergangen sind. Wenn der Schreibvorgang abgeschlossen ist, wird dieses Bit automatisch wieder auf 0 gesetzt und, sofern EERIE gesetzt ist, ein Interrupt ausgelöst. Ein Schreibvorgang sieht typischerweise wie folgt aus:&lt;br /&gt;
:# EEPROM-Bereitschaft abwarten (EEWE=0) &lt;br /&gt;
:# Adresse übergeben an EEAR&lt;br /&gt;
:# Daten übergeben an EEDR&lt;br /&gt;
:# Schreibvorgang auslösen in EECR mit Bit EEMWE=1 und EEWE=1&lt;br /&gt;
:# (Optional) Warten, bis Schreibvorgang abgeschlossen ist&lt;br /&gt;
&lt;br /&gt;
;Bit 0 EERE: &#039;&#039;EEPROM Read Enable&#039;&#039;: Wird dieses Bit auf 1 gesetzt wird das EEPROM an der Adresse in EEAR ausgelesen und die Daten in EEDR gespeichert. Das EEPROM kann nicht ausgelesen werden, wenn bereits eine Schreiboperation gestartet wurde. Es ist daher zu empfehlen, die Bereitschaft vorher zu prüfen. Das EEPROM ist lesebereit, wenn das Bit EEWE=0 ist. Ist der Lesevorgang abgeschlossen, wird das Bit wieder auf 0 gesetzt, und das EEPROM ist für neue Lese- und Schreibbefehle wieder bereit. Ein typischer Lesevorgang kann wie folgt aufgebaut sein:&lt;br /&gt;
:# Bereitschaft zum Lesen prüfen (EEWE=0)&lt;br /&gt;
:# Adresse übergeben an EEAR&lt;br /&gt;
:# Lesezyklus auslösen mit EERE = 1&lt;br /&gt;
:# Warten, bis Lesevorgang abgeschlossen EERE = 0&lt;br /&gt;
:# Daten abholen aus EEDR&lt;br /&gt;
&lt;br /&gt;
= Die Nutzung von sprintf und printf =&lt;br /&gt;
&lt;br /&gt;
Um komfortabel, d.h. formatiert, Ausgaben auf ein Display oder die serielle Schnittstelle zu tätigen, bieten sich &#039;&#039;&#039;sprintf&#039;&#039;&#039; oder &#039;&#039;&#039;printf&#039;&#039;&#039; an. Alle *printf-Varianten sind jedoch ziemlich speicherintensiv und der Einsatz in einem Mikrocontroller mit knappem Speicher muss sorgsam abgewogen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;sprintf&#039;&#039;&#039; wird die Ausgabe zunächst in einem Puffer vorbereitet und anschließend mit einfachen Funktionen zeichenweise ausgegeben. Es liegt in der Verantwortung des Programmierers, genügend Platz im Puffer für die erwarteten Zeichen bereitzuhalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
// nicht dargestellt: Implementierung von uart_puts (vgl. Abschnitt UART)&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
uint16_t counter;&lt;br /&gt;
&lt;br /&gt;
// Ausgabe eines unsigned Integerwertes&lt;br /&gt;
void uart_puti( uint16_t value )&lt;br /&gt;
{&lt;br /&gt;
    uint8_t puffer[20];&lt;br /&gt;
&lt;br /&gt;
    sprintf( puffer, &amp;quot;Zählerstand: %u&amp;quot;, value );&lt;br /&gt;
    uart_puts( puffer );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  counter = 5;&lt;br /&gt;
&lt;br /&gt;
  uart_puti( counter );&lt;br /&gt;
  uart_puti( 42 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere elegante Möglichkeit besteht darin, den STREAM stdout (Standardausgabe) auf eine eigene Ausgabefunktion umzuleiten. Dazu wird dem Ausgabemechanismus der C-Bibliothek eine neue Ausgabefunktion bekannt gemacht, deren Aufgabe es ist, ein einzelnes Zeichen auszugeben. Wohin die Ausgabe dann tatsächlich stattfindet, ist Sache der Ausgabefunktion. Im Beispiel unten wird auf UART ausgegeben. Alle anderen, höheren Funktionen wie z.&amp;amp;nbsp;B. &#039;&#039;&#039;printf&#039;&#039;&#039;, greifen letztendlich auf diese primitive Ausgabefunktion zurück. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
// a. Deklaration der primitiven Ausgabefunktion&lt;br /&gt;
int uart_putchar(char c, FILE *stream);&lt;br /&gt;
&lt;br /&gt;
// b. Umleiten der Standardausgabe stdout (Teil 1)&lt;br /&gt;
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );&lt;br /&gt;
&lt;br /&gt;
// c. Definition der Ausgabefunktion&lt;br /&gt;
int uart_putchar( char c, FILE *stream )&lt;br /&gt;
{&lt;br /&gt;
    if( c == &#039;\n&#039; )&lt;br /&gt;
        uart_putchar( &#039;\r&#039;, stream );&lt;br /&gt;
&lt;br /&gt;
    loop_until_bit_is_set( UCSRA, UDRE );&lt;br /&gt;
    UDR = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
    /* hier µC spezifischen Code zur Initialisierung */&lt;br /&gt;
    /* des UART einfügen... s.o. im AVR-GCC-Tutorial */&lt;br /&gt;
&lt;br /&gt;
    // Beispiel: &lt;br /&gt;
    //&lt;br /&gt;
    // myAVR Board 1.5 mit externem Quarz Q1 3,6864 MHz&lt;br /&gt;
    // 9600 Baud 8N1&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
#endif&lt;br /&gt;
#define UART_BAUD_RATE 9600&lt;br /&gt;
&lt;br /&gt;
// Hilfsmakro zur UBRR-Berechnung (&amp;quot;Formel&amp;quot; laut Datenblatt)&lt;br /&gt;
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)&lt;br /&gt;
&lt;br /&gt;
    UCSRB |= (1&amp;lt;&amp;lt;TXEN) | (1&amp;lt;&amp;lt;RXEN);    // UART TX und RX einschalten&lt;br /&gt;
    UCSRC |= (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0);    // Asynchron 8N1 &lt;br /&gt;
 &lt;br /&gt;
    UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) &amp;gt;&amp;gt; 8 );&lt;br /&gt;
    UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    int16_t antwort = 42;&lt;br /&gt;
    uart_init();&lt;br /&gt;
&lt;br /&gt;
    // b. Umleiten der Standardausgabe stdout (Teil 2)&lt;br /&gt;
    stdout = &amp;amp;mystdout;&lt;br /&gt;
&lt;br /&gt;
    // Anwendung&lt;br /&gt;
    printf( &amp;quot;Die Antwort ist %d.\n&amp;quot;, antwort );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Quelle: avr-libc-user-manual-1.4.3.pdf, S.74&lt;br /&gt;
//         + Ergänzungen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sollen Fließkommazahlen ausgegeben werden, muss im Makefile eine andere (größere) Version der [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|printflib]] eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
* Aktualisierung Register- und Bitbeschreibungen an aktuelle AVR&lt;br /&gt;
* &amp;quot;naked&amp;quot;-Funktionen&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial| ]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=90392</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=90392"/>
		<updated>2015-11-24T13:34:14Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* AVR-Tutorial - Benötigte Ausrüstung */&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 [http://www.watterott.com/de/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 Pollin Elektronik gibt es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz sind die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung müssen separat beschafft werden. Auf dem Board ist ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. &lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin ATMEL Evaluations-Board]]&lt;br /&gt;
* http://www.pollin.de&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board besteht die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten.&lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.pollin.de http://www.pollin.de]&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;
&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 [http://www.atmel.com/images/atmel-2521-avr-hardware-design-considerations_application-note_avr042.pdf 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 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 4 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 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 [http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 hier.]&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 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]] riskant&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 verfügbar&amp;lt;br&amp;gt;Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10-100ppm || sehr genau&amp;lt;br&amp;gt;temperaturstabil || XTAL1/2 Pins nicht 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. 10ms)&amp;lt;br&amp;gt;2 zusätzliche Ballast-Kondensatoren typ. 22 pF&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1-100ppm || 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 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. 10ms)&lt;br /&gt;
|}&lt;br /&gt;
1ppm = 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 des 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 des 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 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 ihrer Größe gibt es die folgende Formel:&lt;br /&gt;
&lt;br /&gt;
C=2xCL-(CP+CI)&lt;br /&gt;
&lt;br /&gt;
* CP: Leiterbahnen bedingte Kapazität&lt;br /&gt;
* CI: Portbedingte Kapazität&lt;br /&gt;
* CL: Datenblatt des Quarzes&lt;br /&gt;
CP+CI ca. 5pF ?&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von CL = 32pF:&lt;br /&gt;
&lt;br /&gt;
C = 2x32pF-5pF = 59pF&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 den Parallelport oder USB gibt es z.&amp;amp;nbsp;B. auf http://shop.mikrocontroller.net/. &lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung gibt es u.a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel] oder [http://rumil.de/hardware/avrisp.html http://rumil.de/hardware/avrisp.html].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an den Parallelport an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan).&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 [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR-Studio] 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], [http://avra.sourceforge.net/ 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 [http://www.mikrocontroller.net/articles/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 PDF-Dateien runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf Datenblatt des ATmega8 (6,3 MB)]&lt;br /&gt;
* [http://www.atmel.com/Images/Atmel-0856-AVR-Instruction-Set-Manual.pdf Befehlssatz der AVRs (1,4 MB)]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/controller/befehle/avr-befehle.htm Befehlssatz in deutscher Übersetzung online]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/controller/atmega8/atmega8.htm Datenblatt des ATmega8 in deutscher Übersetzung online]&lt;br /&gt;
&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>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Richtiges_Designen_von_Platinenlayouts&amp;diff=90391</id>
		<title>Richtiges Designen von Platinenlayouts</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Richtiges_Designen_von_Platinenlayouts&amp;diff=90391"/>
		<updated>2015-11-24T13:25:19Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Gutes Platinenlayout (Dos) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beim Erstellen von Platinenlayouts muss man vieles beachten. Dieser Artikel zählt auf, was man machen sollte (Dos), und was man keinesfalls machen sollte (Don&#039;ts).&lt;br /&gt;
Der Grund hierfür ist, dass die &amp;quot;Regeln&amp;quot; (besser eigentlich &amp;quot;Bedingungen&amp;quot;) sehr umfangreich und komplex sind. Dazu kommt, dass es eigentlich keine Regel ohne Ausnahme gibt, und zusätzlich zu den rein elektrotechnischen Anforderungen noch mechanische und chemische sowie betriebswirtschaftliche Anforderungen bestehen. Siehe dazu diesen [http://www.mikrocontroller.net/topic/305443#3280240 Diskussionsbeitrag (letzter Absatz)].&lt;br /&gt;
&lt;br /&gt;
== Gutes Platinenlayout (Do&#039;s) ==&lt;br /&gt;
&lt;br /&gt;
* Berechne nach dem Erstellen des Schaltplans, welche Ströme über die Leiterbahn fließen werden und bestimme anhand dessen deren minimale Breite. Faustformel: 0,35mm können ohne nennenswerte Erwärmung mit einem Ampere belastet werden. Kritische Leitungen sollten als Vorgabe für den Layouter in der Zeichnung vermerkt werden. Weiteres siehe unter [[Leiterbahnbreite]].&lt;br /&gt;
* Halte die Leiterbahn möglichst kurz. Jeder Leiterzug wirkt wie eine Antenne, welche Störungen aussendet und empfängt.&lt;br /&gt;
* Nutze die freien Flächen zwischen den Leiterzügen und verbinde sie mit einer Masse (Polygone). So kann man Strahlung von außen abschirmen und oft Abstrahlung minimieren. Vermeide aber freie Kupferflächen, die nicht an GND angeschlossen sind. &lt;br /&gt;
* Geize nicht mit [[Kondensator#Entkoppelkondensator | Blockkondensatoren]]. Für jeden VCC-Pin o.ä. ist mindestens ein 100nF Kondensator, bei schnelleren Sachen evtl. ein kleinerer (z.&amp;amp;nbsp;B. 10nF) einzusetzen. Ausserdem kann es meist notwendig sein, pro IC noch zusätzlich einen 10µF Kondensator und eine Ferritperle (engl. bead) zur Entkopplung von Vcc zu spendieren.&lt;br /&gt;
* Digitale und analoge Signale getrennt routen und nur in einem Punkt verbinden. Und zwar idealerweise am [[AD-Wandler]], falls dieser vorhanden ist, sonst in der Nähe des Spannungsreglers. Eine Massefläche für analoge und digitale Schaltungsteile sollte durchgängig sein, getrennte Masseflächen sind nur in sehr seltenen Fällen sinnvoll. &lt;br /&gt;
* Nutze die Anschlüsse der bedrahteten Bauelemente für Durchkontaktierungen.&lt;br /&gt;
* Wenn es sich nicht vermeiden lässt 230V (400V) Netzspannung auf die Platine zu führen, so trenne die Bereiche der Kleinspannung und Netzspannung deutlich voneinander und mit vieeel Platz. Dabei unterscheidet man zwischen Luft- und Kriechstrecken. Eine Kriechstrecke ist die Strecke auf der Oberfläche einer Leiterplatte oder eines Bauteils. Die Luftstrecke ist sozusagen die kürzeste Verbindung zwischen den beiden Potentialen. Die Luft- und Kriechstrecken betragen zwischen 3 und 8 mm. Maximale Spannung z.b. 3kV/cm, bei lackierten Platinen 1kv/mm. Der notwendige Abstand hängt von der Gefährdung ab, siehe auch [[Leiterbahnabstände]].&lt;br /&gt;
* Möglichst eine großflächige Ground-Plane für Masseverbindungen.&lt;br /&gt;
&lt;br /&gt;
== Schlechtes Platinenlayout (Dont&#039;s) ==&lt;br /&gt;
&lt;br /&gt;
* Analoge und digitale Schaltungsteile direkt ohne Filter aus der gleichen Stromquelle versorgen.&lt;br /&gt;
* Nicht beachtet, dass Ströme im Kreis fließen und damit empfindliche Signale zusammen mit pulsierenden Versorgungsströmen über die gleichen Bahnen geleitet (Sternförmige Masseführung nicht beachtet)&lt;br /&gt;
* Digitale Signalleitungen in unmittelbarer Nachbarschaft analoger Signale&lt;br /&gt;
* Zu wenig Abstand zwischen Leiterplattenrand und Leiterzügen&lt;br /&gt;
* Spitze Winkel kleiner als ca. 45° beim Routen von Leiterbahnen. Entgegen der weit verbreiteten Annahme hat das nur sehr wenig Auswirkungen auf die HF-Eigenschaften, mehr dazu im Artikel [[Wellenwiderstand#Leitungsf.C3.BChrung_und_Layout | Wellenwiderstand]]. Es sind mehr fertigungstechnische (Ablösung von Ecken, schlechteres Ätzen) und ästhetische Gründe (Aussehen, Packungsdichte der Leitungen). &lt;br /&gt;
* Durchkontaktierungen auf SMD-Pads. Beim maschinellen Löten läuft das Lötzinn in die Bohrung ab (u.a. durch Kapillarwirkung) und fehlt auf dem Pad. Die Fehlerhäufigkeit steigt. Bei speziellen Footprints (große Ball Grid Arrays) oder Thermal Vias geht es aber nicht anders als Vias in Pads unterzubringen. In diesem Falle müssen die Vias verschlossen werden (engl. plugged via, tented via). Eine weitere Möglichkeit ist es, einen Überschuss an Lotpaste auf das Pad aufzubringen (dickere Siebdruckschablone) oder die Vias mit Barrieren aus Lötstopplack zu umgeben, aber nicht abzudecken&lt;br /&gt;
* Durchkontaktierungen von beiden Seiten mit Stopplack verschließen. Es könnten Feuchtigkeit oder gar Ätzrückstände darin zurückbleiben und beim Löten der Stopplack abplatzen oder Korrosion auftreten (ggf. Hersteller fragen)&lt;br /&gt;
* Bestückdruck auf Lötpads platziert&lt;br /&gt;
* Keine Testpunkte, keine Befestigungsbohrungen&lt;br /&gt;
* Zu wenig Durchkontaktierungen bei hohen Strömen&lt;br /&gt;
* Entkoppelkondensatoren über unnötig lange Leiterbahnen angebunden&lt;br /&gt;
* Keine Massefläche (engl. ground plane). Bei vielen zweilagigen Platinen mit hoher Bauteildichte kann man sich keine Massefläche leisten, spätestens ab 4 Lagen ist diese jedoch praktisch immer verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Vorgehen bei der Layouterstellung ==&lt;br /&gt;
* Umrisse der Platine festlegen, dabei Bruchkanten eventueller Nutzen beachten&lt;br /&gt;
* Befestigungsbohrungen festlegen, dabei ausreichend Platz für Schraubenköpfe und Werkzeuge freihalten (Sperrflächen verlegen)&lt;br /&gt;
* Steckverbinder platzieren. Dabei den 3D-Zusammenhang mit anderen Platinen im Bezug auf Kabeldrehung und  -knickung beachten, ggf. Steckverbinder um 180 Grad drehen, um Sonderkabel zu vermeiden. Steckverbinder auch nicht völlig am Rand platzieren, um Biegeradius von Flachbandkabeln und Zwischenraum zur Gehäusewand zu schaffen. Steckverbinder, welche direkt in einer Frontplatte enden, werden natürlich direkt am Rand platziert. &lt;br /&gt;
* Bauteile platzieren. Dabei möglichst zusammengehörige Bauteile nebeneinander platzieren. Die Luftlinien (engl. air wires) möglichst kurz und kreuzungsarm halten. Idealerweise erst die grossen und hohen Bauteile festlegen, dabei Einbaumasse und -raum beachten, auch in Bezug auf die Wärmeentwicklung&lt;br /&gt;
* Stromversorgung der ICs verlegen, dabei Abstand zu Kanten und kritischen Signalen /-eingängen beachten. Ebenso [[Leiterbahnabstände | Kriechstrecken]] beachten&lt;br /&gt;
* Kritische Signale wie Takte, Sensoreingänge etc. möglichst ohne Lagenwechsel verlegen, ggf. guard lines verwenden &lt;br /&gt;
* Restliche Signale verlegen&lt;br /&gt;
* Masseflächen füllen&lt;br /&gt;
** Masseflächen können eine Schaltung deutlich verbessern, wenn sie richtig benutzt werden. Sie können aber auch genau das Gegenteil bewirken, wenn sie als automatisches Wundermittel betrachtet werden.&lt;br /&gt;
** Die Masseverbindung aller ICs muss zunächst direkt verlegt werden.&lt;br /&gt;
** Erst wenn die Masse komplett verlegt ist, kann man die Massefläche auffüllen. Damit verhindert man, dass vielleicht ein IC nur über eine sehr dünne Verbindung angeschlossen wird, welche man in der Massefläche übersieht. Ebenso verhindert man, dass eine Massverbindung von einem schnellen IC sehr lang wird und damit die Wirksamkeit der [[Kondensator#Entkoppelkondensator | Entkoppelkondensatoren]] leidet.&lt;br /&gt;
** Masseflächen sind nur dann wirklich wirksam, wenn sie möglichst durchgängig sind. Wenn sie durch viele Leitungen zerschnitten werden, sinkt ihre Wirksamkeit massiv und sie können sich zu einem [[EMV]]-Problem entwickeln (Abstrahlung von Energie, Streifen- und Schlitzantennen). Bei zweilagigen Platinen ist es aber kaum möglich, dass Masseflächen nicht zerstückelt werden. Auf jeden Fall darauf achten, das KEINE Zipfel oder Streifen Massefläche existieren, die nicht an mindestens beiden Enden mit anderen Masseflächen verbunden sind. Für &amp;quot;Systeme&amp;quot; aus solchen Masseflächen gilt gleiches, d.h. die Masseflächen müssen auch untereinander gut vernetzt werden. Wenn dieses nicht erreicht werden kann, so ist die Massefläche besser wegzulassen.&lt;br /&gt;
** Bei Platinen mit vier oder mehr Lagen wird meist eine Lage für die Masse (GND) verwendet. Hier hat man den Luxus, dass man GND nicht manuell layouten muss sondern einfach die ICs an die Massefläche anschließt. Aber Vorsicht! Bei Schaltreglern und Leistungsstufen für Motoren und Ähnlichem ist es oft besser bzw. notwendig, auf Masseflächen zu verzichten und statt dessen mit dicken Leitungen bzw. kleineren Polygonen die Ströme sternförmig zu führen.&lt;br /&gt;
** Des weiteren ergibt sich bei Platinen mit vier oder mehr Lagen die Möglichkeit, auch die Spannungsversorgung (&amp;quot;+ Leitung&amp;quot;) als Fläche auszuführen. Grundsätzlich gelten hierbei die gleichen Empfehlungen wie für die Masseflächen. Diese beiden Stromversorgungslagen sollten in dem Sinne, dass sie einen großen, verteilten Kondensator darstellen, der extrem impedanzarm ist, möglichst dicht zusammen liegen. Bei einem Multilayeraufbau mit vier Lagen wären das z.B. die beiden inneren Lagen. Zusätzlich sollten die beiden Lagen öfters mit keramischen Kondensatoren verbunden werden, mindestens an jedem IC zur Spannungsversorgung.&lt;br /&gt;
* Für die Bestückung und das Bedrucken mit Lotpaste sind Passermarken (engl. Fiducials) nötig. Diese Passermarken werden normalerweise als Kreuze oder besser als runde Pads (z.B 1mm) ausgeführt und von Kupfer freigestellt (2mm, Nicht in die Masseflächen einbeziehen). Die Passermarken werden dann von Lötstop freigegstellt und in der Lotpastenschablone (engl. stencil) mit eingebracht. Auf jede zu bestückende Seite sollten zwei Passermarken diagonal auf den Boards eingebracht werden. Andere Vorschläge zielen darauf ab, die Passermarken nicht für das komplette Board, sondern immer extra für spezielle &amp;quot;kritische&amp;quot; Footprints einzusetzten. Passermarken zur Platinenfertigung setzten sich die Platinenfertiger selbstständig ausserhalb der Platinen nach ihren eigenen Bedürfnissen. Die Passermarken für die Bestücker werden voraussichtlich von den Bestückern auch noch adaptiert, so dass sie lediglich als Platzhalter zu verstehen sind, damit Raum beim routen dafür ausgespart bleibt.&lt;br /&gt;
*Der Bestückungsdruck wird am Ende ausgerichtet. Dazu sollte man nahezu alle Lagen ausblenden und nur die Lagen für Bestückungsdruck, Umrisse und Lötstopmaske anzeigen lassen. Dann richtet man die Beschriftungen so aus, dass sie neben den Bauteilen aber nicht auf den Flächen der Lötstopmaske liegen, denn dort gehört die Lotpaste und später der Anschluss der Bauteile hin. Bei sehr dicht bestückten Platinen muss man den Bestückungsdruck teilweise oder vollständig weglassen. Dort platziert man die Bauteilbezeichnung direkt auf dem Bauteil. Damit kann man den Bestückungsdruck wenigstens auf Papier drucken und somit indirekt nutzen. Einige Profi-CAD-Programme haben dafür auch getrennte Ebenen (engl. Layer).&lt;br /&gt;
&lt;br /&gt;
== CAM Input und Produktion / Berücksichtigung von Technologiegrenzen ==&lt;br /&gt;
&lt;br /&gt;
Um Platinen fertigungsgerecht zu layouten, ist es sinnvoll, in etwa zu wissen, was in der Leiterplattenfabrik gemacht wird, wie die Daten für die Produktion aufgearbeitet werden müssen, und wo dort Schwachstellen liegen, um diese nach Möglichkeit zu vermeiden, zu verringern oder zu Umgehen. Diese Grenzen der Technologie sind &amp;quot;weich&amp;quot;, das heisst, ab einem Grundlevel, ab dem eine fehlerfrei Produktion machbar ist, steigt mit zunehmenden Anforderungen der Ausschuss. Den kauft man zum einen mit d.H. man muss ihn im Rahmen der Kalkulation mitbezahlen, auch wenn er schon in der Fabrik weggegeworfen wird, und er muss mit, im Zweifelsfalle aufwändigen und auch nur begrenzt zuverlässigen Verfahren, aussortiert werden. &lt;br /&gt;
&lt;br /&gt;
Hier sollte man also den Grundsatz verfolgen: So grob und einfach wie möglich und so fein wie nötig.&lt;br /&gt;
&lt;br /&gt;
Im folgenden sollen hier ein paar grobe Richtwerte gegeben werden, die eigentlich jede Leiterplattenfabrik kann, und die somit den konservativ definierten Stand der Technik darstellen (Stand ca. 2012). Trozdem sollte man sich im Vorfeld immer informieren. Es ist deutlich mehr möglich, aber das ist abhängig von den Fertigungsstrassen der einzelnen Fabriken und kostet natürlich auch mehr. Man Behalte im Auge, daß hier um fertigungsmechanische und ätztechnische Gründe bei Herstellung der Platine geht, nicht um elektrotechnische Gründe für die fertige Platine. &lt;br /&gt;
&lt;br /&gt;
*Unterätzungsfaktor/U-Faktor &lt;br /&gt;
&lt;br /&gt;
**Um die Unterätzung zu kompensieren, müssen beim CAM-Input die Kupferlagen durch Zugabe einer Breite (U-Faktor) verbreitert werden. Der U-Faktor ist abhängig von dem Materialstärke, die weggeätzt werden muss. Das ist nicht identisch mit der Kupferlage, weil es ja auch Fälle gibt, wo auf eine dünne Vorlage partiell aufgetragen wird wird, und dann alles komplett um die Vorlage abgeätzt wird. Hier ist nur ein U-Faktor für die Vorlagendicke erforderlich.&lt;br /&gt;
&lt;br /&gt;
***Standard:&lt;br /&gt;
****U-Faktor Aussenlagen (35u): +25u (insgesamt), weil beidseitige Wirkung pro Seite 12,5u)&lt;br /&gt;
****U-Faktor Innenlagen (35u): +50u (insgesamt, weil beidseitige Wirkung pro Seite 25u)&lt;br /&gt;
****Wenn Isolationsbreite weniger als 150u, sollte dort NICHT das komplette Leiterbild bearbeitet werden, sondern nur die Pads um z.B. 15u vergrößert werden.&lt;br /&gt;
****Leiterbahnbreiten die kleiner als 150u sind, sollten dabei auf 165u verbreitert werden, wenn die verbleibende Isolation (aus Äztechnischer Sicht!) dieses zulässt.&lt;br /&gt;
&lt;br /&gt;
**Die Software im CAM-Input stellt dafür im allgemeinen spezielle Funktionen zur Vefügung. Diese beruhen aber auch darauf, dass Flächen als Polygone ausgeführt werden, und nicht durch Leiterbahnzüge &amp;quot;gemalt&amp;quot; werden. Desweiteren sollten Pads und nur Pads im Gerber-Format als &amp;quot;Flashs&amp;quot; bzw. &amp;quot;Blinks&amp;quot; dargestellt werden, und Leiterbahnen und eben nur Leiterbahnen als &amp;quot;Draws&amp;quot;, im Grenzfalle auch mit einem &amp;quot;Draw&amp;quot; der Länge 0. Auch wenn ein &amp;quot;Draw&amp;quot; der Länge 0 genauso wie ein &amp;quot;Flash&amp;quot; gleicher Apertur aussieht, gibt die unterscheidung &amp;quot;Draw&amp;quot; zu &amp;quot;Flash&amp;quot; den Aufbearbeitungsalgorithmen der CAM-Input Software wichtige Hinweise.&lt;br /&gt;
&lt;br /&gt;
*Lücken füllen:&lt;br /&gt;
**Sehr schmale „Isostellen“ in der gleichen Kupferfläche und kleine Löcher in Kupferflächen stellen beim Ätzen ein Problem dar, weil das für die Resistschicht kleine &amp;quot;Inseln&amp;quot; oder &amp;quot;Halbinseln&amp;quot; bedeutet, die u.U. nicht halten, sich ablösen, und sich dafür noch anderswo anlagern können, und somit an der Stelle, wo sie fehlen, Unterbrechungen, und an den Stellen, wo die abgerissenen Stücke sich festsetzten, unerwünschte Verbindungen entstehen können. Darum müssen solche Stellen, bearbeitet werden. Das wird Grundsätzlich nach Leiterbildvergrößerung mit U-Faktor gemacht, weil sich einige Lücken dadurch von selber schliessen. Im allgemeinen wird zum füllen einfach ein kleines Stück Leiterbahn über diese Stelle gelegt. Kritisch sind freistehende Resistflächen von ca. 150u mal 150u Abmessungen und kleiner. Werden sie von einer oder zwei Seiten von größeren Resistflächen gehalten, können auch Streifen von ca. 100u tragbar sein, wenn sie nicht zu lang werden.&lt;br /&gt;
&lt;br /&gt;
*Rekalkulieren der Bohrer:&lt;br /&gt;
**Bohrungen für durchkontaktierte (DK)-Bohrungen müssen größer gebohrt werden, weil sie ja zukupfern (Bohrvorlage typisch 200u). Dadurch wird der verbleibende Restring eventuell zu klein.&lt;br /&gt;
**Via Bohrungen (alle Bohrungen kleiner als 0,5 mm) werden nach dem vorhandenen Lötauge gewählt und eventuell vergrößert/verkleinert. Vergrößert, wenn es möglich ist, weil es fertigungstechnische Vorteile bietet, und verkleinert, wenn es sonst Probleme mit Abständen gibt. Der Kupferquerschnitt wird dadurch im allgemeinen nicht zu auffällig verkleinert, und THT-Anschlüsse dünner als 0,5mm sind unbekannt, es kann also (eigentlich) keiner etwas hindurchstecken wollen.&lt;br /&gt;
**Anzustreben sind Bohrer von größer 0,4mm und ein Restring von 175u Breite. Das ist unproblematisch für Lötaugen von 700u (Original), weil ja 50u Durchmesser vom U-Faktor dazukommen. Die Bohrvorlage kann zur Not auf 150u verringert werden.&lt;br /&gt;
**Bohrungen von größer als 0,4mm sind darum anzustreben, weil damit zwei Leiterplatten auf einmal im Stapel gebohrt werden können. Unter 0,4mm wird die seitliche Abweichung der Bohrung in der unteren Leiterplatte so groß, daß sie eventuell ein Pad von der Leiterbahn abschneiden kann. Bei einer Serienfertigung bedeuten darum Bohrungen kleiner als 0,4mm doppelten Aufwand, was sich auch im Preis niederschlägt.....oder einen Wettbewerbsvorteil für Fertiger, die es besser können.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[EMV]]&lt;br /&gt;
* [[Eagle im Hobbybereich]]&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-6-178710.html#254235 Forumsbeitrag]: Regeln beim Platinenentwurf&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/93602#804338 Forumsbeitrag]: Vorschlag für Lötpads bei Hobbyeinsteigerplatinen&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/306233#new Forumsbeitrag]: Über spezielle Padformen (Teardrop, Snowman, Oktogon)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/231263#new Forumsbeitrag]: Suche gutes Buch über Layout-Techniken (Literaturtipps und Links).&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/305443#3286008 Forumsbeitrag]: Tutorials zu Platinenlayout&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/310971#new Forumsbeitrag]: Tipps zum Routen und Entflechten von Platinen.&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/313990#3393319 Forumsbeitrag]: Das Routen von LVDS Signalen.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.ilfa.de/design-optimierung.html Optimierung von Layouts]&lt;br /&gt;
*[http://www.ilfa.de/designrichtlinien Weitere Dokumente zum Thema professionelle Platinenherstellung]&lt;br /&gt;
* [http://www.analog.com/library/analogDialogue/Anniversary/12.html Grounding (Again)], Ask The Applications Engineer - 12, Fa. Analog Devices, (englisch)&lt;br /&gt;
&amp;lt;!-- * http://edaboard.com --&amp;gt;&lt;br /&gt;
* [http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=115 Designing a Better PCB] von Sparkfun (engl.)&lt;br /&gt;
* [http://www.hottconsultants.com/tips.html Tech Tips] von Henry Ott (engl.)&lt;br /&gt;
* [http://www.ultracad.com/articles/90deg.pdf Messung] von verschiedenen Winkeln von Leiterbahnen mit 17ps TDR, keinerlei Unterschiede!&lt;br /&gt;
* [http://www.ilfa.de/absorptivesstromversorgungssysteminleiterplatten.html ILFA], Dämpfung von Resonanzen der Versorgungslagen durch Carbondruck&lt;br /&gt;
* [http://docs.toradex.com/101123-apalis-arm-carrier-board-design-guide.pdf Link]: Tipps zum erstellen von High Speed Platinen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Platinen]]&lt;br /&gt;
[[Kategorie:Schaltplaneditoren]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Richtiges_Designen_von_Platinenlayouts&amp;diff=90390</id>
		<title>Richtiges Designen von Platinenlayouts</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Richtiges_Designen_von_Platinenlayouts&amp;diff=90390"/>
		<updated>2015-11-24T13:25:06Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Schlechtes Platinenlayout (Don&amp;#039;ts) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beim Erstellen von Platinenlayouts muss man vieles beachten. Dieser Artikel zählt auf, was man machen sollte (Dos), und was man keinesfalls machen sollte (Don&#039;ts).&lt;br /&gt;
Der Grund hierfür ist, dass die &amp;quot;Regeln&amp;quot; (besser eigentlich &amp;quot;Bedingungen&amp;quot;) sehr umfangreich und komplex sind. Dazu kommt, dass es eigentlich keine Regel ohne Ausnahme gibt, und zusätzlich zu den rein elektrotechnischen Anforderungen noch mechanische und chemische sowie betriebswirtschaftliche Anforderungen bestehen. Siehe dazu diesen [http://www.mikrocontroller.net/topic/305443#3280240 Diskussionsbeitrag (letzter Absatz)].&lt;br /&gt;
&lt;br /&gt;
== Gutes Platinenlayout (Dos) ==&lt;br /&gt;
&lt;br /&gt;
* Berechne nach dem Erstellen des Schaltplans, welche Ströme über die Leiterbahn fließen werden und bestimme anhand dessen deren minimale Breite. Faustformel: 0,35mm können ohne nennenswerte Erwärmung mit einem Ampere belastet werden. Kritische Leitungen sollten als Vorgabe für den Layouter in der Zeichnung vermerkt werden. Weiteres siehe unter [[Leiterbahnbreite]].&lt;br /&gt;
* Halte die Leiterbahn möglichst kurz. Jeder Leiterzug wirkt wie eine Antenne, welche Störungen aussendet und empfängt.&lt;br /&gt;
* Nutze die freien Flächen zwischen den Leiterzügen und verbinde sie mit einer Masse (Polygone). So kann man Strahlung von außen abschirmen und oft Abstrahlung minimieren. Vermeide aber freie Kupferflächen, die nicht an GND angeschlossen sind. &lt;br /&gt;
* Geize nicht mit [[Kondensator#Entkoppelkondensator | Blockkondensatoren]]. Für jeden VCC-Pin o.ä. ist mindestens ein 100nF Kondensator, bei schnelleren Sachen evtl. ein kleinerer (z.&amp;amp;nbsp;B. 10nF) einzusetzen. Ausserdem kann es meist notwendig sein, pro IC noch zusätzlich einen 10µF Kondensator und eine Ferritperle (engl. bead) zur Entkopplung von Vcc zu spendieren.&lt;br /&gt;
* Digitale und analoge Signale getrennt routen und nur in einem Punkt verbinden. Und zwar idealerweise am [[AD-Wandler]], falls dieser vorhanden ist, sonst in der Nähe des Spannungsreglers. Eine Massefläche für analoge und digitale Schaltungsteile sollte durchgängig sein, getrennte Masseflächen sind nur in sehr seltenen Fällen sinnvoll. &lt;br /&gt;
* Nutze die Anschlüsse der bedrahteten Bauelemente für Durchkontaktierungen.&lt;br /&gt;
* Wenn es sich nicht vermeiden lässt 230V (400V) Netzspannung auf die Platine zu führen, so trenne die Bereiche der Kleinspannung und Netzspannung deutlich voneinander und mit vieeel Platz. Dabei unterscheidet man zwischen Luft- und Kriechstrecken. Eine Kriechstrecke ist die Strecke auf der Oberfläche einer Leiterplatte oder eines Bauteils. Die Luftstrecke ist sozusagen die kürzeste Verbindung zwischen den beiden Potentialen. Die Luft- und Kriechstrecken betragen zwischen 3 und 8 mm. Maximale Spannung z.b. 3kV/cm, bei lackierten Platinen 1kv/mm. Der notwendige Abstand hängt von der Gefährdung ab, siehe auch [[Leiterbahnabstände]].&lt;br /&gt;
* Möglichst eine großflächige Ground-Plane für Masseverbindungen.&lt;br /&gt;
&lt;br /&gt;
== Schlechtes Platinenlayout (Dont&#039;s) ==&lt;br /&gt;
&lt;br /&gt;
* Analoge und digitale Schaltungsteile direkt ohne Filter aus der gleichen Stromquelle versorgen.&lt;br /&gt;
* Nicht beachtet, dass Ströme im Kreis fließen und damit empfindliche Signale zusammen mit pulsierenden Versorgungsströmen über die gleichen Bahnen geleitet (Sternförmige Masseführung nicht beachtet)&lt;br /&gt;
* Digitale Signalleitungen in unmittelbarer Nachbarschaft analoger Signale&lt;br /&gt;
* Zu wenig Abstand zwischen Leiterplattenrand und Leiterzügen&lt;br /&gt;
* Spitze Winkel kleiner als ca. 45° beim Routen von Leiterbahnen. Entgegen der weit verbreiteten Annahme hat das nur sehr wenig Auswirkungen auf die HF-Eigenschaften, mehr dazu im Artikel [[Wellenwiderstand#Leitungsf.C3.BChrung_und_Layout | Wellenwiderstand]]. Es sind mehr fertigungstechnische (Ablösung von Ecken, schlechteres Ätzen) und ästhetische Gründe (Aussehen, Packungsdichte der Leitungen). &lt;br /&gt;
* Durchkontaktierungen auf SMD-Pads. Beim maschinellen Löten läuft das Lötzinn in die Bohrung ab (u.a. durch Kapillarwirkung) und fehlt auf dem Pad. Die Fehlerhäufigkeit steigt. Bei speziellen Footprints (große Ball Grid Arrays) oder Thermal Vias geht es aber nicht anders als Vias in Pads unterzubringen. In diesem Falle müssen die Vias verschlossen werden (engl. plugged via, tented via). Eine weitere Möglichkeit ist es, einen Überschuss an Lotpaste auf das Pad aufzubringen (dickere Siebdruckschablone) oder die Vias mit Barrieren aus Lötstopplack zu umgeben, aber nicht abzudecken&lt;br /&gt;
* Durchkontaktierungen von beiden Seiten mit Stopplack verschließen. Es könnten Feuchtigkeit oder gar Ätzrückstände darin zurückbleiben und beim Löten der Stopplack abplatzen oder Korrosion auftreten (ggf. Hersteller fragen)&lt;br /&gt;
* Bestückdruck auf Lötpads platziert&lt;br /&gt;
* Keine Testpunkte, keine Befestigungsbohrungen&lt;br /&gt;
* Zu wenig Durchkontaktierungen bei hohen Strömen&lt;br /&gt;
* Entkoppelkondensatoren über unnötig lange Leiterbahnen angebunden&lt;br /&gt;
* Keine Massefläche (engl. ground plane). Bei vielen zweilagigen Platinen mit hoher Bauteildichte kann man sich keine Massefläche leisten, spätestens ab 4 Lagen ist diese jedoch praktisch immer verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Vorgehen bei der Layouterstellung ==&lt;br /&gt;
* Umrisse der Platine festlegen, dabei Bruchkanten eventueller Nutzen beachten&lt;br /&gt;
* Befestigungsbohrungen festlegen, dabei ausreichend Platz für Schraubenköpfe und Werkzeuge freihalten (Sperrflächen verlegen)&lt;br /&gt;
* Steckverbinder platzieren. Dabei den 3D-Zusammenhang mit anderen Platinen im Bezug auf Kabeldrehung und  -knickung beachten, ggf. Steckverbinder um 180 Grad drehen, um Sonderkabel zu vermeiden. Steckverbinder auch nicht völlig am Rand platzieren, um Biegeradius von Flachbandkabeln und Zwischenraum zur Gehäusewand zu schaffen. Steckverbinder, welche direkt in einer Frontplatte enden, werden natürlich direkt am Rand platziert. &lt;br /&gt;
* Bauteile platzieren. Dabei möglichst zusammengehörige Bauteile nebeneinander platzieren. Die Luftlinien (engl. air wires) möglichst kurz und kreuzungsarm halten. Idealerweise erst die grossen und hohen Bauteile festlegen, dabei Einbaumasse und -raum beachten, auch in Bezug auf die Wärmeentwicklung&lt;br /&gt;
* Stromversorgung der ICs verlegen, dabei Abstand zu Kanten und kritischen Signalen /-eingängen beachten. Ebenso [[Leiterbahnabstände | Kriechstrecken]] beachten&lt;br /&gt;
* Kritische Signale wie Takte, Sensoreingänge etc. möglichst ohne Lagenwechsel verlegen, ggf. guard lines verwenden &lt;br /&gt;
* Restliche Signale verlegen&lt;br /&gt;
* Masseflächen füllen&lt;br /&gt;
** Masseflächen können eine Schaltung deutlich verbessern, wenn sie richtig benutzt werden. Sie können aber auch genau das Gegenteil bewirken, wenn sie als automatisches Wundermittel betrachtet werden.&lt;br /&gt;
** Die Masseverbindung aller ICs muss zunächst direkt verlegt werden.&lt;br /&gt;
** Erst wenn die Masse komplett verlegt ist, kann man die Massefläche auffüllen. Damit verhindert man, dass vielleicht ein IC nur über eine sehr dünne Verbindung angeschlossen wird, welche man in der Massefläche übersieht. Ebenso verhindert man, dass eine Massverbindung von einem schnellen IC sehr lang wird und damit die Wirksamkeit der [[Kondensator#Entkoppelkondensator | Entkoppelkondensatoren]] leidet.&lt;br /&gt;
** Masseflächen sind nur dann wirklich wirksam, wenn sie möglichst durchgängig sind. Wenn sie durch viele Leitungen zerschnitten werden, sinkt ihre Wirksamkeit massiv und sie können sich zu einem [[EMV]]-Problem entwickeln (Abstrahlung von Energie, Streifen- und Schlitzantennen). Bei zweilagigen Platinen ist es aber kaum möglich, dass Masseflächen nicht zerstückelt werden. Auf jeden Fall darauf achten, das KEINE Zipfel oder Streifen Massefläche existieren, die nicht an mindestens beiden Enden mit anderen Masseflächen verbunden sind. Für &amp;quot;Systeme&amp;quot; aus solchen Masseflächen gilt gleiches, d.h. die Masseflächen müssen auch untereinander gut vernetzt werden. Wenn dieses nicht erreicht werden kann, so ist die Massefläche besser wegzulassen.&lt;br /&gt;
** Bei Platinen mit vier oder mehr Lagen wird meist eine Lage für die Masse (GND) verwendet. Hier hat man den Luxus, dass man GND nicht manuell layouten muss sondern einfach die ICs an die Massefläche anschließt. Aber Vorsicht! Bei Schaltreglern und Leistungsstufen für Motoren und Ähnlichem ist es oft besser bzw. notwendig, auf Masseflächen zu verzichten und statt dessen mit dicken Leitungen bzw. kleineren Polygonen die Ströme sternförmig zu führen.&lt;br /&gt;
** Des weiteren ergibt sich bei Platinen mit vier oder mehr Lagen die Möglichkeit, auch die Spannungsversorgung (&amp;quot;+ Leitung&amp;quot;) als Fläche auszuführen. Grundsätzlich gelten hierbei die gleichen Empfehlungen wie für die Masseflächen. Diese beiden Stromversorgungslagen sollten in dem Sinne, dass sie einen großen, verteilten Kondensator darstellen, der extrem impedanzarm ist, möglichst dicht zusammen liegen. Bei einem Multilayeraufbau mit vier Lagen wären das z.B. die beiden inneren Lagen. Zusätzlich sollten die beiden Lagen öfters mit keramischen Kondensatoren verbunden werden, mindestens an jedem IC zur Spannungsversorgung.&lt;br /&gt;
* Für die Bestückung und das Bedrucken mit Lotpaste sind Passermarken (engl. Fiducials) nötig. Diese Passermarken werden normalerweise als Kreuze oder besser als runde Pads (z.B 1mm) ausgeführt und von Kupfer freigestellt (2mm, Nicht in die Masseflächen einbeziehen). Die Passermarken werden dann von Lötstop freigegstellt und in der Lotpastenschablone (engl. stencil) mit eingebracht. Auf jede zu bestückende Seite sollten zwei Passermarken diagonal auf den Boards eingebracht werden. Andere Vorschläge zielen darauf ab, die Passermarken nicht für das komplette Board, sondern immer extra für spezielle &amp;quot;kritische&amp;quot; Footprints einzusetzten. Passermarken zur Platinenfertigung setzten sich die Platinenfertiger selbstständig ausserhalb der Platinen nach ihren eigenen Bedürfnissen. Die Passermarken für die Bestücker werden voraussichtlich von den Bestückern auch noch adaptiert, so dass sie lediglich als Platzhalter zu verstehen sind, damit Raum beim routen dafür ausgespart bleibt.&lt;br /&gt;
*Der Bestückungsdruck wird am Ende ausgerichtet. Dazu sollte man nahezu alle Lagen ausblenden und nur die Lagen für Bestückungsdruck, Umrisse und Lötstopmaske anzeigen lassen. Dann richtet man die Beschriftungen so aus, dass sie neben den Bauteilen aber nicht auf den Flächen der Lötstopmaske liegen, denn dort gehört die Lotpaste und später der Anschluss der Bauteile hin. Bei sehr dicht bestückten Platinen muss man den Bestückungsdruck teilweise oder vollständig weglassen. Dort platziert man die Bauteilbezeichnung direkt auf dem Bauteil. Damit kann man den Bestückungsdruck wenigstens auf Papier drucken und somit indirekt nutzen. Einige Profi-CAD-Programme haben dafür auch getrennte Ebenen (engl. Layer).&lt;br /&gt;
&lt;br /&gt;
== CAM Input und Produktion / Berücksichtigung von Technologiegrenzen ==&lt;br /&gt;
&lt;br /&gt;
Um Platinen fertigungsgerecht zu layouten, ist es sinnvoll, in etwa zu wissen, was in der Leiterplattenfabrik gemacht wird, wie die Daten für die Produktion aufgearbeitet werden müssen, und wo dort Schwachstellen liegen, um diese nach Möglichkeit zu vermeiden, zu verringern oder zu Umgehen. Diese Grenzen der Technologie sind &amp;quot;weich&amp;quot;, das heisst, ab einem Grundlevel, ab dem eine fehlerfrei Produktion machbar ist, steigt mit zunehmenden Anforderungen der Ausschuss. Den kauft man zum einen mit d.H. man muss ihn im Rahmen der Kalkulation mitbezahlen, auch wenn er schon in der Fabrik weggegeworfen wird, und er muss mit, im Zweifelsfalle aufwändigen und auch nur begrenzt zuverlässigen Verfahren, aussortiert werden. &lt;br /&gt;
&lt;br /&gt;
Hier sollte man also den Grundsatz verfolgen: So grob und einfach wie möglich und so fein wie nötig.&lt;br /&gt;
&lt;br /&gt;
Im folgenden sollen hier ein paar grobe Richtwerte gegeben werden, die eigentlich jede Leiterplattenfabrik kann, und die somit den konservativ definierten Stand der Technik darstellen (Stand ca. 2012). Trozdem sollte man sich im Vorfeld immer informieren. Es ist deutlich mehr möglich, aber das ist abhängig von den Fertigungsstrassen der einzelnen Fabriken und kostet natürlich auch mehr. Man Behalte im Auge, daß hier um fertigungsmechanische und ätztechnische Gründe bei Herstellung der Platine geht, nicht um elektrotechnische Gründe für die fertige Platine. &lt;br /&gt;
&lt;br /&gt;
*Unterätzungsfaktor/U-Faktor &lt;br /&gt;
&lt;br /&gt;
**Um die Unterätzung zu kompensieren, müssen beim CAM-Input die Kupferlagen durch Zugabe einer Breite (U-Faktor) verbreitert werden. Der U-Faktor ist abhängig von dem Materialstärke, die weggeätzt werden muss. Das ist nicht identisch mit der Kupferlage, weil es ja auch Fälle gibt, wo auf eine dünne Vorlage partiell aufgetragen wird wird, und dann alles komplett um die Vorlage abgeätzt wird. Hier ist nur ein U-Faktor für die Vorlagendicke erforderlich.&lt;br /&gt;
&lt;br /&gt;
***Standard:&lt;br /&gt;
****U-Faktor Aussenlagen (35u): +25u (insgesamt), weil beidseitige Wirkung pro Seite 12,5u)&lt;br /&gt;
****U-Faktor Innenlagen (35u): +50u (insgesamt, weil beidseitige Wirkung pro Seite 25u)&lt;br /&gt;
****Wenn Isolationsbreite weniger als 150u, sollte dort NICHT das komplette Leiterbild bearbeitet werden, sondern nur die Pads um z.B. 15u vergrößert werden.&lt;br /&gt;
****Leiterbahnbreiten die kleiner als 150u sind, sollten dabei auf 165u verbreitert werden, wenn die verbleibende Isolation (aus Äztechnischer Sicht!) dieses zulässt.&lt;br /&gt;
&lt;br /&gt;
**Die Software im CAM-Input stellt dafür im allgemeinen spezielle Funktionen zur Vefügung. Diese beruhen aber auch darauf, dass Flächen als Polygone ausgeführt werden, und nicht durch Leiterbahnzüge &amp;quot;gemalt&amp;quot; werden. Desweiteren sollten Pads und nur Pads im Gerber-Format als &amp;quot;Flashs&amp;quot; bzw. &amp;quot;Blinks&amp;quot; dargestellt werden, und Leiterbahnen und eben nur Leiterbahnen als &amp;quot;Draws&amp;quot;, im Grenzfalle auch mit einem &amp;quot;Draw&amp;quot; der Länge 0. Auch wenn ein &amp;quot;Draw&amp;quot; der Länge 0 genauso wie ein &amp;quot;Flash&amp;quot; gleicher Apertur aussieht, gibt die unterscheidung &amp;quot;Draw&amp;quot; zu &amp;quot;Flash&amp;quot; den Aufbearbeitungsalgorithmen der CAM-Input Software wichtige Hinweise.&lt;br /&gt;
&lt;br /&gt;
*Lücken füllen:&lt;br /&gt;
**Sehr schmale „Isostellen“ in der gleichen Kupferfläche und kleine Löcher in Kupferflächen stellen beim Ätzen ein Problem dar, weil das für die Resistschicht kleine &amp;quot;Inseln&amp;quot; oder &amp;quot;Halbinseln&amp;quot; bedeutet, die u.U. nicht halten, sich ablösen, und sich dafür noch anderswo anlagern können, und somit an der Stelle, wo sie fehlen, Unterbrechungen, und an den Stellen, wo die abgerissenen Stücke sich festsetzten, unerwünschte Verbindungen entstehen können. Darum müssen solche Stellen, bearbeitet werden. Das wird Grundsätzlich nach Leiterbildvergrößerung mit U-Faktor gemacht, weil sich einige Lücken dadurch von selber schliessen. Im allgemeinen wird zum füllen einfach ein kleines Stück Leiterbahn über diese Stelle gelegt. Kritisch sind freistehende Resistflächen von ca. 150u mal 150u Abmessungen und kleiner. Werden sie von einer oder zwei Seiten von größeren Resistflächen gehalten, können auch Streifen von ca. 100u tragbar sein, wenn sie nicht zu lang werden.&lt;br /&gt;
&lt;br /&gt;
*Rekalkulieren der Bohrer:&lt;br /&gt;
**Bohrungen für durchkontaktierte (DK)-Bohrungen müssen größer gebohrt werden, weil sie ja zukupfern (Bohrvorlage typisch 200u). Dadurch wird der verbleibende Restring eventuell zu klein.&lt;br /&gt;
**Via Bohrungen (alle Bohrungen kleiner als 0,5 mm) werden nach dem vorhandenen Lötauge gewählt und eventuell vergrößert/verkleinert. Vergrößert, wenn es möglich ist, weil es fertigungstechnische Vorteile bietet, und verkleinert, wenn es sonst Probleme mit Abständen gibt. Der Kupferquerschnitt wird dadurch im allgemeinen nicht zu auffällig verkleinert, und THT-Anschlüsse dünner als 0,5mm sind unbekannt, es kann also (eigentlich) keiner etwas hindurchstecken wollen.&lt;br /&gt;
**Anzustreben sind Bohrer von größer 0,4mm und ein Restring von 175u Breite. Das ist unproblematisch für Lötaugen von 700u (Original), weil ja 50u Durchmesser vom U-Faktor dazukommen. Die Bohrvorlage kann zur Not auf 150u verringert werden.&lt;br /&gt;
**Bohrungen von größer als 0,4mm sind darum anzustreben, weil damit zwei Leiterplatten auf einmal im Stapel gebohrt werden können. Unter 0,4mm wird die seitliche Abweichung der Bohrung in der unteren Leiterplatte so groß, daß sie eventuell ein Pad von der Leiterbahn abschneiden kann. Bei einer Serienfertigung bedeuten darum Bohrungen kleiner als 0,4mm doppelten Aufwand, was sich auch im Preis niederschlägt.....oder einen Wettbewerbsvorteil für Fertiger, die es besser können.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[EMV]]&lt;br /&gt;
* [[Eagle im Hobbybereich]]&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-6-178710.html#254235 Forumsbeitrag]: Regeln beim Platinenentwurf&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/93602#804338 Forumsbeitrag]: Vorschlag für Lötpads bei Hobbyeinsteigerplatinen&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/306233#new Forumsbeitrag]: Über spezielle Padformen (Teardrop, Snowman, Oktogon)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/231263#new Forumsbeitrag]: Suche gutes Buch über Layout-Techniken (Literaturtipps und Links).&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/305443#3286008 Forumsbeitrag]: Tutorials zu Platinenlayout&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/310971#new Forumsbeitrag]: Tipps zum Routen und Entflechten von Platinen.&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/313990#3393319 Forumsbeitrag]: Das Routen von LVDS Signalen.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.ilfa.de/design-optimierung.html Optimierung von Layouts]&lt;br /&gt;
*[http://www.ilfa.de/designrichtlinien Weitere Dokumente zum Thema professionelle Platinenherstellung]&lt;br /&gt;
* [http://www.analog.com/library/analogDialogue/Anniversary/12.html Grounding (Again)], Ask The Applications Engineer - 12, Fa. Analog Devices, (englisch)&lt;br /&gt;
&amp;lt;!-- * http://edaboard.com --&amp;gt;&lt;br /&gt;
* [http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=115 Designing a Better PCB] von Sparkfun (engl.)&lt;br /&gt;
* [http://www.hottconsultants.com/tips.html Tech Tips] von Henry Ott (engl.)&lt;br /&gt;
* [http://www.ultracad.com/articles/90deg.pdf Messung] von verschiedenen Winkeln von Leiterbahnen mit 17ps TDR, keinerlei Unterschiede!&lt;br /&gt;
* [http://www.ilfa.de/absorptivesstromversorgungssysteminleiterplatten.html ILFA], Dämpfung von Resonanzen der Versorgungslagen durch Carbondruck&lt;br /&gt;
* [http://docs.toradex.com/101123-apalis-arm-carrier-board-design-guide.pdf Link]: Tipps zum erstellen von High Speed Platinen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Platinen]]&lt;br /&gt;
[[Kategorie:Schaltplaneditoren]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Glossar&amp;diff=90155</id>
		<title>Glossar</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Glossar&amp;diff=90155"/>
		<updated>2015-11-02T10:17:24Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Modbus-Protokoll korrigiert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC}}&lt;br /&gt;
&lt;br /&gt;
== A ==&lt;br /&gt;
&lt;br /&gt;
;ABI: &#039;&#039;&#039;A&#039;&#039;&#039;pplication &#039;&#039;&#039;B&#039;&#039;&#039;inary &#039;&#039;&#039;I&#039;&#039;&#039;nterface: Das Binärinterface, das zum Datenaustausch verwendet wird, z.B. die Registerverwendung in einer Funktion und für Parameterübergabe, Datenablage, Strukturlayout, etc. Jeder [[Compiler]] erzeugt Code nach einer bestimmten ABI, so daß der Code aus unterschiedlichen Modulen und Bibliotheken zusammenpasst. Beim Mischen von Hochsprachen mit (Inline-)Assembler muss auf ABI-Konformität geachtet werden. Compiler-Schalter können das ABI beeinflussen. Beispiel: -fpack-struct beim GCC.&lt;br /&gt;
&lt;br /&gt;
;[[ADC]]: &#039;&#039;&#039;A&#039;&#039;&#039;nalog &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;C&#039;&#039;&#039;onverter. Im Deutschen auch &#039;ADU&#039;.&lt;br /&gt;
&lt;br /&gt;
;[[ADSR]]: &#039;&#039;&#039;A&#039;&#039;&#039;ttack &#039;&#039;&#039;D&#039;&#039;&#039;ecay &#039;&#039;&#039;S&#039;&#039;&#039;ustain &#039;&#039;&#039;R&#039;&#039;&#039;elease. Ein Amplitudenverlauf als Hüllkurve, die hauptsächlich in der elektronischen Musik - aber auch bei der Verhaltensbeschreibung von Regelersystemen verwendet wird&lt;br /&gt;
&lt;br /&gt;
;[[AGC]]: &#039;&#039;&#039;A&#039;&#039;&#039;utomatic &#039;&#039;&#039;G&#039;&#039;&#039;ain &#039;&#039;&#039;C&#039;&#039;&#039;ontrol. Ein Schaltkreis oder eine Software zur selbsttätigen Verstärkungsanpassung in Form einer Regelung.&lt;br /&gt;
&lt;br /&gt;
;[[ARM]]: &#039;&#039;&#039;A&#039;&#039;&#039;dvanced &#039;&#039;&#039;R&#039;&#039;&#039;ISC &#039;&#039;&#039;M&#039;&#039;&#039;achine. Eine Mikrocontrollerfamilie des Types RISC (&amp;quot;reduced instruction set&amp;quot;) bzw. die Firma, die diese designt und lizensiert.&lt;br /&gt;
&lt;br /&gt;
;[[AVR]]: Eine Mikrocontrollerfamilie von Atmel. Der Ursprung des Namens ist unklar.&lt;br /&gt;
&lt;br /&gt;
== B ==&lt;br /&gt;
&lt;br /&gt;
;[[BGA]]: &#039;&#039;&#039;B&#039;&#039;&#039;all &#039;&#039;&#039;G&#039;&#039;&#039;rid &#039;&#039;&#039;A&#039;&#039;&#039;rray: Eine Gehäuseform für ICs.&lt;br /&gt;
&lt;br /&gt;
;Bit: &#039;&#039;&#039;Bi&#039;&#039;&#039;nary Digi&#039;&#039;&#039;t&#039;&#039;&#039;: Kleinste Informationseinheit, siehe [[Bitmanipulation]].&lt;br /&gt;
 &lt;br /&gt;
;BNC: &#039;&#039;&#039;B&#039;&#039;&#039;ajonet &#039;&#039;&#039;N&#039;&#039;&#039;ut &#039;&#039;&#039;C&#039;&#039;&#039;onnector: Ein Steckverbinder für Koaxialkabel.&lt;br /&gt;
&lt;br /&gt;
;[[BPM]]: &#039;&#039;&#039;B&#039;&#039;&#039;eats &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;minute: Anzahl der Herzschgläge bei Cardio-Applikationen / Zahl der Schlagzeugschläge je Minute in der Musik&lt;br /&gt;
&lt;br /&gt;
;[[BPS]]: &#039;&#039;&#039;B&#039;&#039;&#039;its &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;s&#039;&#039;&#039;econd: Anzahl der Bits je Sekunde, Masszahl für die Übertragungsgeschwindigkeit / Bandbreite&lt;br /&gt;
&lt;br /&gt;
;[[BSDL]]: &#039;&#039;&#039;B&#039;&#039;&#039;oundary &#039;&#039;&#039;S&#039;&#039;&#039;can &#039;&#039;&#039;D&#039;&#039;&#039;escription &#039;&#039;&#039;L&#039;&#039;&#039;anguage: Eine Sprache für [[boundary scan]]-basiertes Testen und Debuggen.&lt;br /&gt;
&lt;br /&gt;
== C ==&lt;br /&gt;
&lt;br /&gt;
;[[C]]: Eine weit verbreitete Programmiersprache.&lt;br /&gt;
&lt;br /&gt;
;[[CAN]]: &#039;&#039;&#039;C&#039;&#039;&#039;ontroller &#039;&#039;&#039;A&#039;&#039;&#039;rea &#039;&#039;&#039;N&#039;&#039;&#039;etwork: Ein Netzwerk für kleine [[Mikrocontroller]], ursprünglich für die Automobilbranche entwickelt.&lt;br /&gt;
&lt;br /&gt;
;[[CCD]]: &#039;&#039;&#039;C&#039;&#039;&#039;harge &#039;&#039;&#039;C&#039;&#039;&#039;oupled &#039;&#039;&#039;D&#039;&#039;&#039;evices: (Ladungsverkoppelte Bauteile), eine Bezeichung für Bildsensoren&lt;br /&gt;
&lt;br /&gt;
;[[CDS]]: &#039;&#039;&#039; C&#039;&#039;&#039;omponent &#039;&#039;&#039;D&#039;&#039;&#039;esign &#039;&#039;&#039;S&#039;&#039;&#039;pecification: formelle Designbeschreibung&lt;br /&gt;
&lt;br /&gt;
;[[CLB]]: &#039;&#039;&#039;C&#039;&#039;&#039;onfigurable &#039;&#039;&#039;L&#039;&#039;&#039;ogic &#039;&#039;&#039;B&#039;&#039;&#039;lock: elementares konfigurierbares Logikelement in PLDs&lt;br /&gt;
&lt;br /&gt;
;[[CMB]]: &#039;&#039;&#039;C&#039;&#039;&#039;ommand &#039;&#039;&#039;M&#039;&#039;&#039;anagement &#039;&#039;&#039;B&#039;&#039;&#039;lock: der Befehlsinterpreter in einer CPU-Plattform, meist im Bereich der Kommunikationsschnittstelle, auch [[CMI]]&lt;br /&gt;
&lt;br /&gt;
;[[CMT]]: &#039;&#039;&#039;C&#039;&#039;&#039;lock &#039;&#039;&#039;M&#039;&#039;&#039;anagement &#039;&#039;&#039;T&#039;&#039;&#039;ile: Ein takterzeugendes Element in einem (Xilinx)-FPGA&lt;br /&gt;
&lt;br /&gt;
;[[CNC]]: &#039;&#039;&#039;C&#039;&#039;&#039;omputerized &#039;&#039;&#039;N&#039;&#039;&#039;umerical &#039;&#039;&#039;C&#039;&#039;&#039;ontrol: Computer gesteuerte Steuerung, z.B. bei Werkzeugmaschinen&lt;br /&gt;
&lt;br /&gt;
;[[CPLD]]: &#039;&#039;&#039;C&#039;&#039;&#039;omplex &#039;&#039;&#039;P&#039;&#039;&#039;rogrammable &#039;&#039;&#039;L&#039;&#039;&#039;ogic &#039;&#039;&#039;D&#039;&#039;&#039;evice: Ein programmierbarer Logikbaustein&lt;br /&gt;
&lt;br /&gt;
;[[CRS]]: &#039;&#039;&#039; C&#039;&#039;&#039;omponent &#039;&#039;&#039;R&#039;&#039;&#039;equirement &#039;&#039;&#039;S&#039;&#039;&#039;pecification: formelle Anforderungsspezifikation&lt;br /&gt;
&lt;br /&gt;
== D ==&lt;br /&gt;
;[[DAC]]: &#039;&#039;&#039;D&#039;&#039;&#039;igital to &#039;&#039;&#039;A&#039;&#039;&#039;nalog &#039;&#039;&#039;C&#039;&#039;&#039;onverter&lt;br /&gt;
;[[DCC]]: &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;C&#039;&#039;&#039;ommand &#039;&#039;&#039;C&#039;&#039;&#039;ontrol: Standard zur digitalen Steuerung von Modelleisenbahnen&lt;br /&gt;
;[[DCM]]: &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;C&#039;&#039;&#039;lock &#039;&#039;&#039;M&#039;&#039;&#039;anager, eine Takterzeugungseinheit in [[FPGA]]s&lt;br /&gt;
;[[DDC]]: &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;D&#039;&#039;&#039;own &#039;&#039;&#039;C&#039;&#039;&#039;onversion: Abtastfrequenzverringerung in der Signalverarbeitung&lt;br /&gt;
;[[DDR]]: &#039;&#039;&#039;D&#039;&#039;&#039;ouble &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;ate: &amp;quot;doppelte Datenrate&amp;quot;, oft in Verbindung mit [[RAM]]s verwendet&lt;br /&gt;
;DDS: &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;S&#039;&#039;&#039;torage: Bezeichung für grosse Massenspeicher in der Computertechnik&lt;br /&gt;
;[[DDS]]: &#039;&#039;&#039;D&#039;&#039;&#039;irect &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ynthesis: Verfahren zur Wellenformerzeugung&lt;br /&gt;
&lt;br /&gt;
;[[DMX]]: Protokoll zur Steuerung von Lichteffektgeräten&lt;br /&gt;
;[[DRC]]: &#039;&#039;&#039;D&#039;&#039;&#039;esign &#039;&#039;&#039;R&#039;&#039;&#039;ule &#039;&#039;&#039;C&#039;&#039;&#039;heck, ein Prüfvorgang auf geometrische Fehler in einem PCB-Layout&lt;br /&gt;
;[[DTMF]]: &#039;&#039;&#039;D&#039;&#039;&#039;ual &#039;&#039;&#039;T&#039;&#039;&#039;one &#039;&#039;&#039;M&#039;&#039;&#039;ultiple &#039;&#039;&#039;F&#039;&#039;&#039;requency: Tonwahlverfahren im Telephon&lt;br /&gt;
;[[DUC]]: &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;U&#039;&#039;&#039;p &#039;&#039;&#039;C&#039;&#039;&#039;onversion: Abtastfrequenzerhöhung in der Signalverarbeitung&lt;br /&gt;
&lt;br /&gt;
== E ==&lt;br /&gt;
&lt;br /&gt;
;[[EEPROM]]: &#039;&#039;&#039;E&#039;&#039;&#039;lectrical &#039;&#039;&#039;E&#039;&#039;&#039;rasable and &#039;&#039;&#039;P&#039;&#039;&#039;rogrammable &#039;&#039;&#039;R&#039;&#039;&#039;ead &#039;&#039;&#039;O&#039;&#039;&#039;nly &#039;&#039;&#039;M&#039;&#039;&#039;emory: Ein nichtflüchtiger [[Speicher#EEPROM|Speicher]].&lt;br /&gt;
&lt;br /&gt;
;[[EMV]]: &#039;&#039;&#039;E&#039;&#039;&#039;lektro&#039;&#039;&#039;m&#039;&#039;&#039;agnetische &#039;&#039;&#039;V&#039;&#039;&#039;erträglichkeit: Beschreibt das Verhalten von Geräten bezüglich Aussenden von elektromagetischen Störungen und die Toleranz bezüglich Einstrahlung eben dieser.&lt;br /&gt;
&lt;br /&gt;
;[[ERC]]: &#039;&#039;&#039;E&#039;&#039;&#039;lectrical &#039;&#039;&#039;R&#039;&#039;&#039;ule &#039;&#039;&#039;C&#039;&#039;&#039;heck, ein Prüfvorgang auf Fehler in einem PCB-Layout, bzw einem Schaltplan.&lt;br /&gt;
&lt;br /&gt;
== F ==&lt;br /&gt;
&lt;br /&gt;
;FBGA: &#039;&#039;&#039;F&#039;&#039;&#039;ine [[BGA|&#039;&#039;&#039;B&#039;&#039;&#039;all &#039;&#039;&#039;G&#039;&#039;&#039;rid &#039;&#039;&#039;A&#039;&#039;&#039;rray]]: Eine Gehäusebauform für ICs.&lt;br /&gt;
;FCU: &#039;&#039;&#039;F&#039;&#039;&#039;low &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;U&#039;&#039;&#039;nit: eine logische Einheit in einem Microcontroller oder einem FPGA, welche einen Datenfluss steuert, z.B. in einer Rechenpipeline&lt;br /&gt;
;FEC: &#039;&#039;&#039;F&#039;&#039;&#039;orward &#039;&#039;&#039;E&#039;&#039;&#039;rror &#039;&#039;&#039;C&#039;&#039;&#039;orrectopn: Fehlerkorrekturverfahren, welches die Paritätsinformation vor den eigentlichen Daten sendet und somit eine on the fly Korrektur im Empfänger ermöglicht&lt;br /&gt;
;FEM: &#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;E&#039;&#039;&#039;lemente &#039;&#039;&#039;M&#039;&#039;&#039;ethode: Rechenverfahren, das mittels Stützstellenapproximation und Minimierung eines Energiefunktionals Systemzustände ermittelt&lt;br /&gt;
;[http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation FFT]: &#039;&#039;&#039;F&#039;&#039;&#039;ast &#039;&#039;&#039;F&#039;&#039;&#039;ourier &#039;&#039;&#039;T&#039;&#039;&#039;ransformation: Ein Algorithmus zur effizienten Berechnung der [http://de.wikipedia.org/wiki/Diskrete_Fourier-Transformation Diskreten Fourier-Transformation] für den Fall gleicher Zeitabstände der Eingabewerte und einer Zweierpotenz als Anzahl der Eingabewerte.  Die Fourier-Transformation bildet eine Funktion auf ihr Frequenzspektrum ab, was vielfach in der Signalverarbeitung Anwendung findet neben anderen Transformationen wie Laplace-Transformation, Wavelet-Transformation oder Z-Transformation.&lt;br /&gt;
;[[FIFO]]: &#039;&#039;&#039;F&#039;&#039;&#039;irst &#039;&#039;&#039;I&#039;&#039;&#039;n &#039;&#039;&#039;F&#039;&#039;&#039;irst &#039;&#039;&#039;O&#039;&#039;&#039;ut: Eine Organisationsform für einen Zwischenspeicher, bei dem die Daten in der Reihenfolge ausgegeben werden, in der sie eingeschrieben wurden&lt;br /&gt;
;[[FMEA]]: &#039;&#039;&#039;F&#039;&#039;&#039;ault &#039;&#039;&#039;M&#039;&#039;&#039;ode &#039;&#039;&#039;E&#039;&#039;&#039;ffect &#039;&#039;&#039;A&#039;&#039;&#039;nalsys, englisch für die Analyse von Funktionsfehlern eines Systems infolge äusserer Einflüsse, deutsch auch &amp;quot;Fehlermöglichkeitseinflussanalyse&amp;quot;&lt;br /&gt;
;[[FOC]]: &#039;&#039;&#039;F&#039;&#039;&#039;ield &#039;&#039;&#039;O&#039;&#039;&#039;riented &#039;&#039;&#039;C&#039;&#039;&#039;ontrol, englisch für feldorientierte Regelung (bei Motoren)&lt;br /&gt;
;[[FPGA]]: &#039;&#039;&#039;F&#039;&#039;&#039;ield &#039;&#039;&#039;P&#039;&#039;&#039;rogrammable &#039;&#039;&#039;G&#039;&#039;&#039;ate &#039;&#039;&#039;A&#039;&#039;&#039;rray: Bezeichnung für jederzeit wieder programmierbare Logikbausteine.&lt;br /&gt;
;[[FPU]]: &#039;&#039;&#039;F&#039;&#039;&#039;loating &#039;&#039;&#039;P&#039;&#039;&#039;oint &#039;&#039;&#039;U&#039;&#039;&#039;nit: Teil eines Prozessors, der Berechnungen mit Gleitkommazahlen unterstützt.&lt;br /&gt;
;[[FSM]]: &#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;S&#039;&#039;&#039;tate &#039;&#039;&#039;M&#039;&#039;&#039;achine, englisch für Zustandsautomat; eine Schaltung, die einen Ablauf in Form einer Software realisiert, z.B. in einem Microcontroller oder auch einem Logikbaustein&lt;br /&gt;
&lt;br /&gt;
== G ==&lt;br /&gt;
&lt;br /&gt;
;GFR: &#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;F&#039;&#039;&#039;unction &#039;&#039;&#039;R&#039;&#039;&#039;egister: s.u.&lt;br /&gt;
;GPR: &#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;P&#039;&#039;&#039;urpose &#039;&#039;&#039;R&#039;&#039;&#039;egister: Arbeitsregister eines Prozessors. Bei vielen Architekturen müssen Daten in solche Register geladen werden, um sie bearbeiten zu können. Bei [[AVR]] sind das die Register R0 – R31&lt;br /&gt;
;GMI:&lt;br /&gt;
;GMII: &#039;&#039;&#039;G&#039;&#039;&#039;igabit &#039;&#039;&#039;M&#039;&#039;&#039;edia &#039;&#039;&#039;I&#039;&#039;&#039;ndependent &#039;&#039;&#039;I&#039;&#039;&#039;nterface, ein [[MII]] für Gigabit-PHYs&lt;br /&gt;
;GPS: &#039;&#039;&#039;G&#039;&#039;&#039;lobal &#039;&#039;&#039;P&#039;&#039;&#039;ositioning &#039;&#039;&#039;S&#039;&#039;&#039;ystem&lt;br /&gt;
;GPU: &#039;&#039;&#039;G&#039;&#039;&#039;raphic &#039;&#039;&#039;P&#039;&#039;&#039;rocessing &#039;&#039;&#039;U&#039;&#039;&#039;nit, eine Grafikverarbeitungseinheit, meist für die Grafikarte in Rechnern verwendet, oft auch im Zusammenhang mit der Benutzung derselben als Coprozessor&lt;br /&gt;
;GSM: &#039;&#039;&#039;G&#039;&#039;&#039;lobal &#039;&#039;&#039;S&#039;&#039;&#039;ystem for &#039;&#039;&#039;M&#039;&#039;&#039;obile Communications: Das Mobilfunknetz der zweiten Generation (auch 2G genannt). Darüber können Gespräche (circuit switched) und Daten (packet switched, GPRS) übertragen werden.&lt;br /&gt;
;GTP: &#039;&#039;&#039;G&#039;&#039;&#039;igabit &#039;&#039;&#039;T&#039;&#039;&#039;ransceiver &#039;&#039;&#039;P&#039;&#039;&#039;ort: Ein high speed port bei FPGAs&lt;br /&gt;
&lt;br /&gt;
== H ==&lt;br /&gt;
&lt;br /&gt;
;HF: Hochfrequenz&lt;br /&gt;
&lt;br /&gt;
;HIL: &amp;amp;rarr; Wikipedia: [http://de.wikipedia.org/wiki/Hardware_in_the_Loop &#039;&#039;&#039;H&#039;&#039;&#039;ardware &#039;&#039;&#039;i&#039;&#039;&#039;n the &#039;&#039;&#039;L&#039;&#039;&#039;oop].&lt;br /&gt;
&lt;br /&gt;
;HP: &#039;&#039;&#039;H&#039;&#039;&#039;orse &#039;&#039;&#039;P&#039;&#039;&#039;ower, engl. Bezeichnung für mechanische Leistung, siehe Pferdestärek &lt;br /&gt;
;HPF: &#039;&#039;&#039;H&#039;&#039;&#039;igh &#039;&#039;&#039;P&#039;&#039;&#039;ass &#039;&#039;&#039;F&#039;&#039;&#039;ilter: Englisch für Hochpass-[[Filter]], seltener auch nur &#039;&#039;&#039;HP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== I ==&lt;br /&gt;
&lt;br /&gt;
;IIR: &#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse: Bezeichnet ein bestimmte Sorte von [[Filter]]n, mit unendlicher Sprungantwort.&lt;br /&gt;
&lt;br /&gt;
;ISA: &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;S&#039;&#039;&#039;et &#039;&#039;&#039;A&#039;&#039;&#039;rchitecture: Registerstruktur und Befehlssatz eines Prozessors/[[Mikrocontroller]]s bzw. einer Prozessorfamilie.&lt;br /&gt;
&lt;br /&gt;
;[[ISP]]: &#039;&#039;&#039;I&#039;&#039;&#039;n &#039;&#039;&#039;S&#039;&#039;&#039;ystem &#039;&#039;&#039;P&#039;&#039;&#039;rogramming: Der Mikrocontroller wird direkt auf der Zielhardware programmiert.&lt;br /&gt;
&lt;br /&gt;
;ISR: &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;S&#039;&#039;&#039;ervice &#039;&#039;&#039;R&#039;&#039;&#039;outine: Ein Programmstück, das nach Eintreten eines bestimmten Ereignisses ausgeführt wird. Siehe [[Interrupt]].&lt;br /&gt;
&lt;br /&gt;
;IRQ: &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;R&#039;&#039;&#039;e&#039;&#039;&#039;q&#039;&#039;&#039;uest: Ein Ereignis, das einen [[Interrupt]] auslöst. In der Regel wird die Programmausführung unterbrochen und ein spezielles Programmstück, eine ISR, ausgeführt und danach zum ursprünglichen Programmcode zurückgekehrt. Viele IRQs können aktiviert oder deaktiviert werden.&lt;br /&gt;
&lt;br /&gt;
== J ==&lt;br /&gt;
&lt;br /&gt;
;[[JTAG]]: &#039;&#039;&#039;J&#039;&#039;&#039;oint &#039;&#039;&#039;T&#039;&#039;&#039;est &#039;&#039;&#039;A&#039;&#039;&#039;ction &#039;&#039;&#039;G&#039;&#039;&#039;roup: Eine Funktion für komplexe ICs, um diese im aufgelöteten Zustand zu prüfen bzw. zu programmieren und debuggen (Mikrocontroller).&lt;br /&gt;
&lt;br /&gt;
== K ==&lt;br /&gt;
&lt;br /&gt;
;KDE: Oberfläche bei Linux&lt;br /&gt;
&lt;br /&gt;
== L ==&lt;br /&gt;
;LIFO: &#039;&#039;&#039;L&#039;&#039;&#039;ast &#039;&#039;&#039;&#039;I&#039;&#039;&#039;n &#039;&#039;&#039;F&#039;&#039;&#039;irst &#039;&#039;&#039;O&#039;&#039;&#039;ut, azyklisch beschriebener Speicher, der wie ein Stapel (stack) arbeitet&lt;br /&gt;
&lt;br /&gt;
;LPF: &#039;&#039;&#039;L&#039;&#039;&#039;ow &#039;&#039;&#039;P&#039;&#039;&#039;ass &#039;&#039;&#039;F&#039;&#039;&#039;ilter: Englisch für Tiefpass[[Filter]], teilweise auch nur &#039;&#039;&#039;LP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;LSB: &#039;&#039;&#039;L&#039;&#039;&#039;east &#039;&#039;&#039;S&#039;&#039;&#039;ignificant &#039;&#039;&#039;B&#039;&#039;&#039;yte: Das niederwertigste Byte in einem Datenwort mit mehreren Bytes. Je nach Zusammenhang aber auch&lt;br /&gt;
: &#039;&#039;&#039;L&#039;&#039;&#039;east &#039;&#039;&#039;S&#039;&#039;&#039;ignificant &#039;&#039;&#039;B&#039;&#039;&#039;it: niederwertigstes Bit.&lt;br /&gt;
&lt;br /&gt;
== M ==&lt;br /&gt;
&lt;br /&gt;
;MAC: &#039;&#039;&#039;M&#039;&#039;&#039;edia &#039;&#039;&#039;A&#039;&#039;&#039;ccess &#039;&#039;&#039;C&#039;&#039;&#039;ontroller: Bezeichnung für die Logik, die einen Baustein steuert, meist im Zusammenhang mit Ethernet verwendet&lt;br /&gt;
&lt;br /&gt;
;MCB: &#039;&#039;&#039;M&#039;&#039;&#039;ain &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;B&#039;&#039;&#039;lock: Eine allgemeine Bezeichnung für die zentrale Steuerlogik in einem System&lt;br /&gt;
: &#039;&#039;&#039;M&#039;&#039;&#039;emory &#039;&#039;&#039;C&#039;&#039;&#039;ontroller &#039;&#039;&#039;B&#039;&#039;&#039;lock: Abkürzung für einen Speichercontroller z.B. in einem FPGA&lt;br /&gt;
&lt;br /&gt;
;MCU: &#039;&#039;&#039;M&#039;&#039;&#039;ain &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;U&#039;&#039;&#039;nit: Die zentrale Steuerlogik in einem System, auch &#039;&#039;&#039;[[CPU]]&#039;&#039;&#039;&lt;br /&gt;
: &#039;&#039;&#039;M&#039;&#039;&#039;icro &#039;&#039;&#039;C&#039;&#039;&#039;ontroller &#039;&#039;&#039;U&#039;&#039;&#039;nit: allgeine Bezeichnung für einen Prozessor&lt;br /&gt;
&lt;br /&gt;
;MIG: &#039;&#039;&#039;M&#039;&#039;&#039;emory &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;G&#039;&#039;&#039;enerator: Eine Software, die ein Speicherinterface in [[FPGA]]s konfiguriert&lt;br /&gt;
&lt;br /&gt;
;MII: &#039;&#039;&#039;M&#039;&#039;&#039;edia &#039;&#039;&#039;I&#039;&#039;&#039;ndependent &#039;&#039;&#039;I&#039;&#039;&#039;nterface, ein allgemeines, bausteinunabhängiges Interface, oft in Verbindung mit Ethernet-PHYs&lt;br /&gt;
&lt;br /&gt;
;[[MIPS]]: &#039;&#039;&#039;M&#039;&#039;&#039;illion &#039;&#039;&#039;i&#039;&#039;&#039;nstructions &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;s&#039;&#039;&#039;econd&lt;br /&gt;
: &#039;&#039;&#039;M&#039;&#039;&#039;icroprocessor without &#039;&#039;&#039;i&#039;&#039;&#039;nterlocked &#039;&#039;&#039;p&#039;&#039;&#039;ipeline &#039;&#039;&#039;s&#039;&#039;&#039;tages.&lt;br /&gt;
&lt;br /&gt;
;MMC: &#039;&#039;&#039;M&#039;&#039;&#039;ulti &#039;&#039;&#039;M&#039;&#039;&#039;edia &#039;&#039;&#039;C&#039;&#039;&#039;ard: Eine kleine Speicherkarte&lt;br /&gt;
&lt;br /&gt;
;MSB: &#039;&#039;&#039;M&#039;&#039;&#039;ost &#039;&#039;&#039;S&#039;&#039;&#039;ignificant &#039;&#039;&#039;B&#039;&#039;&#039;yte: Das höchstwertige Byte in einem Datenwort mit mehreren Bytes. Je nach Zusammenhang aber auch&lt;br /&gt;
: &#039;&#039;&#039;M&#039;&#039;&#039;ost &#039;&#039;&#039;S&#039;&#039;&#039;ignificant &#039;&#039;&#039;B&#039;&#039;&#039;it: höchstwertiges Bit.&lt;br /&gt;
&lt;br /&gt;
;Modbus RTU/ASCII: Ein älteres, aber immer noch oft eingesetztes Busprotokoll für serielle Verbindungen. In der Modbus TCP-Variante auch Ethernetfähig&lt;br /&gt;
&lt;br /&gt;
== N ==&lt;br /&gt;
&lt;br /&gt;
;NCO: &#039;&#039;&#039;N&#039;&#039;&#039;umeric &#039;&#039;&#039;C&#039;&#039;&#039;ontrolled &#039;&#039;&#039;O&#039;&#039;&#039;scillator. Ein numerisch/digital arbeitender Schwingkreis - siehe auch [[DDS]].&lt;br /&gt;
&lt;br /&gt;
== O ==&lt;br /&gt;
&lt;br /&gt;
; OCDS: &#039;&#039;&#039;O&#039;&#039;&#039;n &#039;&#039;&#039;C&#039;&#039;&#039;hip &#039;&#039;&#039;D&#039;&#039;&#039;ebug &#039;&#039;&#039;S&#039;&#039;&#039;upport&lt;br /&gt;
&lt;br /&gt;
== P ==&lt;br /&gt;
;[[PAM]]: &#039;&#039;&#039;P&#039;&#039;&#039;ulse &#039;&#039;&#039;A&#039;&#039;&#039;mplituden &#039;&#039;&#039;M&#039;&#039;&#039;odulation: Umsetzung eines Wertes auf analoge Spannungszustände, z.B. bei Ethernet&lt;br /&gt;
;[[PCM]]: &#039;&#039;&#039;P&#039;&#039;&#039;ulse &#039;&#039;&#039;C&#039;&#039;&#039;ode &#039;&#039;&#039;M&#039;&#039;&#039;odulation: Umsetzung eines Wertes auf 1-Bit Signal, auch ein Datenformat&lt;br /&gt;
;PDM: &#039;&#039;&#039;P&#039;&#039;&#039;ulse &#039;&#039;&#039;D&#039;&#039;&#039;ichte &#039;&#039;&#039;M&#039;&#039;&#039;odulation: Umsetzung eines Wertes auf 1-Bit Signal, siehe [[Pulsdichtemodulation]]&lt;br /&gt;
;[[PFC]]: &#039;&#039;&#039;P&#039;&#039;&#039;ower &#039;&#039;&#039;F&#039;&#039;&#039;actor &#039;&#039;&#039;C&#039;&#039;&#039;orrection: Eine Schaltung, die Blindleistung kompensiert&lt;br /&gt;
;PHY: Bezeichnung für einen physikalischen Chip, oft im Zusammenhang mit Ethernet verwendet&lt;br /&gt;
;[http://de.wikipedia.org/wiki/Phase-locked_loop PLL]: &#039;&#039;&#039;P&#039;&#039;&#039;hase &#039;&#039;&#039;L&#039;&#039;&#039;ocked &#039;&#039;&#039;L&#039;&#039;&#039;oop: Eine Schaltung, die einen Ausgangstakt mit definierter Phaselage zu einem Eingangstakt generiert.&lt;br /&gt;
;[[PSU]]: &#039;&#039;&#039;P&#039;&#039;&#039;ower &#039;&#039;&#039;S&#039;&#039;&#039;upply &#039;&#039;&#039;U&#039;&#039;&#039;nit: Bezeichnung für die Stromversorgungseinheit&lt;br /&gt;
;[[PWM]]: &#039;&#039;&#039;P&#039;&#039;&#039;ulse &#039;&#039;&#039;W&#039;&#039;&#039;eiten &#039;&#039;&#039;M&#039;&#039;&#039;odulation: Umsetzung eines Wertes auf 1-Bit Signal&lt;br /&gt;
&lt;br /&gt;
== Q ==&lt;br /&gt;
;[[QAM]]: &#039;&#039;&#039;Q&#039;&#039;&#039;adratur &#039;&#039;&#039;A&#039;&#039;&#039;mplituden &#039;&#039;&#039;M&#039;&#039;&#039;odulation: Modulation eines Analogsignals mit einem Quadratursignal (IQ).&lt;br /&gt;
&lt;br /&gt;
;[[QDR]]: &#039;&#039;&#039;Q&#039;&#039;&#039;adruple &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;ate: Eine Speicherzugriffstechnik mit 4 Daten je Takt, siehe RAMs.&lt;br /&gt;
&lt;br /&gt;
== R ==&lt;br /&gt;
&lt;br /&gt;
;[[RS232]]: &#039;&#039;&#039;R&#039;&#039;&#039;ecommended &#039;&#039;&#039;S&#039;&#039;&#039;tandard 232: Eine Definition zur seriellen Datenübertragung, eng gekoppelt an [[UART]].&lt;br /&gt;
&lt;br /&gt;
;RCD: &#039;&#039;&#039;R&#039;&#039;&#039;esidual &#039;&#039;&#039;C&#039;&#039;&#039;urrent protective &#039;&#039;&#039;D&#039;&#039;&#039;evice, neudeutsch für [http://de.wikipedia.org/wiki/Fehlerstromschutzschalter Fehlerstromschutzschalter].&lt;br /&gt;
&lt;br /&gt;
;RISC: &#039;&#039;&#039;R&#039;&#039;&#039;educed &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;S&#039;&#039;&#039;et &#039;&#039;&#039;C&#039;&#039;&#039;omputer. Designstrategie für den Befehlssatz von Prozessoren und Microcontrollern, die einfache Befehle bevorzugt.&lt;br /&gt;
&lt;br /&gt;
== S ==&lt;br /&gt;
&lt;br /&gt;
;SAR: &#039;&#039;&#039;S&#039;&#039;&#039;ynthetic &#039;&#039;&#039;A&#039;&#039;&#039;perture &#039;&#039;&#039;R&#039;&#039;&#039;adar: Eine Messwertverarbeitungsmethodik in der Radartechnik, bei der durch reale oder virutelle Positionsvariation eine künstlich vergrösserte &amp;quot;Blende&amp;quot; benutzt werden kann, wodurch sich der Empfangsbereich stark vergrössert.&lt;br /&gt;
&lt;br /&gt;
;SDR: &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;D&#039;&#039;&#039;efined &#039;&#039;&#039;R&#039;&#039;&#039;adio: Allgemeine Bezeichung für mathematisch per Software erzeugte und modulierte elektromagnetische Wellen in der HF-Technik, speziell der Funkdatenübertragung und Radartechnik.&lt;br /&gt;
&lt;br /&gt;
;SOC: &#039;&#039;&#039;S&#039;&#039;&#039;ystem &#039;&#039;&#039;O&#039;&#039;&#039;n &#039;&#039;&#039;C&#039;&#039;&#039;hip: Bezeichung für die Erzeugung ganzer computerähnlicher Rechnersysteme auf programmierbaren Schaltkreisen wie FPGAs&lt;br /&gt;
&lt;br /&gt;
;SFR: &#039;&#039;&#039;S&#039;&#039;&#039;pecial &#039;&#039;&#039;F&#039;&#039;&#039;unction &#039;&#039;&#039;R&#039;&#039;&#039;egister: Hardware-Register, über die interne und externe Peripherie eines Prozessors/[[Mikrocontroller]]s konfiguriert wird, und über die Daten ausgetauscht werden. IO-Ports werden z.B. auf bestimmte [[Speicher#Register|SFRs]] abgebildet, auf die dann mit speziellen Befehlen zugegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
== T ==&lt;br /&gt;
&lt;br /&gt;
;TTL: &#039;&#039;&#039;T&#039;&#039;&#039;ransistor-&#039;&#039;&#039;T&#039;&#039;&#039;ransistor-&#039;&#039;&#039;L&#039;&#039;&#039;ogik.&lt;br /&gt;
&lt;br /&gt;
== U ==&lt;br /&gt;
&lt;br /&gt;
;[[UART]]: &#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;A&#039;&#039;&#039;synchronus &#039;&#039;&#039;R&#039;&#039;&#039;eceiver and &#039;&#039;&#039;T&#039;&#039;&#039;ransmitter: Ein Modul in Mikrocontrollern oder PCs zum seriellen Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
;[[USB]]: &#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;B&#039;&#039;&#039;us : Ein standardisiertes serielles Protokoll, das vorwiegend bei PCs verwendet wird. Bandbreite beträgt bis zu 5Gbit/s.&lt;br /&gt;
&lt;br /&gt;
== V ==&lt;br /&gt;
;VCA: &#039;&#039;&#039;V&#039;&#039;&#039;oltage &#039;&#039;&#039;C&#039;&#039;&#039;ontrolled &#039;&#039;&#039;A&#039;&#039;&#039;mplifier - Spannungsgesteuerter Verstärker&lt;br /&gt;
;VCO: &#039;&#039;&#039;V&#039;&#039;&#039;oltage &#039;&#039;&#039;C&#039;&#039;&#039;ontrolled &#039;&#039;&#039;O&#039;&#039;&#039;scillator - Spannungsgesteuerter Oszillator&lt;br /&gt;
;VHDL: &#039;&#039;&#039;V&#039;&#039;&#039;HSIC &#039;&#039;&#039;H&#039;&#039;&#039;ardware &#039;&#039;&#039;D&#039;&#039;&#039;escription &#039;&#039;&#039;L&#039;&#039;&#039;anguage - Programmiersprache für ASIC-und FPGA-Entwurfswerkzeuge&lt;br /&gt;
;VHSIC: &#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;H&#039;&#039;&#039;igh &#039;&#039;&#039;S&#039;&#039;&#039;peed &#039;&#039;&#039;I&#039;&#039;&#039;ntegrated &#039;&#039;&#039;C&#039;&#039;&#039;ircuit - allgemein für schnelle Digtialschaltungen&lt;br /&gt;
;VLSI: &#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;arge &#039;&#039;&#039;S&#039;&#039;&#039;cale &#039;&#039;&#039;I&#039;&#039;&#039;ntegrated &#039;&#039;&#039;C&#039;&#039;&#039;ircuit - allgemein für ASICS&lt;br /&gt;
&lt;br /&gt;
== W ==&lt;br /&gt;
&lt;br /&gt;
;[[Watchdog|WDT]]: &#039;&#039;&#039;W&#039;&#039;&#039;atch &#039;&#039;&#039;D&#039;&#039;&#039;og &#039;&#039;&#039;T&#039;&#039;&#039;imer&lt;br /&gt;
&lt;br /&gt;
== X ==&lt;br /&gt;
&lt;br /&gt;
== Y ==&lt;br /&gt;
&lt;br /&gt;
== Z ==&lt;br /&gt;
&lt;br /&gt;
;Z: In der HF-Technik das Formelzeichen für den [[Wellenwiderstand]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen| ]]&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=90154</id>
		<title>AVR-GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=90154"/>
		<updated>2015-11-02T10:14:23Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;avr-gcc ist ein freier [[C]]-Cross-[[Compiler]] für [[AVR]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
avr-gcc kann von der Leistungsfähigkeit kommerzieller [[Compiler]] gut mithalten. Sogar C++-Programme sind möglich; in der aktuellen Fassung wird C++ jedoch nur eingeschränkt unterstützt (Stand 3/2012).&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
Die Toolchain (Werkzeugsammlung) besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung, siehe [[AVR-GCC-Tutorial/Exkurs Makefiles|AVR-GCC-Tutorial: Exkurs Makefiles]]. &lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* AVR-Libc: Die C-Standardbibliothek mit AVR-spezifischen Headerdateien und Funktionen.&lt;br /&gt;
* [[AVRDUDE]]: universelle AVR-Programmiersoftware, kein eigentlicher Teil der Toolchain, aber oft verwendet&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Linux/Unix ===&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Wenn keine aktuelle avr-gcc-Version als Paket (Paketname ist, zumindest bei Debian, gcc-avr) für die verwendete Distribution zur Verfügung steht, dann können sich [[Unix]]/[[Linux]]-Nutzer den Sourcecode herunterladen und selbst kompilieren, dazu gibt es Schritt-für-Schritt-Anleitungen&amp;lt;ref&amp;gt;[http://www.nongnu.org/avr-libc/user-manual/install_tools.html AVR-Libc: Building and Installing under Linux, FreeBSD, and Others]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.roboternetz.de/wissen/index.php/Avr-gcc_und_avrdude_installieren www.roboternetz.de: avr-gcc und avrdude installieren]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das [http://www.femtoos.org FemtoOS]-Paket beinhaltet Scripte zum automatischen Herunterladen und Bauen einer avr-gcc Version 4.3.3.&lt;br /&gt;
&lt;br /&gt;
Empfehlenswert ist auch [http://cdk4avr.sf.net CDK4AVR], das die entsprechenden Tools als einfach installierbare Linux-Pakete bereitstellt. Leider ist das Projekt schon etwas älter, im Forum findet sich ein [http://www.mikrocontroller.net/topic/130972 Beitrag], aktuellere Sourcen mit den entsprechenden Patches zu versehen und zu kompilieren. Patches zu den Binutils und GCC-Sourcen sind unumgänglich, da die offiziellen Sourcen aufgrund des Umfangs an Prozessortargets den aktuellsten Entwicklungen hinterherhinken und damit bereits bekannte Fehler eventuell noch nicht behoben sind. Weitere Tipps zur AVR-Programmierung unter Linux stehen im Artikel [[AVR und Linux]].&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Die beste fertige Toolchain ist das [http://www.obdev.at/crosspack/ Crosspack]. Dieses enthält auch die AVR-Libc, avrdude und avarice. Leider gab es bei Mac OS 10.5.6 eine tiefgreifende Änderung beim fork()-Systemcall, der bewirkt, dass avarice mit JTAGICE mkII und Dragon nicht funktioniert. Geräte mit Serial-USB-Konvertern (AVRISP clones etc) funktionieren dagegen problemlos. &lt;br /&gt;
&lt;br /&gt;
Wer die Toolchain von Hand bauen möchte kann das natürlich auch tun, dazu einfach den unter &amp;quot;Linux/Unix&amp;quot; verlinkten Anleitungen folgen. Unter [[Mac OS X]] muss man dazu zuerst die [http://developer.apple.com/Tools/ Apple Developer Tools] installieren.&lt;br /&gt;
&lt;br /&gt;
Teile der Toolchain (AVR-Libc und avrdude) kann folgendermaßen installieren:&lt;br /&gt;
&lt;br /&gt;
==== Mit MacPorts ====&lt;br /&gt;
Wenn man [http://www.macports.org/ MacPorts] benutzt kann man folgendes in das Terminal eingeben, um den Toolchain zu installieren:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avr-libc&lt;br /&gt;
&lt;br /&gt;
Das Programmiertool avrdude bekommt man genauso:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avrdude&lt;br /&gt;
&lt;br /&gt;
==== Mit Hombrew ====&lt;br /&gt;
Mit dem neueren Tool [http://brew.sh Homebrew] funktioniert das folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
avrdude kann sofort installiert werden:&lt;br /&gt;
&lt;br /&gt;
 brew install avrdude&lt;br /&gt;
&lt;br /&gt;
Für den restlichen Toolchain muss man erst ein &#039;Tap&#039; hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 brew tap larsimmisch/homebrew-avr&lt;br /&gt;
&lt;br /&gt;
und kann dann den eigentlichen Toolchain installieren:&lt;br /&gt;
&lt;br /&gt;
 brew install avr-libc&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
&lt;br /&gt;
* [http://tinkerlog.com/2007/09/29/programming-avr-with-a-macbook/ Programming AVR with a MacBook] (engl.)&lt;br /&gt;
* [http://www.ladyada.net/library/avrdevtut/setup-mac.html AVR Tutorial from Lady Ada] (engl.)&lt;br /&gt;
* [http://www.obdev.at/crosspack/ Crosspack]&lt;br /&gt;
* [http://www.digithink.com/OSX-AVR OSX-AVR (nicht mehr aktuell)]&lt;br /&gt;
* [http://www.definefalsetrue.com/index.php/Mac-OS-X/bootfeedx.html BootFeedX Bootloaderfrontend]&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Für MS-Windows gibt es das fertig kompilierte Softwarepaket [[WinAVR]].&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
&lt;br /&gt;
Win32:&lt;br /&gt;
* [[AVR-Studio]]: ab Version 4.12 mit WinAVR-Unterstützung, integrierter Simulator, Debugger, rudimentäre Projektverwaltung&lt;br /&gt;
* Programmers-Notepad: wird bei [[WinAVR]] mitgeliefert, ein guter Editor mit einer rudimentären Projektverwaltung&lt;br /&gt;
* [http://www.myavr.info/download/benutzerhandbuch_sisy_avr.pdf SiSy-AVR]: ein CASE-Tool mit WinAVR-Unterstützung, das eine Entwicklungsumgebung bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Plattformunabhängig:&lt;br /&gt;
* [http://www.eclipse.org/ Eclipse] mit CDT und dem [http://avr-eclipse.sourceforge.net/index.html AVR Eclipse Plugin]&lt;br /&gt;
* [[Code::Blocks]]: vielseitige, freie Entwicklungsumgebung für Windows und Linux&lt;br /&gt;
* [http://www.netbeans.org/ Netbeans] in der C++ - Version mit [[WinAVR]] oder [[avr-gcc]] als Toolchain&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
*[http://sourceforge.net/projects/kontrollerlab/?_test=b KontrollerLab] ist eine freie Entwicklungsumgebung für AVR momentan aber noch im Beta-stadium.&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken / Libraries ==&lt;br /&gt;
&lt;br /&gt;
Die [http://www.nongnu.org/avr-libc/ AVR-Libc] ist die gebräuchliche &amp;quot;Laufzeitbibliothek&amp;quot; zum avr-gcc C-Compiler, welche den Zugriff auf die AVR-Hardware erheblich erleichtert. Die offizielle Dokumentation zur avr-libc mit vielen Hinweisen auch zum Compiler avr-gcc und verschiedener Tools (z.&amp;amp;nbsp;B. [[AVRDUDE]]) findet man [http://www.nongnu.org/avr-libc/user-manual/index.html hier].&lt;br /&gt;
&lt;br /&gt;
Auch die [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] enthält nützlichen Code z.&amp;amp;nbsp;B. für UART, LCD,.... Bei der Procyon AVRlib ist die Lizenz zu beachten (in Kurzform: man muss dritten auf Verlangen den gesamten Quellcode der Firmware zur Verfügung stellen, falls Teile der Procyon Bibliothek genutzt werden).&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf interne Funktionen oder externe Peripherie existieren einige fertige Komponenten. Z.B. &amp;quot;Projects&amp;quot;-Bereich von [http://www.avrfreaks.net/ avrfreaks.net] (Anmeldung erforderlich (kostenlos)). &lt;br /&gt;
&lt;br /&gt;
Die Erstellung eigener Bibliotheken ist im Artikel  [[Libraries]] erklärt.&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
Eine Liste mit einigen Hinweisen:&lt;br /&gt;
&lt;br /&gt;
* 07.10.11 → es kann Probleme mit der aktuellen Eclipse-Version (Indigo) und WinAVR geben. Falls ihr Indigo installiert habt und Eclipse die Definitionen wie z.B. DDRA nicht kennt, jedoch kompillieren kann, dann müsst ihr auf die Version Helios SR2 wechseln. Danach läuft alles wie gehabt!&lt;br /&gt;
&lt;br /&gt;
* Keine &amp;quot;antiken&amp;quot; Versionen verwenden. Für MS-Windows-Nutzer: aktuelles WinAVR installieren. Für Linux/Unix-Nutzer: letzte stabile Version selbst kompilieren oder aus &amp;quot;Distribution-Packages&amp;quot; installieren (z.&amp;amp;nbsp;B. [http://cdk4avr.sourceforge.net/ cdk4avr]).&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen zuerst in die [http://www.nongnu.org/avr-libc/user-manual/index.html Anleitung] der avr-libc schauen. Insbesondere die FAQ lesen.&lt;br /&gt;
&lt;br /&gt;
* Sicherstellen, dass der MCU-Parameter (zum Compiler/Linker, meist im Makefile defniert) mit dem Zielprozessor übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-GCC-Tutorial]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Im Zweifel nicht INTERRUPT(...) sondern SIGNAL(...) nutzen. In neueren Versionen der avr-libc wurde &amp;quot;ISR&amp;quot; als Ersatz für SIGNAL eingeführt und sollte genutzt werden (SIGNAL und INTERRUPT werden langfristig entfallen). Darauf achten, dass die Vektor- bzw. Signal-Namen (&amp;quot;Parameter&amp;quot;) zu ISR bzw. SIGNAL (und INTERRUPT wenn denn unbedingt erforderlich) richtig geschrieben sind. Die Namen sind in der in der entsprechenden Header-Datei (ioxxx.h) für den Controller und der avr-libc-Dokumenation aufgelistet. Im Zweifel den erzeugten Interrupt-Vektor im Assembler-Listing prüfen, es darf &#039;&#039;&#039;kein&#039;&#039;&#039; SIG_&#039;&#039;xxx&#039;&#039; oder xxx_vect mehr zu sehen sein, sondern _vector_&#039;&#039;N&#039;&#039; (wobei &#039;&#039;N&#039;&#039; eine Zahl ist). Neuere Versionen der avr-gcc zeigen eine Warnung, falls etwas falsch geschrieben wurde, ältere Versionen nicht.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf Daten(-Tabellen) im Programmspeicher (Flash) erfolgt über Program-Space-Funktionen (pgm_read*). Lediglich die Definition einer Variablen/eines Feldes mit dem PROGMEM Attribut zu versehen, reicht (im Gegensatz zu Codevision, IAR, Imagecraft) nicht aus.&lt;br /&gt;
&lt;br /&gt;
* Nicht alle AVRs werden vollständig von der avr-libc bzw. dem Compiler unterstützt. Bei Problemen hilft oft ein Blick in den erzeugten Assembler-Code. Die Anzahl der unterstützen Controller steigt jedoch mit Version zu Version von binutils, avr-libc und avrdude. Evtl. reicht einfach ein Update auf neuere Software-Versionen (z.&amp;amp;nbsp;B. im jeweils aktuellen WinAVR-Packet).&lt;br /&gt;
&lt;br /&gt;
* inp(), outp(), sbi() und cbi() werden in der aktuellen Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle Header-Datei einbinden(deprecated.h). Es wird schon seit längerem empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen kann einfach z.&amp;amp;nbsp;B. DDRB=0xfe bzw. foo=PINB geschrieben werden.  Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &amp;amp;= ~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei (1&amp;lt;&amp;lt;x)). Die ersten beiden Varianten erzeugen bei eingeschalteter Optimierung und passenden Parametern (wie hier im Beispiel Register im &amp;quot;unteren&amp;quot; Speicherbereich) die SBI bzw. CBI Prozessorbefehle.&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-nm erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit &lt;br /&gt;
::&amp;lt;pre&amp;gt;avr-nm --size-sort --print-size -r -td &amp;lt;your_ELF_file&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aufgerufen und gibt eine vierspaltige Liste aus: Die erste Spalte ist die Adresse, die zweite die benötigte Größe, die dritte der Typ und die vierte der Name des Symbols. Alle Symbole vom Typ &amp;quot;T&amp;quot; (globale Funktionen), &amp;quot;t&amp;quot; (lokale Funktionen) und letztlich auch die mit einem &amp;quot;D&amp;quot; oder &amp;quot;d&amp;quot; (globale bzw. lokale Daten mit Initialisierungswerten im ROM) betreffen das FLASH-ROM. Typen &amp;quot;B&amp;quot; und &amp;quot;b&amp;quot; brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). (vgl. [http://www.mikrocontroller.net/topic/59960#467920 Forenbeitrag] von Jörg Wunsch)&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-size erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]]&lt;br /&gt;
* [[GCC: unbenutzte Funktionen entfernen]]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Avr-gcc/Interna AVR-GCC Interna]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://winavr.sourceforge.net/install_config_WinAVR.pdf Tutorial von C. O&#039;Flynn und E. Weddington] Einstieg in die Nutzung des avr-gcc unter MS-Windows mit WinAVR (englisch)&lt;br /&gt;
* [http://www.linuxfocus.org/Deutsch/November2004/article352.shtml AVR-GCC und Linux]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum auf mikrocontroller.net]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Compiler]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=90153</id>
		<title>AVR-GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=90153"/>
		<updated>2015-11-02T10:13:45Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Version rausgenommen, da diese sich ständig ändert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;avr-gcc ist ein freier [[C]]-Cross-[[Compiler]] für [[AVR]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
avr-gcc kann von der Leistungsfähigkeit kommerzieller [[Compiler]] gut mithalten. Sogar C++-Programme sind möglich; in der aktuellen Fassung wird C++ jedoch nur eingeschränkt unterstützt (Stand 3/2012).&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
Die Toolchain (Werkzeugsammlung) besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung, siehe [[AVR-GCC-Tutorial/Exkurs Makefiles|AVR-GCC-Tutorial: Exkurs Makefiles]]. &lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* AVR-Libc: Die C-Standardbibliothek mit AVR-spezifischen Headerdateien und Funktionen.&lt;br /&gt;
* [[AVRDUDE]]: universelle AVR-Programmiersoftware, kein eigentlicher Teil der Toolchain, aber oft verwendet&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Linux/Unix ===&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Wenn keine aktuelle avr-gcc-Version als Paket (Paketname ist, zumindest bei Debian, gcc-avr) für die verwendete Distribution zur Verfügung steht, dann können sich [[Unix]]/[[Linux]]-Nutzer den Sourcecode herunterladen und selbst kompilieren, dazu gibt es Schritt-für-Schritt-Anleitungen&amp;lt;ref&amp;gt;[http://www.nongnu.org/avr-libc/user-manual/install_tools.html AVR-Libc: Building and Installing under Linux, FreeBSD, and Others]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.roboternetz.de/wissen/index.php/Avr-gcc_und_avrdude_installieren www.roboternetz.de: avr-gcc und avrdude installieren]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das [http://www.femtoos.org FemtoOS]-Paket beinhaltet Scripte zum automatischen Herunterladen und Bauen einer avr-gcc Version 4.3.3.&lt;br /&gt;
&lt;br /&gt;
Empfehlenswert ist auch [http://cdk4avr.sf.net CDK4AVR], das die entsprechenden Tools als einfach installierbare Linux-Pakete bereitstellt. Leider ist das Projekt schon etwas älter, im Forum findet sich ein [http://www.mikrocontroller.net/topic/130972 Beitrag], aktuellere Sourcen mit den entsprechenden Patches zu versehen und zu kompilieren. Patches zu den Binutils und GCC-Sourcen sind unumgänglich, da die offiziellen Sourcen aufgrund des Umfangs an Prozessortargets den aktuellsten Entwicklungen hinterherhinken und damit bereits bekannte Fehler eventuell noch nicht behoben sind. Weitere Tipps zur AVR-Programmierung unter Linux stehen im Artikel [[AVR und Linux]].&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Die beste fertige Toolchain ist das [http://www.obdev.at/crosspack/ Crosspack]. Dieses enthält auch die AVR-Libc, avrdude und avarice. Leider gab es bei Mac OS 10.5.6 eine tiefgreifende Änderung beim fork()-Systemcall, der bewirkt, dass avarice mit JTAGICE mkII und Dragon nicht funktioniert. Geräte mit Serial-USB-Konvertern (AVRISP clones etc) funktionieren dagegen problemlos. &lt;br /&gt;
&lt;br /&gt;
Wer die Toolchain von Hand bauen möchte kann das natürlich auch tun, dazu einfach den unter &amp;quot;Linux/Unix&amp;quot; verlinkten Anleitungen folgen. Unter [[Mac OS X]] muss man dazu zuerst die [http://developer.apple.com/Tools/ Apple Developer Tools] installieren.&lt;br /&gt;
&lt;br /&gt;
Teile der Toolchain (AVR-Libc und avrdude) kann folgendermaßen installieren:&lt;br /&gt;
&lt;br /&gt;
==== Mit MacPorts ====&lt;br /&gt;
Wenn man [http://www.macports.org/ MacPorts] benutzt kann man folgendes in das Terminal eingeben, um den Toolchain zu installieren:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avr-libc&lt;br /&gt;
&lt;br /&gt;
Das Programmiertool avrdude bekommt man genauso:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avrdude&lt;br /&gt;
&lt;br /&gt;
==== Mit Hombrew ====&lt;br /&gt;
Mit dem neueren Tool [http://brew.sh Homebrew] funktioniert das folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
avrdude kann sofort installiert werden:&lt;br /&gt;
&lt;br /&gt;
 brew install avrdude&lt;br /&gt;
&lt;br /&gt;
Für den restlichen Toolchain muss man erst ein &#039;Tap&#039; hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 brew tap larsimmisch/homebrew-avr&lt;br /&gt;
&lt;br /&gt;
und kann dann den eigentlichen Toolchain installieren:&lt;br /&gt;
&lt;br /&gt;
 brew install avr-libc&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
&lt;br /&gt;
* [http://tinkerlog.com/2007/09/29/programming-avr-with-a-macbook/ Programming AVR with a MacBook] (engl.)&lt;br /&gt;
* [http://www.ladyada.net/library/avrdevtut/setup-mac.html AVR Tutorial from Lady Ada] (engl.)&lt;br /&gt;
* [http://www.obdev.at/crosspack/ Crosspack]&lt;br /&gt;
* [http://www.digithink.com/OSX-AVR OSX-AVR (nicht mehr aktuell)]&lt;br /&gt;
* [http://www.definefalsetrue.com/index.php/Mac-OS-X/bootfeedx.html BootFeedX Bootloaderfrontend]&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx Atmel AVR Toolchain 3.4.x for Windows] zum herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Für MS-Windows gibt es das fertig kompilierte Softwarepaket [[WinAVR]].&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
&lt;br /&gt;
Win32:&lt;br /&gt;
* [[AVR-Studio]]: ab Version 4.12 mit WinAVR-Unterstützung, integrierter Simulator, Debugger, rudimentäre Projektverwaltung&lt;br /&gt;
* Programmers-Notepad: wird bei [[WinAVR]] mitgeliefert, ein guter Editor mit einer rudimentären Projektverwaltung&lt;br /&gt;
* [http://www.myavr.info/download/benutzerhandbuch_sisy_avr.pdf SiSy-AVR]: ein CASE-Tool mit WinAVR-Unterstützung, das eine Entwicklungsumgebung bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Plattformunabhängig:&lt;br /&gt;
* [http://www.eclipse.org/ Eclipse] mit CDT und dem [http://avr-eclipse.sourceforge.net/index.html AVR Eclipse Plugin]&lt;br /&gt;
* [[Code::Blocks]]: vielseitige, freie Entwicklungsumgebung für Windows und Linux&lt;br /&gt;
* [http://www.netbeans.org/ Netbeans] in der C++ - Version mit [[WinAVR]] oder [[avr-gcc]] als Toolchain&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
*[http://sourceforge.net/projects/kontrollerlab/?_test=b KontrollerLab] ist eine freie Entwicklungsumgebung für AVR momentan aber noch im Beta-stadium.&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken / Libraries ==&lt;br /&gt;
&lt;br /&gt;
Die [http://www.nongnu.org/avr-libc/ AVR-Libc] ist die gebräuchliche &amp;quot;Laufzeitbibliothek&amp;quot; zum avr-gcc C-Compiler, welche den Zugriff auf die AVR-Hardware erheblich erleichtert. Die offizielle Dokumentation zur avr-libc mit vielen Hinweisen auch zum Compiler avr-gcc und verschiedener Tools (z.&amp;amp;nbsp;B. [[AVRDUDE]]) findet man [http://www.nongnu.org/avr-libc/user-manual/index.html hier].&lt;br /&gt;
&lt;br /&gt;
Auch die [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] enthält nützlichen Code z.&amp;amp;nbsp;B. für UART, LCD,.... Bei der Procyon AVRlib ist die Lizenz zu beachten (in Kurzform: man muss dritten auf Verlangen den gesamten Quellcode der Firmware zur Verfügung stellen, falls Teile der Procyon Bibliothek genutzt werden).&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf interne Funktionen oder externe Peripherie existieren einige fertige Komponenten. Z.B. &amp;quot;Projects&amp;quot;-Bereich von [http://www.avrfreaks.net/ avrfreaks.net] (Anmeldung erforderlich (kostenlos)). &lt;br /&gt;
&lt;br /&gt;
Die Erstellung eigener Bibliotheken ist im Artikel  [[Libraries]] erklärt.&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
Eine Liste mit einigen Hinweisen:&lt;br /&gt;
&lt;br /&gt;
* 07.10.11 → es kann Probleme mit der aktuellen Eclipse-Version (Indigo) und WinAVR geben. Falls ihr Indigo installiert habt und Eclipse die Definitionen wie z.B. DDRA nicht kennt, jedoch kompillieren kann, dann müsst ihr auf die Version Helios SR2 wechseln. Danach läuft alles wie gehabt!&lt;br /&gt;
&lt;br /&gt;
* Keine &amp;quot;antiken&amp;quot; Versionen verwenden. Für MS-Windows-Nutzer: aktuelles WinAVR installieren. Für Linux/Unix-Nutzer: letzte stabile Version selbst kompilieren oder aus &amp;quot;Distribution-Packages&amp;quot; installieren (z.&amp;amp;nbsp;B. [http://cdk4avr.sourceforge.net/ cdk4avr]).&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen zuerst in die [http://www.nongnu.org/avr-libc/user-manual/index.html Anleitung] der avr-libc schauen. Insbesondere die FAQ lesen.&lt;br /&gt;
&lt;br /&gt;
* Sicherstellen, dass der MCU-Parameter (zum Compiler/Linker, meist im Makefile defniert) mit dem Zielprozessor übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-GCC-Tutorial]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Im Zweifel nicht INTERRUPT(...) sondern SIGNAL(...) nutzen. In neueren Versionen der avr-libc wurde &amp;quot;ISR&amp;quot; als Ersatz für SIGNAL eingeführt und sollte genutzt werden (SIGNAL und INTERRUPT werden langfristig entfallen). Darauf achten, dass die Vektor- bzw. Signal-Namen (&amp;quot;Parameter&amp;quot;) zu ISR bzw. SIGNAL (und INTERRUPT wenn denn unbedingt erforderlich) richtig geschrieben sind. Die Namen sind in der in der entsprechenden Header-Datei (ioxxx.h) für den Controller und der avr-libc-Dokumenation aufgelistet. Im Zweifel den erzeugten Interrupt-Vektor im Assembler-Listing prüfen, es darf &#039;&#039;&#039;kein&#039;&#039;&#039; SIG_&#039;&#039;xxx&#039;&#039; oder xxx_vect mehr zu sehen sein, sondern _vector_&#039;&#039;N&#039;&#039; (wobei &#039;&#039;N&#039;&#039; eine Zahl ist). Neuere Versionen der avr-gcc zeigen eine Warnung, falls etwas falsch geschrieben wurde, ältere Versionen nicht.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf Daten(-Tabellen) im Programmspeicher (Flash) erfolgt über Program-Space-Funktionen (pgm_read*). Lediglich die Definition einer Variablen/eines Feldes mit dem PROGMEM Attribut zu versehen, reicht (im Gegensatz zu Codevision, IAR, Imagecraft) nicht aus.&lt;br /&gt;
&lt;br /&gt;
* Nicht alle AVRs werden vollständig von der avr-libc bzw. dem Compiler unterstützt. Bei Problemen hilft oft ein Blick in den erzeugten Assembler-Code. Die Anzahl der unterstützen Controller steigt jedoch mit Version zu Version von binutils, avr-libc und avrdude. Evtl. reicht einfach ein Update auf neuere Software-Versionen (z.&amp;amp;nbsp;B. im jeweils aktuellen WinAVR-Packet).&lt;br /&gt;
&lt;br /&gt;
* inp(), outp(), sbi() und cbi() werden in der aktuellen Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle Header-Datei einbinden(deprecated.h). Es wird schon seit längerem empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen kann einfach z.&amp;amp;nbsp;B. DDRB=0xfe bzw. foo=PINB geschrieben werden.  Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &amp;amp;= ~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei (1&amp;lt;&amp;lt;x)). Die ersten beiden Varianten erzeugen bei eingeschalteter Optimierung und passenden Parametern (wie hier im Beispiel Register im &amp;quot;unteren&amp;quot; Speicherbereich) die SBI bzw. CBI Prozessorbefehle.&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-nm erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit &lt;br /&gt;
::&amp;lt;pre&amp;gt;avr-nm --size-sort --print-size -r -td &amp;lt;your_ELF_file&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aufgerufen und gibt eine vierspaltige Liste aus: Die erste Spalte ist die Adresse, die zweite die benötigte Größe, die dritte der Typ und die vierte der Name des Symbols. Alle Symbole vom Typ &amp;quot;T&amp;quot; (globale Funktionen), &amp;quot;t&amp;quot; (lokale Funktionen) und letztlich auch die mit einem &amp;quot;D&amp;quot; oder &amp;quot;d&amp;quot; (globale bzw. lokale Daten mit Initialisierungswerten im ROM) betreffen das FLASH-ROM. Typen &amp;quot;B&amp;quot; und &amp;quot;b&amp;quot; brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). (vgl. [http://www.mikrocontroller.net/topic/59960#467920 Forenbeitrag] von Jörg Wunsch)&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-size erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]]&lt;br /&gt;
* [[GCC: unbenutzte Funktionen entfernen]]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Avr-gcc/Interna AVR-GCC Interna]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://winavr.sourceforge.net/install_config_WinAVR.pdf Tutorial von C. O&#039;Flynn und E. Weddington] Einstieg in die Nutzung des avr-gcc unter MS-Windows mit WinAVR (englisch)&lt;br /&gt;
* [http://www.linuxfocus.org/Deutsch/November2004/article352.shtml AVR-GCC und Linux]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum auf mikrocontroller.net]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Compiler]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Baud&amp;diff=86736</id>
		<title>Baud</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Baud&amp;diff=86736"/>
		<updated>2015-01-21T10:03:54Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Erklärung zum &amp;quot;UBRR-Wert&amp;quot; eingefügt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Baud ist die sogenannte Schrittgeschwindigkeit, ein Maß für die Übertragungsgeschwindigkeit (Übertragungsrate).&lt;br /&gt;
&lt;br /&gt;
Im Wortsinne handelt es sich um die Geschwindigkeit der Schritte. Unter einem Schritt versteht man dabei eine Änderung der Signals. Das kann bei einer RS232-Leitung eine Pegeländerung von +12V auf -12V sein. Damit wird dann ein Bit pro Schritt übertragen. Bei einer 16-fach Quadratur Amplituden Modulation wird mit einem neuen Schritt ein neues Signal erzeugt, dass 4 Bit enthält. So werden dann 4 Bit pro Schritt übertragen. Bei einer Schrittgeschwindigkeit von 2400 baud bedeutet das eine Datenrate von 9600 Bit pro Sekunde.&lt;br /&gt;
&lt;br /&gt;
Achtung: &lt;br /&gt;
Baud wird oft mit bps (Bit pro Sekunde) gleichgesetzt, das ist aber falsch. Arbeitet man mit zwei verschiedenen Spannungen (wie z.&amp;amp;nbsp;B. [[RS-232]]), dann kann man mit einem Schritt ein Bit übertragen, dann hat man bei 9600 baud auch 9600 bps. Benutzt man aber (viele) verschiedene Spannungspegel, dann kann man damit auch mehrere Bit pro Baud übertragen. Bei analogen Modems nach dem V.34-Standard werden im Durchschnitt 8,4 Bit pro baud übertragen und damit bei 3429 baud immerhin 28800 bps erzielt.&lt;br /&gt;
&lt;br /&gt;
Folgende Baudraten sind seit langer Zeit als Standards festgelegt, jeder PC kann mit diesen Baudraten kommunizieren. Dazu wird ein Quarz mit 1,8432 MHz verwendet. In der Tabelle ist zusätzlich der benötigte Werte für die Konfiguration der üblichen UARTs angegeben (AVR, 8051, etc.). Allerdings kann man für Mikrocontroller auch höhere Quarzfrequenzen wählen und dennoch diese Baudraten mit 0% Fehler generieren. Dazu benötigt man einen [[Baudratenquarz]].&lt;br /&gt;
&lt;br /&gt;
In der unten angegebenen Tabelle ist neben der Baudrate und dem erforderlichen Teiler auch der in das &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;B&#039;&#039;&#039;aud &#039;&#039;&#039;R&#039;&#039;&#039;ate &#039;&#039;&#039;R&#039;&#039;&#039;egister eines AVR einzutragende Zahlenwert aufgeführt (siehe auch &amp;quot;Der UART&amp;quot; im AVR-GCC Tutorial). &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; &lt;br /&gt;
! Baudrate   ||  Teiler   || UBRR&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|75 ||	24576 ||	1535&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|300 || 	6144 ||	383&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|1200 ||	1536 ||	95&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|2400 ||	768 ||	47&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|4800 ||	384 ||	23&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|9600 ||	192 ||	11&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|14400 ||	128 ||	7&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|19200 ||	96 ||	5&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|28800 ||	64 ||	3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|38400 ||	48 ||	2&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|57600 ||	32 ||	1&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
|115200 ||	16 ||	0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:UART und RS232]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Widerstand&amp;diff=85023</id>
		<title>Widerstand</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Widerstand&amp;diff=85023"/>
		<updated>2014-09-26T12:00:28Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Schaltplan und weitere Erklärung hinzugefügt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter einem Widerstand versteht man ein passives Bauteil, an dem, sobald es vom Strom durchflossen wird, eine Spannung abfällt. &lt;br /&gt;
Der Quotient aus Spannung und Stromstärke wird dabei als der (ohmsche) Widerstand bezeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R=\frac{U}{I}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einheit für den Widerstand ist Ohm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;[R] = \mathrm{\Omega = \frac{V}{A}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reihenschaltung ==&lt;br /&gt;
Kennzeichend für eine Reihenschaltung ist es, dass alle Widerstände mit dem gleichen Strom durchflossen werden.&lt;br /&gt;
          R1_      R2_          Rn_&lt;br /&gt;
   o-----|___|----|___|--...---|___|----o&lt;br /&gt;
&lt;br /&gt;
    VCC                               GND&lt;br /&gt;
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)&lt;br /&gt;
&lt;br /&gt;
Für eine Reihenschaltung von n Widerständen gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_{\mathrm{ges}}=R_1+R_2+\dots+R_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{\mathrm{ges}}=U_1+U_2+\dots+U_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{\mathrm{ges}}=I_1=I_2=\dots=I_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsteiler ===&lt;br /&gt;
&lt;br /&gt;
Ein Spezialfall der Reihenschaltung ist der Spannungsteiler. Bei einem Spannungsteiler schaltet man üblicherweise zwei Widerstände in Reihe und greift die geteilte Spannung in der Mitte ab. Es folgt eine grobe Übersicht; eine ausführlichere Darstellung gibt es im Extraartikel [[Spannungsteiler]].&lt;br /&gt;
&lt;br /&gt;
Nehmen wir also einen Spannungsteiler mit zwei Widerständen R1 und R2 an. Wie oben dargestellt, fließt bei einer Reihenschaltung durch alle Widerstände der gleiche Strom:&lt;br /&gt;
&amp;lt;math&amp;gt;I = \frac{U}{R_{ges}} = \frac{U}{R_1 + R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend lautet der Spannungsabfall am unteren Widerstand:&lt;br /&gt;
&amp;lt;math&amp;gt;U_1 = R_1 \cdot I = U \cdot \frac{R_1}{R_1 + R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man nun ein gewisses Teilverhältnis &amp;lt;math&amp;gt;\frac{U_1}{U}&amp;lt;/math&amp;gt; erreichen, so muss man folglich &amp;lt;math&amp;gt;\frac{R_1}{R_1 + R_2}&amp;lt;/math&amp;gt; entsprechend wählen, denn es gilt:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{U_1}{U} = \frac{R_1}{R_1 + R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies stellt die eigentliche Herausforderung dar, denn zu einem vorgegebenem Spannungs-Verhältnis geeignete Widerstandspaare zu finden, erfordert ohne die Hilfe des Computers manchmal entweder ein &amp;quot;glückliches Händchen&amp;quot; oder die E96-Reihe! &lt;br /&gt;
&lt;br /&gt;
Es gibt auch verschiedene Tools, um die Berechnung der Widerstandskombinationen etwas zu vereinfachen, siehe [[Widerstand#Siehe auch | Abschnitt &amp;quot;Siehe auch&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
== Parallelschaltung ==&lt;br /&gt;
Charakteristisch für eine Parallelschaltung ist es, dass alle Widerstände an der gleichen Spannung anliegen:&lt;br /&gt;
        VCC&lt;br /&gt;
      o------+-----+------&lt;br /&gt;
             |     |     |&lt;br /&gt;
            .-.   .-.   .-.&lt;br /&gt;
            | |R1 | |R2 | |Rn&lt;br /&gt;
            | |   | |   | |&lt;br /&gt;
            &#039;-&#039;   &#039;-&#039;   &#039;-&#039;&lt;br /&gt;
             |     |     |&lt;br /&gt;
      o------+-----+------&lt;br /&gt;
        GND&lt;br /&gt;
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)&lt;br /&gt;
&lt;br /&gt;
Für eine Parallelschaltung von n Widerständen gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{R_{\mathrm{ges}}}=\frac{1}{R_1}+\frac{1}{R_2}+\dots+\frac{1}{R_n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{\mathrm{ges}}=U_1=U_2=\dots=U_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{\mathrm{ges}}=I_1+I_2+\dots+I_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Potentiometer]]&lt;br /&gt;
* [[Wellenwiderstand]]&lt;br /&gt;
* [[E24-Teiler]]&lt;br /&gt;
* [[E48-Teiler]]&lt;br /&gt;
* [[E96-Teiler]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.cl-projects.de/projects/tools/resmatch.phtml Widerstandsberechnung] -Onlinerechner von cl-projects.de&lt;br /&gt;
* [http://www.dk8pp.de/downloads/index.html ParSer] Umfangreiches Programm zur Berechung verschiedener Anordungen von bis zu drei Widerständen oder Kondensatoren&lt;br /&gt;
* [http://www.ibrtses.com/products/index.html resistor divider] (Shareware)&lt;br /&gt;
* [http://www.gjlay.de/helferlein/spannungsteiler.html Online-Rechner zur Berechnung von Spannungsteilern] aus E&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt;- bzw. E&amp;lt;sub&amp;gt;24&amp;lt;/sub&amp;gt;-Widerständen (JavaScript)&lt;br /&gt;
* [http://www.qsl.net/in3otd/parallr.html# Resistor calculator], für krumme Widerstandswerte aus Normwerten (E12/E24/E96)&lt;br /&gt;
* [http://www.brothersoft.com/rval-79581.html RVal], Tool zur Berechnung krummer Widerstandswerte vom E6-E192.&lt;br /&gt;
* [http://www.veith.net/e12calc.htm Hippy&#039;s Happy Resistor Calculator], Online-Tool zur Berechnung krummer Widerstandswerte aus E1-E12 mit bis zu vier Elementen, unerwünschte Widerstandswerte können ausgeschlossen werden.&lt;br /&gt;
* [http://hackwerk.de/widerstand/ hackwerk], Online-Tool zur Berechnung krummer Widerstandswerte vom E6-E24 mit bis zu vier Elementen, zur Berechnung zu verwendene Widerstandswerte können frei vorgegeben werden.&lt;br /&gt;
* [http://eecircle.com/applets/008/ResPicker.html Resistance Pair Chooser], Java-Applet zur Berechnung krummer Widerstandswerte vom E6-E192 mit zwei Elementen, Constraint wird als Term angegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Widerstand&amp;diff=85022</id>
		<title>Widerstand</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Widerstand&amp;diff=85022"/>
		<updated>2014-09-26T11:57:03Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Schaltbild und weitere Erklärung hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter einem Widerstand versteht man ein passives Bauteil, an dem, sobald es vom Strom durchflossen wird, eine Spannung abfällt. &lt;br /&gt;
Der Quotient aus Spannung und Stromstärke wird dabei als der (ohmsche) Widerstand bezeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R=\frac{U}{I}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einheit für den Widerstand ist Ohm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;[R] = \mathrm{\Omega = \frac{V}{A}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reihenschaltung ==&lt;br /&gt;
Kennzeichend für eine Reihenschaltung ist es, dass alle Widerstände mit dem gleichen Strom durchflossen werden.&lt;br /&gt;
          R1_      R2_          Rn_&lt;br /&gt;
   o-----|___|----|___|--...---|___|----o&lt;br /&gt;
&lt;br /&gt;
    VCC                               GND&lt;br /&gt;
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)&lt;br /&gt;
&lt;br /&gt;
Für eine Reihenschaltung von n Widerständen gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_{\mathrm{ges}}=R_1+R_2+\dots+R_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{\mathrm{ges}}=U_1+U_2+\dots+U_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{\mathrm{ges}}=I_1=I_2=\dots=I_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsteiler ===&lt;br /&gt;
&lt;br /&gt;
Ein Spezialfall der Reihenschaltung ist der Spannungsteiler. Bei einem Spannungsteiler schaltet man üblicherweise zwei Widerstände in Reihe und greift die geteilte Spannung in der Mitte ab. Es folgt eine grobe Übersicht; eine ausführlichere Darstellung gibt es im Extraartikel [[Spannungsteiler]].&lt;br /&gt;
&lt;br /&gt;
Nehmen wir also einen Spannungsteiler mit zwei Widerständen R1 und R2 an. Wie oben dargestellt, fließt bei einer Reihenschaltung durch alle Widerstände der gleiche Strom:&lt;br /&gt;
&amp;lt;math&amp;gt;I = \frac{U}{R_{ges}} = \frac{U}{R_1 + R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend lautet der Spannungsabfall am unteren Widerstand:&lt;br /&gt;
&amp;lt;math&amp;gt;U_1 = R_1 \cdot I = U \cdot \frac{R_1}{R_1 + R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man nun ein gewisses Teilverhältnis &amp;lt;math&amp;gt;\frac{U_1}{U}&amp;lt;/math&amp;gt; erreichen, so muss man folglich &amp;lt;math&amp;gt;\frac{R_1}{R_1 + R_2}&amp;lt;/math&amp;gt; entsprechend wählen, denn es gilt:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{U_1}{U} = \frac{R_1}{R_1 + R_2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies stellt die eigentliche Herausforderung dar, denn zu einem vorgegebenem Spannungs-Verhältnis geeignete Widerstandspaare zu finden, erfordert ohne die Hilfe des Computers manchmal entweder ein &amp;quot;glückliches Händchen&amp;quot; oder die E96-Reihe! &lt;br /&gt;
&lt;br /&gt;
Es gibt auch verschiedene Tools, um die Berechnung der Widerstandskombinationen etwas zu vereinfachen, siehe [[Widerstand#Siehe auch | Abschnitt &amp;quot;Siehe auch&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
== Parallelschaltung ==&lt;br /&gt;
&lt;br /&gt;
Für eine Parallelschaltung von n Widerständen gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{R_{\mathrm{ges}}}=\frac{1}{R_1}+\frac{1}{R_2}+\dots+\frac{1}{R_n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{\mathrm{ges}}=U_1=U_2=\dots=U_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{\mathrm{ges}}=I_1+I_2+\dots+I_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Potentiometer]]&lt;br /&gt;
* [[Wellenwiderstand]]&lt;br /&gt;
* [[E24-Teiler]]&lt;br /&gt;
* [[E48-Teiler]]&lt;br /&gt;
* [[E96-Teiler]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.cl-projects.de/projects/tools/resmatch.phtml Widerstandsberechnung] -Onlinerechner von cl-projects.de&lt;br /&gt;
* [http://www.dk8pp.de/downloads/index.html ParSer] Umfangreiches Programm zur Berechung verschiedener Anordungen von bis zu drei Widerständen oder Kondensatoren&lt;br /&gt;
* [http://www.ibrtses.com/products/index.html resistor divider] (Shareware)&lt;br /&gt;
* [http://www.gjlay.de/helferlein/spannungsteiler.html Online-Rechner zur Berechnung von Spannungsteilern] aus E&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt;- bzw. E&amp;lt;sub&amp;gt;24&amp;lt;/sub&amp;gt;-Widerständen (JavaScript)&lt;br /&gt;
* [http://www.qsl.net/in3otd/parallr.html# Resistor calculator], für krumme Widerstandswerte aus Normwerten (E12/E24/E96)&lt;br /&gt;
* [http://www.brothersoft.com/rval-79581.html RVal], Tool zur Berechnung krummer Widerstandswerte vom E6-E192.&lt;br /&gt;
* [http://www.veith.net/e12calc.htm Hippy&#039;s Happy Resistor Calculator], Online-Tool zur Berechnung krummer Widerstandswerte aus E1-E12 mit bis zu vier Elementen, unerwünschte Widerstandswerte können ausgeschlossen werden.&lt;br /&gt;
* [http://hackwerk.de/widerstand/ hackwerk], Online-Tool zur Berechnung krummer Widerstandswerte vom E6-E24 mit bis zu vier Elementen, zur Berechnung zu verwendene Widerstandswerte können frei vorgegeben werden.&lt;br /&gt;
* [http://eecircle.com/applets/008/ResPicker.html Resistance Pair Chooser], Java-Applet zur Berechnung krummer Widerstandswerte vom E6-E192 mit zwei Elementen, Constraint wird als Term angegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Filter&amp;diff=85021</id>
		<title>Filter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Filter&amp;diff=85021"/>
		<updated>2014-09-26T11:49:28Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Neues Schaltbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
&lt;br /&gt;
Als Filter bezeichnet man in der Elektronik eine Schaltung, die die Frequenzanteile eines Signals unterschiedlich stark abschwächt oder betont. Im Bereich der Signalverarbeitung mit Software werden Filter mathematisch nachgebildet.&lt;br /&gt;
&lt;br /&gt;
=== Tiefpass ===&lt;br /&gt;
&lt;br /&gt;
Ein TP filtert Frequenzen oberhalb der Grenzfrequenz weg. Der einfachste passive (analoge) Tiefpass besteht aus einer R/C-Kombination.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LP.bmp|thumb|right|Die Übertragungskennlinie eines Tiefpasses mit&lt;br /&gt;
&amp;lt;math&amp;gt;f_g&amp;lt;/math&amp;gt; = 1.59kHz]]&lt;br /&gt;
&lt;br /&gt;
        VCC     ___&lt;br /&gt;
       o-------|___|----+------o&lt;br /&gt;
                        |&lt;br /&gt;
                        |&lt;br /&gt;
                       ---&lt;br /&gt;
                       ---&lt;br /&gt;
                        |&lt;br /&gt;
                        |&lt;br /&gt;
       o----------------+------o&lt;br /&gt;
         GND&lt;br /&gt;
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Grenzfrequenz ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f_g = \frac{1}{2 \pi \cdot R \cdot C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Grenzfrequenz &amp;lt;math&amp;gt;f_g&amp;lt;/math&amp;gt; besteht zwischen Eingangssignal und Ausgangssignal eine Phasenverschiebung von 45&amp;amp;deg;.&lt;br /&gt;
Ausserdem ist die Ausgangsspannung zur Eingangspannung um 3dB abgeschwächt.&lt;br /&gt;
&lt;br /&gt;
Der einfachste digitale Tiefpass ist ein rückgekoppelter Akkumulator vom Typ Y(t+1) = Y(t)*(1-k) + I*k, wobei I der Inputwert, k der Dämpfungswert und Y der Ausgangswert sind.&lt;br /&gt;
&lt;br /&gt;
=== Hochpass ===&lt;br /&gt;
&lt;br /&gt;
Ein HP filtert Frequenzen unterhalb seiner Grenzfrequenz weg, d.h. er lässt Frequenzen oberhalb passieren. Analog zum Tiefpass, kann auch hier eine einfache passiver Variante mit einem RC-Glied realisiert werden:&lt;br /&gt;
&lt;br /&gt;
        VCC     ||&lt;br /&gt;
       o--------||------+------o&lt;br /&gt;
                ||      |&lt;br /&gt;
                       .-.&lt;br /&gt;
                       | |&lt;br /&gt;
                       | |&lt;br /&gt;
                       &#039;-&#039;&lt;br /&gt;
                        |&lt;br /&gt;
       o----------------+------o&lt;br /&gt;
         GND&lt;br /&gt;
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)&lt;br /&gt;
&lt;br /&gt;
=== Bandpass ===&lt;br /&gt;
&lt;br /&gt;
Ein BP lässt sich als Kombination von HP und TP auffassen. Er lässt Frequenzen zwischen zwei Grenzwerten durch.&lt;br /&gt;
&lt;br /&gt;
=== Notch-Filter ===&lt;br /&gt;
Das Notch-Filter nimmt einen definierten, sehr schmalbandigen Frequenzbereich aus dem Spektrum des Eingangssignals heraus. Sie können als FIR- oder IIR-Filter ausgeführt sein. Eine mögliche Realisation besteht in der Verwendung eines Resonanzfilters oder Kammfilters.&lt;br /&gt;
&lt;br /&gt;
=== Reso-Filter ===&lt;br /&gt;
Ein Resonanzfilter schwingt auf einer bestimmten Frequenz und wird durch das Eingangssignal mehr oder weniger stark angeregt. Frequenzen nahe der Resonanzfrequenz werden besonders betont. Theoretisch wird die Übertragungsfunktion für diese Frequenzen vollständig Null, praktisch wird dies für reale, verlustbehaftete Bauteile aber nicht erreicht. Resonanzfilter sind praktisch immer [[Glossar#I|IIR]]-Filter. Resonanzfilter werden zur Verstärkung oder Abschwächung eines Frequenzbereiches genutzt.&lt;br /&gt;
&lt;br /&gt;
=== Kamm-Filter ===&lt;br /&gt;
Durch zeitversetze gegenphasige Überlagerung eines Eingangssignals mit einer Kopie entsteht ein Kammfilter, bei dem sich alle die Frequenzen auslöschen, bei denen die Periodendauer im Bereich der Verzögerung liegt.&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Analog ===&lt;br /&gt;
&lt;br /&gt;
Analoge Filter werden aus elektronischen oder mechanischen Bauteilen aufgebaut. In der Elektronik dienen sie der analogen Signalbearbeitung, in der Mechanik der Beeinflussung von Schwingungen. Beispielsweise werden durch Verkettung von schwingenden Feder-Masse-Systemen akustische Dämpfer ausgebildet.&lt;br /&gt;
&lt;br /&gt;
Analoge Filter haben bis auf eine systembedingte Anstiegszeit keine Reaktionsverzögerung bzw Latenz.&lt;br /&gt;
&lt;br /&gt;
=== Digital ===&lt;br /&gt;
Hier unterscheiden wir im Wesentlichen zwischen IIR- und FIR-Filtern. Der Algorithmus und der Rechenaufwand ist - wie die Effizienz - sehr verschieden. Speziell beim IIR muss man aufpassen, dass die Filterstufen nicht übersteuern, da IIR-Filter grundsätzlich instabil sein können.&lt;br /&gt;
&lt;br /&gt;
Digitale Filter haben neben einer Anstiegszeit eine rechenzeitbedingte Latenz.&lt;br /&gt;
&lt;br /&gt;
==== Aufbau der Digitalfilter ====&lt;br /&gt;
Ein digitales Filter besteht aus einem Speicher, in den nacheinander die einzelnen Daten eines Datenstromes hineingeladen und mit Koeffizienten multipliziert werden. Die Summe über einen definierten Bereich, der Zahl der sog. Taps, ist der Filterwert, der gfs noch durch die Zahl der Taps dividiert wird. Die Zahl der Taps ist massgeblich für die Güte und den Frequenzgang des Filters.&lt;br /&gt;
&lt;br /&gt;
Die Filterkoeffizienten rühren aus der Überlagerung mit Schwingungen genau der Frequenzen, die man herausselektieren möchte. Im einfachsten Fall multipliziert man einen eingehenden Datenstrom mit einer COS-Schwingung (im komplexen Fall auch mit der Sinus-Schwingung) und erhält eine Resonanz: Frequenzen im Datenstrom, die genau der Filterfrequenz entsprechen, werden logischerweise komplett durchgelassen. Frequenzen links und rechts davon mit zunehmender Abweichung der Filterfrequenz immer schlechter. Durch Überlagerung mehrerer solcher Frequenzen erhält man eine Addiotion der COS-Funktionen und immer mehr Frequenzen werden durch das Filter durchgelassen. Mathematisch kann man dies allgemein formulieren und z.B. für alle Frequenzen abwärts gegen Null integrieren, wodurch man einen Tiefpass erhält.&lt;br /&gt;
&lt;br /&gt;
Die Filterkoeffizienten sind selbst überlagerbar, d.h. wenn man von einem Koeffizientensatz eines Tiefpasses, der auf 100kHz ausgelegt wurde, einen TP-Koeffizientensatz, welcher auf 1kHz ausgelegt wurde, abzieht, erhält man automatisch ein Bandpassfilter 1kHz-100kHz.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
&lt;br /&gt;
Zuerst berechnen wir die Filterkoeffizienten mithilfe folgender Daten:&lt;br /&gt;
&lt;br /&gt;
# Filterart&lt;br /&gt;
# Ordnung&lt;br /&gt;
# Sample-Frequenz&lt;br /&gt;
# Grenzfrequenz.&lt;br /&gt;
&lt;br /&gt;
Für die &amp;quot;analogen Koeffizienten&amp;quot; findet man z.&amp;amp;nbsp;B. im Tietze-Schenk  Tabellen (nach Art und Ordnung sortiert). Diese rechnet man in &amp;quot;digitale Koeffizienten&amp;quot; um (Verhältnis Sample-Frequenz / Grenzfrequenz geht mit ein). Die Eingangsdaten werden mit diesen Koeffizienten im eigentlichen Filteralgorithmus verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Gleich mal ein Beispiel: krit.Filter, 2.Ordnung, Samplefreq 100Hz, Grenzfreq 2Hz (Verhältnis 50:1)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
float afc[] = {&lt;br /&gt;
 /* analoge Filterkoeff.                                          Art     Ordnung */&lt;br /&gt;
    1.287188506, 0.414213562, 0.0,                             /* Krit.   2.      */&lt;br /&gt;
    0.869958884, 0.189207115, 0.0,                             /* Krit.   4.      */&lt;br /&gt;
    0.699891558, 0.122462048, 0.0,                             /* Krit.   6.      */&lt;br /&gt;
    0.601690062, 0.090507733, 0.0,                             /* Krit.   6.      */&lt;br /&gt;
    1.3617,      0.6180,      0.0,                             /* Bessel  2.      */&lt;br /&gt;
    1.3397,      0.4889, 0.7743, 0.3890, 0.0,                  /* Bessel  4.      */&lt;br /&gt;
    1.2217,      0.3887, 0.9686, 0.3505, 0.5131, 0.2756, 0.0,  /* Bessel  6.      */&lt;br /&gt;
    0.0&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
 AFC: A0= 0.870000   A1= 0.189200&lt;br /&gt;
 DFC: C1=-1.494553   C0= 0.558423  D0= 0.015967   D1= 0.031934  D2= 0.015967&lt;br /&gt;
 (das sind die gesuchten fünf Werte)&lt;br /&gt;
 &lt;br /&gt;
 DFC: 0x5fa7  0x8ef4  0x0416  0x82d  0x0416 (skaliert mit -16384 bzw. +65536)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für höhere Ordnungen speisen wir das Ergebnis wiederholt (Ordnung / 2 mal) durch den Filter, allerdings (außer beim krit. Filter) jede Stufe mit anderen Koeffizienten.&lt;br /&gt;
&lt;br /&gt;
==== Fensterung ====&lt;br /&gt;
Da die einkommenden Daten nicht immer ganzzahlig in die Tap-Zahl sowie die einzelnen selekttierten Frequenzen passen, ergeben sich Verzerrungen, die man lindern kann, wenn man den Datenstrom mit einer [[Fensterfunktion]] weich ein- und aublendet. Beispiele dafür sind die COS-basierten Funktionen &amp;quot;Hamming&amp;quot;, &amp;quot;von Hann&amp;quot; und &amp;quot;Blackman-Harris&amp;quot; sowie das weit gebräuchliche Kaiser-Fenster, das auf Besselfunktionen beruht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== geeignete Literatur ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.digitalfilter.com www.digitalfilter.com]&lt;br /&gt;
&lt;br /&gt;
Dough Coulter: Digital Audio Processing&lt;br /&gt;
&lt;br /&gt;
Tietze / Schenk: Schaltungstechnik&lt;br /&gt;
&lt;br /&gt;
Fortsetzung / Erweiterung folgt...&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
&lt;br /&gt;
* Entfernen von Störsignalen aus einem Nutzsignal (z.&amp;amp;nbsp;B. bei einem Funkempfänger)&lt;br /&gt;
* Unterdrückung eines Wechselpannungsanteils&lt;br /&gt;
* Anti-Aliasing -&amp;gt; siehe [[Abtasttheorem]]&lt;br /&gt;
* Auftrennung in unterschiedliche Bänder&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Filter&amp;diff=85020</id>
		<title>Filter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Filter&amp;diff=85020"/>
		<updated>2014-09-26T11:48:00Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Neues Schaltbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
&lt;br /&gt;
Als Filter bezeichnet man in der Elektronik eine Schaltung, die die Frequenzanteile eines Signals unterschiedlich stark abschwächt oder betont. Im Bereich der Signalverarbeitung mit Software werden Filter mathematisch nachgebildet.&lt;br /&gt;
&lt;br /&gt;
=== Tiefpass ===&lt;br /&gt;
&lt;br /&gt;
Ein TP filtert Frequenzen oberhalb der Grenzfrequenz weg. Der einfachste passive (analoge) Tiefpass besteht aus einer R/C-Kombination.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LP.bmp|thumb|right|Die Übertragungskennlinie eines Tiefpasses mit&lt;br /&gt;
&amp;lt;math&amp;gt;f_g&amp;lt;/math&amp;gt; = 1.59kHz]]&lt;br /&gt;
&lt;br /&gt;
        VCC     ___&lt;br /&gt;
       o-------|___|----+------o&lt;br /&gt;
                        |&lt;br /&gt;
                        |&lt;br /&gt;
                       ---&lt;br /&gt;
                       ---&lt;br /&gt;
                        |&lt;br /&gt;
                        |&lt;br /&gt;
       o----------------+------o&lt;br /&gt;
         GND&lt;br /&gt;
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Grenzfrequenz ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f_g = \frac{1}{2 \pi \cdot R \cdot C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Grenzfrequenz &amp;lt;math&amp;gt;f_g&amp;lt;/math&amp;gt; besteht zwischen Eingangssignal und Ausgangssignal eine Phasenverschiebung von 45&amp;amp;deg;.&lt;br /&gt;
Ausserdem ist die Ausgangsspannung zur Eingangspannung um 3dB abgeschwächt.&lt;br /&gt;
&lt;br /&gt;
Der einfachste digitale Tiefpass ist ein rückgekoppelter Akkumulator vom Typ Y(t+1) = Y(t)*(1-k) + I*k, wobei I der Inputwert, k der Dämpfungswert und Y der Ausgangswert sind.&lt;br /&gt;
&lt;br /&gt;
=== Hochpass ===&lt;br /&gt;
&lt;br /&gt;
Ein HP filtert Frequenzen unterhalb seiner Grenzfrequenz weg, d.h. er lässt Frequenzen oberhalb passieren. Analog zum Tiefpass, kann auch hier eine einfache passiver Variante mit einem RC-Glied realisiert werden:&lt;br /&gt;
&lt;br /&gt;
         C&lt;br /&gt;
       | |&lt;br /&gt;
 o-----| |----+----o &lt;br /&gt;
              |&lt;br /&gt;
              |&lt;br /&gt;
             ---&lt;br /&gt;
             |  | R&lt;br /&gt;
             --- &lt;br /&gt;
              |&lt;br /&gt;
              |&lt;br /&gt;
             GND&lt;br /&gt;
&lt;br /&gt;
=== Bandpass ===&lt;br /&gt;
&lt;br /&gt;
Ein BP lässt sich als Kombination von HP und TP auffassen. Er lässt Frequenzen zwischen zwei Grenzwerten durch.&lt;br /&gt;
&lt;br /&gt;
=== Notch-Filter ===&lt;br /&gt;
Das Notch-Filter nimmt einen definierten, sehr schmalbandigen Frequenzbereich aus dem Spektrum des Eingangssignals heraus. Sie können als FIR- oder IIR-Filter ausgeführt sein. Eine mögliche Realisation besteht in der Verwendung eines Resonanzfilters oder Kammfilters.&lt;br /&gt;
&lt;br /&gt;
=== Reso-Filter ===&lt;br /&gt;
Ein Resonanzfilter schwingt auf einer bestimmten Frequenz und wird durch das Eingangssignal mehr oder weniger stark angeregt. Frequenzen nahe der Resonanzfrequenz werden besonders betont. Theoretisch wird die Übertragungsfunktion für diese Frequenzen vollständig Null, praktisch wird dies für reale, verlustbehaftete Bauteile aber nicht erreicht. Resonanzfilter sind praktisch immer [[Glossar#I|IIR]]-Filter. Resonanzfilter werden zur Verstärkung oder Abschwächung eines Frequenzbereiches genutzt.&lt;br /&gt;
&lt;br /&gt;
=== Kamm-Filter ===&lt;br /&gt;
Durch zeitversetze gegenphasige Überlagerung eines Eingangssignals mit einer Kopie entsteht ein Kammfilter, bei dem sich alle die Frequenzen auslöschen, bei denen die Periodendauer im Bereich der Verzögerung liegt.&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Analog ===&lt;br /&gt;
&lt;br /&gt;
Analoge Filter werden aus elektronischen oder mechanischen Bauteilen aufgebaut. In der Elektronik dienen sie der analogen Signalbearbeitung, in der Mechanik der Beeinflussung von Schwingungen. Beispielsweise werden durch Verkettung von schwingenden Feder-Masse-Systemen akustische Dämpfer ausgebildet.&lt;br /&gt;
&lt;br /&gt;
Analoge Filter haben bis auf eine systembedingte Anstiegszeit keine Reaktionsverzögerung bzw Latenz.&lt;br /&gt;
&lt;br /&gt;
=== Digital ===&lt;br /&gt;
Hier unterscheiden wir im Wesentlichen zwischen IIR- und FIR-Filtern. Der Algorithmus und der Rechenaufwand ist - wie die Effizienz - sehr verschieden. Speziell beim IIR muss man aufpassen, dass die Filterstufen nicht übersteuern, da IIR-Filter grundsätzlich instabil sein können.&lt;br /&gt;
&lt;br /&gt;
Digitale Filter haben neben einer Anstiegszeit eine rechenzeitbedingte Latenz.&lt;br /&gt;
&lt;br /&gt;
==== Aufbau der Digitalfilter ====&lt;br /&gt;
Ein digitales Filter besteht aus einem Speicher, in den nacheinander die einzelnen Daten eines Datenstromes hineingeladen und mit Koeffizienten multipliziert werden. Die Summe über einen definierten Bereich, der Zahl der sog. Taps, ist der Filterwert, der gfs noch durch die Zahl der Taps dividiert wird. Die Zahl der Taps ist massgeblich für die Güte und den Frequenzgang des Filters.&lt;br /&gt;
&lt;br /&gt;
Die Filterkoeffizienten rühren aus der Überlagerung mit Schwingungen genau der Frequenzen, die man herausselektieren möchte. Im einfachsten Fall multipliziert man einen eingehenden Datenstrom mit einer COS-Schwingung (im komplexen Fall auch mit der Sinus-Schwingung) und erhält eine Resonanz: Frequenzen im Datenstrom, die genau der Filterfrequenz entsprechen, werden logischerweise komplett durchgelassen. Frequenzen links und rechts davon mit zunehmender Abweichung der Filterfrequenz immer schlechter. Durch Überlagerung mehrerer solcher Frequenzen erhält man eine Addiotion der COS-Funktionen und immer mehr Frequenzen werden durch das Filter durchgelassen. Mathematisch kann man dies allgemein formulieren und z.B. für alle Frequenzen abwärts gegen Null integrieren, wodurch man einen Tiefpass erhält.&lt;br /&gt;
&lt;br /&gt;
Die Filterkoeffizienten sind selbst überlagerbar, d.h. wenn man von einem Koeffizientensatz eines Tiefpasses, der auf 100kHz ausgelegt wurde, einen TP-Koeffizientensatz, welcher auf 1kHz ausgelegt wurde, abzieht, erhält man automatisch ein Bandpassfilter 1kHz-100kHz.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
&lt;br /&gt;
Zuerst berechnen wir die Filterkoeffizienten mithilfe folgender Daten:&lt;br /&gt;
&lt;br /&gt;
# Filterart&lt;br /&gt;
# Ordnung&lt;br /&gt;
# Sample-Frequenz&lt;br /&gt;
# Grenzfrequenz.&lt;br /&gt;
&lt;br /&gt;
Für die &amp;quot;analogen Koeffizienten&amp;quot; findet man z.&amp;amp;nbsp;B. im Tietze-Schenk  Tabellen (nach Art und Ordnung sortiert). Diese rechnet man in &amp;quot;digitale Koeffizienten&amp;quot; um (Verhältnis Sample-Frequenz / Grenzfrequenz geht mit ein). Die Eingangsdaten werden mit diesen Koeffizienten im eigentlichen Filteralgorithmus verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Gleich mal ein Beispiel: krit.Filter, 2.Ordnung, Samplefreq 100Hz, Grenzfreq 2Hz (Verhältnis 50:1)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
float afc[] = {&lt;br /&gt;
 /* analoge Filterkoeff.                                          Art     Ordnung */&lt;br /&gt;
    1.287188506, 0.414213562, 0.0,                             /* Krit.   2.      */&lt;br /&gt;
    0.869958884, 0.189207115, 0.0,                             /* Krit.   4.      */&lt;br /&gt;
    0.699891558, 0.122462048, 0.0,                             /* Krit.   6.      */&lt;br /&gt;
    0.601690062, 0.090507733, 0.0,                             /* Krit.   6.      */&lt;br /&gt;
    1.3617,      0.6180,      0.0,                             /* Bessel  2.      */&lt;br /&gt;
    1.3397,      0.4889, 0.7743, 0.3890, 0.0,                  /* Bessel  4.      */&lt;br /&gt;
    1.2217,      0.3887, 0.9686, 0.3505, 0.5131, 0.2756, 0.0,  /* Bessel  6.      */&lt;br /&gt;
    0.0&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
 AFC: A0= 0.870000   A1= 0.189200&lt;br /&gt;
 DFC: C1=-1.494553   C0= 0.558423  D0= 0.015967   D1= 0.031934  D2= 0.015967&lt;br /&gt;
 (das sind die gesuchten fünf Werte)&lt;br /&gt;
 &lt;br /&gt;
 DFC: 0x5fa7  0x8ef4  0x0416  0x82d  0x0416 (skaliert mit -16384 bzw. +65536)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für höhere Ordnungen speisen wir das Ergebnis wiederholt (Ordnung / 2 mal) durch den Filter, allerdings (außer beim krit. Filter) jede Stufe mit anderen Koeffizienten.&lt;br /&gt;
&lt;br /&gt;
==== Fensterung ====&lt;br /&gt;
Da die einkommenden Daten nicht immer ganzzahlig in die Tap-Zahl sowie die einzelnen selekttierten Frequenzen passen, ergeben sich Verzerrungen, die man lindern kann, wenn man den Datenstrom mit einer [[Fensterfunktion]] weich ein- und aublendet. Beispiele dafür sind die COS-basierten Funktionen &amp;quot;Hamming&amp;quot;, &amp;quot;von Hann&amp;quot; und &amp;quot;Blackman-Harris&amp;quot; sowie das weit gebräuchliche Kaiser-Fenster, das auf Besselfunktionen beruht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== geeignete Literatur ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.digitalfilter.com www.digitalfilter.com]&lt;br /&gt;
&lt;br /&gt;
Dough Coulter: Digital Audio Processing&lt;br /&gt;
&lt;br /&gt;
Tietze / Schenk: Schaltungstechnik&lt;br /&gt;
&lt;br /&gt;
Fortsetzung / Erweiterung folgt...&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
&lt;br /&gt;
* Entfernen von Störsignalen aus einem Nutzsignal (z.&amp;amp;nbsp;B. bei einem Funkempfänger)&lt;br /&gt;
* Unterdrückung eines Wechselpannungsanteils&lt;br /&gt;
* Anti-Aliasing -&amp;gt; siehe [[Abtasttheorem]]&lt;br /&gt;
* Auftrennung in unterschiedliche Bänder&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Filter&amp;diff=85019</id>
		<title>Filter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Filter&amp;diff=85019"/>
		<updated>2014-09-26T11:42:02Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Schaltbild für Hochpass hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
&lt;br /&gt;
Als Filter bezeichnet man in der Elektronik eine Schaltung, die die Frequenzanteile eines Signals unterschiedlich stark abschwächt oder betont. Im Bereich der Signalverarbeitung mit Software werden Filter mathematisch nachgebildet.&lt;br /&gt;
&lt;br /&gt;
=== Tiefpass ===&lt;br /&gt;
&lt;br /&gt;
Ein TP filtert Frequenzen oberhalb der Grenzfrequenz weg. Der einfachste passive (analoge) Tiefpass besteht aus einer R/C-Kombination.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LP.bmp|thumb|right|Die Übertragungskennlinie eines Tiefpasses mit&lt;br /&gt;
&amp;lt;math&amp;gt;f_g&amp;lt;/math&amp;gt; = 1.59kHz]]&lt;br /&gt;
         R&lt;br /&gt;
        ___&lt;br /&gt;
 o-----|___|----+----o &lt;br /&gt;
                |&lt;br /&gt;
                |&lt;br /&gt;
               ---&lt;br /&gt;
               --- C&lt;br /&gt;
                |&lt;br /&gt;
                |&lt;br /&gt;
                |&lt;br /&gt;
               GND&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Grenzfrequenz ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f_g = \frac{1}{2 \pi \cdot R \cdot C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Grenzfrequenz &amp;lt;math&amp;gt;f_g&amp;lt;/math&amp;gt; besteht zwischen Eingangssignal und Ausgangssignal eine Phasenverschiebung von 45&amp;amp;deg;.&lt;br /&gt;
Ausserdem ist die Ausgangsspannung zur Eingangspannung um 3dB abgeschwächt.&lt;br /&gt;
&lt;br /&gt;
Der einfachste digitale Tiefpass ist ein rückgekoppelter Akkumulator vom Typ Y(t+1) = Y(t)*(1-k) + I*k, wobei I der Inputwert, k der Dämpfungswert und Y der Ausgangswert sind.&lt;br /&gt;
&lt;br /&gt;
=== Hochpass ===&lt;br /&gt;
&lt;br /&gt;
Ein HP filtert Frequenzen unterhalb seiner Grenzfrequenz weg, d.h. er lässt Frequenzen oberhalb passieren. Analog zum Tiefpass, kann auch hier eine einfache passiver Variante mit einem RC-Glied realisiert werden:&lt;br /&gt;
&lt;br /&gt;
         C&lt;br /&gt;
       | |&lt;br /&gt;
 o-----| |----+----o &lt;br /&gt;
              |&lt;br /&gt;
              |&lt;br /&gt;
             ---&lt;br /&gt;
             |  | R&lt;br /&gt;
             --- &lt;br /&gt;
              |&lt;br /&gt;
              |&lt;br /&gt;
             GND&lt;br /&gt;
&lt;br /&gt;
=== Bandpass ===&lt;br /&gt;
&lt;br /&gt;
Ein BP lässt sich als Kombination von HP und TP auffassen. Er lässt Frequenzen zwischen zwei Grenzwerten durch.&lt;br /&gt;
&lt;br /&gt;
=== Notch-Filter ===&lt;br /&gt;
Das Notch-Filter nimmt einen definierten, sehr schmalbandigen Frequenzbereich aus dem Spektrum des Eingangssignals heraus. Sie können als FIR- oder IIR-Filter ausgeführt sein. Eine mögliche Realisation besteht in der Verwendung eines Resonanzfilters oder Kammfilters.&lt;br /&gt;
&lt;br /&gt;
=== Reso-Filter ===&lt;br /&gt;
Ein Resonanzfilter schwingt auf einer bestimmten Frequenz und wird durch das Eingangssignal mehr oder weniger stark angeregt. Frequenzen nahe der Resonanzfrequenz werden besonders betont. Theoretisch wird die Übertragungsfunktion für diese Frequenzen vollständig Null, praktisch wird dies für reale, verlustbehaftete Bauteile aber nicht erreicht. Resonanzfilter sind praktisch immer [[Glossar#I|IIR]]-Filter. Resonanzfilter werden zur Verstärkung oder Abschwächung eines Frequenzbereiches genutzt.&lt;br /&gt;
&lt;br /&gt;
=== Kamm-Filter ===&lt;br /&gt;
Durch zeitversetze gegenphasige Überlagerung eines Eingangssignals mit einer Kopie entsteht ein Kammfilter, bei dem sich alle die Frequenzen auslöschen, bei denen die Periodendauer im Bereich der Verzögerung liegt.&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Analog ===&lt;br /&gt;
&lt;br /&gt;
Analoge Filter werden aus elektronischen oder mechanischen Bauteilen aufgebaut. In der Elektronik dienen sie der analogen Signalbearbeitung, in der Mechanik der Beeinflussung von Schwingungen. Beispielsweise werden durch Verkettung von schwingenden Feder-Masse-Systemen akustische Dämpfer ausgebildet.&lt;br /&gt;
&lt;br /&gt;
Analoge Filter haben bis auf eine systembedingte Anstiegszeit keine Reaktionsverzögerung bzw Latenz.&lt;br /&gt;
&lt;br /&gt;
=== Digital ===&lt;br /&gt;
Hier unterscheiden wir im Wesentlichen zwischen IIR- und FIR-Filtern. Der Algorithmus und der Rechenaufwand ist - wie die Effizienz - sehr verschieden. Speziell beim IIR muss man aufpassen, dass die Filterstufen nicht übersteuern, da IIR-Filter grundsätzlich instabil sein können.&lt;br /&gt;
&lt;br /&gt;
Digitale Filter haben neben einer Anstiegszeit eine rechenzeitbedingte Latenz.&lt;br /&gt;
&lt;br /&gt;
==== Aufbau der Digitalfilter ====&lt;br /&gt;
Ein digitales Filter besteht aus einem Speicher, in den nacheinander die einzelnen Daten eines Datenstromes hineingeladen und mit Koeffizienten multipliziert werden. Die Summe über einen definierten Bereich, der Zahl der sog. Taps, ist der Filterwert, der gfs noch durch die Zahl der Taps dividiert wird. Die Zahl der Taps ist massgeblich für die Güte und den Frequenzgang des Filters.&lt;br /&gt;
&lt;br /&gt;
Die Filterkoeffizienten rühren aus der Überlagerung mit Schwingungen genau der Frequenzen, die man herausselektieren möchte. Im einfachsten Fall multipliziert man einen eingehenden Datenstrom mit einer COS-Schwingung (im komplexen Fall auch mit der Sinus-Schwingung) und erhält eine Resonanz: Frequenzen im Datenstrom, die genau der Filterfrequenz entsprechen, werden logischerweise komplett durchgelassen. Frequenzen links und rechts davon mit zunehmender Abweichung der Filterfrequenz immer schlechter. Durch Überlagerung mehrerer solcher Frequenzen erhält man eine Addiotion der COS-Funktionen und immer mehr Frequenzen werden durch das Filter durchgelassen. Mathematisch kann man dies allgemein formulieren und z.B. für alle Frequenzen abwärts gegen Null integrieren, wodurch man einen Tiefpass erhält.&lt;br /&gt;
&lt;br /&gt;
Die Filterkoeffizienten sind selbst überlagerbar, d.h. wenn man von einem Koeffizientensatz eines Tiefpasses, der auf 100kHz ausgelegt wurde, einen TP-Koeffizientensatz, welcher auf 1kHz ausgelegt wurde, abzieht, erhält man automatisch ein Bandpassfilter 1kHz-100kHz.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
&lt;br /&gt;
Zuerst berechnen wir die Filterkoeffizienten mithilfe folgender Daten:&lt;br /&gt;
&lt;br /&gt;
# Filterart&lt;br /&gt;
# Ordnung&lt;br /&gt;
# Sample-Frequenz&lt;br /&gt;
# Grenzfrequenz.&lt;br /&gt;
&lt;br /&gt;
Für die &amp;quot;analogen Koeffizienten&amp;quot; findet man z.&amp;amp;nbsp;B. im Tietze-Schenk  Tabellen (nach Art und Ordnung sortiert). Diese rechnet man in &amp;quot;digitale Koeffizienten&amp;quot; um (Verhältnis Sample-Frequenz / Grenzfrequenz geht mit ein). Die Eingangsdaten werden mit diesen Koeffizienten im eigentlichen Filteralgorithmus verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Gleich mal ein Beispiel: krit.Filter, 2.Ordnung, Samplefreq 100Hz, Grenzfreq 2Hz (Verhältnis 50:1)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
float afc[] = {&lt;br /&gt;
 /* analoge Filterkoeff.                                          Art     Ordnung */&lt;br /&gt;
    1.287188506, 0.414213562, 0.0,                             /* Krit.   2.      */&lt;br /&gt;
    0.869958884, 0.189207115, 0.0,                             /* Krit.   4.      */&lt;br /&gt;
    0.699891558, 0.122462048, 0.0,                             /* Krit.   6.      */&lt;br /&gt;
    0.601690062, 0.090507733, 0.0,                             /* Krit.   6.      */&lt;br /&gt;
    1.3617,      0.6180,      0.0,                             /* Bessel  2.      */&lt;br /&gt;
    1.3397,      0.4889, 0.7743, 0.3890, 0.0,                  /* Bessel  4.      */&lt;br /&gt;
    1.2217,      0.3887, 0.9686, 0.3505, 0.5131, 0.2756, 0.0,  /* Bessel  6.      */&lt;br /&gt;
    0.0&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
 AFC: A0= 0.870000   A1= 0.189200&lt;br /&gt;
 DFC: C1=-1.494553   C0= 0.558423  D0= 0.015967   D1= 0.031934  D2= 0.015967&lt;br /&gt;
 (das sind die gesuchten fünf Werte)&lt;br /&gt;
 &lt;br /&gt;
 DFC: 0x5fa7  0x8ef4  0x0416  0x82d  0x0416 (skaliert mit -16384 bzw. +65536)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für höhere Ordnungen speisen wir das Ergebnis wiederholt (Ordnung / 2 mal) durch den Filter, allerdings (außer beim krit. Filter) jede Stufe mit anderen Koeffizienten.&lt;br /&gt;
&lt;br /&gt;
==== Fensterung ====&lt;br /&gt;
Da die einkommenden Daten nicht immer ganzzahlig in die Tap-Zahl sowie die einzelnen selekttierten Frequenzen passen, ergeben sich Verzerrungen, die man lindern kann, wenn man den Datenstrom mit einer [[Fensterfunktion]] weich ein- und aublendet. Beispiele dafür sind die COS-basierten Funktionen &amp;quot;Hamming&amp;quot;, &amp;quot;von Hann&amp;quot; und &amp;quot;Blackman-Harris&amp;quot; sowie das weit gebräuchliche Kaiser-Fenster, das auf Besselfunktionen beruht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== geeignete Literatur ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.digitalfilter.com www.digitalfilter.com]&lt;br /&gt;
&lt;br /&gt;
Dough Coulter: Digital Audio Processing&lt;br /&gt;
&lt;br /&gt;
Tietze / Schenk: Schaltungstechnik&lt;br /&gt;
&lt;br /&gt;
Fortsetzung / Erweiterung folgt...&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
&lt;br /&gt;
* Entfernen von Störsignalen aus einem Nutzsignal (z.&amp;amp;nbsp;B. bei einem Funkempfänger)&lt;br /&gt;
* Unterdrückung eines Wechselpannungsanteils&lt;br /&gt;
* Anti-Aliasing -&amp;gt; siehe [[Abtasttheorem]]&lt;br /&gt;
* Auftrennung in unterschiedliche Bänder&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Oversampling&amp;diff=85018</id>
		<title>Oversampling</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Oversampling&amp;diff=85018"/>
		<updated>2014-09-26T11:26:18Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Verlinkung von Jitter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter dem so genannten &#039;oversampling&#039; versteht man eine [[Überabtastung]] eines Signals, jenseits der benötigten oder vorhandenen [[Abtastfrequenz]] des Signals.&lt;br /&gt;
&lt;br /&gt;
=Anwendungen=&lt;br /&gt;
==Digitale Datenübertragung==&lt;br /&gt;
Kommt ein stark [[jitter]]-belastetes Signal an einem Signaleingang an, so muss dieses mit mehr als dem Faktor 2 abgetastet werden, da die tatsächliche minimale Periode infolge des Jitters geringer als Faktor 1/2 ist (theoretisch ist zumindest Faktor 2 nötig, um beide Flanken eines Rechtecksignals zu sehen). Daher wird es gerne mit der dreifachen Frequenz abgetastet, um es sehr einfach in die Zieltaktdomain überführen und verarbeiten zu können.&lt;br /&gt;
&lt;br /&gt;
==Signalverarbeitung==&lt;br /&gt;
Mathematische [[Filter]] arbeiten um so genauer, je mehr TAPs - also Stützstellen - sie verwenden. Um Schwingungen und Phasenverläufe möglichst genau verarbeiten und kumulierende Fehler reduzieren zu können, werden Daten bei hohen Anspüchen auf höheren Abtastraten verarbeitet, als sie am Eingang anliegen. Dabei ist zu beachten, dass die Zahl der Filter-TAPs bereits aufgrund der Abtastratenerhöhung linear mitwachsen muss, um wieder die gleiche Frequenzraum erfassen zu können und andererseits auch deshalb vergrössert werden muss, um den Filter selber qualitativ zu verbessern.&lt;br /&gt;
&lt;br /&gt;
==A/D bzw. D/A Wandler==&lt;br /&gt;
&lt;br /&gt;
=== Genauigkeit ===&lt;br /&gt;
&lt;br /&gt;
Vor einem A/D-Wandler, bzw. nach einem D/A-Wandler braucht man normalerweise einen Filter, um Frequenzen jenseits des Nyquist Limits (1/2 Samplingfrequenz) zu unterdrücken. Ein steiler analoger Filter ist aufwendig und braucht präzise Bauteile. Als Alternative wird oft Oversampling genutzt und der Wandler mit einer höheren Frequenz (z.B. 4 fach) betrieben, und dann ein digitaler Filter für den steilen Übergang genutzt - der analoge Filter für die höhere Samplingfrequenz ist deutlich einfacher, da er flacher ausfallen darf. Nebenbei ergibt das Oversampling noch eine  Erhöhung der Auflösung : für die 4-fach höhere Frequenz wird theoretisch 1 Bit gewonnen. Die Genauigkeit erhöht sich dabei allerdings nicht wesentlich.    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sinx/x-Korrektur ===&lt;br /&gt;
&lt;br /&gt;
Außerdem ist mit einer höheren Abtastrate weniger oder keine &amp;quot;sinx/x&amp;quot;-Korrektur mehr nötig, ein Filter, dass im analogen Bereich unmöglich zu entwerfen ist und im Digitalen zumindest etwas von der maximalen Amplitude verschenkt.&lt;br /&gt;
&lt;br /&gt;
=== Noise shaping ===&lt;br /&gt;
&lt;br /&gt;
Sigma-Delta-ADC?&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Kondensator&amp;diff=85013</id>
		<title>Kondensator</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Kondensator&amp;diff=85013"/>
		<updated>2014-09-25T13:01:58Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Lesbarkeit hoffentlich erhöht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Kondensator ist ein passives Bauteil mit zwei Anschlüssen, welches elektrische Energie in einem elektrischen Feld speichert. Die charakteristische Größe, die den Kondesator beschreibt ist die Kapazität F.&lt;br /&gt;
Dieses Bauteil besteht aus zwei Flächen gut leitfähigem Materials, die jedoch voneinander isoliert sind. Das Isolationsmaterial ist ein Dielektrikum und verleiht dem Kondensator je nach Materialauswahl stark unterschiedliche Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
== Aufbau eines Kondensators ==&lt;br /&gt;
Wie oben beschrieben besteht ein Kondensator immer aus zwei leitfähigen - voneinander isolierten - Flächen. Je größer die Fläche, je geringer der Abstand der Flächen, und je höher das  relativer Permittivität \varepsilon_r - das Dielektrikum -  desto höher ist die Kapazität des Bauteiles. Der einfachste Kondensator besteht aus zwei voneinander isolierten Metallplatten, zwischen denen sich Luft als &amp;quot;Dielektrikum&amp;quot; befindet. Um die Fläche und damit die Kapazität zu vergrößern gibt es verschiedene Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
=== Wickelkondensator ===&lt;br /&gt;
Die einfachste Methode die Flächen zu vergrößern ist es, zwei leitfähige Folien mit einem Isolationsmaterial dazwischen aufzuwickeln. Diese Methode wird für so ziemlich alle Kondensatortypen verwendet. Manchmal wird der Wickel nach der Herstellung flachgepresst, um das Volumen zu optimieren.&lt;br /&gt;
&lt;br /&gt;
=== Schichtkondensator ===&lt;br /&gt;
Diese Aufbauart wird durch &amp;quot;stapeln&amp;quot; der unterschiedlichen Lagen erreicht. Verfahrenstechnisch ist dies oft wieder ein Wickel, jedoch meist auf bis zu 2 Meter durchmessenden Wickelrädern. Dieses ursprünglich von Siemens eingesetzt Verfahren wird auch aktuell noch verwendet, hauptsächlich für Folienkondensatoren bis in den mF-Bereich hinein. Nach dem Wickeln auf vieleckigen Räder wird der Folienstapel geschnitten und auf die gewünschte Größe = Kapazität getrennt.&lt;br /&gt;
&lt;br /&gt;
== Kondensatortypen ==&lt;br /&gt;
(Vakuum-, Glimmer- und Glaskondensatoren nicht berücksichtigt)&lt;br /&gt;
=== Keramik-Kondensator ===&lt;br /&gt;
Kerkos sind sogenannte &amp;quot;Vielschicht-Kondensatoren&amp;quot; die aus mehreren hundert Lagen einer isolierenden Keramik (Titandioxid+Bariumtitanat), und einer elektrisch leitfähigen Metallisierung bestehen (Aluminium &amp;amp; Magnesiumsilikate)bestehen.&lt;br /&gt;
Dieser Typ ist wie der Folienkondensator für höchste Frequenzen geeignet, hat eine sehr geringe Baugröße, eine gute Temperaturstabilität aber piezoelektrische Eigenschaften. Die Kapazität pro mm³ variiert je nach Dielektrikum Z5U, Y5V, X7R, C0 (in abnehmender Kapazitätsdichte) und ist sowohl abhängig von Temperatur als auch der angelegten Spannung.&lt;br /&gt;
&lt;br /&gt;
=== Folien-Kondensator ===&lt;br /&gt;
Unterschiedliche Folienarten verleihen dem Kondensator stark unterschiedliche Eigenschaften wie z.B. temperatur- und alterungsbeständigkeit, Verlustfaktor, Isolationswiderstand, und die obere Grenzfrequenz, um nur die wichtigsten zu nennen. Die Dicke der Matallisierung hingegen entscheidet über den maximal zulässigen Rippelstrom / Impulsstromfestigkeit und darüber, ob sich ein Kondensator &amp;quot;selbst heilen&amp;quot; kann, oder nicht. Das Verfahren der &amp;quot;Selbstheilung&amp;quot; funktioniert nur bei Metallisierungen, da es darauf beruht, daß die im C gespeicherte Energie den Metallbelag beim Durchschlag durch die Isolation verdampfen kann. Ist die Energie zu gering, wird nur wenig Metall um den Durchschlag verdampft, und der Kurzschluß bleibt bestehen. Ist die Energie zu hoch, wird der Kondensator thermisch zerstört. Hat der C den richigen Energiegehalt, verdampft direkt um die Durchschlagstelle herum bis zu einigen mm der Metallisierung, und die Fehlstelle ist wieder isoliert. Im Übrigen ist eine Parallelsschaltung aus vielen,als selbstheilenden C&#039;s nicht unbedingt mehr &amp;quot;selbstheilend&amp;quot; da der Energieeintrag dann aus dem Gesamtverbund kommt, und oft zu hoch ist um nur eine kleine Fläche verdampfen zu lassen.&lt;br /&gt;
Impulsstrom-feste Kondensatoren zeichnen sich durch hohe Schichtstärken der Metallisierung aus, oder verwenden statt der Metallbeschichtung direkt eine Metallfolie. Hier wäre normalerweise ein &amp;quot;selbstheilen&amp;quot; gleichbedeutend mit einem so hohen Energieeintrag, daß das Bauteil zerstört wird.&lt;br /&gt;
&lt;br /&gt;
Hier eine kleine Übersicht mit der Bitte um Vervollständigung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Folien-Typ&#039;&#039;&#039;  || Polypropylen || Polystyren || Polycarbonat  ||Polyester|| Polystyrol  ||   Polyethylennaphthalat ||   Polytetrafluorethylen ||   Polyphenylensulfid    ||   Metallpapier   &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Markenname Folie&#039;&#039;&#039; || Hostalen || -   || Makrofol, Makroflex ||  Mylar, Hostaphan ||   Styroflex ||  Kaladex||  Teflon|| Tedur, Ryton|| Papier&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Abkürzung&#039;&#039;&#039; || PP || -  || PC||  PET ||  PS||  PEN||  PTFE|| PPS|| -  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Typ&#039;&#039;&#039; || (F)KP, MKP || -   || KC, MKC ||  (F)KT, MKT  ||  -KS, MKS ||  (F)KN, MKN||  -|| (F)KI, MKI|| MP  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Temperaturfestigkeit [°C]&#039;&#039;&#039; || ca 105 || -    || ca. 105 ||  125..150  ||  -  ||  150 ||  -|| 150 || 85  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Toleranz ca. +/- [%]&#039;&#039;&#039; || 1 || 1   || -||  -  ||  -  ||  -||  -|| -|| 20  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Grenzfrequenz ca. [kHz]&#039;&#039;&#039; || 100 || 400   || -||  -  ||  1000  ||  -||  -|| -|| -  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Selbstheilend&#039;&#039;&#039; || ja || -  || -||  ja  ||  -  ||  -||  -|| -|| ja  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Impulsbelastbarkeit&#039;&#039;&#039; || + || +   || ||  +  ||  -- ||  -||  -|| -|| +  &lt;br /&gt;
|}&lt;br /&gt;
(MK) = metallisierte Folie,  (F) = Metallbeläge z.B. Metallfolie (K) = Metallfolie+Kunststofffolie&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==== ====&lt;br /&gt;
&lt;br /&gt;
=== Elektrolyt-Kondensator ===&lt;br /&gt;
Ein Elko unterscheidet sich hauptsächlich dadurch von anderen Kondensatoren, daß nur eine Elektrode aus einer Metallschicht besteht, die zweite aus einem festen, oder flüssigen Elektrolyten.&lt;br /&gt;
&lt;br /&gt;
==== Fest-Elektrolyt ====&lt;br /&gt;
Diese Bauteile bestehen aus Polymeren, Metalloxiden, Braunstein, ... und sind wie die Elkos immer gepolt.&lt;br /&gt;
Als Metalloxide ist Tantal sehr, und Niob noch weniger verbreitet.&lt;br /&gt;
Takos sind &#039;&#039;&#039;SEHR&#039;&#039;&#039; empfindlich gegenüber schnellen Spannungsanstiegen bzw. Überspannung und sollten nie ohne Vorwiderstand direkt an einer niederohmigen Quelle (Batterie) geladen/betrieben werden. Takos verbrennen im Fehlerfall mit einer Stichflamme, daher empfiehlt es sich eine deutlich höhere Spannungsfestigkeit zu wählen und - bei direktem Anschluß an eine niederohmige Quelle - zusätzlich ein Lade-Vorwiderstand einzubauen. Treten zusätzlich hohe Temperaturen auf, ist die Spannungsfestigkeit mindestens zu verdoppeln.&lt;br /&gt;
Kondensatoren mit Niob statt Tantal sind weniger verbreitet, und noch sehr teuer. Ihr Vorteil ist z.B. die Unempfindlichkeit gegenüber schnellen Spannungsanstiegen, sie können direkt an jeder Quelle betrieben werden.&lt;br /&gt;
&lt;br /&gt;
==== Flüssig-Elektrolyt ====&lt;br /&gt;
Diese Bauteile bestehen aus zwei Lagen &#039;&#039;&#039;sehr stark angeätzter&#039;&#039;&#039; Aluminiumfolie - zur Vergrößerung der Oberfläche - und einem flüssigen (seltener &amp;quot;einem festen&amp;quot;) Elektrolyten. Die zweite Folie kontaktiert gleichzeitig den Elektrolyten. Der Elektrolyt ist häufig auf Alkoholen basierend, aus/mit Schwefelsäure oder Glykol.&lt;br /&gt;
Die Alufolie wird nach den ätzen anodisch oxidiert. Die Eloxal-Schicht ist mechanisch belastbar, und stellt die &#039;&#039;&#039;einzige&#039;&#039;&#039; Isolation zwischen den beiden Anschlüssen dar. Die Oxidation der Alufolie wird je nach Hersteller bei ca. 140..165% der Nennspannung durchgeführt. Die Oxidschicht baut sich durch den Elektrolyten bei langer Lagerung stark ab, daher sinkt die Spannungsfestigkeit eines Elkos mit seinem Alter. Alte Bauteile können - sofern noch Elektrolyt enthalten ist - durch spannungsrichtiges Anschließen an eine Spannungsquelle und langsamen erhöhen der Spannung bis über die Nennspannung hinaus wieder &amp;quot;formiert&amp;quot; werden. Achtung, hier besteht die Gefahr eines Kurzschlusses zwischen den Anschlüssen, daher hochohmigen Vorwiderstand verwenden!&lt;br /&gt;
Wird ein Elko verpolt betrieben, wird die Oxidschicht im Laufe der Zeit (Abhängig von Spannung und Temperatur) abgebaut, und der Kondensator schlägt durch.&lt;br /&gt;
&lt;br /&gt;
=== Doppelschicht-Kondensatoren ===&lt;br /&gt;
Diese Bauteile werden unter Markennamen wie &amp;quot;Goldcap&amp;quot;, &amp;quot;Ultracap&amp;quot; oder &amp;quot;Supercap&amp;quot; vertrieben, besitzen meist ein flüssiges Elektrolyt haben aber nicht besonders viel mit den o.g. &amp;quot;Elektrolytkondensatoren&amp;quot; gemeinsam. Dieser Kondensator besitzt Eigenschaften eines Kondensators und einer Batterie. Der &amp;quot;Kondensator&amp;quot; ist hier aus (im Gegensatz zum Elko) zwei Lagen einer einseitig metallisierten Aktivkohle, einem Separator, und einem Elektrolyten. &lt;br /&gt;
Das verwendete Elektrolyt erfüllt unter definierten Betriebsbedingungen die Funktion eines zusätzlichen Dielektrikums, und trägt zusätzlich zur ohnehin schon sehr großen Fläche der Aktivkohle, durch seine extrem dünne Schichtdicke, zur sehr hohen Kapazität bei.&lt;br /&gt;
Im Gegensatz zu einer Batterie kann der Doppelschichtkondensator Energie sehr schnell aufnehmen und abgeben, und altert dabei nur im geringen Maße. 500000 Lade-/Entladezyklen sind erreichbar, wenn die Spannung pro Zelle nicht überschritten wird. Normal sind hier 2,3..2,5V.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
Hier wird für verschiedene Anwendungsfälle eine sinnvolle Lösung empfohlen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Anwendung&#039;&#039;&#039;  || &#039;&#039;&#039;Beispiel&#039;&#039;&#039; || &#039;&#039;&#039;Empfohlener Typ&#039;&#039;&#039;  ||&#039;&#039;&#039;Kommentar&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Stromversorgung || Netzteil|| Elko||&lt;br /&gt;
|- &lt;br /&gt;
| Stromversorgung || Zwischenkreis|| Elkos, Folienkondensatoren||&lt;br /&gt;
|-&lt;br /&gt;
| Datenerhalt || || Doppelschichtkondensator ||&lt;br /&gt;
|-&lt;br /&gt;
| Energiespeicher|| digitale Schaltungen|| Kerko || z.B. 47nF pro IC bzw. Vcc-Anschluß&lt;br /&gt;
|- &lt;br /&gt;
| Hohe Impulsenergie x00ms || Impulsschweißgerät, (capacitive discharge)|| Elko (Folie)||&lt;br /&gt;
|-&lt;br /&gt;
| Impulsfeste Kondensatoren || Coils shrinker, Coilgun, Railgun|| Folie||MKT10 oder noch besser FKT1&lt;br /&gt;
|-&lt;br /&gt;
| NF-Filter|| PWM als DAC || Tako/Elko/Kerko ||&lt;br /&gt;
|-&lt;br /&gt;
| HF-Filter|| Beispiel || Styroflex-Folie ||&lt;br /&gt;
|-&lt;br /&gt;
| Audio || Kopplung || Folie ||&lt;br /&gt;
|-&lt;br /&gt;
| Vorwiderstand || Motorkondensator || MP oder Folie ||&lt;br /&gt;
|-&lt;br /&gt;
| Vorwiderstand || Kondensatornetzteil|| Kerko/Folie || Achtung, nur X2-Typen!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mathematik zum Kondensator ==&lt;br /&gt;
&lt;br /&gt;
Die Größe eines Kondensators ist seine Kapazität (Formelzeichen &#039;&#039;C&#039;&#039;), die als Ladung (Formelzeichen &#039;&#039;Q&#039;&#039;) durch Spannung (Formelzeichen &#039;&#039;U&#039;&#039;) definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C=\frac{Q}{U}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einheit für die Kapazität ist Farad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; [C]=F=\frac{As}{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reihenschaltung ===&lt;br /&gt;
&lt;br /&gt;
Für eine Reihenschaltung von &#039;&#039;n&#039;&#039; Kondensatoren gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{C_{ges}}=\frac{1}{C_1}+\frac{1}{C_2}+\dots+\frac{1}{C_n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{ges}=U_1+U_2+\dots+U_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{ges}=I_1=I_2=\dots=I_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
Für eine Parallelschaltung von &#039;&#039;n&#039;&#039; Kondensatoren gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C_{ges}=C_1+C_2+\dots+C_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{ges}=U_1=U_2=\dots=U_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{ges}=I_1+I_2+\dots+I_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gespeicherte Energie ===&lt;br /&gt;
&lt;br /&gt;
Die in einem Kondensator gespeicherte Energie lässt sich durch die Formel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; W=\frac{C}{2} \cdot U^2 = \frac{1}{2 \cdot C} \cdot Q^2 = \frac{U}{2} \cdot Q &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
berechnen.&lt;br /&gt;
&lt;br /&gt;
== Praxis ==&lt;br /&gt;
&lt;br /&gt;
=== Polaritätszeichen ===&lt;br /&gt;
&lt;br /&gt;
Elektrolytkondensatoren (Elkos) sind (in der Regel) gepolt, d. h. Gleichspannungspegel müssen in einer vorgeschriebenen Polarität angelegt werden, damit das Dielektrikum nicht zerstört wird.  Bei Aluminium-Elkos wird dabei generell der Minuspol gekennzeichnet, bei kleinen Bauformen mit einem Strich, bei größeren Bauformen befinden sich u. U. auch noch Minuszeichen in diesem Strich eingebettet.  Bei Tantal-Kondensatoren hingegen wird immer der Pluspol gekennzeichnet (nicht nur bei den SMD-Bauformen, aber auch bei diesen).&lt;br /&gt;
&lt;br /&gt;
[[Bild:SMD-Elkos.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Die gezeigten Elkos haben folgende Werte:&lt;br /&gt;
&lt;br /&gt;
* 220 µF, Spannungsfestigkeit 6 V&lt;br /&gt;
* 100 µF (&amp;lt;math&amp;gt;10 \cdot 10^7&amp;lt;/math&amp;gt; pF), 16 V&lt;br /&gt;
* 22 µF, 10 V&lt;br /&gt;
* 1 µF, 35 V&lt;br /&gt;
* 2,2 µF (&amp;lt;math&amp;gt;22 \cdot 10^5&amp;lt;/math&amp;gt; pF), 10 V&lt;br /&gt;
&lt;br /&gt;
Die beim 100-µF-Kondensator zu findende Buchstabenschreibweise für die Spannungsfestigkeit ist wenig gebräuchlich, aber gelegentlich anzutreffen.  Die Zuordnung ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Buchstabe&#039;&#039;&#039;           ||  e  ||   G   ||   J   ||   A   ||   C   ||   D   ||   E   ||   V   ||   H   &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Spannungsfestigkeit&#039;&#039;&#039; || 2.5V || 4 V   || 6,3 V ||  10 V ||  16 V ||  20 V ||  25 V || 35 V || 50 V &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Case Code&#039;&#039;&#039; (Bauform)      ||  A  ||  B  ||  C  ||  D   &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Länge&#039;&#039;&#039; (mm)               || 3,2 || 3,5 || 6,0 || 7,3 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Breite&#039;&#039;&#039; (mm)              || 1,6 || 2,8 || 3,2 || 4,3 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Höhe&#039;&#039;&#039; (mm)                || 1,6 || 1,9 || 2,5 || 2,8 &lt;br /&gt;
|-&lt;br /&gt;
|    Maßtoleranz (mm)            || 0,2 || 0,2 || 0,3 || 0,3  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Siebkondensator ===&lt;br /&gt;
&lt;br /&gt;
Der Siebkondensator sitzt hinter einem Gleichrichter und hat die Aufgabe, aus einer gleichgerichteten, pulsierenden Spannung, eine annähernd konstante Gleichspannung mit nur wenig Welligkeit (engl. Ripple) zu machen. Er wird periodisch geladen und muss während der Ladepausen, wenn die Eingangssspannung vor dem Gleichrichter kleiner als die Ausgangsspannung ist, den Ausgang mit Strom versorgen. Man findet ihn in allen klassischen Netzteilen mit 50Hz Trafo. Als Daumenregel kann man sich merken, dass man pro 1A Ausgangsstrom ca. 10mF braucht, um eine Welligkeit von ca. 1Vpp zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Einen Siebkondensator findet man auch am Ausgang von Schaltnetzteilen, seine Aufgabe ist dort die gleiche. Allerdings sind die Schaltfrequenzen deutlich höher, typisch 50-500kHz. Darum muss dieser Kondensator einen besonders kleinen, effektiven Innenwiderstand besitzen (engl. ESR, Equivalent Series Resistance).&lt;br /&gt;
&lt;br /&gt;
=== Entkoppelkondensator ===&lt;br /&gt;
&lt;br /&gt;
Der Entkoppelkondensator hat die Aufgabe, die Versorgungsspannung nahe an einem IC für hochfrequente Ströme zu puffern (entkoppeln, engl. decoupling). Schnelle Digital- und Analogschaltungen benötigen vor allem beim Umschalten sehr schnell viel Strom, in der Größenordnung von Nanosekunden bis Mikrosekunden, je nach IC Milliampere bis Ampere. Diese müssen mit möglichst geringem Widerstand und Induktivität geliefert werden. Ein Stromversorgungsnetz auf einer Platine kann das meist nur unzureichend, dazu sind die Leitungen meist zu lang und damit die Induktivität zu hoch. Ein nah am IC platzierter Kondensator liefert diesen Strom für kurze Zeit, ohne dass die Spannung nennenswert einbricht. Die Entkopplung der Stromversorgung geschieht meist mehrstufig, d.h. es werden Kondensatoren verschiedener Arten und Kapazitäten eingesetzt, siehe [[Stromversorgung für FPGAs]].&lt;br /&gt;
&lt;br /&gt;
Praktische Anwendung&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Jeder&#039;&#039;&#039; Digitalschaltkreis benötigt einen 100nF Keramikkondensator nah (kleiner 20mm) an den Anschlüssen von VCC und GND. Je schneller der IC schalten kann, umso wichtiger ist er.&lt;br /&gt;
* Für &#039;&#039;&#039;jedes&#039;&#039;&#039; Anschlusspaar von VCC und GND eines ICs muss ein Kondensator verwendet werden. Sparen geht hier oft schief!&lt;br /&gt;
* Für die Verbindung der Enkoppelkondensatoren zur Masse- bzw. Versorgungsfläche sollte man möglichst je Kondesator ein VIA benutzen und nicht über ein VIA mehrere Kondensatoren verbinden. Dadurch wird die parasitäre Induktivität vermindert.&lt;br /&gt;
* Schnelle Analogschaltkreise wie Operationsverstärker, [[Treiber]] etc. brauchen auch individuelle Entkoppelkondensatoren.&lt;br /&gt;
* Pi mal Daumen gilt: Je größer der Kondensator, umso weiter kann er von dem Verbraucher weg sein, da er auf Grund seines Innenwiderstands weniger HF-tauglich ist. Es ist somit nicht sinnvoll, einen 1000µF Elektrolytkondensator 10mm neben einen Digital-IC setzen zu wollen. Dort gehört der 100nF Keramikkondensator hin. Aber für die Stromversorgung von Motoren, Treibern und [[H-Brücken Übersicht|H-Brücken]] sind derartige großen Kondensatoren wichtig und sollten nicht zu weit entfernt sein.&lt;br /&gt;
&lt;br /&gt;
=== Koppelkondensator ===&lt;br /&gt;
&lt;br /&gt;
Koppelkondensatoren verbinden Verstärkerstufen. Dabei wird jedoch nur der Wechselanteil übertragen, kein Gleichanteil. Diese Kondensatoren müssen möglichst verzerrungsarm sein, vor allem im Audiobereich. Das wird durch die richtige Wahl des Dielektrikums erreicht.&lt;br /&gt;
&lt;br /&gt;
=== Forumsbeiträge ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/43762 Abblockkondensator: Kerko (Keramik) oder Folie?]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/62576 Brennende Tantalkondensatoren]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/108865#963281 Kodierung (Umwandlung)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/169958#1624840 Unterschied: Elektrolytkondensator vs. Tantalkondensator]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/195563#1915294 Unterschied: C0G vs. Glimmer]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/264347#2748845 Kurze Beschreibung verschiedener Folienkondensatoren]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/108865#1356075 PC Tool zum Identifizieren von Kondensatoren]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://my.execpc.com/~endlr/index.html CapSite 2009] - Introduction To Capacitors&lt;br /&gt;
* [http://www.cde.com/catalogs/AEappGUIDE.pdf Aluminum Electrolytic Capacitor Application Guide] von CDE Cornell Dubilier&lt;br /&gt;
* Anwendungen&lt;br /&gt;
** [http://www.radio-electronics.com/info/data/capacitor/capacitor_types.php Capacitor types and their uses] (engl.)&lt;br /&gt;
** [http://www.planetanalog.com/features/showArticle.jhtml;jsessionid=23?articleID=199905522 Choosing and Using Bypass Capacitors] (dreiteilige Artikelserie) bei [http://www.planetanalog.com www.planetanalog.com]&lt;br /&gt;
** [http://www.vagrearg.org/?p=decoupling Decoupling by Example]&lt;br /&gt;
* Video-Tutorials&lt;br /&gt;
** EEVblog #33 – Capacitor Tutorial [http://www.eevblog.com/2009/09/26/eevblog-33-1of2-capacitor-tutorial-electrolytic-tantalum-and-plastic-film/ Teil 1: Electrolytic, Tantalum, and Plastic Film] und [http://www.eevblog.com/2009/09/26/eevblog-33-2of2-capacitor-tutorial-ceramics-and-impedance/ Teil 2: Ceramics and impedance]&lt;br /&gt;
* [http://www.maximintegrated.com/app-notes/index.mvp/id/5527 Tutorial] von Maxim, &amp;quot;Temperature and Voltage Variation of Ceramic Capacitors, or Why Your 4.7µF Capacitor Becomes a 0.33µF Capacitor&amp;quot;, engl.&lt;br /&gt;
* [http://www.wima.de/DE/characteristics.htm Vergleichstabelle] der Eigenschaften von Folien- und Keramikkondensatoren, WIMA&lt;br /&gt;
* [http://portal.national.com/rap/Application/0,1570,28,00.html] Bob Pease: &amp;quot;Understand Capacitor Soakage to Optimize Analog Systems&amp;quot;&lt;br /&gt;
* [http://www.youtube.com/watch?v=AP_FSyWGpoE Youtube-Video zum Thema Abblockkondensatoren (Deutsch)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Festplatte&amp;diff=85012</id>
		<title>Festplatte</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Festplatte&amp;diff=85012"/>
		<updated>2014-09-25T12:17:25Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Rechtschreibung und Lesbarkeit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Festplatte ==&lt;br /&gt;
Im uC-Forum tauchen gelegentlich immer mal wieder Fragen auf, wie man eine Festplatte ansteuert. Da ich mich selber auch relativ lange damit befasst habe, habe ich viel Zeit investiert um alle Infos zusammen zu tragen. In diesem Artikel sollen die wichtigsten Grundlagen vermittelt werden. Also wie eine Festplatte aufgebaut ist, welche Register es gibt und wie man mittels Command Codes irgendwelche Aktionen ausführt.&lt;br /&gt;
&lt;br /&gt;
=== Grundlegender Aufbau einer Festplatte ===&lt;br /&gt;
Sicher haben einige von euch schon mal eine Festplatte auseinander genommen. Die können diesen Abschnitt getrost überspringen ;)&lt;br /&gt;
Für die anderen hier mal ein Bild:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Festplatte_1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Plattenstapel dreht sich üblicherweise mit einer Geschwindigkeit von 4200 oder 5400 U/min (Notebook-Festplatten), 7200 U/min (Desktop-Festplatten) oder mit über 10&#039;000 U/min (Server-Festplatten). Die Platten selber bestehen aus Aluminium oder Glas, welches mit einer ferromagnetischen Schicht versehen ist.&lt;br /&gt;
Die Schreib-/Leseköpfe können mittels eines sogenannten &#039;Servos&#039; über den Platten positioniert werden. Sie sind im Prinzip kleine Spulen, die über einen Flexiblen Leiter mit einem Verstärker verbunden sind. Dieser Verstärker stellt die Verbindung mit der Elektronik her.&lt;br /&gt;
Wenn nun die Platten rotieren, entsteht dadurch ein Luftzug im Festplattengehäuse. Der Luftzug hebt dann die Schreib-/Leseköpfe von der Plattenoberfläche ab, diese schweben dann einige nm über der Plattenoberfläche. Aus diesem Grund brauchen Festplatten einen minimalen Luftdruck (Oft ist im Datenblatt vermerkt, bis zu welcher Meereshöhe man das Gerät betreiben darf).&lt;br /&gt;
&lt;br /&gt;
=== Wie werden jetzt die Daten gespeichert? ===&lt;br /&gt;
Nun müssen natürlich irgendwie die Bits &amp;amp; Bytes auf dieser magnetischen Plattenschicht abgelegt werden können. Um das zu tun, wird eine spezielle Einteilung vorgenommen. Als erstes werden die Platten in konzentrische Ringe unterteilt. Diese Ringe werden als &#039;Track&#039; bezeichnet. Alle Tracks, die vom Plattenzentrum den selben Abstand haben, nennt man Zylinder.&lt;br /&gt;
Die Tracks wiederum unterteilt man in Sektoren. Üblicherweise sind es 63 Sektoren pro Track. In jedem Sektor lassen sich 512 Bytes speichern.&lt;br /&gt;
Möchte man nun Einen Sektor gezielt adressieren, benötigt man also dessen Zylinder, die Sektornummer, und die Nummer des Schreib-/Lesekopfs (da die Ober- und Unterseite der Platten für die Datenspeicherung verwendet werden). Diese Adressierung nennt man CHS (für Cylinder, Head, Sector). Sie wird von neueren Festplatten oft nicht mehr unterstützt. Für diese gibt es eine einfachere Adressierungsart, nämlich LBA (Linear Block Address). Hier wird eine einzige 28 Bit lange Zahl verwendet, die alle Sektoren nacheinander linear durchnummeriert. In beiden Adressierungsarten lassen sich aber max. 128 GByte adressieren (warum, dazu später mehr).&lt;br /&gt;
&lt;br /&gt;
== Der IDE-Stecker ==&lt;br /&gt;
IDE- (bzw. ATA-) Festplatten besitzen eine relativ einfache Schnittstelle zur Steuerung. Die Steckerbelegung sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Bild:Festplatte_Connector.jpg|500px]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beschreibung der Signale:&lt;br /&gt;
# DD0..15: Hier werden die Daten und Steuerkommandos übertragen.&lt;br /&gt;
# DA0..2:  Über die &#039;Drive Address&#039; lassen sich die einzelnen Register ansprechen.&lt;br /&gt;
# CS0, CS1: Chip Select. Wählt zusammen mit DAx ein Register aus (low-aktiv).&lt;br /&gt;
# RESET:   Hard-Reset der Steuerelektronik (low-aktiv).&lt;br /&gt;
# DIOW:    Write-Signal (low-aktiv).&lt;br /&gt;
# DIOR:    Read-Signal (low-aktiv).&lt;br /&gt;
# INTRQ:   Interrupt Request (high-aktiv!)&lt;br /&gt;
# DASP:    Drive active (open-collector). Hiermit kann eine LED angesteuert werden. Vorwiderstand nicht vergessen! ;-)&lt;br /&gt;
# PDIAG:   Dient zur Kommunikation der Festplatten untereinander.&lt;br /&gt;
# CSEL:    Cable Select. Wird ebenfalls nur benötigt, wenn man 2 Festplatten hat.&lt;br /&gt;
# IORDY:   Zeigt an, dass Daten übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
Die restlichen Signale braucht man nur, wenn man mit DMA arbeitet, worauf ich in diesem Artikel nicht näher eingehe.&lt;br /&gt;
Zum steuern der Festplatte braucht man übrigens die Leitungen IORDY, CSEL un PDIAG nicht unbedingt. An DASP kann man eine LED incl. Vorwiderstand anschliessen. Die blinkt dann auf, wenn auf die Platte zugegriffen wird.&lt;br /&gt;
Die Signalpegel für die Leitungen sind alle 5V TTL. Wenn man also einen mit 3.3V betriebenen Microcontroller mit 5V-Toleranten Eingängen hat, kann man die Festplatte problemlos ansteuern (habe ich selbst allerdings noch nicht getestet).&lt;br /&gt;
&lt;br /&gt;
== Der Registerblock ==&lt;br /&gt;
Die Festplatte besitzt 13 verschiedene Register. Auf diese kann man wie folgt zugreifen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!/CS0&lt;br /&gt;
!/CS1&lt;br /&gt;
!DA2&lt;br /&gt;
!DA1&lt;br /&gt;
!DA0&lt;br /&gt;
!Register (Read)&lt;br /&gt;
!Register (Write)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|Alternate Status&lt;br /&gt;
|Device Control&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|Data Register&lt;br /&gt;
|Data Register&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|Error Register&lt;br /&gt;
|Features Register&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|Sector Count&lt;br /&gt;
|Sector Count&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Sector Number / LBA Bits 0..7&lt;br /&gt;
|Sector Number / LBA Bits 0..7&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|Cylinder Low / LBA Bits 8..15&lt;br /&gt;
|Cylinder Low / LBA Bits 8..15&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|Cylinder High / LBA Bits 16..23&lt;br /&gt;
|Cylinder High / LBA Bits 16..23&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|Device Register &amp;amp; LBA Bits 24..27&lt;br /&gt;
|Device Register &amp;amp; LBA Bits 24..27&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Status Register&lt;br /&gt;
|Command Register&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn man DMA verwendet, dann sind noch weitere Adressierungen möglich, auf diese gehe ich hier allerdings (noch) nicht ein.&lt;br /&gt;
Wenn beide Chip Select-Eingänge auf 1 sind, dann ist der Datenbus in einem hochohmigen Zustand (tristate).&lt;br /&gt;
Zu beachten ist noch, dass alle Register (ausser dem Datenregister) nur 8 Bit breit sein. Diese 8 Bit werden auf den Datenleitungen DD0..7 übertragen.&lt;br /&gt;
Auch erkennt man aus der Tabelle, dass u.U. je nach Operation (lesen, schreiben) unterschiedliche Register ausgewählt werden (was auch richtig ist, denn es macht ja keinen Sinn, etwas ins Status-Register zu schreiben...).&lt;br /&gt;
&lt;br /&gt;
=== Das Alternate Status / Status Register ===&lt;br /&gt;
Das Alternate Status Register hat grundsätzlich dieselbe Funktion wie das Status Register. Mit einem kleinen Unterschied: Wenn die Laufwerkselektronik einen Interrupt erzeugt (z.&amp;amp;nbsp;B. weil Daten gelesen werden sollen), dann wird der Interrupt gelöscht, wenn man das Status Register liest. Beim Lesen des Alternate Status Registers bleibt der Interrupt jedoch erhalten.&lt;br /&gt;
In beiden Registern sind die folgenden Bits enthalten:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit 7&lt;br /&gt;
!Bit 6&lt;br /&gt;
!Bit 5&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|BSY&lt;br /&gt;
|DRDY&lt;br /&gt;
|DF&lt;br /&gt;
|DSC&lt;br /&gt;
|DRQ&lt;br /&gt;
|COR&lt;br /&gt;
|IDX&lt;br /&gt;
|ERR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;BSY&lt;br /&gt;
:Busy-Flag. Wenn das Bit gesetzt ist, sind alle anderen Bits ungültig und das Laufwerk ist beschäftigt.&lt;br /&gt;
;DRDY&lt;br /&gt;
:Drive Ready. Es können Befehle zur Festplatte gesendet werden.&lt;br /&gt;
;DF&lt;br /&gt;
:Device Fault. Es ist beim Schreiben von Daten zu einem Fehler gekommen.&lt;br /&gt;
;DSC&lt;br /&gt;
:Drive Seek Complete. Zeigt an, dass das Laufwerk den angeforderten Track gefunden hat und die Schreib-/Leseköpfe dort positioniert hat.&lt;br /&gt;
;DRQ&lt;br /&gt;
:Zeigt an, dass Daten zum Laufwerk transportiert werden sollen (beim Schreiben), bzw. dass Daten vom Laufwerk abgeholt werden können (beim Lesen).&lt;br /&gt;
;CORR&lt;br /&gt;
:Corrected Data. Wenn Daten von der Elektronik korrigiert worden sind, wird dieses Bit gesetzt.&lt;br /&gt;
;IDX&lt;br /&gt;
:Index. Wird bei jeder Umdrehung des Plattenstapels auf 1 gesetzt.&lt;br /&gt;
;ERR&lt;br /&gt;
:Error. Das Error-Register muss ausgelesen werden, um nähere Informationen zu erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Das Command-Register ===&lt;br /&gt;
In das Command Register schreibt man einen speziellen Command-Code, der bestimmte Aktionen einletet. So bewirkt z.&amp;amp;nbsp;B. das schreiben des Codes 0x30 das schreiben eines Sektors auf die Platte. Der Befehl wird unmittelbar nach dem Schreiben ins Command Register ausgeführt und BSY auf 1 gesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Das Data Register ===&lt;br /&gt;
Das Data Register ist 16 Bit breit (als einziges der Register). Bei einem Lese- oder Schreibkommando können hier die gelesenen Daten abgeholt bzw. reingeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Device Control Register ===&lt;br /&gt;
Das Device Control Register enthält folgende Bits:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit 7&lt;br /&gt;
!Bit 6&lt;br /&gt;
!Bit 5&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|SRST&lt;br /&gt;
|nIEN&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Setzt man SRST auf 1, so wird ein Software Reset durchgeführt.&lt;br /&gt;
Mit nIEN kann man die Interrupts ein- oder ausschalten.&lt;br /&gt;
&lt;br /&gt;
=== Device Register &amp;amp; LBA Bits 24..27 ===&lt;br /&gt;
Im Device Register stehen folgende Bits:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit 7&lt;br /&gt;
!Bit 6&lt;br /&gt;
!Bit 5&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|L&lt;br /&gt;
|1&lt;br /&gt;
|DRV&lt;br /&gt;
|H3 / LBA27&lt;br /&gt;
|H2 / LBA26&lt;br /&gt;
|H1 / LBA25&lt;br /&gt;
|H0 / LBA24&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
L gibt an, dass das Laufwerk in den LBA-Modus geschaltet werden soll (L = 1) oder dass CHS-Adressierung verwendet werdem soll (L = 0).&lt;br /&gt;
DRV dient zur Adressierung eines Laufwerks, also zur Unterscheidung Master / Slave und ist nur nötig, wenn man 2 Laufwerke an einem Kabel betreibt. DRV = 0 wählt das Master-Laufwerk aus, DRV = 1 adressiert das Slave-Laufwerk.&lt;br /&gt;
Die Bits H0..H3 geben die Nummer des Kopfes an, wenn CHS-Adressierung verwendet wird. Wird LBA verwendet, dann kommen hier die Bits 24..27 hin.&lt;br /&gt;
&lt;br /&gt;
=== Error Register ===&lt;br /&gt;
Das Error Register sieht so aus:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit 7&lt;br /&gt;
!Bit 6&lt;br /&gt;
!Bit 5&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|CRC&lt;br /&gt;
|UNC&lt;br /&gt;
|0&lt;br /&gt;
|IDNF&lt;br /&gt;
|0&lt;br /&gt;
|ABRT&lt;br /&gt;
|TK0NF&lt;br /&gt;
|AMNF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CRC bedeutet, dass bei einem DMA-Transfer ein CRC-Fehler aufgetreten ist.&lt;br /&gt;
UNC gibt an, dass bei einer Datenübertragung ein Fehler erkannt worden ist, dieser aber nicht korrigiert werden konnte.&lt;br /&gt;
IDNF zeigt an, dass der angeforderte Sektor nicht gefunden worden ist.&lt;br /&gt;
ABRT wird auf 1 gesetzt, wenn ein Befehl abgebrochen (aborted) wurde.&lt;br /&gt;
TK0NF Zeigt an, dass Track 0 nicht gefunden worden ist.&lt;br /&gt;
AMNF (Address Mark not found): Zeigt an, dass der gewünschte Sektor zwar gefunden wurde, seine Daten aber nicht.&lt;br /&gt;
&lt;br /&gt;
=== Features Register ===&lt;br /&gt;
Das Features Register bekommt, je nach ausgeführtem Befehl, eine andere Bedeutung.&lt;br /&gt;
&lt;br /&gt;
=== Cylinder High / LBA Bits 16..23 ===&lt;br /&gt;
Hier kommt das High Byte der Zylindernummer rein, wenn man CHS-Adressierung verwendet. Setzt man LBA ein, dann müssen hier die entsprechenden LBA Bits geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Cylinder Low / LBA Bits 8..15 ===&lt;br /&gt;
Das Low-Byte der Zylindernummer bei CHS-Adressierung; Bits 8..15 bei LBA-Adressierung.&lt;br /&gt;
&lt;br /&gt;
=== Sector Number / LBA Bits 0..7 ===&lt;br /&gt;
Wenn man mit CHS arbeitet, muss hier die Sektornummer stehen. Achtung: Sektoren werden von 1 her beginnend Adressiert!&lt;br /&gt;
Bei LBA werden hier die Bits 0..7 platziert.&lt;br /&gt;
&lt;br /&gt;
=== Sector Count Register ===&lt;br /&gt;
Hier kann man angeben, wie viele Sektoren man beim nächsten Befehl übertragen möchte. Die Festplatte kann bis 256 Sektoren auf einmal lesen.&lt;br /&gt;
&lt;br /&gt;
== Die Steuerung der Platte ==&lt;br /&gt;
Um jetzt endlich die Festplatte ansteuern zu können, wird wie folgt vorgegangen:&lt;br /&gt;
Als erstes muss man allfällige Command-Parameter in den entsprechenden Registern platzieren. Siehe Beispiel. Anschliessend wird der Command Code ins Command Register geschrieben. Dann kann man auf 2 Arten verfahren:&lt;br /&gt;
&lt;br /&gt;
# Wenn man Interrupts verwendet, kann man jetzt getrost irgend was anderes machen. Die Festplatte generiert selbständig einen Interrupt, wenn sie zum Übertragen der Daten bereit ist.&lt;br /&gt;
# Wenn keine Interrupts zur Verfügung stehen, kann man so lange das Status Register pollen, bis BSY = 0 ist.&lt;br /&gt;
&lt;br /&gt;
Wenn man den Command Code abgesetzt hat und die Platte nicht mehr BSY ist, kann man schon das Datenregister schreiben (bzw. lesen).&lt;br /&gt;
Das Vorgehen für den Read Sector-Command ist z.&amp;amp;nbsp;B. wie folgt:&lt;br /&gt;
&lt;br /&gt;
# Sector Count schreiben&lt;br /&gt;
# Sector Number schreiben&lt;br /&gt;
# Cylinder Low schreiben&lt;br /&gt;
# Cylinder High schreiben&lt;br /&gt;
# Device Register schreiben (angeben, ob LBA verwendet werden soll, welches Device man adressieren will etc).&lt;br /&gt;
# Den Command Code ins Command Register schreiben&lt;br /&gt;
# Das Status-Register abfragen&lt;br /&gt;
# Wenn BSY = 1, gehe zu 7&lt;br /&gt;
# Das Daten-Register lesen (16 Bit!)&lt;br /&gt;
# Das Status-Register lesen&lt;br /&gt;
# Wenn DRQ = 1 ist, dann gehe zu 9&lt;br /&gt;
# fertig!&lt;br /&gt;
&lt;br /&gt;
Im Detail:&lt;br /&gt;
# Sector Count Register Adressieren&lt;br /&gt;
# Anzahl Sektoren an DD0..7 anlegen&lt;br /&gt;
# DIOW = 0&lt;br /&gt;
# DIOW = 1&lt;br /&gt;
# Sector Number Rgsister adressieren&lt;br /&gt;
# Sektornummer an DD0..7 anlegen&lt;br /&gt;
# DIOW = 0&lt;br /&gt;
# DIOW = 1&lt;br /&gt;
# ...&lt;br /&gt;
# Command Register adressieren&lt;br /&gt;
# Command Code an DD0..7 anlegen&lt;br /&gt;
# DIOW = 0&lt;br /&gt;
# DIOW = 1&lt;br /&gt;
# Status-Register Adressieren&lt;br /&gt;
# DIOR = 0&lt;br /&gt;
# Wert von DD0..7 zwischenspeichern&lt;br /&gt;
# DIOR = 1&lt;br /&gt;
# BSY-Bit abfragen, und wenn gesetzt gehe zu 15&lt;br /&gt;
# Daten-Register adressieren&lt;br /&gt;
# DIOR = 0&lt;br /&gt;
# Wert von DD0..15 lesen&lt;br /&gt;
# DIOR = 1&lt;br /&gt;
# Status-Register adressieren&lt;br /&gt;
# DIOR = 0&lt;br /&gt;
# Wert von DD0..7 zwischenspeichern&lt;br /&gt;
# DIOR = 1&lt;br /&gt;
# DRQ-Bit abfragen, und wenn gesetzt gehe zu 20&lt;br /&gt;
# Fertig!&lt;br /&gt;
&lt;br /&gt;
=== Command Codes ===&lt;br /&gt;
Um natürlich bestimmte Aktionen ausführen zu können, muss man die Command Codes der Festplatte kennen. Die wichtigsten Command Codes lauten:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Command&lt;br /&gt;
!Code&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|Identify Device&lt;br /&gt;
|0xEC&lt;br /&gt;
|Gibt Infos wie Modell, Hersteller, Kapazität... aus&lt;br /&gt;
|-&lt;br /&gt;
|Read Sector(s)&lt;br /&gt;
|0x21 / 0x20&lt;br /&gt;
|Liest die gewünschte Anzahl Sektoren von der Platte&lt;br /&gt;
|-&lt;br /&gt;
|Seek&lt;br /&gt;
|0x70&lt;br /&gt;
|Positioniert die Schreib-/Leseköpfe über dem angegebenen Sektor&lt;br /&gt;
|-&lt;br /&gt;
|Standby&lt;br /&gt;
|0xE2&lt;br /&gt;
|Schaltet die Platte aus. Sie wird autom. wieder aktiv, wenn man ihr einen neuen Befehl sendet.&lt;br /&gt;
|-&lt;br /&gt;
|Write Sector(s)&lt;br /&gt;
|0x30 / 0x31&lt;br /&gt;
|Schreibt die gewünschte Anzahl Sektoren auf die Platte.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt natürlich noch wesentlich mehr Kommandos, aber mit diesen paar hier kann man i.d.R. schon alles, was man braucht, um ein Dateisystem zu implementieren. Eine genauere Beschreibung findet sich unter diesem Link: http://t13.org/Documents/MinutesDefault.aspx?DocumentType=4&amp;amp;DocumentStage=2&lt;br /&gt;
Dann dort den gewünschten ATA-Standard auswählen (Aktuell ist glaube ich ATA-7).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://t13.org/Documents/MinutesDefault.aspx?DocumentType=4&amp;amp;DocumentStage=2 T13 Technical Commitee, das die ATA-Standards definiert]&lt;br /&gt;
* [http://hem.passagen.se/communication/ide.html IDE Hard Disk experiments]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Speicher und Dateisysteme]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Beschleunigungssensor&amp;diff=85011</id>
		<title>Beschleunigungssensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Beschleunigungssensor&amp;diff=85011"/>
		<updated>2014-09-25T12:14:47Z</updated>

		<summary type="html">&lt;p&gt;Eltio: /* Piezosensoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier entsteht ein Artikel über Beschleunigungssensoren. Und damit es voran geht, sammeln wir mal Informationen:&lt;br /&gt;
&lt;br /&gt;
== Physikalische Grundlagen: Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschleunigung ist als die Änderung der Geschwindigkeit &amp;lt;math&amp;gt;v=\frac{x}{t}&amp;lt;/math&amp;gt; über die Zeit &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; definiert und lässt sich für eine konstante Geschwindigkeit während der Zeit &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; so definieren: &amp;lt;math&amp;gt;a=\frac{v}{t}=\frac{x}{t^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In SI-Einheiten: &amp;lt;math&amp;gt;[a]=\frac{m}{s}\cdot\frac{1}{s}&amp;lt;/math&amp;gt;, womit wir bei den bekannten &amp;lt;math&amp;gt;\frac{m}{s^2}&amp;lt;/math&amp;gt; sind.&lt;br /&gt;
&lt;br /&gt;
== Messverfahren ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche unterschiedliche Messverfahren, um Beschleunigungen zu messen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEMS Sensoren ===&lt;br /&gt;
&lt;br /&gt;
Eine häufig eingesetze Variante bei MEMS-Sensoren ist, die Bewegung eines &amp;quot;Siliziumpendels&amp;quot; zu messen. Diese Messung geschieht idr. kapazitiv. Aus der gemessenen Verschiebung kann dann eine Beschleunigung abgeleitet werden. Anschliessend steht die Beschleunigungsinformation entweder analog oder digital am Sensorausgang zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Einsatz solcher &amp;quot;Siliziumpendel&amp;quot; ist auch der Grund dafür, dass mit solchen Beschleunigungssensoren auch die Erdbeschleunigung gemessen werden kann. &lt;br /&gt;
&lt;br /&gt;
Der Ausgang dieser Sensoren wird dann auf ein g = &amp;lt;math&amp;gt;9,81.\frac{m}{s^2}&amp;lt;/math&amp;gt; kalibriert.&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
&lt;br /&gt;
Ein Beschleunigungssensor (Z-Achse) mit 5V Betriebsspannung und einer Empfindlichkeit von 1 V/g wird so positioniert, dass seine Messachse kolinear zur Erdoberfläche steht. &lt;br /&gt;
&lt;br /&gt;
Am Sensorausgang erscheint eine Spannung von 2.5V.&lt;br /&gt;
&lt;br /&gt;
Wird der Sensor jetzt so gedreht, dass seine Messachse rechtwinklig zur Erdoberfläche steht, erscheint am Sensorausgang eine Spannung von 3.5V oder 1.5V (abhängig von der Richtung der Messachse).&lt;br /&gt;
&lt;br /&gt;
Das hat den Vorteil, dass so ein Beschleunigungssensor zur Neigungsmessung eingesetzt werden kann,&lt;br /&gt;
&lt;br /&gt;
Nachteilig ist, daß es durch diesen Effekt erschwert wird, Geschwindigkeitsänderungen eines Fahrzeugs zu messen, sobald dieses sich nicht absolut horizontal bewegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Piezosensoren ===&lt;br /&gt;
&lt;br /&gt;
Ebenfalls häufig eingesetzt werden Beschleunigungssensoren auf Piezobasis. Diese Sensoren generieren ihre Ausgangsspannung durch die Verformung eines Piezokristalls (durch die Beschleunigung wird der Kristall verformt).&lt;br /&gt;
&lt;br /&gt;
Solche Sensoren sind nicht in der Lage statische Beschleunigungen wie z.b. die Erdbeschleunigung zu messen. &lt;br /&gt;
&lt;br /&gt;
Ein Vorteil solcher Sensoren ist u.a. dass sie sich selbst mit Energie versorgen und so zum Betrieb keine stabilisierte Versorgungsspannung benötigen.&lt;br /&gt;
&lt;br /&gt;
Solche Sensoren werden häufig an einer Schnittstelle betrieben, welche mit Konstanstrom arbeitet (nicht zu verwechseln mit der 4..20mA Stromschnittstelle).&lt;br /&gt;
&lt;br /&gt;
=== Beispieltypen ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Analog (d.h Auswertung über ADC)&lt;br /&gt;
** Freescale MMA7260 (3,3V, Low G, 3 Achsen)&lt;br /&gt;
** STM LIS302SG (3,3V, Low G, 3 Achsen)&lt;br /&gt;
** Colibrys VS9000.d (high-end 3D Mems Sensor)&lt;br /&gt;
** VTI SCA610&lt;br /&gt;
&lt;br /&gt;
*Digital (d.h spricht I2C, SPI)&lt;br /&gt;
** Freescale MMA7455 (3,3V, Low G, 3 Achsen)&lt;br /&gt;
** STM LIS302DL (2.16-3.6V, Low G, 3 Achsen)&lt;br /&gt;
** [http://www.bosch-sensortec.com/content/language1/downloads/BMA150_DataSheet_Rev.1.5_30May2008.pdf BMA150] (2,4V-3,6V, +/-2G, +/-4G, +/-8G)&lt;br /&gt;
&lt;br /&gt;
Beschleunigungssensoren unterscheiden sich in der Empfindlichkeit (ab ca. +/- 1G), der Abtastrate (wenige Hz bis mehrere kHz) und der Auflösung (8bit - 16 bit).&lt;br /&gt;
&lt;br /&gt;
Beim Einsatz von Beschleunigungssensoren sind diese Werte entscheidend, aber auch Linearität, Offset und Rauschen müssen u.U. berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Für Präzisionsanwendungen mit hoher Bandbreite ist meistens das Ausgangsrauschen der limitierende Faktor. Rauscharme Sensoren mit Analogausgängen sind dann auch entsprechend teuer.&lt;br /&gt;
&lt;br /&gt;
Viele Beschleunigungssensoren haben Schaltausgänge, die ein Über- und/oder Unterschreiten von Beschleunigungswerten signalisieren. Damit lassen sich Schock- oder Bewegungssensoren realisieren.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Beschleunigungssensor&amp;diff=85010</id>
		<title>Beschleunigungssensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Beschleunigungssensor&amp;diff=85010"/>
		<updated>2014-09-25T12:13:50Z</updated>

		<summary type="html">&lt;p&gt;Eltio: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier entsteht ein Artikel über Beschleunigungssensoren. Und damit es voran geht, sammeln wir mal Informationen:&lt;br /&gt;
&lt;br /&gt;
== Physikalische Grundlagen: Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschleunigung ist als die Änderung der Geschwindigkeit &amp;lt;math&amp;gt;v=\frac{x}{t}&amp;lt;/math&amp;gt; über die Zeit &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; definiert und lässt sich für eine konstante Geschwindigkeit während der Zeit &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; so definieren: &amp;lt;math&amp;gt;a=\frac{v}{t}=\frac{x}{t^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In SI-Einheiten: &amp;lt;math&amp;gt;[a]=\frac{m}{s}\cdot\frac{1}{s}&amp;lt;/math&amp;gt;, womit wir bei den bekannten &amp;lt;math&amp;gt;\frac{m}{s^2}&amp;lt;/math&amp;gt; sind.&lt;br /&gt;
&lt;br /&gt;
== Messverfahren ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche unterschiedliche Messverfahren, um Beschleunigungen zu messen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEMS Sensoren ===&lt;br /&gt;
&lt;br /&gt;
Eine häufig eingesetze Variante bei MEMS-Sensoren ist, die Bewegung eines &amp;quot;Siliziumpendels&amp;quot; zu messen. Diese Messung geschieht idr. kapazitiv. Aus der gemessenen Verschiebung kann dann eine Beschleunigung abgeleitet werden. Anschliessend steht die Beschleunigungsinformation entweder analog oder digital am Sensorausgang zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Einsatz solcher &amp;quot;Siliziumpendel&amp;quot; ist auch der Grund dafür, dass mit solchen Beschleunigungssensoren auch die Erdbeschleunigung gemessen werden kann. &lt;br /&gt;
&lt;br /&gt;
Der Ausgang dieser Sensoren wird dann auf ein g = &amp;lt;math&amp;gt;9,81.\frac{m}{s^2}&amp;lt;/math&amp;gt; kalibriert.&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
&lt;br /&gt;
Ein Beschleunigungssensor (Z-Achse) mit 5V Betriebsspannung und einer Empfindlichkeit von 1 V/g wird so positioniert, dass seine Messachse kolinear zur Erdoberfläche steht. &lt;br /&gt;
&lt;br /&gt;
Am Sensorausgang erscheint eine Spannung von 2.5V.&lt;br /&gt;
&lt;br /&gt;
Wird der Sensor jetzt so gedreht, dass seine Messachse rechtwinklig zur Erdoberfläche steht, erscheint am Sensorausgang eine Spannung von 3.5V oder 1.5V (abhängig von der Richtung der Messachse).&lt;br /&gt;
&lt;br /&gt;
Das hat den Vorteil, dass so ein Beschleunigungssensor zur Neigungsmessung eingesetzt werden kann,&lt;br /&gt;
&lt;br /&gt;
Nachteilig ist, daß es durch diesen Effekt erschwert wird, Geschwindigkeitsänderungen eines Fahrzeugs zu messen, sobald dieses sich nicht absolut horizontal bewegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Piezosensoren ===&lt;br /&gt;
&lt;br /&gt;
Ebenfalls häufig eingesetzt werden Beschleunigungssensoren auf Piezobasis. Diese Sensoren generieren ihre Ausgangsspannung durch die Verformung eines Piezzokristalls (durch die Beschleunigung wird der Kristall verformt).&lt;br /&gt;
&lt;br /&gt;
Solche Sensoren sind nicht in der Lage statische Beschleunigungen wie z.b. die Erdbeschleunigung zu messen. &lt;br /&gt;
&lt;br /&gt;
Ein Vorteil solcher Sensoren ist u.a. dass sie sich selbst mit Energie versorgen und so zum Betrieb keine stabilisierte Versorgungsspannung benötigen.&lt;br /&gt;
&lt;br /&gt;
Solche Sensoren werden häufig an einer Schnittstelle betrieben, welche mit Konstanstrom arbeitet (nicht zu verwechseln mit der 4..20mA Stromschnittstelle).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispieltypen ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Analog (d.h Auswertung über ADC)&lt;br /&gt;
** Freescale MMA7260 (3,3V, Low G, 3 Achsen)&lt;br /&gt;
** STM LIS302SG (3,3V, Low G, 3 Achsen)&lt;br /&gt;
** Colibrys VS9000.d (high-end 3D Mems Sensor)&lt;br /&gt;
** VTI SCA610&lt;br /&gt;
&lt;br /&gt;
*Digital (d.h spricht I2C, SPI)&lt;br /&gt;
** Freescale MMA7455 (3,3V, Low G, 3 Achsen)&lt;br /&gt;
** STM LIS302DL (2.16-3.6V, Low G, 3 Achsen)&lt;br /&gt;
** [http://www.bosch-sensortec.com/content/language1/downloads/BMA150_DataSheet_Rev.1.5_30May2008.pdf BMA150] (2,4V-3,6V, +/-2G, +/-4G, +/-8G)&lt;br /&gt;
&lt;br /&gt;
Beschleunigungssensoren unterscheiden sich in der Empfindlichkeit (ab ca. +/- 1G), der Abtastrate (wenige Hz bis mehrere kHz) und der Auflösung (8bit - 16 bit).&lt;br /&gt;
&lt;br /&gt;
Beim Einsatz von Beschleunigungssensoren sind diese Werte entscheidend, aber auch Linearität, Offset und Rauschen müssen u.U. berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Für Präzisionsanwendungen mit hoher Bandbreite ist meistens das Ausgangsrauschen der limitierende Faktor. Rauscharme Sensoren mit Analogausgängen sind dann auch entsprechend teuer.&lt;br /&gt;
&lt;br /&gt;
Viele Beschleunigungssensoren haben Schaltausgänge, die ein Über- und/oder Unterschreiten von Beschleunigungswerten signalisieren. Damit lassen sich Schock- oder Bewegungssensoren realisieren.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED&amp;diff=82920</id>
		<title>LED</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED&amp;diff=82920"/>
		<updated>2014-05-06T12:42:37Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Schreibweise der Indizes angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung == &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ledrgb.jpg|thumb|right|246px|Detailfoto einer RGB-LED [http://www.mikrocontroller.net/topic/109784#990685]]]&lt;br /&gt;
&lt;br /&gt;
Eine LED (engl. &amp;lt;B&amp;gt;L&amp;lt;/B&amp;gt;ight &amp;lt;B&amp;gt;E&amp;lt;/B&amp;gt;mitting &amp;lt;B&amp;gt;D&amp;lt;/B&amp;gt;iode, &#039;&#039;Leuchtdiode&#039;&#039;) besteht aus einem [[Halbleiter]]-PN-Übergang, der durch seine Zusammensetzung Licht eines stark begrenzten Wellenbereiches emittiert, wenn er in Durchlassrichtung von Strom durchflossen wird. Die Helligkeit einer LED ist in erster Näherung proportional zum Strom.&lt;br /&gt;
&lt;br /&gt;
Die Farbe des emittierten Lichts hängt vom verwendeten Halbleitermaterial ab. Es existieren [[Halbleiter | Halbleitermaterialien]] für den gesamten sichtbaren Bereich als auch für den Infrarotbereich und den nahen Ultraviolettbereich. Für kurze Wellenlängen (Blau bis Ultraviolett) ist ein Halbleitermaterial wie z.&amp;amp;nbsp;B. InGaN oder GaN erforderlich. Für die ersten blauen LEDs wurde SiC verwendet, welche aber eine schlechte Effizienz hat (Quelle:Wikipedia).&lt;br /&gt;
&lt;br /&gt;
Weißes Licht oder andere Farbmischungen können erzeugt werden, indem man eine Blau- oder Ultraviolett-LED mit einem Phosphormaterial beschichtet, welches durch das Licht der LED zur Emission angeregt wird. Die entstehende Farbe wird dabei von der Beschichtung bestimmt.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
== Durchlassspannung ==&lt;br /&gt;
&lt;br /&gt;
LEDs haben im Vergleich zu gewöhnlichen [[Diode|Dioden]] eine vergleichsweise hohe, vom Halbleitermaterial abhängige [[Durchlass-Spannung]]. Bevor diese erreicht wird, fließt nur sehr wenig Strom und die LED leuchtet praktisch nicht. Oberhalb der Durchlassspannung (Flussspannung) steigt der Strom schnell an (Diodenkennlinie). Die Flussspannung reicht von ca. 1,2 V bei Infrarot-LEDs bis zu etwa 4 V bei Ultraviolett-LEDs. Auffällig ist die Korrelation zwischen Spannung und der Farbe, die damit zusammenhängt, dass die Emission höherenergetischer Photonen einen größeren Bandabstand im Halbleitermaterial erfordert, welcher von den Elektronen überwunden werden muss, wenn sie ihre Energie abgegeben. Da anfänglich nur Halbleiter mit geringem Bandabstand produziert wurden und aufgrund von mangelnder Reinheit oft Zwischenniveaurekombination stattfand, waren lange Zeit keine blauen oder gar echtvioletten LEDs herstellbar. Die ersten verfügbaren LEDs waren naturgemäß auch rot.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:centre&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Farbe || typische&amp;lt;br&amp;gt;Flussspannung [V]&lt;br /&gt;
|-&lt;br /&gt;
| Infrarot || 1,2&lt;br /&gt;
|-&lt;br /&gt;
| Rot || 1,8&lt;br /&gt;
|-&lt;br /&gt;
| Gelb || 2,0&lt;br /&gt;
|-&lt;br /&gt;
| Grün || 2,2&lt;br /&gt;
|-&lt;br /&gt;
| Grün&amp;lt;br&amp;gt;(Ultrahell) || 3,3&lt;br /&gt;
|-&lt;br /&gt;
| Blau || 3,6&lt;br /&gt;
|-&lt;br /&gt;
| Weiß || 3,6&lt;br /&gt;
|-&lt;br /&gt;
| Ultraviolett || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Durchlassstrom == &lt;br /&gt;
&lt;br /&gt;
Da LEDs durch einen zu hohen Strom zerstört werden, muss der Strom begrenzt werden. Typische Maximalwerte liegen abhängig von der LED z.&amp;amp;nbsp;B. bei 2 mA (low current) oder 20 mA. Genaue Angaben dazu finden sich in entsprechenden Datenblättern.&lt;br /&gt;
&lt;br /&gt;
=== Vorwiderstand ===&lt;br /&gt;
&lt;br /&gt;
Im einfachsten Fall und bei relativ geringfügig variierender Betriebsspannung kann man dazu einen Widerstand einsetzen.&lt;br /&gt;
&lt;br /&gt;
[[bild:led_rv.png|right]]&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_V=\frac{Vcc-U_\text{LED}}{I_\text{LED}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand in Ohm&lt;br /&gt;
* Vcc: Betriebsspannung in Volt&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{LED}&amp;lt;/math&amp;gt;: Durchlassspannung der LED in Volt&lt;br /&gt;
* &amp;lt;math&amp;gt;I_{LED}&amp;lt;/math&amp;gt;: Strom durch die LED in Ampere&lt;br /&gt;
&lt;br /&gt;
Bei 6 V Betriebsspannung, einer Durchlassspannung der LED von 2,4 V und einem gewünschten Strom von 20 mA braucht man nach dem ohmschen Gesetz einen Widerstand von 180Ω, bei 12 V Betriebsspannung sind es 480Ω. In der Praxis wird jeweils der nächstgrößere Standardwert gewählt (E-Reihen).&lt;br /&gt;
&lt;br /&gt;
Was passiert nun, wenn die Flußspannung der LED etwas anders ist als angenommen, z.B. durch Fertigungstoleranzen, höheren Strom oder stark veränderte Temperatur? Bleiben wir bei dem Beispiel mit 6V Versorgungsspannung, 2,4V Flußspannung, 20mA und 180 Ohm Vorwiderstand. Es fallen rechnerisch 3,6V am Vorwiderstand ab. Wenn nun die Flußspannung um 0,2V schwankt (realistischer Wert), ändert sich die Spannung über dem Vorwiderstand um diese 0,2V. Bezogen auf 3,6V Spannungsabfall sind das 5,5%. Bei 12V Betriebsspannung und damit 9,6V Spannungsabfall über dem Vorwiderstand sind es nur noch 2%. Daraus erkennt man, dass der Vorwiderstand umso besser als [[Konstantstromquelle]] wirkt, je höher der Spannungsabfall über diesem ist. Eine echte Konstantstromquelle mit aktiven Elementen (Transistoren) erreicht den gleichen Effekt mit deutlich weniger Spannungsabfall.&lt;br /&gt;
&lt;br /&gt;
Mit einem 480-Ohm-Widerstand, welcher für 12 V Betriebsspannung passend ist, würden bei 6 Volt statt 20 mA nur noch 7,5 mA fließen. Mit einem 180-Ohm-Widerstand, welcher für 6 V Betriebsspannung passend ist, würden bei 12 V statt der gewünschten 20 mA allerdings schon 53 mA fließen. &lt;br /&gt;
&lt;br /&gt;
Beachten muss man auch die als Wärme abgegebene &#039;&#039;&#039;Verlustleistung&#039;&#039;&#039; über dem Vorwiderstand, vor allem wenn man LEDs an eine recht hohe Betriebsspannung von 12 V oder gar 24 V anschließt. Die Verlustleistung berechnet sich einfach aus&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P_\text{RV} = (V_\text{cc}-U_\text{LED}) \cdot I_\text{LED} = I_\text{LED}^2 \cdot R_\text{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel mit der 2,4-V-LED und einem Strom von 20 mA heißt das, dass an dem 480-Ohm-Widerstand eine Verlustleistung von 192 mW abfällt. Ein kleiner SMD-Widerstand der Größe 0805 hält das nicht mehr aus (1/8 W = 125 mW maximal).&lt;br /&gt;
&lt;br /&gt;
Wie man aus dem Beispiel erkennt, ist bei stark variierender Betriebsspannung ein Vorwiderstand weniger geeignet. Es sei denn, man nimmt sehr unterschiedliche LED-Ströme und damit LED-Helligkeiten oder möglicherweise die Zerstörung der LED in Kauf.&lt;br /&gt;
&lt;br /&gt;
Bei Batteriebetrieb werden LEDs häufig ohne Vorwiderstand betrieben. So z.B. bei billigen Taschenlampen und Fahrradlampen. Dabei werden oft sogar zwei 1,5V Batterien in Reihe geschaltet und die LED direkt angeschlossen. Der Grund ist, dass das alles nichts kosten darf und man sich auf den Innenwiderstand der Batterie und der LEDs verlässt, um den Strom halbwegs zu begrenzen.&lt;br /&gt;
&lt;br /&gt;
=== Konstantstromquelle ===&lt;br /&gt;
&lt;br /&gt;
Bei stark schwankender Versorgungsspannung oder Umgebungstemperatur heißt der Ausweg [[Konstantstromquelle]]. Kriterien für die Auswahl einer Schaltung für die Konstantstromquelle sind hierbei z.&amp;amp;nbsp;B. Betriebsspannungsbereich, erforderliche Genauigkeit und Kosten. Auch hier ist zu beachten, daß die Verlustleistung der Konstantstromquelle von den Bauteilen abgeführt werden muss, mit einer gewissen Ausnahme der Lösungen mit Schaltregler.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsstrom ===&lt;br /&gt;
&lt;br /&gt;
In der Praxis werden LEDs oft mit einem weit geringeren als dem maximal zulässigen Durchlassstrom betrieben. Insbesondere im Entwicklungs- und Experimentierumfeld kann eine für maximal 20 mA ausgelegte LED auch mit lediglich 3-5 mA betrieben werden. Der subjektiv wahrgenommene Helligkeitsverlust ist deutlich geringer, als der prozentuale Unterschied der Stromstärke vermuten lässt, siehe Artikel [[LED-Fading]].&lt;br /&gt;
&lt;br /&gt;
== Mehrere LEDs zusammenschalten ==&lt;br /&gt;
&lt;br /&gt;
Diese Frage bewegt immer wieder die Gemüter. Wie schaltet man mehrere LEDs &#039;&#039;&#039;richtig&#039;&#039;&#039; zusammen?&lt;br /&gt;
&lt;br /&gt;
=== Reihenschaltung ===&lt;br /&gt;
&lt;br /&gt;
In einer Reihenschaltung ist der Strom durch alle Verbraucher gleich. Ideal für LEDs. Hat man eine ausreichend hohe Versorgungsspannung, kann man mehrere LEDs in Reihe schalten. Dann reicht ein einziger Widerstand bzw. eine [[Konstantstromquelle]]. Allerdings sollte man das nicht übertreiben. 100-150 LEDs direkt an die Netzspannung zu hängen ist nicht möglich, da die LEDs zu viel Sperrspannung abbekommen würden. Auch bei gleichgerichteter Spannung besteht ein Sicherheitsproblem. Als Hobbybastler sollte man sich auch hier auf Spannungen kleiner als 40V beschränken.&lt;br /&gt;
&lt;br /&gt;
=== Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
Das direkte Parallelschalten von LEDs ist sehr kritisch und muss vermieden werden. Grund ist die exponentielle Diodekennlinie, welche bewirkt, dass eine kleine Spannungsänderung eine grosse Stromänderung hervorruft. Schaltet man nun zwei LEDs mit verschiedenen Durchlassspannung parallel, bekommt die mit der niedrigeren Durchlassspannung DEUTLICH mehr Strom ab, dadurch wird sie nicht nur deutlich heller sondern auch wärmer. Das führt zum 2. Problem, denn mit steigender Temperatur sinkt die Durchlassspannung zusätzlich, wodurch sich der Effekt weiter verstärkt! LEDs verschiedender Farben haben sehr unterschiedliche Durchlassspannungen, hier ist ein direktes Parallelschalten vollkommen unmöglich. Aber selbst LEDs mit gleicher Farbe und aus einem Produktionsdurchlauf (Lot) weisen herstellungsbedingt bisweilen erhebliche Streuungen der Durchlassspannung auf!&lt;br /&gt;
&lt;br /&gt;
Richtig Parallelschalten kann man LEDs aber durch&lt;br /&gt;
&lt;br /&gt;
* Vorwiderstand/Konstantstromquelle für jede einzelne LED&lt;br /&gt;
* Auswählen von ausgemessenen LEDs mit sehr ähnlicher Flußspannung&lt;br /&gt;
&lt;br /&gt;
Letztere Methode wird von professionellen Herstellern verwendet, um bei grösseren Anzeigen LEDs direkt parallel schalten zu können. Die Unterschiede in der Flußspannung bei Nennstrom sollten dabei kleiner als 10mV(?) sein. Das gilt natürlich auch für das Parallelschalten von LED-Strängen, also Reihenschaltungen von LEDs.Das ist doof!!!!!&lt;br /&gt;
&lt;br /&gt;
=== Reihen- plus Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
Eine Kombination aus Serien- und Parallelschaltung ist weniger kritisch, da sich die unterschiedlichen Kennlinien statistisch mitteln. Z.B. kann man 20 LEDs in Reihe und mehrere solcher Stränge parallel schalten. Eine einzelne Diode mit geringerer Durchlaßspannung wird im Strom durch 9 andere begrenzt. Der Stromanstieg infolge der Unterschiede der einzelnen Stränge erzeugt an allen Bahnwiderständen der Dioden einen Spannungsabfall, der die ungleiche Stromverteilung begrenzt.&lt;br /&gt;
&lt;br /&gt;
Da LEDs mit bis zu 20% in ihrer effektiven Leuchtkraft bei gleicher scheinbarer Spannung streuen, sollte man wenigstens 10 LEDs in Reihe schalten und diese auch nur zu 70% auslasten, um optische Schwankungen auf ein Maß der Nichtsichtbarkeit zu senken und Mitkopplungseffekte infolge von Erwärmung zu begrenzen. Statistisch streuen die Helligkeiten dann nur noch im Bereich einiger Prozente. Die Variation der Stromaufnahme einzelner Stränge sollte demgemäß ebenfalls auf 5% begrenzt werden, d.h. der regelnde Widerstand muss im Bereich von &amp;gt;10% Spannungsänderungen aufnehmen können.&lt;br /&gt;
&lt;br /&gt;
Eine brauchbare Dimensionierung für 1,7V-LEDs @ 20mA wäre: 10 LEDs mit R=150Ohm an 20Volt. Der Widerstand sollte mit 1W belastbar sein. Noch besser ist ein gegengeregelter FET, der als Kaltleiter eine doppelte Gegenregelung bringt.&lt;br /&gt;
&lt;br /&gt;
Für eine gleichmäßige Lichtversorgung eines Array, sollten die LEDs nicht strangweise parallel, sondern in Schleifen verlegt werden. Man kann z.B. zwei Stränge alternierend verdrahten.&lt;br /&gt;
&lt;br /&gt;
== Direktbetrieb an 230V ==&lt;br /&gt;
Eine Methode, LEDs an 230V direkt zu betreiben, ist die Strombegrenzung mit einem spannungsfesten Kondensator, der in Reihe zur eigentlichen LED-Schaltung liegt, die aus einem 4-Wege-Gleichrichter einen ELKO und als Array verschalteter LEDs besteht. Die LEDs können wie im obigen Beispiel auf 20V oder 24V ausgelegt werden und sollten mit zwei antiparallel geschalteten Z-Dioden auf 24/28V limitiert werden, um Spannungsspitzen abzufangen. Die vorgeschaltete Kapazität wird mit einer Reihenschaltung von 4 keramischen Kondensatoren aufgebaut, von denen jeder ca 60V abfangen muss. Die Kapazität richtet sich nach der Stromaufnahme der Summe der LED-Stränge.&lt;br /&gt;
&lt;br /&gt;
Eine andere Möglichkeit befindet sich im Artikel [[LED-Glühbirne]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: IO-Grundlagen#Hardware]]&lt;br /&gt;
* [[LED-&amp;quot;Birnen&amp;quot;]]&lt;br /&gt;
* [[LED-Matrix]]&lt;br /&gt;
* [[LED-Fading]]&lt;br /&gt;
* [[Lichtsensor / Helligkeitssensor#LED]]&lt;br /&gt;
* [[Ambilight in Hardware]]&lt;br /&gt;
* [[Konstantstromquelle]] &lt;br /&gt;
* [[Konstantstromquelle fuer Power LED]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/158836?goto=2759782#2759782 Forumsbeitrag]: LEDs an 230V Netzspannung mit Konstantstromquelle&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/219681#2197034 Forumsbeitrag]: Darstellung der Toleranzen von LEDs und deren Wirkung, oder &amp;quot;Warum man einen Vorwiderstand braucht&amp;quot;&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/74169#618682 Forumsbeitrag]: 16-Segment Ganganzeige ohne Mikrocontroller&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267113#2788848 Forumsbeitrag]: Unbekannte LEDs ausmessen.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/280991?goto=2966997#2966820 Forumsbeitrag]: Konstantstromquelle für LED an 40-420VDC&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/290710?goto=3106790#3106790 Forumsbeitrag]: Graphische Ermittlung des LED-Stroms und der Toleranzen&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/311454#new Forumsbeitrag]: Glühbirnen ungepulst betreiben?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/289238#3073788 Forumsbeitrag]: 2 LEDs mit einem Portpin steuern&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261525?goto=new#new Forumsbeitrag]: Samsung Hochvolt AC LED Erfahrungen?&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikibooks.org/wiki/Arbeiten_mit_LEDs/_Grundlagen Wikibooks Arbeiten mit LEDs: Grundlagen] - Sehr gute Erklärung, auch für Anfänger&lt;br /&gt;
* [http://www.theledlight.com/technical.html www.theledlight.com] - LED Information and Technical Data (englisch)&lt;br /&gt;
* [http://forum.electronicwerkstatt.de/phpBB/faq/led/ LED FAQ für Anfänger]&lt;br /&gt;
* [http://members.misty.com/don/ledx.html Don Klipstein&#039;s LED Main Page (engl.)]&lt;br /&gt;
* [http://www.robotroom.com/LEDTester.html Selecting a LED] - LED Tester von David Cook (Beginnerprojekt)&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/throw Some thoughts on throwies] von Windell H. Oskay von www.evilmadscientist.com&lt;br /&gt;
*[http://www.led-rechner.de www.led-rechner.de]&lt;br /&gt;
*[http://catalog.osram-os.com/catalogue/catalogue.do?act=downloadFile&amp;amp;favOid=02000002000040ac000100b6 Vergleich von LED-Schaltungen ] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
* [http://catalog.osram-os.com/catalogue/catalogue.do;jsessionid=CBC285EE73F7A4DA3956223C87D46516?act=downloadFile&amp;amp;favOid=0200000200004264000100b6 Ansteuerung von Power TOPLEDs] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
*[http://catalog.osram-os.com/catalogue/catalogue.do;jsessionid=CBC285EE73F7A4DA3956223C87D46516?act=downloadFile&amp;amp;favOid=0200000200001b48000200b6 Verhalten von InGaN LEDs in Parallelschaltungen] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Displays und Anzeigen| ]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Bildsensor&amp;diff=78390</id>
		<title>Bildsensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Bildsensor&amp;diff=78390"/>
		<updated>2013-09-04T11:24:05Z</updated>

		<summary type="html">&lt;p&gt;Eltio: Rechtschreibfehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein &#039;&#039;&#039;Bildsensor&#039;&#039;&#039; besteht aus einer matrixförmigen Anordnung lichtempfindlicher Zellen (siehe [[Lichtsensor_/_Helligkeitssensor|Photodiode]], die über einzelne Verstärker in den Pixeln - und/oder Verstärkern in den Zeilen und Spalten verfügen, die die erzeugte Ladung in eine Spannung umwandeln und die Information nach Aussen transportieren.&lt;br /&gt;
&lt;br /&gt;
=== Bauformen ===&lt;br /&gt;
Bildsensoren existieren in unterschiedlichen Technologien, z.B. CMOS, PMOS und CCDs. Auf der eigentlichen Matrix können zusätzliche lichtempfindliche oder lichtleitende Schichten in Form von beschichteten Dünnfilmen aufgebraucht sein.&lt;br /&gt;
&lt;br /&gt;
* ARC (anti reflective coating), eine Art Aufrauhung , um das Licht besser einzusammeln und den Wirkungsgrad zu erhöhen&lt;br /&gt;
* PIN (p, intrinsic, n), eine zusätzliche stark absorbierende Schicht mit erhöhter Empfindlichkeit gegenüber sichtbarem Licht oder auch UV-/IR-Licht&lt;br /&gt;
* Szintilator, empfängt Teilchen- und Röntgenstrahlen und wandelt sie in Lichtimpulse um, die in der folgenden Schicht empfangen werden.&lt;br /&gt;
&lt;br /&gt;
=== Analoge Sensoren ===&lt;br /&gt;
Die eigentliche Sensormatrix verfügt zunächst nur über Steuerleitungen zum Resetten = Laden/Entladen der Zellen, sowie gfs Multiplexer zum Aufschalten der Ladung auf Leitungen. Das benötigte Timing muss extern angeführt werden. Die Ausgabe erfolgt analog Pixel für Pixel. Durch gleichzeitiges Aktivieren von zwei Steuerleitungen aneinander grenzender Zeilen und Spalten können Gruppen von benachbarten Pixeln gebündelt werden. Durch dieses sogenannten [[Binning]] wird eine Minderung der [[Auflösung]] und eine Steigerung der Helligkeitsempfindlichkeit je Endpixel erreicht.&lt;br /&gt;
&lt;br /&gt;
=== Digitale Sensoren ===&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus verfügen sogenannte digitale Bildsensoren einen oder mehrere interne AD-Wandler und eine eigene Taktgeneration, welche ein komplettes digitales Bild mit allen Steuersignalen HSYNCH, VSYNCH und BLANK etc ausgeben.&lt;br /&gt;
&lt;br /&gt;
Die Taktgeneration wird dabei intern autark gelöst oder ist abhängig von einem externen Takt sowie Steuersignalen, die die Betriebsarten regeln. Damit ist z.B. das binning und auch das teilweise Auslesen der Sensoren konfigurierbar, wodurch unterschiedliche Bildgössen und -wiederholungsgeschwindigkeiten (frame rate) möglich sind.&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Daten erfolgt wieder Pixelweise oder Gruppenweise über einen oder mehrere Ausgänge. Dabei sind serielle Ausgaben (bitweise) oder parallele Ausgaben (wortweise) möglich.&lt;br /&gt;
&lt;br /&gt;
=== Typen und Anwendungen ===&lt;br /&gt;
&lt;br /&gt;
Beispiele für Sensoren und Sensoranwendungen speziell mit digitaler Ausgabe sind:&lt;br /&gt;
&lt;br /&gt;
* Kamera-Sensoren für Videotechnik / HDTV&lt;br /&gt;
* Bildsensoren für industrielle Überwachung&lt;br /&gt;
&lt;br /&gt;
=== Integrierte Bildverarbeitung ===&lt;br /&gt;
Einige Sensoren verfügen darüber hinaus auch noch über interne Logikschaltungen zur Vorbearbeitung des Bildes.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* Softbinning&lt;br /&gt;
* Gain-Offset-Korrektur&lt;br /&gt;
* Belichtungskorrektur (AGC)&lt;br /&gt;
* Bildanalyse&lt;br /&gt;
* Bewegungsextraktion&lt;br /&gt;
* Objekterkennung&lt;br /&gt;
&lt;br /&gt;
Heutige Bildsensoren tendieren zu immer mehr Intelligenz und Integrationsdichte. Sie unterstützen meist gleich mehrere Schnittstellen und Betriebsarten.&lt;br /&gt;
&lt;br /&gt;
=== Schnittstellen ===&lt;br /&gt;
Moderne Bildsensoren verfügen hierbei über komplett funktionable, genormte Video-Schnittstellen:&lt;br /&gt;
&lt;br /&gt;
* SVIDEO (analog)&lt;br /&gt;
* CameraLink&lt;br /&gt;
* HDMI&lt;br /&gt;
* GigEVision&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Eltio</name></author>
	</entry>
</feed>