<?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=Rolfn</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=Rolfn"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Rolfn"/>
	<updated>2026-04-10T23:21:08Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED-%22Birnen%22&amp;diff=90853</id>
		<title>LED-&quot;Birnen&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED-%22Birnen%22&amp;diff=90853"/>
		<updated>2016-01-02T09:54:42Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: /* Vor- und Nachteile der LED-Lampen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Beitrag beschreibt Aufbau und Funktion von [[LED]]-basierten Leuchtmitteln (LED-Lampen), umgangssprachlich auch manchmal als &#039;&#039;&#039;&amp;quot;LED-Birnen&amp;quot;&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Immer häufiger werden neben Kompaktleuchtstofflampen (Quecksilberdampf-Niederdrucklampe) auch LED-Lampen als Ersatz für die herkömmlichen Glühfadenlampen (&amp;quot;Glühbirnen&amp;quot;) verwendet. Dabei existieren kostengünstige Versionen mit Gruppen aneinander gereihter Standard-LEDs, sowie Ausführungen, die gezielt in Form  klassischer Glühfadenbirnen gestaltet sind und für 230V optimierte Halbleiter enthalten.&lt;br /&gt;
&lt;br /&gt;
== Vergleich mit anderen Leuchtmitteln ==&lt;br /&gt;
Auf den Packungen der Hersteller sind sowohl bei Kompaktleuchtstofflampen, als auch bei LED-Birnen sehr optimistische Werte für die Lebensdauer und die Helligkeit angegeben. &lt;br /&gt;
&lt;br /&gt;
Seit 1. September 2013 ist die [http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2012:342:0001:0022:DE:PDF DIM II – EU 1194/2012 EU Verordnung] in Kraft, die gewisse Mindestanforderungen an die angegeben Werte gibt. Die Anforderungen werden schrittweise in 3 Stufen verschärft: &lt;br /&gt;
 - Stufe 1: 1. September 2013, &lt;br /&gt;
 - Stufe 2: 1. September 2014&lt;br /&gt;
 - Stufe 3: 1. September 2016&lt;br /&gt;
&lt;br /&gt;
Die Einhaltung wird durch Marktaufsichtsbehörden zu kontrollieren; Man kann sich nur selber überlegen ob eher die Marken oder Noname-Hersteller sich daran halten werden.&lt;br /&gt;
&lt;br /&gt;
=== Lebensdauervergleich===&lt;br /&gt;
Kompaktleuchtstofflampen werden gerne mit bis zu 10.000h - LED-Lampen sogar mit bis zu 50.000h angegeben. &lt;br /&gt;
&lt;br /&gt;
Für LED Lampen fordert die DIM II eine maximale Frühausfallrate von 5% nach 1000h und eine maximale Ausfallrate von 10% nach 6000h. (ab Stufe 1)&lt;br /&gt;
&lt;br /&gt;
Kompaktleuchtstofflampen dürfen maximale 5% Frühausfallrate nach 500h haben und nach 6000h dürfen maximal 50% ausgefallen sein. (Stufe 1; Stufe 3: 70%)&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Punkt ist die alterungsbedingte Lichtstromabnahme: Nach der Richtlinie müssen für Kompaktleuchtstofflampen nach 2000h noch 80% (Stufe 2) bzw 83% nach 2000h und 70% nach 6000h (Stufe 3)&lt;br /&gt;
&lt;br /&gt;
LEDs müssen nach 6000h noch mindestens 80% Lichtstrom haben. (Stufe 2)&lt;br /&gt;
&lt;br /&gt;
Zum Vergleich: 50% der Glühlampen müssten &amp;gt;1000h (Stufe 1), 2000h (Stufe 2) bzw. für Kleinspannungslampen ab Stufe 3 4000h leben.&lt;br /&gt;
Dabei müssen sie bei 3/4 der obigen Lebensdauerforderung noch mindestens 80% der Helligkeit haben. Frühausfallraten wären &amp;lt;5% bei 200h.&lt;br /&gt;
Wären, da bekannterweise die Glühlampen die Anforderungen &lt;br /&gt;
&lt;br /&gt;
=== Leistungsvergleich===&lt;br /&gt;
&lt;br /&gt;
Nach der DIM II ist es vorgeschrieben, dass die Lampen oder die Verpackung den Lichtstromwert in Lumen ausweisen. Damit werden die Leuchtmittel direkt vergleichbar in Punkto Helligkeit. Zusätzlich dürfen die Äquivalenzwerte angegeben werden, wobei die Umrechnung vom Lichtstrom vorgegeben ist. In der Regel benötigen hier dann LED-Lampen &amp;quot;mehr&amp;quot; Lumen als herkömmliche Glühlampen um die selbe Äquivalenzleistung zu haben.&lt;br /&gt;
&lt;br /&gt;
Beispiel: eine GU20 40D 35W Halogen hat ca. 140lm. Die selbe Lichtmenge reicht nur für das Labeln von 25W (Äquivalent). 35W würden 230lm brauchen. (Beispiel von [http://www.lighting.philips.com/pwc_li/main/led/assets/final%20dim2-philips_presentation.pdf hier, Seite 8])&lt;br /&gt;
&lt;br /&gt;
Im direkten Vergleich ist der Lichstrom sinnvoller, da hier die Augenempfindlichkeit schon berücksichtigt ist.&lt;br /&gt;
&lt;br /&gt;
=== Farbwiedergabe- und Lichtfarbenvergleich ===&lt;br /&gt;
&lt;br /&gt;
Auch Anforderungen an die Farbwiedergabe und an die Lichtfarbe werden in der DIM 2 formuliert:&lt;br /&gt;
&lt;br /&gt;
==== Farbwiedergabe ====&lt;br /&gt;
&lt;br /&gt;
Glühlampen haben per Definition einen Farbwiedergabewert Ra=100.&lt;br /&gt;
Für LED und Kompaktleuchtstofflampen sind die Mindestanforderungen Ra&amp;gt;85 (bzw. Ra&amp;gt;65 für Aussen- oder Industrieanwendungen). Gute Lampen gibt es aber auch mit Ra&amp;gt;90.&lt;br /&gt;
&lt;br /&gt;
==== Lichtfarbe ====&lt;br /&gt;
&lt;br /&gt;
Auch die [https://de.wikipedia.org/wiki/Farbtemperatur Lichtfarbe] muss angegeben werden. Hier ist die Einheit Kelvin und je kleiner der Wert desto &amp;quot;wärmer&amp;quot; das Licht. &lt;br /&gt;
&lt;br /&gt;
Normalerweise bekommt man hier nur &amp;quot;warmweiss&amp;quot; oder 3000K. &lt;br /&gt;
Damit sollten die Zeiten vorbei sein wo man vom Chinamann eine 8000K LED-Lampe als warmweiss verkauft bekommt und dann sich über das blaue Licht wundert.&lt;br /&gt;
&lt;br /&gt;
Bei LEDs darf maximale Farbabweichung darf hier nicht mehr als 6 [http://fastvoice.net/2013/09/18/farbkonsistenz-macadam-sdcm-wie-unterschiedlich-leuchten-leds/ Schwellwerteinheiten] sein. Der Wert sollte angegeben sein, gut Lampen erreichen hier weniger als 3 Schwellwerteinheiten.&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile der LED-Lampen ===&lt;br /&gt;
&lt;br /&gt;
LED-Lampen haben einige Vorteile gegenüber den Kompaktleuchtstofflampen und vor allem gegenüber den Glühfadenlampen: &lt;br /&gt;
&lt;br /&gt;
* Die Energieeffizienz ist in der Regel höher als bei Kompaktleuchststofflampen.&lt;br /&gt;
* Die Kosteneffizienz ist bei einfachen Ausführungen ähnlich gut.&lt;br /&gt;
* Die Lichtfarbe bzw. Farbtemperatur der LED-Lampe ist flexibler und kann auf Wunsch der Glühfadenlampenfarbe besser angepasst werden. Dazu gibt es kaltweiße, warmweiße und auch farbige Ausführungen.&lt;br /&gt;
* Sie enthalten keine leicht freisetzbaren Giftstoffe, wie Quecksilber.&lt;br /&gt;
* Erreichen bereits nach wenigen Millisekunden nach dem Einschalten die volle Leuchtkraft.&lt;br /&gt;
* Können eine sehr lange Lebensdauer haben (meist &amp;gt;= 30000 Stunden).&lt;br /&gt;
* Sind nach Lebensende &amp;quot;nur&amp;quot; als Elektroschrott zu entsorgen (aber kein Sondermüll wie Energiesparlampen).&lt;br /&gt;
&lt;br /&gt;
Jedoch gibt es auch einige Nachteile:&lt;br /&gt;
&lt;br /&gt;
* bei birnenähnlichen Designs und höheren Leistungen höherer Preis &lt;br /&gt;
* Ähnlich wie bei ESLs befinden sich sehr viel billige Produkte am Markt, bei denen die Elektronik rasch kaputt geht.&lt;br /&gt;
* schlechterer Farbwiedergabeindex Ra=80-95 (Glühbirne als Referenz Ra=100)&lt;br /&gt;
* Bei Billigprodukten oftmals starke EMV-Probleme (Störungen im Kurzwellenbereich)&lt;br /&gt;
&lt;br /&gt;
=== Kostenvergleich von Energiesparlampen ===&lt;br /&gt;
[[Datei:Kostenvergleich-led-esl-birnen.jpg|left|300px|Kostenvergleich]]&lt;br /&gt;
&lt;br /&gt;
Die Grafik zeigt 3 Fälle von Kostenrechnungen für konventionelle Glühlampen, Kompaktleuchtstofflampe (als ESL bezeichnet) und LED-Lampen.&lt;br /&gt;
&lt;br /&gt;
Berechnet werden jeweils die beiden Extremfälle einer Lampe mit niedrigem Preis und hoher Lebensdauer (günstiger Fall) und einer &amp;quot;Montagslampe&amp;quot;, die schnell kaputt geht, trotz hohen Preises. Daraus wird ein wahrscheinlichster Mittelwert (geometrische Mitte) - einmal für geringe und einmal für starke Nutzung gebildet.&lt;br /&gt;
&lt;br /&gt;
Aufgeführt ist auch die Unterscheidung der privaten und geschäftlichen Nutzung, bei der die Beschaffungs- und Wartungszeiten viel stärker zu Buche schlagen, da ein Angestellter bezahlt werden muss. Hier zeigt sich der Vorteil der langen Nutzungsdauer der LED-Lampen besonders deutlich.&lt;br /&gt;
&lt;br /&gt;
Es zeigt sich auch, dass Privatnutzer durchaus noch einen geringen Sparvorteil haben können, wenn sie auf LED-Lampen umrüsten.&lt;br /&gt;
&lt;br /&gt;
Excel für eigene Berechnungen: [http://www.mikrocontroller.net/wikifiles/0/09/Lampenrechner.xls Lampenvergleichsrechner]&lt;br /&gt;
&lt;br /&gt;
Externer Link auf Excel:&lt;br /&gt;
[http://shop.bioledex.de/files/BIOLEDEX-LED-Stromkosten-Rechner.xls Stromkostenrechner]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Bauformen ==&lt;br /&gt;
=== Hochvolt-LED-Lampen===&lt;br /&gt;
&lt;br /&gt;
=== Niederspannungs-LED-Lampen===&lt;br /&gt;
==== Halogenersatzlampen ====&lt;br /&gt;
Üblicherweise werden Niederspannungs-LED-Lampen an einem dezentralen Transformator betrieben, wie z.B mit 24V. Mit einer geeigneten Vorschaltung zur Spannungsherabsetzung im Lampengehäuse, sind sie auch indirekt an 230V-Netzen benutzbar.&lt;br /&gt;
&lt;br /&gt;
==== Betrieb von Standard-LEDs an 230V ====&lt;br /&gt;
[[Datei:led_230v.png|left|300px|230V-Vorschaltung]]&lt;br /&gt;
Mit der nebenstehenden Schaltung besteht die Möglichkeit, eine normale LED direkt an 230V anzuschließen. Diese Schaltung funktioniert so, dass die Spannung mittels Z-Dioden begrenzt wird; in diesem Fall auf 30V. Diese sind deshalb wichtig, weil die Gleichrichtdioden für hohen Frequenzanteile als Kapazität wirken und der Elko diese nicht aufnehmen kann, wodurch sie direkt auf die LEDs wirken würden. Gfs sollte dem Elko noch eine keramischer Kondensator beigefügt werden.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:Led an 220V.png|left|300px|230V-Schaltung]]&lt;br /&gt;
Statt eines Gleichrichters, kann auch eine Antiparallelschaltung von LEDs verwendet werden. Auch dabei werden beide Halbwellen genutzt. Die Ausfallwahrscheinlichkeit ist geringer, weil weniger Bauteile und vor allem kein Elko genutzt wird. Allerdings muss die Schaltung genau dimensioniert werden, d.h. die strombegrenzende Wirkung des Kondensators ist sehr wichtig. Daher werden zur Sicherheit einige in Serie geschaltet, um das Problem der Alterung oder Defektbildung zu minimieren. Die LEDs leuchten bei dieser Schaltungsform aber etwas dunkler als oben, weil kein konstanter Strom fliessen kann und man mit Rücksicht auf die Lebensdauer der LEDs nicht einfach die Spannung so erhöhen kann, dass der Effektivwert erreicht wird.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{warnung|Spannungen ab 60V sind lebensgefährlich!}}&lt;br /&gt;
&lt;br /&gt;
== Funktion einer LED-Lampe am Beispiel==&lt;br /&gt;
von [[Benutzer:Didi34]]&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
[[Datei:aufbau.JPG|left|300px]]&lt;br /&gt;
Ich beschreibe in diesem Beitrag den Aufbau eines 4W Philips LED-Leuchtmittels mit E-14 Sockel. Über dem LED-Chip befindet sich ein Glaskolben, der in den weißen Kunststoffsockel geklebt ist. Der Glaskolben ist aus Milchglas, dies dient als Diffusor. Um näher in die Lampe zu kommen, muss der Glaskolben abgenommen werden.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:sockel.JPG|left|300px]]&lt;br /&gt;
Nun sieht man den LED-Chip in der Mitte der Lampe. Über dem Chip befindet sich eine weitere Abdeckung, die abgenommen werden muss. &lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:chip_anschluss.JPG|left|300px]]&lt;br /&gt;
Auf dem nächsten Bild sieht man die Aluminium-Platine, worauf sich der LED-Chip befindet. Die beiden Drähte stellen die Versorgung der LED (300V Gleichspannung) dar. Die Platine besteht aus dem Basismaterial Aluminium, um eine bessere Kühlung zu erreichen.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
=== Innenleben ===&lt;br /&gt;
[[Datei:platine_unten.jpg|left|300px]]&lt;br /&gt;
Im Inneren der LED-Lampe befindet sich folgende Platine:&lt;br /&gt;
&lt;br /&gt;
Man sieht nun auf der Platine eine kleine Gleichrichterschaltung. Die Anschlüsse Blau und Braun sind Neutralleiter(N) und Außenleiter(L1) unserer Energieversorgung mit 230V Wechselspannung.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:platine_oben.JPG|left|300px]]&lt;br /&gt;
&lt;br /&gt;
Die beiden Drähte Rot(+) und Schwarz(-) sind die Ausgänge der Schaltung. Sie führen eine Gleichspannung von 300V und werden direkt an der Aluminiumplatine der LED angeschlossen, da die LED für diese Spannung ausgelegt ist. Näheres zur Schaltung:&lt;br /&gt;
[http://www.mikrocontroller.net/articles/LED-Gl%C3%BChbirne#Schaltung/ Schaltung]&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
==== LED-Chip ====&lt;br /&gt;
[[Datei:ledchip_dunkel.jpg|left|300px]]&lt;br /&gt;
Der LED-Chip besteht aus mehreren in Serie geschalteten LEDs. Die in Serie geschalteten LEDs sind um eine warm-weiße Farbe zu erreichen teils rot und teils weiß. Die LED ist für 300V DC ausgelegt. Auf dem LED-Chip befinden sich zwei weiße und zwei rote LED-Arrays. Die gelbe Schicht der weißen LEDs ist ein Phosphor (also ein Leuchtstoff) der aus dem blauen Licht der Kristalle weißes Licht macht.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:ledchip_hell.jpg|left|300px]]&lt;br /&gt;
Eine weitere Ansicht des LED-Chips im Betrieb unter Spannung.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
==== Schaltung ====&lt;br /&gt;
[[Datei:netzteilschaltung.png|left|300px|Einfache Gleichrichterschaltung für LEDs]]&lt;br /&gt;
Für den Betieb an Netzspannung wird ein Kondensatornetzteil verwendet, welches aus 230V AC 300V DC macht. Die Schaltung ist mit 1A abgesichert. {{Absatz}}&lt;br /&gt;
&lt;br /&gt;
=== Messung ===&lt;br /&gt;
[[Datei:messung.bmp|left|300px|Messung]]&lt;br /&gt;
Es wurde zwischen dem roten und schwarzen Ausgang der oben genannten Schaltung gemessen. CH1 roter Anschluss CH2 schwarzer Anschluss.&lt;br /&gt;
Die rote Linie am Oszillogramm ist Die Spannung zwischen den beiden Drähten (CH1-CH2).&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
{{warnung|Spannungen ab 60V sind lebensgefährlich!}}&lt;br /&gt;
&lt;br /&gt;
== Interne Links ==&lt;br /&gt;
* [[LED]]&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Leuchtdiode Wikipedia: LED]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Kompaktleuchtstofflampe Wikipedia: Kompaktleuchtstofflampe]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Glühlampe Wikipedia: Glühbirne ]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Kondensatornetzteil Wikipedia: Kondensatornetzteil]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Energiesparende Leuchtmittel Wikipedia: Energiesparende Leuchtmittel allgemein]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Displays und Anzeigen]]&lt;/div&gt;</summary>
		<author><name>Rolfn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED&amp;diff=90852</id>
		<title>LED</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED&amp;diff=90852"/>
		<updated>2016-01-02T09:50:05Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: /* Reihen- plus Parallelschaltung */&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;
== Flußspannung ==&lt;br /&gt;
&lt;br /&gt;
LEDs haben im Vergleich zu gewöhnlichen [[Diode|Dioden]] eine vergleichsweise hohe, vom Halbleitermaterial abhängige [[Durchlass-Spannung | Flußspannung]]. Bevor diese erreicht wird, fließt nur sehr wenig Strom und die LED leuchtet praktisch nicht. Oberhalb der Flußspannung steigt der Strom schnell an (Diodenkennlinie). Die Flußspannung 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 (Energiedifferenz) 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 echte violette 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. Der Maximalstrom einer LED ist bei allen Typen sehr ähnlich und liegt bei 20 -30 mA. Eine Standard-LED wird üblicherweise mit 20 mA betrieben. Moderne LEDs kommen häufig mit sehr viel weniger Strom aus. So benötigt eine Low-Current LED nur 2 mA um sehr hell zu leuchten. 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;
=== Warum benötig man einen Vorwiderstand? ===&lt;br /&gt;
&lt;br /&gt;
Diese Frage wird seit langer Zeit immer wieder gestellt.&lt;br /&gt;
&lt;br /&gt;
Die [https://www.mikrocontroller.net/attachment/151822/LED-Kennlinien.png Kennlinie] einer LED ist stark nichtlinear. Unterhalb der Flußspannung fließt fast kein Strom und die LED leuchtet kaum. Oberhalb der Flußspannung steigt der Stromfluß schon bei kleinen Spannungsänderungen stark an. In der Praxis müsste man nun die Spannung für jede einzelne LED exakt einstellen, um den exakten Strom zu treffen und auch zu halten. Das kann und will man aber nicht. Außerdem unterliegt die Flußspannung sowohl einer Fertigungstoleranz als auch einer negativen Temperaturdrift, d.h. bei höherer Temperatur (Umgebung oder Eigenerwärmung) sinkt die Flußspannung. Alle diese Effekte kann man problemlos mit einem Vorwiderstand soweit abschwächen, dass sie praktisch keine große Rolle mehr spielen, ganz ohne präzise Spannungseinstellung.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel. In diesem [https://www.mikrocontroller.net/attachment/151822/LED-Kennlinien.png Bild] ist die Kennlinie einer grünen LED mit und ohne Vorwiderstand dargestellt. Die Flußspannung beträgt ca. 2,2V bei 10mA LED-Strom. Wenn man jetzt exakt 2,05V anlegt, fließen 6mA (blaue Kurve). Schwankt jetzt aber die angelegte Spannung um +/-0,2V (10%), dann schwankt der Strom um +14/-5mA! Ganz anders mit Vorwiderstand. Man braucht eine höhere Spannung, hier beispielsweise 4V, wobei auch 6mA fließen (rosa Kurve). Schwankt diese nun um +/-0,4V (10%), schwankt der Strom nur um +/-1mA. Das ist deutlich stabiler!&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;
=== Unsichtbarer Vorwiderstand ===&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. Allerdings schwankt damit die Helligkeit der LED stark mit den Toleranzen und dem Ladezustand der Batterien.&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;
== 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 Diodenkennlinie, welche bewirkt, dass eine kleine Spannungsänderung eine große 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 verschiedener 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.&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 Arrays, 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;
&lt;br /&gt;
Eine Methode, LEDs an 230V direkt zu betreiben, ist die Strombegrenzung mit einem spannungsfesten Kondensator [https://www.mikrocontroller.net/articles/Controller_an_230V#Versorgung_.C3.BCber_Vorwiderstand.2FKondensator Kondensatornetzteil], der in Reihe zur eigentlichen LED-Schaltung liegt, die aus einem 4-Wege-Gleichrichter, einem ELKO und einer Anzahl 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 begrenzt werden, um Spannungsspitzen abzufangen. Die Kapazität richtet sich nach der Stromaufnahme der LED-Stränge. 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;
* [https://www.mikrocontroller.net/topic/goto_post/4153684 Forumsbeitrag]: Berechung des Spannungsabfalls an langen LED-Ketten&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&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;
*[https://en.wikipedia.org/?title=Light-emitting_diode Leuchtdiode]&lt;br /&gt;
*[http://electronics-electrical.exportersindia.com/lighting-displays/led-lights.htm LED-Leuchten Hersteller]&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>Rolfn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Konstantstromquelle_fuer_Power_LED&amp;diff=64467</id>
		<title>Konstantstromquelle fuer Power LED</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Konstantstromquelle_fuer_Power_LED&amp;diff=64467"/>
		<updated>2012-02-21T12:56:45Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: /* Noch heller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemeines ==&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb von Leistungs-[[LED]]s sind normalerweise getaktete [[Konstantstromquelle##Konstantstromquelle_mit_Schaltregler | Stromregler]] erforderlich. Als Leistungs-LEDs bezeichnet man im Allgemeinen Leuchtdioden mit &#039;&#039;&#039;1W&#039;&#039;&#039; oder mehr Leistung. Die Nennströme zum Betrieb liegen meist in den Klassen 300mA, 700mA und 1.2A. Abhängig von der jeweiligen [[LED#Durchlassspannung | Durchlaßspannung]] ergibt sich nicht exakt die angegebene Leistungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der jeweils erlaubte maximale Strom ist dem LED-Datenblatt zu entnehmen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Auch um verschiedene Helligkeiten bei verschiedenen LED-Typen und -Farben aneinander anzupassen, ist es erforderlich, den Strom anpassen zu können. Eine lineare [[Konstantstromquelle]] kann in dieser Leistungklasse zu hohen Wärmeverlusten führen, sofern nicht die Eingangsparameter genau dimensioniert werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Betrieb einer 1W-LED an 12V &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V = (U_{ges}-U_{Led}) \cdot I_{Led} = (12V-3,3V) \cdot 300mA = 2.6W&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man verwendet also besser einen Schaltregler. Ein Schaltregler, dessen Ausgangsspannung - wie in diesem Fall - kleiner als die Eingangsspannung ist, heisst im englischen Sprachraum &amp;quot;Buck&amp;quot;-Regler. Es gibt spezielle Bausteine für den Betrieb von Power-LEDs. Diese sind auf die Anwendung mit LEDs spezialisiert, haben meist nur 5 Anschlüsse, sind aber teilweise noch recht schwierig erhältlich und teuer. Der Standard-Schaltregler-IC [[MC34063]] wurde bereits im Forum beschrieben. Hier wird eine Vereinfachung der Schaltung speziell für dessen Einsatz zur LED-Versorgung beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Standard-Buck-Reglerschaltung ==&lt;br /&gt;
&lt;br /&gt;
In der folgenden Schaltung wird der weit verbreitete IC [[MC34063]] eingesetzt, welcher allerdings nicht auf die Anwendung mit LEDs optimiert ist!&lt;br /&gt;
&lt;br /&gt;
[[Bild: Spannungsregler mit Buck-Regler.png|thumb|left|300px|Spannungsregler mit Buck-Regler]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
Die Standardschaltung verwendet einige Bauteile, die für den Betrieb von LEDs nicht erforderlich sind. So ist es zum Betrieb von LED nicht erforderlich, den Strom vollkommen konstant zu halten. Eine schnelle, geringfügige Stromänderung (engl. Ripple) wird vom Auge nicht wahrgenommen und für die LED ist der mittlere Strom maßgeblich für die Helligkeit. Auch hier gilt: Ein Blick ins Datenblatt der LED ist unumgänglich, insbesondere wenn man im Grenzbereich von Temperatur und Leistung arbeitet!&lt;br /&gt;
&lt;br /&gt;
== Vereinfachte Schaltung für LEDs ==&lt;br /&gt;
&lt;br /&gt;
Diese reduzierten Anforderungen an die Konstanz des Ausgangsstroms  vereinfachen die Schaltung stark. Ausser dem IC selber und der LED werden hier nur sechs statt acht Bauteile verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Bild: Strom.png|thumb|left|300px|Vereinfachter Stromregler für LEDs]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Fertigmodul ==&lt;br /&gt;
&lt;br /&gt;
Beim [http://www.mikrocontroller.net/user/show/Mexman Autor] sind komplette Module erhältlich, mit denen man eine oder zwei LEDs in Reihenschaltung an 12V Wechselspannung als Ersatz für Halogenlampen betreiben kann. Das unten gezeigte Modul betreibt 1W oder 3W-LEDs und ist für &#039;&#039;&#039;unter 3 EUR&#039;&#039;&#039; erhältlich. Es enthält zusätzlich einen Brückengleichrichter zum Betrieb an 12V Wechselspannung!&lt;br /&gt;
&lt;br /&gt;
[[Bild: Modul.jpg|thumb|left|334px|Minimodul zum Einbau in Halogenspots]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
[[Bild: Modul.png|thumb|left|300px|Schaltung des Minimoduls]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Stromeinstellung ==&lt;br /&gt;
&lt;br /&gt;
Der strombestimmende Widerstand kann an den erforderlichen Ausgangsstrom angepasst werden. Der verwendete Schaltkreis hat einen Maximalstrom von 1.5A, er sollte aber nur für Power-LED mit 3W, also bis zu ca. 700mA Dauerstrom verwendet werden!&lt;br /&gt;
&lt;br /&gt;
[[Bild: Strome.png|thumb|left|300px|Stromeinstellung]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Dimmung ==&lt;br /&gt;
&lt;br /&gt;
Der Stromregler wird nicht durch Ändern des LED-Stromes gedimmt. Das wäre zwar technisch möglich, wird aber normalerweise nicht angewendet. Stattdessen wird der gesamte Stromregler ein- und ausgeschaltet ([[PWM]]). Dafür verwendet der vorliegenden IC normalerweise Pin 5. Bei den hier gezeigten Modulen ist dieser Pin nicht zugänglich, es wird eine etwas brutalere Methode verwendet. Dem IC wird ein überhöhter Ausgangsstrom vorgetäuscht und es regelt somit den Ausgangsstrom auf Null herunter. Das erfordert keine Unterbrechung einer Leiterbahn, sondern eine externe Beschaltung mit einem [[Ausgangsstufen_Logik-ICs#Open_Collector |Open-Kollektor]] Transistor am Pin 7, welcher leicht zugänglich ist.&lt;br /&gt;
&lt;br /&gt;
[[Bild: PWM.png|thumb|left|300px|PWM-Ansteuerung]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man die nachfolgende Schaltung verwenden, um eine Dimmung per PWM zu erreichen. Der Vorteil liegt darin, dass der Eingriff weniger rabiat erfolgt und im AUS-Zustand ca. 10mA Strom spart, welchen die oben gezeigte Lösung im Aus-Zustand zusätzlich benötigt. Ausserdem entfällt der Transistor und zwei Widerstände, was im Falle maximaler Miniaturisierung Platz spart. Das PWM-Signal muss hier invertiert sein, d.h. bei einer Spannung kleiner als 1,25V ist die LED eingeschaltet und bei größer 1,25V ist sie ausgeschaltet. Damit kann das Signal direkt an einen Mikrocontroller angeschlossen werden. Nachteilig ist, dass diese Änderung nur mit Anheben von Pin 5 von der Miniplatine durchgeführt werden kann. Ohne Gleichrichter wird an 12V Gleichspannung ein Wirkungsgrad von ca. 78% erreicht. Das ist für diese einfache, preiswerte Schaltung ziemlich gut.&lt;br /&gt;
&lt;br /&gt;
[[Bild: Power-LED_Stromquelle.png|thumb|left|300px|Alternative PWM-Ansteuerung]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
Ein Nachteil dieser etwas zweckentfremdeten Ansteuerung ist eine leichte Verzögerung beim Einschalten. Das folgende Oszillogramm zeigt diese mit ca. 10µs. Sie führt dazu, dass Einschaltphasen der [[PWM]] kleiner als 10µs die LED nicht einschaltet, das muss beim Auslegen der [[PWM]] berücksichtigt werden! Bei üblichen Ansteuerfrequenzen im Bereich von 100-300 Hz ist diese Verzögerung aber vernachlässigbar. Das Oszillogramm zeigt auch die Frequenz der Stromregelung mit ca. 100kHz&lt;br /&gt;
&lt;br /&gt;
[[Bild: 10us.png|thumb|left|351px|Einschaltverzögerung]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Noch heller ==&lt;br /&gt;
Das 12V AC Modul kann problemlos bei geringerer Betriebsspannung am Fahrrad als Treiber fuer eine Power-LED benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es koennen sogar 3 LED in Reihe mit nur einem Modul betrieben werden!&lt;br /&gt;
Allerdings reichen dann 12V als Betriebsspannung nicht mehr aus, schliesslich addieren sich ja alle drei Flussspannungen und bei 3 x Blau in Reihe sind das ja schon fast 12V!&lt;br /&gt;
Also: Betriebsspannung auf 20..24V DC oder 18V AC erhöhen!&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
Mit dem oben gezeigten Modul kann man sehr günstig per Mikrokontroller Power-LEDs regeln. Die Bezugsquelle für die Module ist beim [http://www.mikrocontroller.net/user/show/Mexman Autor] erfragbar.&lt;br /&gt;
&lt;br /&gt;
Alternativ gibt es hier ein [[media:KSQ_PLED.zip | Archiv]] mit den Daten in Eagle-Format. Darin sind zwei Versionen enthalten. Einmal mit bedrahteten Bauelementen als einfache, einseitige Platine und einmal komplett in [[SMD]] mit zweiseitiger Bestückung für minimale Größe.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Stückliste, Konstantstromquelle mit 300mA&amp;lt;br&amp;gt;mit Reichelt Bestellnummern&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil || Beschreibung || SMD || THT&lt;br /&gt;
|-&lt;br /&gt;
|C1 ||	Kondensator, 10µF, 35V || SMD TAN.10/35 || RAD 10/35&lt;br /&gt;
|-&lt;br /&gt;
|C2 ||	Kondensator, 330pF, 35V ||NPO-G1206 330P  || NPO-2,5 330P&lt;br /&gt;
|-&lt;br /&gt;
|D1 ||	Schottky-Diode, 1A, 40V || LL 5819 SMD || SB 140&lt;br /&gt;
|-&lt;br /&gt;
|L1 ||	Spule, 0,4A, 470µH || L-PIS4720 470µ || L-11P 470µ&lt;br /&gt;
|-&lt;br /&gt;
|R1 ||	Widerstand, 1Ω ||	SMD 1/4W 1,0 || METALL 1,00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.diodes.com/zetex/_pdfs/3.0/pdf/ZXLD1350.pdf Datenblatt des ZETEX LED-Treiber ZXLD1350]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Konstantstromquelle#MC34063.2C_Step_Down Artikel zum MC34063] &lt;br /&gt;
* [http://www.datasheetcatalog.net/de/datasheets_pdf/M/C/3/4/MC34063.shtml Datenblatt des MC34063]&lt;br /&gt;
*[http://www.elektronikpraxis.vogel.de/index.cfm?pid=866&amp;amp;pk=316524&amp;amp;nl=1&amp;amp;cmp=nl-101 Selbe Prinzip von einem TI Ing]&lt;br /&gt;
*[http://www.led-treiber.de LED-Treiber] verschiedenster Art&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Spannungsversorgung und Energiequellen]]&lt;br /&gt;
[[Kategorie:Displays und Anzeigen]]&lt;/div&gt;</summary>
		<author><name>Rolfn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Der_UART&amp;diff=59297</id>
		<title>AVR-GCC-Tutorial/Der UART</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Der_UART&amp;diff=59297"/>
		<updated>2011-08-08T06:23:36Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: &amp;quot;Updated AVR UART Library&amp;quot; zugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Über den [[UART]] kann ein [[AVR]] leicht mit einer [[RS-232]]-Schnittstelle eines PC oder sonstiger Geräte mit &amp;quot;[[seriell]]er Schnittstelle&amp;quot; verbunden werden. &lt;br /&gt;
&lt;br /&gt;
== Allgemeines zum UART ==&lt;br /&gt;
&lt;br /&gt;
Mögliche Anwendungen des UART:&lt;br /&gt;
&lt;br /&gt;
;Debug-Schnittstelle: z.&amp;amp;nbsp;B. zur Anzeige von Zwischenergebnissen (&amp;quot;printf-debugging&amp;quot; - hier besser &amp;quot;Logging&amp;quot; oder &amp;quot;UART-debugging&amp;quot;) über [[RS-232]] auf einem PC. Auf dem Rechner reicht dazu ein [[RS-232#Terminalprogramme|Terminalprogramm]] (MS-Windows: Hyperterm oder besser [https://sites.google.com/site/terminalbpp/], [http://www.der-hammer.info/terminal/ HTerm]; Unix/Linux z.&amp;amp;nbsp;B. minicom). Ein direkter Anschluss ist aufgrund unterschiedlicher Pegel nicht möglich, jedoch sind entsprechende Schnittstellen-ICs wie z.&amp;amp;nbsp;B. ein MAX232 günstig und leicht zu integrieren. Rechner ohne serielle Schnittstelle können über fertige USB-seriell-Adapter angeschlossen werden. &lt;br /&gt;
;Mensch-Maschine Schnittstelle: z.&amp;amp;nbsp;B. Konfiguration und Statusabfrage über eine &amp;quot;Kommandozeile&amp;quot; oder Menüs (siehe z.&amp;amp;nbsp;B. Forumsbeitrag [http://www.mikrocontroller.net/topic/52985 Auswertung RS232-Befehle] und Artikel [[Tinykon]]) &lt;br /&gt;
;Übertragen von gespeicherten Werten: z.&amp;amp;nbsp;B. bei einem Datenlogger&lt;br /&gt;
;Anschluss von Geräten: mit serieller Schnittstelle (z.&amp;amp;nbsp;B. (Funk-)Modems, Mobiltelefone, Drucker, Sensoren, &amp;quot;intelligente&amp;quot; LC-Displays, GPS-Empfänger). &lt;br /&gt;
;&amp;quot;Feldbusse&amp;quot;: auf RS485/RS422-Basis mittels entsprechenden Bustreiberbausteinen (z.&amp;amp;nbsp;B. MAX485)&lt;br /&gt;
;DMX, Midi: etc.&lt;br /&gt;
;LIN-Bus: &#039;&#039;&#039;L&#039;&#039;&#039;ocal &#039;&#039;&#039;I&#039;&#039;&#039;nterconnect &#039;&#039;&#039;N&#039;&#039;&#039;etwork: Preiswerte Sensoren/Aktoren in der Automobiltechnik und darüber hinaus&lt;br /&gt;
&lt;br /&gt;
Einige AVR-Controller haben ein bis zwei vollduplexfähige UART (&#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;A&#039;&#039;&#039;synchronous &#039;&#039;&#039;R&#039;&#039;&#039;eceiver and &#039;&#039;&#039;T&#039;&#039;&#039;ransmitter) schon eingebaut (&amp;quot;Hardware-UART&amp;quot;). &lt;br /&gt;
Übrigens: Vollduplex heißt nichts anderes, als dass der Baustein gleichzeitig senden und empfangen kann.&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs (ATmega, ATtiny) verfügen über einen bis vier U&#039;&#039;&#039;S&#039;&#039;&#039;ART(s), dieser unterscheidet sich vom UART hauptsächlich durch interne FIFO-Puffer für Ein- und Ausgabe und erweiterte Konfigurationsmöglichkeiten. Die Puffergröße ist allerdings nur 1 Byte.&lt;br /&gt;
&lt;br /&gt;
== Die Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der UART basiert auf normalem TTL-Pegel mit 0V (logisch 0) und 5V (logisch 1). Die Schnittstellenspezifikation für RS-232 definiert jedoch -3V ... -12V (logisch 1) und&lt;br /&gt;
+3 ... +12V (logisch 0). Daher muss der Signalaustausch zwischen AVR und Partnergerät invertiert werden. Für die Anpassung der Pegel und das Invertieren der Signale gibt es fertige Schnittstellenbausteine. Der bekannteste davon ist wohl der MAX232. &lt;br /&gt;
&amp;lt;!-- &amp;quot;Hackerloesung&amp;quot; auskommentiert - nicht so gut in einem &amp;quot;Einsteiger-Tutorial&amp;quot; - mthomas&lt;br /&gt;
Allerdings kostet der auch wieder Geld und benötigt&lt;br /&gt;
zusätzlich immerhin 4 externe Elkos.&lt;br /&gt;
&lt;br /&gt;
Die in den PC eingebauten Schnittstellen vertragen ohne Klagen auch den TTL-Pegel vom AVR. Allerdings müssen wir immer noch die Signale invertieren. Im einfachtesn Fall verwenden wir dazu jeweils einen einfachen NPN-Transistor und 2 Widerstände. Näheres dazu erfahrt ihr in den folgenden Übungen.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Streikt die Kommunikation per UART, so ist oft eine fehlerhafte Einstellung der Baudrate die Ursache. Die Konfiguration auf eine bestimmte Baudrate ist abhängig von der Taktfrequenz des Controllers. Gerade bei neu aufgebauten Schaltungen (bzw. neu gekauften Controllern) sollte man sich daher noch einmal vergewissern, dass der Controller auch tatsächlich mit der vermuteten Taktrate arbeitet und nicht z.&amp;amp;nbsp;B. den bei einigen Modellen werksseitig eingestellten internen [[Oszillator]] statt eines externen Quarzes nutzt. Die Werte der verschiedenen fuse-bits im Fehlerfall also beispielsweise mit &#039;&#039;[[AVRDUDE]]&#039;&#039; kontrollieren und falls nötig anpassen. Grundsätzlich empfiehlt sich auch immer ein Blick in die [[AVR_Checkliste]].&lt;br /&gt;
&lt;br /&gt;
== Die UART-Register ==&lt;br /&gt;
&lt;br /&gt;
Der UART wird über vier separate Register angesprochen. Die USARTs der ATMEGAs verfügen über mehrere zusätzliche Konfigurationsregister. Das Datenblatt gibt darüber Auskunft. Die folgende Tabelle gibt nur die Register für die UARTs der ATmega8/16/32 u.ä. wieder.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UCSRA&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;A&#039;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier teilt uns der UART mit, was er gerade so macht.&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;RXC&#039;&#039;&#039;|| &#039;&#039;&#039;TXC&#039;&#039;&#039;|| &#039;&#039;&#039;UDRE&#039;&#039;&#039;|| &#039;&#039;&#039;FE&#039;&#039;&#039;|| &#039;&#039;&#039;DOR&#039;&#039;&#039;|| &#039;&#039;&#039;PE&#039;&#039;&#039;|| &#039;&#039;&#039;U2X&#039;&#039;&#039;|| &#039;&#039;&#039;MPCM&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R|| R/W|| R|| R|| R|| R|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 1|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXC&#039;&#039;&#039; (UART Receive Complete)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn ein empfangenes Zeichen vom Empfangs-Schieberegister in das Empfangs-Datenregister transferiert wurde.&lt;br /&gt;
:Das Zeichen muss nun schnellstmöglich aus dem Datenregister ausgelesen werden. Falls dies nicht erfolgt, bevor ein weiteres Zeichen komplett empfangen wurde, wird eine Überlauf-Fehlersituation eintreten. Mit dem Auslesen des Datenregisters wird das Bit automatisch gelöscht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXC&#039;&#039;&#039; (UART Transmit Complete)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn das im Sende-Schieberegister befindliche Zeichen vollständig ausgegeben wurde und kein weiteres Zeichen im Sendedatenregister ansteht. Dies bedeutet also, dass die Kommunikation vollumfänglich abgeschlossen ist.&lt;br /&gt;
:Dieses Bit ist wichtig bei Halbduplex-Verbindungen, wenn das Programm nach dem Senden von Daten auf Empfang schalten muss. Im Vollduplexbetrieb brauchen wir dieses Bit nicht zu beachten.&lt;br /&gt;
:Das Bit wird nur dann automatisch gelöscht, wenn der entsprechende Interrupthandler aufgerufen wird, ansonsten müssen wir das Bit selber löschen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UDRE&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;E&#039;&#039;&#039;mpty)&lt;br /&gt;
:Dieses Bit zeigt an, ob der Sendepuffer bereit ist, um ein zu sendendes Zeichen aufzunehmen. Das Bit wird vom AVR gesetzt (1), wenn der Sendepuffer leer ist. Es wird gelöscht (0), wenn ein Zeichen im Sendedatenregister vorhanden ist und noch nicht in das Sende-Schieberegister übernommen wurde. Atmel empfiehlt aus Kompatibilitätsgründen mit kommenden µC, UDRE auf 0 zu setzen, wenn das UCSRA Register beschrieben wird.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn ein Zeichen in das Sendedatenregister geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FE&#039;&#039;&#039; (&#039;&#039;&#039;F&#039;&#039;&#039;raming &#039;&#039;&#039;E&#039;&#039;&#039;rror)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn der UART einen Zeichenrahmenfehler detektiert, d.h. wenn das Stopbit eines empfangenen Zeichens 0 ist.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das Stopbit des empfangenen Zeichens 1 ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DOR&#039;&#039;&#039; (&#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;R&#039;&#039;&#039;un)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn unser Programm das im Empfangsdatenregister bereit liegende Zeichen nicht abholt bevor das nachfolgende Zeichen komplett empfangen wurde.&lt;br /&gt;
:Das nachfolgende Zeichen wird verworfen.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das empfangene Zeichen in das Empfangsdatenregister transferiert werden konnte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PE&#039;&#039;&#039; (&#039;&#039;&#039;P&#039;&#039;&#039;arity &#039;&#039;&#039;E&#039;&#039;&#039;rror&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn das im Empfangsdatenregister bereit liegende Zeichen eine Paritätsfehler aufweist.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das empfangene Zeichen in das Empfangsdatenregister transferiert werden konnte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;U2X&#039;&#039;&#039; (Double the transmission speed)&lt;br /&gt;
:Dieses Bit wird lediglich im asynchronen Modus genutzt. Im synchronen Modus ist es 0 zu setzen. Wird das Bit gesetzt, so wird der Baudraten Divisor von 16 auf 8 reduziert, was einer Verdopplung der Transferrate gleich kommt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MPCM&#039;&#039;&#039; (&#039;&#039;&#039;M&#039;&#039;&#039;ulti &#039;&#039;&#039;P&#039;&#039;&#039;rozessor &#039;&#039;&#039;C&#039;&#039;&#039;ommunication &#039;&#039;&#039;M&#039;&#039;&#039;ode)&lt;br /&gt;
:Dieses Bit aktiviert die Multi-Prozessor-Kommunikation. Jeder eintreffende Frame der keine Adressinformation enthält wird dadurch ignoriert.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UCSRB &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;B&#039;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
In diesem Register stellen wir ein, wie wir den UART verwenden möchten.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Register 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;
|- &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;RXCIE&#039;&#039;&#039;|| &#039;&#039;&#039;TXCIE&#039;&#039;&#039;|| &#039;&#039;&#039;UDRIE&#039;&#039;&#039;|| &#039;&#039;&#039;RXEN&#039;&#039;&#039;|| &#039;&#039;&#039;TXEN&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ2&#039;&#039;&#039;|| &#039;&#039;&#039;RXB8&#039;&#039;&#039;|| &#039;&#039;&#039;TXB8&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R|| 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;
&#039;&#039;&#039;RXCIE&#039;&#039;&#039; (&#039;&#039;&#039;RX&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;omplete &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART RX Complete Interrupt ausgelöst, wenn ein Zeichen vom UART empfangen wurde. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXCIE&#039;&#039;&#039; (&#039;&#039;&#039;TX&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;omplete &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART TX Complete Interrupt ausgelöst, wenn ein Zeichen vom UART gesendet wurde. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UDRIE&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;E&#039;&#039;&#039;mpty &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART Datenregister Leer Interrupt ausgelöst, wenn der UART wieder bereit ist um ein neues zu sendendes Zeichen zu übernehmen. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXEN&#039;&#039;&#039; (&#039;&#039;&#039;R&#039;&#039;&#039;eceiver &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Nur wenn dieses Bit gesetzt ist, arbeitet der Empfänger des UART überhaupt. Wenn das Bit nicht gesetzt ist, kann der entsprechende Pin des AVR als normaler I/O-Pin verwendet werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXEN&#039;&#039;&#039; (&#039;&#039;&#039;T&#039;&#039;&#039;ransmitter &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Nur wenn dieses Bit gesetzt ist, arbeitet der Sender des UART überhaupt. Wenn das Bit nicht gesetzt ist, kann der entsprechende Pin des AVR als normaler I/O-Pin verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCSZ2&#039;&#039;&#039; (Characters Size)&lt;br /&gt;
:Dieses Bit setzt in Verbindung mit dem UCSZ1:0 Bits im UCSRC Register die Anzahl von Datenbits eines Frames beim Empfang oder Senden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXB8&#039;&#039;&#039; (Receive Data Bit 8)&lt;br /&gt;
:Wenn das vorher erwähnte CHR9-Bit gesetzt ist, dann enthält dieses Bit das 9. Datenbit eines empfangenen Zeichens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXB8&#039;&#039;&#039; (Transmit Data Bit 8)&lt;br /&gt;
:Wenn das vorher erwähnte CHR9-Bit gesetzt ist, dann muss in dieses Bit das 9. Bit des zu sendenden Zeichens eingeschrieben werden bevor das eigentliche Datenbyte in das Datenregister geschrieben wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UCSRC &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;C&#039;&#039;&#039;.&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;URSEL&#039;&#039;&#039;|| &#039;&#039;&#039;UMSEL&#039;&#039;&#039;|| &#039;&#039;&#039;UPM1&#039;&#039;&#039;|| &#039;&#039;&#039;UPM0&#039;&#039;&#039;|| &#039;&#039;&#039;USBS&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ1&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ0&#039;&#039;&#039;|| &#039;&#039;&#039;UCPOL&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 1|| 0|| 0|| 0|| 0|| 1|| 1|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;URSEL&#039;&#039;&#039; (Register Select)&lt;br /&gt;
:Dieses Bit selektiert die Auswahl des UCSRC- bzw. des UBRRH Registers. Beim Lesen von UCSRC wird es als 1 gelesen. Beim Schreiben auf UCSRC muss es auf 1 gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
:Achtung: Manche Prozessoren verfügen über dieses Bit, andere wiederrum nicht. Was hat es damit auf sich?&amp;lt;br&amp;gt;Um Zugriffsadressen einzusparen, wurde von Atmel ein etwas seltsamer Weg gewählt. Das UCSRC Register und das High-Byte des Baudratenregisters teilen sich dieselbe Registeradresse! Um der Hardware mitzuteilen, welche Bedeutung ein zugewiesener Wert haben soll, entweder neue Belegung des Baudratenregisters oder eben Konfiguration des UCSRC Registers, dient dieses Bit. Ist es nicht gesetzt, dann wird eine Zuweisung immer als Zuweisung an das High-Byte des Baudratenregisters angesehen, selbst wenn das so nicht beabsichtigt war. Nur dann wenn dieses Bit gesetzt ist, dann wird eine Zuweisung auch tatsächlich als eine Zuweisung an das UCSRC Register gewertet und die Konfiguration verändert. Lässt man das Bit irrtümlich weg, dann verursacht eine Zuweisung an UCSRC eine Veränderung der Baudrateneinstellung!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UMSEL&#039;&#039;&#039; (USART Mode Select)&lt;br /&gt;
:Durch dieses Bit kann eine asynchrone oder synchrone Übertragung eingestellt werden. Durch Setzen des Bits wird eine synchrone Übertragung eingestellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UPM1:0&#039;&#039;&#039; (Parity Mode)&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UPM1&#039;&#039;&#039;|| &#039;&#039;&#039;UPM0&#039;&#039;&#039;|| &#039;&#039;&#039;Parity Mode&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| Disabled&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| Enabled, Even Priority&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| Enabled, OddPriority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;USBS&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;SART &#039;&#039;&#039;S&#039;&#039;&#039;top &#039;&#039;&#039;B&#039;&#039;&#039;it &#039;&#039;&#039;S&#039;&#039;&#039;elect)&lt;br /&gt;
:Diese Bits setzen die Anzahl der zu sendenden Stopbits eines Frames. Beim Setzen werden 2 Stopbits übertragen, andernfalls nur 1 Stopbit.&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;USBS&#039;&#039;&#039;|| &#039;&#039;&#039;Anzahl der Stop Bits&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
|  0|| 1&lt;br /&gt;
|- &lt;br /&gt;
|  1|| 2&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCSZ1:0&#039;&#039;&#039; (Character Size)&lt;br /&gt;
:Diese Bits setzen in Verbindung mit UCSZ2 aus dem UCSRB Register die Anzahl der Datenbits eines Frames.&lt;br /&gt;
:Diese Bits setzen den entsprechenden Paritätsmodus.&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UCSZ2&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ1&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ0&#039;&#039;&#039;|| &#039;&#039;&#039;Character Size&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| 0|| 5-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| 1|| 6-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| 0|| 7-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| 1|| 8-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| 0|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| 1|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| 0|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| 1|| 9-Bit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCPOL&#039;&#039;&#039; (Clock Polarity)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UDR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier werden Daten zwischen UART und CPU übertragen. Da der UART im&lt;br /&gt;
Vollduplexbetrieb gleichzeitig empfangen und senden kann, handelt es sich&lt;br /&gt;
hier physikalisch um 2 Register, die aber über die gleiche I/O-Adresse&lt;br /&gt;
angesprochen werden. Je nachdem, ob ein Lese- oder ein Schreibzugriff auf&lt;br /&gt;
den UART erfolgt wird automatisch das richtige UDR angesprochen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UBRR&#039;&#039;&#039;&lt;br /&gt;
| &#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.&amp;lt;br /&amp;gt;&lt;br /&gt;
In diesem Register müssen wir dem UART mitteilen, wie schnell wir gerne kommunizieren möchten. Der Wert, der in dieses Register geschrieben werden muss, errechnet sich nach folgender Formel (wenn U2X Bit 0 gesetzt ist):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\mathrm{UBRR} = \frac{\mathrm{Taktfrequenz}}{\mathrm{Baudrate} \cdot 16} - 1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sind Baudraten bis über 115200 Baud möglich, je nach Controller und CPU-Frequenz. Siehe Datenblatt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== UART initialisieren ==&lt;br /&gt;
&lt;br /&gt;
Wir wollen nun Daten mit dem UART auf die serielle Schnittstelle ausgeben. Dazu müssen wir den UART zuerst mal initialisieren. Dazu setzen wir je nach gewünschter Funktionsweise die benötigten Bits im &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister.&lt;br /&gt;
&lt;br /&gt;
Da wir vorerst nur senden möchten und noch keine Interrupts auswerten wollen, gestaltet sich die Initialisierung wirklich sehr einfach, da wir lediglich das &#039;&#039;&#039;Transmitter Enable&#039;&#039;&#039; Bit setzen müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs mit USART haben mehrere Konfigurationsregister und erfordern eine etwas andere Konfiguration. Für einen ATmega16 z.&amp;amp;nbsp;B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);                           // UART TX einschalten&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1 &amp;lt;&amp;lt; UCSZ1)|(1 &amp;lt;&amp;lt; UCSZ0); // Asynchron 8N1&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun ist noch das Baudratenregister &#039;&#039;&#039;UBRR&#039;&#039;&#039; der verwendeten UARTs einzustellen, bzw. bei neueren AVRs die beiden Register &#039;&#039;&#039;UBRRL&#039;&#039;&#039; und &#039;&#039;&#039;UBRRH&#039;&#039;&#039;. &amp;lt;!--Der Wert dafür ergibt sich aus der unten angegebenen Formel durch Einsetzen der Taktfrequenz und der gewünschten Übertragungsrate. Das Berechnen der Formel wird dem [[C-Präprozessor|Präprozessor]] überlassen. Dabei ist zu beachten, dass der Präprozessor keine Floating Point Ergebnisse liefert, sondern Integer Ergebnisse. Das bedeutet, dass wenn durch Division auf einen Integer Wert 1.99 zugewiesen wird, 0.99 abgeschnitten werden und das Ergebnis 1.0 ist - obwohl 2.0 viel näher wäre.--&amp;gt;. Die Berechnung wird während des Compilerlaufs ausgeführt, beansprucht also in der gezeigten Form weder Speicher noch Rechenzeit des Controllers. Das Ergebniss wird jedoch als ganzzahliger Wert eingesetzt, d.h. Nachkommastellen werden einfach abgeschnitten und es erfolgt keine Rundund. Aus diesem Grund kann man sich eines kleinen Tricks bedienen, indem vor der eigentlichen Division bei der Zuweisung die Hälfte des Wertes dazu addiert wird. Allgemein formuliert bedeutet das: &amp;lt;code&amp;gt;int i = ( a + b/2 ) / b;&amp;lt;/code&amp;gt;. Dies wird in der unten angegebenen Berechnung von UBRR_VAL ausgenutzt um den Fehler zu minimieren. (Eine ausführliche Erklärung zum &#039;&#039;cleveren Runden&#039;&#039; findet sich in einer [http://www.mikrocontroller.net/topic/170617#1631916 Forumsdiskussion].) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* &lt;br /&gt;
  UART-Init: &lt;br /&gt;
Berechnung des Wertes für das Baudratenregister &lt;br /&gt;
aus Taktrate und gewünschter Baudrate&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann&lt;br /&gt;
   F_CPU im Makefile definiert werden, eine nochmalige Definition&lt;br /&gt;
   hier wuerde zu einer Compilerwarnung fuehren. Daher &amp;quot;Schutz&amp;quot; durch&lt;br /&gt;
   #ifndef/#endif &lt;br /&gt;
&lt;br /&gt;
   Dieser &amp;quot;Schutz&amp;quot; kann zu Debugsessions führen, wenn AVRStudio &lt;br /&gt;
   verwendet wird und dort eine andere, nicht zur Hardware passende &lt;br /&gt;
   Taktrate eingestellt ist: Dann wird die folgende Definition &lt;br /&gt;
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) &lt;br /&gt;
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU&lt;br /&gt;
   noch nicht definiert: */&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000&amp;quot;&lt;br /&gt;
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten &lt;br /&gt;
                         // Ohne ergeben sich unten Fehler in der Berechnung&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600UL      // Baudrate&lt;br /&gt;
&lt;br /&gt;
// Berechnungen&lt;br /&gt;
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden&lt;br /&gt;
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate&lt;br /&gt;
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.&lt;br /&gt;
&lt;br /&gt;
#if ((BAUD_ERROR&amp;lt;990) || (BAUD_ERROR&amp;gt;1010))&lt;br /&gt;
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! &lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Makros sind sehr praktisch, da damit sowohl automatisch der Wert für UBRR, als auch die Abweichung in der generierten (möglichen) von der gewünschten Baudrate berechnet wird. Im Falle einer zu hohen Abweichung (+/-1%) wird eine Fehlermeldung ausgegeben und der Compilerablauf abgebrochen. Damit können viele Probleme mit &amp;quot;UART sendet komische Zeichen&amp;quot; vermieden werden. Ausserdem kann man mühelos die Einstellung an eine neue Taktfrequenz bzw. Baudrate anpassen, ohne selber rechnen oder in Tabellen nachschlagen zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung der UART Register kann im Hauptprogramm main() vorgenommen werden. Öfters wird jedoch eine Funktion z.&amp;amp;nbsp;B. uart_init() dafür geschrieben, die in der eigenen Codesammlung in mehreren Projekten verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Für einige AVR (z.&amp;amp;nbsp;B. ATmega169, ATmega48/88/168, AT90CAN jedoch nicht für z.&amp;amp;nbsp;B. ATmega16/32, ATmega128, ATtiny2313) wird durch die Registerdefinitionen der avr-libc (io*.h) auch für Controller mit zwei UBRR-Registern (UBRRL/UBRRH) ein UBRR bzw. UBRR0 als &amp;quot;16-bit-Register&amp;quot; definiert und man kann den Wert direkt per UBRR = UBRR_VAL zuweisen. Intern werden dann zwei Zuweisungen für UBRRH und UBRRL generiert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* UART-Init Bsp. ATmega48 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UBRR0 = UBRR_VAL;&lt;br /&gt;
  UCSR0B |= (1&amp;lt;&amp;lt;TXEN0);&lt;br /&gt;
  // Frame Format: Asynchron 8N1&lt;br /&gt;
  UCSR0C = (1&amp;lt;&amp;lt;UCSZ01)|(1&amp;lt;&amp;lt;UCSZ00);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die einzelne Anweisung ist nicht bei allen Controllern möglich, da die beiden Register nicht bei allen aufeinanderfolgende Addressen aufweisen. Die getrennte Zuweisung an UBRRH und UBRRL wie im nächsten Beispiel gezeigt, ist universeller und portabler und daher vorzuziehen. Wichtig ist, dass UBRRH &#039;&#039;&#039;vor&#039;&#039;&#039; UBRRL geschrieben wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* UART-Init Bsp. ATmega16 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
  UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);  // UART TX einschalten&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0);  // Asynchron 8N1 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inzwischen gibt es in der avr-libc Makros für obige Berechnung der UBRR Registerwerte aus Taktrate F_CPU und Baudrate BAUD. Dazu wird die Includedatei  [http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html &amp;lt;util/setbaud.h&amp;gt;] eingebunden, nachdem F_CPU und die gewünschte Baudrate definiert wurden. Einige Beispiele zur Anwendung finden sich in der Dokumentation der avr-libc. Im Quellcode kann dann analog zur oben gezeigten Vorgehensweise einfach das Makro UBRR_VALUE (bzw. UBRRH_VALUE und UBRRL_VALUE) an der entsprechenden Stelle eingesetzt werden. Es wird auch automatisch ermittelt, ob der U2X-Modus (vgl. Datenblatt) zu geringeren Abweichungen führt und dann dem Makro USE_U2X ein Wert ungleich null zugewiesen. Ein Beispiel (angelehnt an die avr-libc-Dokumentation):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt; &lt;br /&gt;
#define F_CPU 1000000 /* evtl. bereits via Compilerparameter definiert */&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)   &lt;br /&gt;
{&lt;br /&gt;
   UBRRH = UBRRH_VALUE;&lt;br /&gt;
   UBRRL = UBRRL_VALUE;&lt;br /&gt;
   /* evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt)&lt;br /&gt;
      UBRR = UBRR_VALUE;&lt;br /&gt;
   */&lt;br /&gt;
#if USE_2X&lt;br /&gt;
   /* U2X-Modus erforderlich */&lt;br /&gt;
   UCSRA |= (1 &amp;lt;&amp;lt; U2X);&lt;br /&gt;
#else&lt;br /&gt;
   /* U2X-Modus nicht erforderlich */&lt;br /&gt;
   UCSRA &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
   // hier weitere Initialisierungen (TX und/oder RX aktivieren, Modus setzen &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html Dokumentation der avr-libc zu &amp;lt;util/setbaud.h&amp;gt;]&lt;br /&gt;
* [http://www.wormfood.net/avrbaudcalc.php WormFood&#039;s AVR Baud Rate Calculator] online.&lt;br /&gt;
* [http://www.gjlay.de/helferlein/avr-uart-rechner.html AVR Baudraten-Rechner] in JavaScript&lt;br /&gt;
&lt;br /&gt;
== Senden mit dem UART ==&lt;br /&gt;
&lt;br /&gt;
=== Senden einzelner Zeichen ===&lt;br /&gt;
&lt;br /&gt;
Um nun ein Zeichen auf die Schnittstelle auszugeben, müssen wir dasselbe&lt;br /&gt;
lediglich in das &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister schreiben. Vorher ist zu prüfen, ob das UART-Modul bereit ist, das zu sendende Zeichen entgegenzunehmen. Die Bezeichnungen des/der Statusregisters mit dem Bit UDRE ist abhängig vom Controllertypen (vgl. Datenblatt).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&amp;amp;nbsp;B. fuer ATmega16:&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)))  /* warten bis Senden moeglich                   */&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    UDR = &#039;x&#039;;                    /* schreibt das Zeichen x auf die Schnittstelle */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schreiben einer Zeichenkette (String) ===&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe &amp;quot;String senden&amp;quot; wird durch zwei Funktionen abgearbeitet. Die universelle/controllerunabhängige Funktion uart_puts übergibt jeweils ein Zeichen der Zeichenkette an eine Funktion uart_putc, die abhängig von der vorhandenen Hardware implementiert werden muss. In der Funktion zum Senden eines Zeichens ist darauf zu achten, dass vor dem Senden geprüft wird, ob der UART bereit ist den &amp;quot;Sendeauftrag&amp;quot; entgegenzunehmen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* ATmega16 */&lt;br /&gt;
int uart_putc(unsigned char c)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)))  /* warten bis Senden moeglich */&lt;br /&gt;
    {&lt;br /&gt;
    }                             &lt;br /&gt;
&lt;br /&gt;
    UDR = c;                      /* sende Zeichen */&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* puts ist unabhaengig vom Controllertyp */&lt;br /&gt;
void uart_puts (char *s)&lt;br /&gt;
{&lt;br /&gt;
    while (*s)&lt;br /&gt;
    {   /* so lange *s != &#039;\0&#039; also ungleich dem &amp;quot;String-Endezeichen(Terminator)&amp;quot; */&lt;br /&gt;
        uart_putc(*s);&lt;br /&gt;
        s++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die in uart_putc verwendeten Schleifen, in denen gewartet wird bis die UART-Hardware zum senden bereit ist, sind insofern etwas kritisch, da während des Sendens eines Strings nicht mehr auf andere Ereignisse reagiert werden kann. Universeller ist die Nutzung von FIFO(first-in first-out)-Puffern, in denen die zu sendenden bzw. empfangenen Zeichen/Bytes zwischengespeichert und in Interruptroutinen an die U(S)ART-Hardware weitergegeben bzw. von ihr ausgelesen werden. Dazu existieren fertige Komponenten (Bibliotheken, Libraries), die man recht einfach in eigene Entwicklungen integrieren kann. Es empfiehlt sich, diese Komponenten zu nutzen und das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
=== Schreiben von Variableninhalten ===&lt;br /&gt;
&lt;br /&gt;
Sollen Inhalte von Variablen (Ganzzahlen, Gleitkomma) in &amp;quot;menschenlesbarer&amp;quot; Form gesendet werden, ist vor dem Transfer eine Umwandlung in Zeichen (&amp;quot;ASCII&amp;quot;) erforderlich. Bei nur einer Ziffer ist diese Umwandlung relativ einfach: man addiert den ASCII-Wert von Null zur Ziffer und kann diesen Wert direkt senden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_putc (s.o.)&lt;br /&gt;
&lt;br /&gt;
int main (void) &lt;br /&gt;
{&lt;br /&gt;
   // Ausgabe von 0123456789&lt;br /&gt;
   char c;&lt;br /&gt;
&lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   for (uint8_t i=0; i&amp;lt;=9; ++i) {&lt;br /&gt;
      c = i + &#039;0&#039;;&lt;br /&gt;
      uart_putc( c );&lt;br /&gt;
      // verkuerzt: uart_putc( i + &#039;0&#039; );&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll mehr als eine Ziffer ausgegeben werden, bedient man sich zweckmäßigerweise vorhandener Funktionen zur Umwandlung von Zahlen in Zeichenketten/Strings. Die Funktion der avr-libc zur Umwandlung von vorzeichenbehafteten 16bit-Ganzzahlen (int16_t) in Zeichenketten heißt &#039;&#039;itoa&#039;&#039; (Integer to ASCII). Man muss der Funktion einen Speicherbereich zur Verarbeitung (buffer) mit Platz für alle Ziffern, das String-Endezeichen (&#039;\0&#039;) und evtl. das Vorzeichen bereitstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_putc, uart_puts (s.o.)&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   char s[7];&lt;br /&gt;
   int16_t i = -12345;&lt;br /&gt;
   &lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   itoa( i, s, 10 ); // 10 fuer radix -&amp;gt; Dezimalsystem&lt;br /&gt;
   uart_puts( s );&lt;br /&gt;
&lt;br /&gt;
   // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:&lt;br /&gt;
   uart_puts( itoa( i, s, 10 ) );&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für vorzeichenlose 16bit-Ganzzahlen (uint16_t) exisitert &#039;&#039;utoa&#039;&#039;. Die Funktionen für 32bit-Ganzzahlen (int32_t und uint32_t) heißen &#039;&#039;ltoa&#039;&#039; bzw. &#039;&#039;ultoa&#039;&#039;. Da 32bit-Ganzzahlen mehr Stellen aufweisen können, ist ein entsprechend größerer Pufferspeicher vorzusehen.&lt;br /&gt;
&lt;br /&gt;
Auch Gleitkommazahlen (float/double) können mit bereits vorhandenen Funktionen in Zeichenfolgen umgewandelt werden, dazu existieren die Funktionen &#039;&#039;dtostre&#039;&#039; und &#039;&#039;dtostrf&#039;&#039;. dtostre nutzt Exponentialschreibweise (&amp;quot;engineering&amp;quot;-Format). (Hinweis: z.Zt. existiert im avr-gcc kein &amp;quot;echtes&amp;quot; double, intern wird immer mit &amp;quot;einfacher Genauigkeit&amp;quot;, entsprechend float, gerechnet.) &lt;br /&gt;
&lt;br /&gt;
dtostrf und dtostre benötigen die libm.a der avr-libc. Bei Nutzung von Makefiles ist der Parameter -lm in in LDFLAGS anzugeben (Standard in den WinAVR/mfile-Makefilevorlagen). Nutzt man AVRStudio als IDE für den GNU-Compiler (gcc-Plugin) ist die libm.a unter Libaries auszuwählen: Project -&amp;gt; Configurations Options -&amp;gt; Libaries -&amp;gt; libm.a mit dem Pfeil nach rechts einbinden. Siehe auch die [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|FAQ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_putc, uart_puts (s.o.)&lt;br /&gt;
&lt;br /&gt;
/* lt. avr-libc Dokumentation:&lt;br /&gt;
char* dtostrf(&lt;br /&gt;
  double __val,&lt;br /&gt;
  char   __width,&lt;br /&gt;
  char   __prec,&lt;br /&gt;
  char * __s&lt;br /&gt;
)  &lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   // Pufferspeicher ausreichend groß&lt;br /&gt;
   // evtl. Vorzeichen + width + Endezeichen:&lt;br /&gt;
   char s[8]; &lt;br /&gt;
   float f = -12.345;&lt;br /&gt;
   &lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   dtostrf( f, 6, 3, s ); &lt;br /&gt;
   uart_puts( s );&lt;br /&gt;
   // verkürzt: uart_puts( dtostrf( f, 7, 3, s ) );&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Empfangen ==&lt;br /&gt;
=== Einzelne Zeichen empfangen ===&lt;br /&gt;
&lt;br /&gt;
Zum Empfang von Zeichen muss der Empfangsteil des UART bei der Initialisierung aktiviert werden, indem das RXEN-Bit im jeweiligen Konfigurationsregister (UCSRB bzw UCSR0B/UCSR1B) gesetzt wird. Im einfachsten Fall wird solange gewartet, bis ein Zeichen empfangen wurde, dieses steht dann im UART-Datenregister (UDR bzw. UDR0 und UDR1 bei AVRs mit 2 UARTS) zur Verfügung (sogen. &amp;quot;Polling-Betrieb&amp;quot;). Ein Beispiel für den ATmega16:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Siehe auch obere Baudrateneinstellung */&lt;br /&gt;
/* USART-Init beim ATmega16 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0);  // Asynchron 8N1 &lt;br /&gt;
    UCSRB |= (1&amp;lt;&amp;lt;RXEN);                        // UART RX einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Zeichen empfangen */&lt;br /&gt;
uint8_t uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)))   // warten bis Zeichen verfuegbar&lt;br /&gt;
        ;&lt;br /&gt;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und die Anwendung in einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// hier Makro für die Baudratenberechnung &lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_getc (s.o.)&lt;br /&gt;
 &lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  uart_init();&lt;br /&gt;
  while (1) &lt;br /&gt;
  {&lt;br /&gt;
    uint8_t c;&lt;br /&gt;
    c = uart_getc();&lt;br /&gt;
&lt;br /&gt;
    // hier etwas mit c machen z.B. auf PORT ausgeben&lt;br /&gt;
    DDRC = 0xFF; // PORTC Ausgang&lt;br /&gt;
    PORTC = c;&lt;br /&gt;
  }&lt;br /&gt;
  return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion uart_getc() blockiert allerdings den Programmablauf, denn es wird gewartet, bis ein Zeichen empfangen wird! Möchte man das Warten vermeiden, kann das RXC-Bit in einer Programmschleife abgefragt werden und dann nur bei gesetztem RXC-Bit UDR ausgelesen werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// hier Makro für die Baudratenberechnung &lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_getc (s.o.)&lt;br /&gt;
 &lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  uart_init();&lt;br /&gt;
  while (1) &lt;br /&gt;
  {&lt;br /&gt;
    if ( (UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)) )&lt;br /&gt;
    {&lt;br /&gt;
      // Zeichen wurde empfangen, jetzt abholen&lt;br /&gt;
      uint8_t c;&lt;br /&gt;
      c = uart_getc();&lt;br /&gt;
      // hier etwas mit c machen z.B. auf PORT ausgeben&lt;br /&gt;
      DDRC = 0xFF; // PORTC Ausgang&lt;br /&gt;
      PORTC = c;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // Kein Zeichen empfangen, Restprogramm ausführen...&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eleganter und in den meisten Anwendungsfällen &amp;quot;stabiler&amp;quot; ist die Vorgehensweise, die empfangenen Zeichen in einer Interrupt-Routine einzulesen und zur späteren Verarbeitung in einem Eingangsbuffer (FIFO-Buffer) zwischenzuspeichern. Dazu existieren fertige und gut getestete [[Libraries|Bibliotheken]] &amp;lt;!-- &amp;quot;echte Libraries&amp;quot; (.a) wie im Verweis beschrieben sind hier eigentlich nicht gemeint, verwirrt hier etwas, da AVR-&amp;quot;Libraries&amp;quot; meist per #defines anpassbare Source-Codes sind, vielleicht so: --&amp;gt; und Quellcodekomponenten (z.&amp;amp;nbsp;B. UART-Library von P. Fleury, procyon-avrlib und einige in der &amp;quot;Academy&amp;quot; von avrfreaks.net).&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html Dokumenation der avr-libc/stdlib.h]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_sprintf_und_printf Die Nutzung von sprintf und printf]&lt;br /&gt;
* [http://homepage.hispeed.ch/peterfleury/ Peter Fleurys] UART-Bibiliothek fuer avr-gcc/avr-libc&lt;br /&gt;
&amp;lt;!-- nimmermehr: * siehe auch: Weiterführende Informationen inkl. Beispielen für die Nutzung von stdio-Funktionen (printf etc.) im [[AVR-Tutorial:_UART]]. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: 9bit&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Zeichenketten (Strings) ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Zeichenketten, muß man sich zunächst darüber im klaren sein, daß es ein Kriterium geben muß, an dem der µC erkennen kann, wann ein Text zu Ende ist. Sehr oft wird dazu das Zeichen &#039;Return&#039; benutzt, um das Ende eines Textes zu markieren. Dies ist vom Benutzer einfach eingebbar und er ist auch daran gewöhnt, daß er eine Eingabezeile mit einem Druck auf die Return Taste abgeschlossen wird.&lt;br /&gt;
&lt;br /&gt;
Prinzipiell gibt es jedoch keine Einschränkung bezüglich dieses speziellen Zeichens. Es muß nur sichergestellt werden, daß dieses spezielle &#039;Ende eines Strings&#039; - Zeichen nicht mit einem im Text vorkommenden Zeichen verwechselt werden kann. Wenn also im zu übertragenden Text beispielsweise kein &#039;;&#039; vorkommt, dann spricht nichts dagegen, den Benutzer die Eingabe eines Textes mit einem &#039;;&#039; abschließen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die durchaus übliche Annahme getroffen, daß eine Stringübertragung identisch ist mit der Übertragung einer Textzeile und daher mit einem Return (&#039;\n&#039;) abgeschlossen wird.&lt;br /&gt;
&lt;br /&gt;
Das Problem der Übertragung eines Strings reduziert sich damit auf die Aufgabenstellung: Empfange und sammle Zeichen in einem char Array, bis entweder das Array voll ist oder das Text Ende Zeichen&#039; empfangen wurde. Danach wird der empfangene Text noch mit einem &#039;\0&#039; Zeichen abgeschlossen um einen Standard C-String daraus zu machen, mit dem dann weiter gearbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
/* Zeichen empfangen */&lt;br /&gt;
uint8_t uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)))   // warten bis Zeichen verfuegbar&lt;br /&gt;
        ;&lt;br /&gt;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_gets( char* Buffer, uint8_t MaxLen )&lt;br /&gt;
{&lt;br /&gt;
  uint8_t NextChar;&lt;br /&gt;
  uint8_t StringLen = 0;&lt;br /&gt;
&lt;br /&gt;
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen&lt;br /&gt;
&lt;br /&gt;
                                  // Sammle solange Zeichen, bis:&lt;br /&gt;
                                  // * entweder das String Ende Zeichen kam&lt;br /&gt;
                                  // * oder das aufnehmende Array voll ist&lt;br /&gt;
  while( NextChar != &#039;\n&#039; &amp;amp;&amp;amp; StringLen &amp;lt; MaxLen - 1 ) {&lt;br /&gt;
    *Buffer++ = NextChar;&lt;br /&gt;
    StringLen++;&lt;br /&gt;
    NextChar = uart_getc();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
                                  // Noch ein &#039;\0&#039; anhängen um einen Standard&lt;br /&gt;
                                  // C-String daraus zu machen&lt;br /&gt;
  *Buffer = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf ist darauf zu achten, dass das empfangende Array auch mit einer&lt;br /&gt;
vernünftigen Größe definiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  char Line[40];      // String mit maximal 39 zeichen&lt;br /&gt;
&lt;br /&gt;
  uart_gets( Line, sizeof( Line ) );&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Benutzung von sizeof() ist allerdings zu beachten, dass sizeof() nicht die Anzahl der Elemente des Arrays liefert, sondern die Länge in Byte. Da ein char nur ein Byte lang ist, passt der Aufruf &#039;uart_gets(Line, sizeof( Line ) );&#039; in diesem Fall. Falls man - aus welchen Gründen auch immer - andere Datentypen benutzen möchte, sollte man zur korrekten Angabe der Array-Länge folgende Vorgehensweise bevorzugen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
  int Line[40];      // Array vom Typ int&lt;br /&gt;
&lt;br /&gt;
  uart_gets( Line, sizeof( Line ) / sizeof( Line[0] ) );&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interruptbetrieb==&lt;br /&gt;
&lt;br /&gt;
Hier wird das Grundwissen des Artikels [[Interrupt]] und des Abschnitts [[AVR-GCC-Tutorial#Programmieren_mit_Interrupts|AVR-GCC-Tutorial: Programmieren_mit_Interrupts]] vorausgesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Empfangen (RX) ===&lt;br /&gt;
&lt;br /&gt;
Beim ATmega8 muss das &#039;&#039;&#039;RXCIE&#039;&#039;&#039; Bit im Register UCSRB gesetzt werden, damit ein Interrupt beim Empfang eines Zeichens ausgelöst werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* siehe auch obere Baudrateneinstellung */&lt;br /&gt;
/* USART-Init beim ATmega16 */&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
  UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0); // Asynchron 8N1 &lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;RXEN)|(1&amp;lt;&amp;lt;TXEN)|(1&amp;lt;&amp;lt;RXCIE);  // UART RX, TX und RX Interrupt einschalten&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich muss &amp;quot;Global Interrupt Enable&amp;quot; mittels des Befehls sei() aktiviert sein. Interrupt-spezifische Definitionen werden über die Includedatei eingebunden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Interrupt wird immer ausgelöst, wenn ein Zeichen erfolgreich empfangen wurde. Zusätzlich braucht man die Interruptserviceroutine (ISR). &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel enthält die ISR einen FIFO-Puffer (First in, First out). Dafür werden ein paar globale Variablen und Makros benötigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define UART_MAXSTRLEN 10&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart_str_complete = 0;     // 1 .. String komplett empfangen&lt;br /&gt;
volatile uint8_t uart_str_count = 0;&lt;br /&gt;
volatile char uart_string[UART_MAXSTRLEN + 1] = &amp;quot;&amp;quot;;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(USART_RXC_vect)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char nextChar;&lt;br /&gt;
&lt;br /&gt;
  // Daten aus dem Puffer lesen&lt;br /&gt;
  nextChar = UDR;&lt;br /&gt;
  if( uart_str_complete == 0 ) {	// wenn uart_string gerade in Verwendung, neues Zeichen verwerfen&lt;br /&gt;
&lt;br /&gt;
    // Daten werden erst in uart_string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird&lt;br /&gt;
    if( nextChar != &#039;\n&#039; &amp;amp;&amp;amp;&lt;br /&gt;
        nextChar != &#039;\r&#039; &amp;amp;&amp;amp;&lt;br /&gt;
        uart_str_count &amp;lt; UART_MAXSTRLEN - 1 ) {&lt;br /&gt;
      uart_string[uart_str_count] = nextChar;&lt;br /&gt;
      uart_str_count++;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      uart_string[uart_str_count] = &#039;\0&#039;;&lt;br /&gt;
      uart_str_count = 0;&lt;br /&gt;
      uart_str_complete = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Funktion: Wurde eine komplette Zeichenkette empfangen, also das Ende (\n oder \r) erkannt oder die maximale Länge &#039;&#039;UART_MAXSTRLEN&#039;&#039; erreicht, wird die globale Variable &#039;&#039;uart_str_complete&#039;&#039; auf &#039;1&#039; gesetzt. Damit wird dem Hauptprogramm, welches auf diese Variable pollt, mitgeteilt, dass die Zeichenkette &#039;&#039;uart_string&#039;&#039; zur Verarbeitung bereit steht. Nach der Verarbeitung der Zeichenkette in der entsprechenden main-Routine, muss die Variable &#039;&#039;uart_str_complete&#039;&#039; wieder auf &#039;0&#039; zurück gesetzt werden. Dadurch werden alle neu empfangenen Zeichen wieder in den globalen Puffer geschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Baustelle) ===&lt;br /&gt;
&lt;br /&gt;
* Empfangen (Receive) (Anm.: z.T. erledigt)&lt;br /&gt;
** ggf. Fallstricke ([http://www.mikrocontroller.net/topic/84256#707214 UDR in der ISR lesen!])&lt;br /&gt;
** Komplettes, einfaches Beispiel ([http://www.mikrocontroller.net/topic/84228#707052 Echo] (noch buggy beim Datenzugriff, siehe Lit. 2+3!)), ggf. LED zur ISR-Empfangsanzeige oder Overflow-Anzeige&lt;br /&gt;
&lt;br /&gt;
* Senden (Transmit)&lt;br /&gt;
** Variante &amp;quot;UART Data Register Empty&amp;quot; (UDRE) [http://www.mikrocontroller.net/topic/101472#882716]&lt;br /&gt;
** Variante &amp;quot;UART Transmit Complete&amp;quot; (TXC) &lt;br /&gt;
&lt;br /&gt;
* FIFO-Puffer [http://www.mikrocontroller.net/topic/101472#882716], Ringpuffer (Byte Buffering (circular))&lt;br /&gt;
&lt;br /&gt;
* UART-Bibliotheken &lt;br /&gt;
** [http://homepage.hispeed.ch/peterfleury/avr-software.html UART-Library] von Peter Fleury (UART (interrupt driven), Byte Buffering (circular))&lt;br /&gt;
** [http://beaststwo.org/avr-uart/index.shtml Updated AVR UART Library]  (modernisierte und erweiterte Version der Bibliothek von Peter Fleury)&lt;br /&gt;
** [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] von Pascal Stang (UART (interrupt driven), Byte Buffering (circular), VT100 Terminal Output)&lt;br /&gt;
&lt;br /&gt;
* Literatur &lt;br /&gt;
** [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=48188 avrfreaks.net Tutorial] inkl. Diskussion (engl.)&lt;br /&gt;
** avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_16bitio Why do some 16-bit timer registers sometimes get trashed?]&lt;br /&gt;
&lt;br /&gt;
==Software-UART==&lt;br /&gt;
&lt;br /&gt;
Falls die Zahl der vorhandenen Hardware-UARTs nicht ausreicht, können weitere Schnittstellen über sogennante Software-UARTs ergänzt werden. Es gibt dazu (mindestens) zwei Ansätze: &lt;br /&gt;
* Der bei AVRs üblichste Ansatz basiert auf dem Prinzip, dass ein externer Interrupt-Pin für den Empfang (&amp;quot;RX&amp;quot;) genutzt wird. Das Startbit löst den Interrupt aus, in der Interrupt-Routine (ISR) wird der externe Interrupt deaktiviert und ein Timer aktiviert. In der Interrupt-Routine des Timers wird der Zustand des Empfangs-Pins entsprechend der Baudrate abgetastet. Nach Empfang des Stop-Bits wird der externe Interrupt wieder aktiviert. Senden kann über einen beliebigen Pin (&amp;quot;TX&amp;quot;) erfolgen, der entsprechend der Baudrate und dem zu sendenden Zeichen auf 0 oder 1 gesetzt wird. Die Implementierung ist nicht ganz einfach, es existieren dazu aber fertige Bibliotheken (z.&amp;amp;nbsp;B. bei [http://www.avrfreaks.net/ avrfreaks] oder in der [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon avrlib]).&lt;br /&gt;
* Ein weiterer Ansatz erfordert keinen Pin mit &amp;quot;Interrupt-Funktion&amp;quot; aber benötigt mehr Rechenzeit. Jeder Input-Pin kann als Empfangspin (RX) dienen. Über einen Timer wird der Zustand des RX-Pins mit einem vielfachen der Baudrate abgetastet (dreifach scheint üblich) und High- bzw. Lowbits anhand einer Mindestanzahl identifiziert. (Beispiel: &amp;quot;Generic Software Uart&amp;quot; Application-Note von IAR)&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs (z.&amp;amp;nbsp;B. ATtiny26 oder ATmega48,88,168,169) verfügen über ein Universal Serial Interface (USI), das teilweise UART-Funktion übernehmen kann. Atmel stellt eine Application-Note bereit, in der die Nutzung des USI als UART erläutert wird (im Prinzip &amp;quot;Hardware-unterstützter Software-UART&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Handshaking==&lt;br /&gt;
Wenn der Sender ständig sendet, wird irgendwann der Fall eintreten, daß der Empfänger nicht bereit ist, neue Zeichen zu empfangen. In diesem Fall muß durch ein &#039;&#039;&#039;Handshake-Verfahren&#039;&#039;&#039; die Situation bereinigt werden. Handshake bedeutet nichts anderes, als daß der Empfänger dem Sender mitteilt, daß er zur Zeit keine Daten annehmen kann und der Sender die Übertragung der nächsten Zeichen solange einstellen soll, bis der Empfänger signalisiert, daß er wieder Zeichen aufnehmen kann.&lt;br /&gt;
===Hardwarehandshake (RTS/CTS)===&lt;br /&gt;
Beim Hardwarehandshake werden zusätzlich zu den beiden Daten-Übertragungsleitungen noch 2 weitere Leitungen benötigt: &#039;&#039;&#039;RTS&#039;&#039;&#039; (&#039;&#039;&#039;R&#039;&#039;&#039;equest &#039;&#039;&#039;T&#039;&#039;&#039;o &#039;&#039;&#039;S&#039;&#039;&#039;end) und &#039;&#039;&#039;CTS&#039;&#039;&#039; (&#039;&#039;&#039;C&#039;&#039;&#039;lear &#039;&#039;&#039;T&#039;&#039;&#039;o &#039;&#039;&#039;S&#039;&#039;&#039;end). Jeder der beiden Kommunikationspartner ist verpflichtet, bevor ein Zeichen gesendet wird, den Zustand der &#039;&#039;&#039;RTS&#039;&#039;&#039; Leitung zu überprüfen. Nur wenn die Gegenstelle darauf Empfangsbereitschaft signalisiert, darf das Zeichen gesendet werden. Um der Gegenstelle zu signalisieren, daß sie zur Zeit keine Zeichen schicken soll, wird die Leitung &#039;&#039;&#039;CTS&#039;&#039;&#039; benutzt.&lt;br /&gt;
&lt;br /&gt;
===Softwarehandshake (XON/XOFF)===&lt;br /&gt;
Beim Softwarehandshake sind keine speziellen Leitungen notwendig. Statt dessen werden besondere ASCII-Zeichen benutzt, die der Gegenstelle signalisieren, daß Senden einzustellen bzw. wieder aufzunehmen.&amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;XOFF&#039;&#039;&#039; Aufforderung das Senden einzustellen&lt;br /&gt;
* &#039;&#039;&#039;XON&#039;&#039;&#039;  Gegenstelle darf wieder senden&lt;br /&gt;
&lt;br /&gt;
Nachteilig bei einem Softwarehandshake ist es, dass dadurch keine direkte binäre Datenübertragung mehr möglich ist. Von den möglichen 256 Bytewerten werden ja 2 (nämlich &#039;&#039;&#039;XON&#039;&#039;&#039; und &#039;&#039;&#039;XOFF&#039;&#039;&#039;) für besondere Zwecke benutzt und fallen daher aus.&lt;br /&gt;
&lt;br /&gt;
==Galvanische Trennung==&lt;br /&gt;
Für eine geringe Überspannungsfestigkeit empfielt es sich, die Datenkanäle über Optokoppler zu führen. Es bietet sich z.b. der 6N138 an, ein &amp;quot;normaler&amp;quot; CNY-17 ist für hohe Baudraten nicht brauchbar.&lt;br /&gt;
&lt;br /&gt;
==Fehlersuche==&lt;br /&gt;
Erstaunlich oft wird im Forum der Hilferuf laut: &amp;quot;Meine UART funktioniert nicht, was mache ich falsch&amp;quot;. In der überwiegenden Mehrzahl der Fälle stellt sich dann heraus, daß es sich um ein Hardwareproblem handelt, wobei da wiederrum der Löwenanteil auf das Konto einer nicht korrekt eingestellten Taktrate geht: Der µC benutzt nicht einen angeschlossenen Quarz, so wie er auch im Programm eingetragen ist, sondern läuft immer noch mit dem internen RC-Takt. Daraus resultiert aber auch, daß der Baudraten Konfigurationswert falsch berechnet wird.&lt;br /&gt;
&lt;br /&gt;
Hilfreich zum Aufspüren solcher Fehler ist auch die [[AVR_Checkliste#UART/USART|AVR-Checkliste]].&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
Tipps zur Verarbeitung von Strings sind in den [[FAQ]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;/div&gt;</summary>
		<author><name>Rolfn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Der_UART&amp;diff=58815</id>
		<title>AVR-GCC-Tutorial/Der UART</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Der_UART&amp;diff=58815"/>
		<updated>2011-07-22T22:24:25Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: Link zu &amp;quot;Procyon AVRlib&amp;quot; korrigiert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Über den [[UART]] kann ein [[AVR]] leicht mit einer [[RS-232]]-Schnittstelle eines PC oder sonstiger Geräte mit &amp;quot;[[seriell]]er Schnittstelle&amp;quot; verbunden werden. &lt;br /&gt;
&lt;br /&gt;
== Allgemeines zum UART ==&lt;br /&gt;
&lt;br /&gt;
Mögliche Anwendungen des UART:&lt;br /&gt;
&lt;br /&gt;
;Debug-Schnittstelle: z.&amp;amp;nbsp;B. zur Anzeige von Zwischenergebnissen (&amp;quot;printf-debugging&amp;quot; - hier besser &amp;quot;Logging&amp;quot; oder &amp;quot;UART-debugging&amp;quot;) über [[RS-232]] auf einem PC. Auf dem Rechner reicht dazu ein [[RS-232#Terminalprogramme|Terminalprogramm]] (MS-Windows: Hyperterm oder besser [https://sites.google.com/site/terminalbpp/], [http://www.der-hammer.info/terminal/ HTerm]; Unix/Linux z.&amp;amp;nbsp;B. minicom). Ein direkter Anschluss ist aufgrund unterschiedlicher Pegel nicht möglich, jedoch sind entsprechende Schnittstellen-ICs wie z.&amp;amp;nbsp;B. ein MAX232 günstig und leicht zu integrieren. Rechner ohne serielle Schnittstelle können über fertige USB-seriell-Adapter angeschlossen werden. &lt;br /&gt;
;Mensch-Maschine Schnittstelle: z.&amp;amp;nbsp;B. Konfiguration und Statusabfrage über eine &amp;quot;Kommandozeile&amp;quot; oder Menüs (siehe z.&amp;amp;nbsp;B. Forumsbeitrag [http://www.mikrocontroller.net/topic/52985 Auswertung RS232-Befehle] und Artikel [[Tinykon]]) &lt;br /&gt;
;Übertragen von gespeicherten Werten: z.&amp;amp;nbsp;B. bei einem Datenlogger&lt;br /&gt;
;Anschluss von Geräten: mit serieller Schnittstelle (z.&amp;amp;nbsp;B. (Funk-)Modems, Mobiltelefone, Drucker, Sensoren, &amp;quot;intelligente&amp;quot; LC-Displays, GPS-Empfänger). &lt;br /&gt;
;&amp;quot;Feldbusse&amp;quot;: auf RS485/RS422-Basis mittels entsprechenden Bustreiberbausteinen (z.&amp;amp;nbsp;B. MAX485)&lt;br /&gt;
;DMX, Midi: etc.&lt;br /&gt;
;LIN-Bus: &#039;&#039;&#039;L&#039;&#039;&#039;ocal &#039;&#039;&#039;I&#039;&#039;&#039;nterconnect &#039;&#039;&#039;N&#039;&#039;&#039;etwork: Preiswerte Sensoren/Aktoren in der Automobiltechnik und darüber hinaus&lt;br /&gt;
&lt;br /&gt;
Einige AVR-Controller haben ein bis zwei vollduplexfähige UART (&#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;A&#039;&#039;&#039;synchronous &#039;&#039;&#039;R&#039;&#039;&#039;eceiver and &#039;&#039;&#039;T&#039;&#039;&#039;ransmitter) schon eingebaut (&amp;quot;Hardware-UART&amp;quot;). &lt;br /&gt;
Übrigens: Vollduplex heißt nichts anderes, als dass der Baustein gleichzeitig senden und empfangen kann.&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs (ATmega, ATtiny) verfügen über einen bis vier U&#039;&#039;&#039;S&#039;&#039;&#039;ART(s), dieser unterscheidet sich vom UART hauptsächlich durch interne FIFO-Puffer für Ein- und Ausgabe und erweiterte Konfigurationsmöglichkeiten. Die Puffergröße ist allerdings nur 1 Byte.&lt;br /&gt;
&lt;br /&gt;
== Die Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der UART basiert auf normalem TTL-Pegel mit 0V (logisch 0) und 5V (logisch 1). Die Schnittstellenspezifikation für RS-232 definiert jedoch -3V ... -12V (logisch 1) und&lt;br /&gt;
+3 ... +12V (logisch 0). Daher muss der Signalaustausch zwischen AVR und Partnergerät invertiert werden. Für die Anpassung der Pegel und das Invertieren der Signale gibt es fertige Schnittstellenbausteine. Der bekannteste davon ist wohl der MAX232. &lt;br /&gt;
&amp;lt;!-- &amp;quot;Hackerloesung&amp;quot; auskommentiert - nicht so gut in einem &amp;quot;Einsteiger-Tutorial&amp;quot; - mthomas&lt;br /&gt;
Allerdings kostet der auch wieder Geld und benötigt&lt;br /&gt;
zusätzlich immerhin 4 externe Elkos.&lt;br /&gt;
&lt;br /&gt;
Die in den PC eingebauten Schnittstellen vertragen ohne Klagen auch den TTL-Pegel vom AVR. Allerdings müssen wir immer noch die Signale invertieren. Im einfachtesn Fall verwenden wir dazu jeweils einen einfachen NPN-Transistor und 2 Widerstände. Näheres dazu erfahrt ihr in den folgenden Übungen.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Streikt die Kommunikation per UART, so ist oft eine fehlerhafte Einstellung der Baudrate die Ursache. Die Konfiguration auf eine bestimmte Baudrate ist abhängig von der Taktfrequenz des Controllers. Gerade bei neu aufgebauten Schaltungen (bzw. neu gekauften Controllern) sollte man sich daher noch einmal vergewissern, dass der Controller auch tatsächlich mit der vermuteten Taktrate arbeitet und nicht z.&amp;amp;nbsp;B. den bei einigen Modellen werksseitig eingestellten internen [[Oszillator]] statt eines externen Quarzes nutzt. Die Werte der verschiedenen fuse-bits im Fehlerfall also beispielsweise mit &#039;&#039;[[AVRDUDE]]&#039;&#039; kontrollieren und falls nötig anpassen. Grundsätzlich empfiehlt sich auch immer ein Blick in die [[AVR_Checkliste]].&lt;br /&gt;
&lt;br /&gt;
== Die UART-Register ==&lt;br /&gt;
&lt;br /&gt;
Der UART wird über vier separate Register angesprochen. Die USARTs der ATMEGAs verfügen über mehrere zusätzliche Konfigurationsregister. Das Datenblatt gibt darüber Auskunft. Die folgende Tabelle gibt nur die Register für die UARTs der ATmega8/16/32 u.ä. wieder.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UCSRA&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;A&#039;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier teilt uns der UART mit, was er gerade so macht.&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;RXC&#039;&#039;&#039;|| &#039;&#039;&#039;TXC&#039;&#039;&#039;|| &#039;&#039;&#039;UDRE&#039;&#039;&#039;|| &#039;&#039;&#039;FE&#039;&#039;&#039;|| &#039;&#039;&#039;DOR&#039;&#039;&#039;|| &#039;&#039;&#039;PE&#039;&#039;&#039;|| &#039;&#039;&#039;U2X&#039;&#039;&#039;|| &#039;&#039;&#039;MPCM&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R|| R/W|| R|| R|| R|| R|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 1|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXC&#039;&#039;&#039; (UART Receive Complete)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn ein empfangenes Zeichen vom Empfangs-Schieberegister in das Empfangs-Datenregister transferiert wurde.&lt;br /&gt;
:Das Zeichen muss nun schnellstmöglich aus dem Datenregister ausgelesen werden. Falls dies nicht erfolgt, bevor ein weiteres Zeichen komplett empfangen wurde, wird eine Überlauf-Fehlersituation eintreten. Mit dem Auslesen des Datenregisters wird das Bit automatisch gelöscht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXC&#039;&#039;&#039; (UART Transmit Complete)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn das im Sende-Schieberegister befindliche Zeichen vollständig ausgegeben wurde und kein weiteres Zeichen im Sendedatenregister ansteht. Dies bedeutet also, dass die Kommunikation vollumfänglich abgeschlossen ist.&lt;br /&gt;
:Dieses Bit ist wichtig bei Halbduplex-Verbindungen, wenn das Programm nach dem Senden von Daten auf Empfang schalten muss. Im Vollduplexbetrieb brauchen wir dieses Bit nicht zu beachten.&lt;br /&gt;
:Das Bit wird nur dann automatisch gelöscht, wenn der entsprechende Interrupthandler aufgerufen wird, ansonsten müssen wir das Bit selber löschen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UDRE&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;E&#039;&#039;&#039;mpty)&lt;br /&gt;
:Dieses Bit zeigt an, ob der Sendepuffer bereit ist, um ein zu sendendes Zeichen aufzunehmen. Das Bit wird vom AVR gesetzt (1), wenn der Sendepuffer leer ist. Es wird gelöscht (0), wenn ein Zeichen im Sendedatenregister vorhanden ist und noch nicht in das Sende-Schieberegister übernommen wurde. Atmel empfiehlt aus Kompatibilitätsgründen mit kommenden µC, UDRE auf 0 zu setzen, wenn das UCSRA Register beschrieben wird.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn ein Zeichen in das Sendedatenregister geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FE&#039;&#039;&#039; (&#039;&#039;&#039;F&#039;&#039;&#039;raming &#039;&#039;&#039;E&#039;&#039;&#039;rror)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn der UART einen Zeichenrahmenfehler detektiert, d.h. wenn das Stopbit eines empfangenen Zeichens 0 ist.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das Stopbit des empfangenen Zeichens 1 ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DOR&#039;&#039;&#039; (&#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;R&#039;&#039;&#039;un)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn unser Programm das im Empfangsdatenregister bereit liegende Zeichen nicht abholt bevor das nachfolgende Zeichen komplett empfangen wurde.&lt;br /&gt;
:Das nachfolgende Zeichen wird verworfen.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das empfangene Zeichen in das Empfangsdatenregister transferiert werden konnte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PE&#039;&#039;&#039; (&#039;&#039;&#039;P&#039;&#039;&#039;arity &#039;&#039;&#039;E&#039;&#039;&#039;rror&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn das im Empfangsdatenregister bereit liegende Zeichen eine Paritätsfehler aufweist.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das empfangene Zeichen in das Empfangsdatenregister transferiert werden konnte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;U2X&#039;&#039;&#039; (Double the transmission speed)&lt;br /&gt;
:Dieses Bit wird lediglich im asynchronen Modus genutzt. Im synchronen Modus ist es 0 zu setzen. Wird das Bit gesetzt, so wird der Baudraten Divisor von 16 auf 8 reduziert, was einer Verdopplung der Transferrate gleich kommt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MPCM&#039;&#039;&#039; (&#039;&#039;&#039;M&#039;&#039;&#039;ulti &#039;&#039;&#039;P&#039;&#039;&#039;rozessor &#039;&#039;&#039;C&#039;&#039;&#039;ommunication &#039;&#039;&#039;M&#039;&#039;&#039;ode)&lt;br /&gt;
:Dieses Bit aktiviert die Multi-Prozessor-Kommunikation. Jeder eintreffende Frame der keine Adressinformation enthält wird dadurch ignoriert.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UCSRB &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;B&#039;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
In diesem Register stellen wir ein, wie wir den UART verwenden möchten.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Register 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;
|- &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;RXCIE&#039;&#039;&#039;|| &#039;&#039;&#039;TXCIE&#039;&#039;&#039;|| &#039;&#039;&#039;UDRIE&#039;&#039;&#039;|| &#039;&#039;&#039;RXEN&#039;&#039;&#039;|| &#039;&#039;&#039;TXEN&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ2&#039;&#039;&#039;|| &#039;&#039;&#039;RXB8&#039;&#039;&#039;|| &#039;&#039;&#039;TXB8&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R|| 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;
&#039;&#039;&#039;RXCIE&#039;&#039;&#039; (&#039;&#039;&#039;RX&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;omplete &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART RX Complete Interrupt ausgelöst, wenn ein Zeichen vom UART empfangen wurde. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXCIE&#039;&#039;&#039; (&#039;&#039;&#039;TX&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;omplete &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART TX Complete Interrupt ausgelöst, wenn ein Zeichen vom UART gesendet wurde. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UDRIE&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;E&#039;&#039;&#039;mpty &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART Datenregister Leer Interrupt ausgelöst, wenn der UART wieder bereit ist um ein neues zu sendendes Zeichen zu übernehmen. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXEN&#039;&#039;&#039; (&#039;&#039;&#039;R&#039;&#039;&#039;eceiver &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Nur wenn dieses Bit gesetzt ist, arbeitet der Empfänger des UART überhaupt. Wenn das Bit nicht gesetzt ist, kann der entsprechende Pin des AVR als normaler I/O-Pin verwendet werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXEN&#039;&#039;&#039; (&#039;&#039;&#039;T&#039;&#039;&#039;ransmitter &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Nur wenn dieses Bit gesetzt ist, arbeitet der Sender des UART überhaupt. Wenn das Bit nicht gesetzt ist, kann der entsprechende Pin des AVR als normaler I/O-Pin verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCSZ2&#039;&#039;&#039; (Characters Size)&lt;br /&gt;
:Dieses Bit setzt in Verbindung mit dem UCSZ1:0 Bits im UCSRC Register die Anzahl von Datenbits eines Frames beim Empfang oder Senden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXB8&#039;&#039;&#039; (Receive Data Bit 8)&lt;br /&gt;
:Wenn das vorher erwähnte CHR9-Bit gesetzt ist, dann enthält dieses Bit das 9. Datenbit eines empfangenen Zeichens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXB8&#039;&#039;&#039; (Transmit Data Bit 8)&lt;br /&gt;
:Wenn das vorher erwähnte CHR9-Bit gesetzt ist, dann muss in dieses Bit das 9. Bit des zu sendenden Zeichens eingeschrieben werden bevor das eigentliche Datenbyte in das Datenregister geschrieben wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UCSRC &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;C&#039;&#039;&#039;.&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;URSEL&#039;&#039;&#039;|| &#039;&#039;&#039;UMSEL&#039;&#039;&#039;|| &#039;&#039;&#039;UPM1&#039;&#039;&#039;|| &#039;&#039;&#039;UPM0&#039;&#039;&#039;|| &#039;&#039;&#039;USBS&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ1&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ0&#039;&#039;&#039;|| &#039;&#039;&#039;UCPOL&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 1|| 0|| 0|| 0|| 0|| 1|| 1|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;URSEL&#039;&#039;&#039; (Register Select)&lt;br /&gt;
:Dieses Bit selektiert die Auswahl des UCSRC- bzw. des UBRRH Registers. Beim Lesen von UCSRC wird es als 1 gelesen. Beim Schreiben auf UCSRC muss es auf 1 gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
:Achtung: Manche Prozessoren verfügen über dieses Bit, andere wiederrum nicht. Was hat es damit auf sich?&amp;lt;br&amp;gt;Um Zugriffsadressen einzusparen, wurde von Atmel ein etwas seltsamer Weg gewählt. Das UCSRC Register und das High-Byte des Baudratenregisters teilen sich dieselbe Registeradresse! Um der Hardware mitzuteilen, welche Bedeutung ein zugewiesener Wert haben soll, entweder neue Belegung des Baudratenregisters oder eben Konfiguration des UCSRC Registers, dient dieses Bit. Ist es nicht gesetzt, dann wird eine Zuweisung immer als Zuweisung an das High-Byte des Baudratenregisters angesehen, selbst wenn das so nicht beabsichtigt war. Nur dann wenn dieses Bit gesetzt ist, dann wird eine Zuweisung auch tatsächlich als eine Zuweisung an das UCSRC Register gewertet und die Konfiguration verändert. Lässt man das Bit irrtümlich weg, dann verursacht eine Zuweisung an UCSRC eine Veränderung der Baudrateneinstellung!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UMSEL&#039;&#039;&#039; (USART Mode Select)&lt;br /&gt;
:Durch dieses Bit kann eine asynchrone oder synchrone Übertragung eingestellt werden. Durch Setzen des Bits wird eine synchrone Übertragung eingestellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UPM1:0&#039;&#039;&#039; (Parity Mode)&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UPM1&#039;&#039;&#039;|| &#039;&#039;&#039;UPM0&#039;&#039;&#039;|| &#039;&#039;&#039;Parity Mode&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| Disabled&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| Enabled, Even Priority&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| Enabled, OddPriority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;USBS&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;SART &#039;&#039;&#039;S&#039;&#039;&#039;top &#039;&#039;&#039;B&#039;&#039;&#039;it &#039;&#039;&#039;S&#039;&#039;&#039;elect)&lt;br /&gt;
:Diese Bits setzen die Anzahl der zu sendenden Stopbits eines Frames. Beim Setzen werden 2 Stopbits übertragen, andernfalls nur 1 Stopbit.&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;USBS&#039;&#039;&#039;|| &#039;&#039;&#039;Anzahl der Stop Bits&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
|  0|| 1&lt;br /&gt;
|- &lt;br /&gt;
|  1|| 2&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCSZ1:0&#039;&#039;&#039; (Character Size)&lt;br /&gt;
:Diese Bits setzen in Verbindung mit UCSZ2 aus dem UCSRB Register die Anzahl der Datenbits eines Frames.&lt;br /&gt;
:Diese Bits setzen den entsprechenden Paritätsmodus.&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UCSZ2&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ1&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ0&#039;&#039;&#039;|| &#039;&#039;&#039;Character Size&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| 0|| 5-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| 1|| 6-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| 0|| 7-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| 1|| 8-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| 0|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| 1|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| 0|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| 1|| 9-Bit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCPOL&#039;&#039;&#039; (Clock Polarity)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UDR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier werden Daten zwischen UART und CPU übertragen. Da der UART im&lt;br /&gt;
Vollduplexbetrieb gleichzeitig empfangen und senden kann, handelt es sich&lt;br /&gt;
hier physikalisch um 2 Register, die aber über die gleiche I/O-Adresse&lt;br /&gt;
angesprochen werden. Je nachdem, ob ein Lese- oder ein Schreibzugriff auf&lt;br /&gt;
den UART erfolgt wird automatisch das richtige UDR angesprochen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UBRR&#039;&#039;&#039;&lt;br /&gt;
| &#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.&amp;lt;br /&amp;gt;&lt;br /&gt;
In diesem Register müssen wir dem UART mitteilen, wie schnell wir gerne kommunizieren möchten. Der Wert, der in dieses Register geschrieben werden muss, errechnet sich nach folgender Formel (wenn U2X Bit 0 gesetzt ist):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\mathrm{UBRR} = \frac{\mathrm{Taktfrequenz}}{\mathrm{Baudrate} \cdot 16} - 1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sind Baudraten bis über 115200 Baud möglich, je nach Controller und CPU-Frequenz. Siehe Datenblatt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== UART initialisieren ==&lt;br /&gt;
&lt;br /&gt;
Wir wollen nun Daten mit dem UART auf die serielle Schnittstelle ausgeben. Dazu müssen wir den UART zuerst mal initialisieren. Dazu setzen wir je nach gewünschter Funktionsweise die benötigten Bits im &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister.&lt;br /&gt;
&lt;br /&gt;
Da wir vorerst nur senden möchten und noch keine Interrupts auswerten wollen, gestaltet sich die Initialisierung wirklich sehr einfach, da wir lediglich das &#039;&#039;&#039;Transmitter Enable&#039;&#039;&#039; Bit setzen müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs mit USART haben mehrere Konfigurationsregister und erfordern eine etwas andere Konfiguration. Für einen ATmega16 z.&amp;amp;nbsp;B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);                           // UART TX einschalten&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1 &amp;lt;&amp;lt; UCSZ1)|(1 &amp;lt;&amp;lt; UCSZ0); // Asynchron 8N1&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun ist noch das Baudratenregister &#039;&#039;&#039;UBRR&#039;&#039;&#039; der verwendeten UARTs einzustellen, bzw. bei neueren AVRs die beiden Register &#039;&#039;&#039;UBRRL&#039;&#039;&#039; und &#039;&#039;&#039;UBRRH&#039;&#039;&#039;. &amp;lt;!--Der Wert dafür ergibt sich aus der unten angegebenen Formel durch Einsetzen der Taktfrequenz und der gewünschten Übertragungsrate. Das Berechnen der Formel wird dem [[C-Präprozessor|Präprozessor]] überlassen. Dabei ist zu beachten, dass der Präprozessor keine Floating Point Ergebnisse liefert, sondern Integer Ergebnisse. Das bedeutet, dass wenn durch Division auf einen Integer Wert 1.99 zugewiesen wird, 0.99 abgeschnitten werden und das Ergebnis 1.0 ist - obwohl 2.0 viel näher wäre.--&amp;gt;. Die Berechnung wird während des Compilerlaufs ausgeführt, beansprucht also in der gezeigten Form weder Speicher noch Rechenzeit des Controllers. Das Ergebniss wird jedoch als ganzzahliger Wert eingesetzt, d.h. Nachkommastellen werden einfach abgeschnitten und es erfolgt keine Rundund. Aus diesem Grund kann man sich eines kleinen Tricks bedienen, indem vor der eigentlichen Division bei der Zuweisung die Hälfte des Wertes dazu addiert wird. Allgemein formuliert bedeutet das: &amp;lt;code&amp;gt;int i = ( a + b/2 ) / b;&amp;lt;/code&amp;gt;. Dies wird in der unten angegebenen Berechnung von UBRR_VAL ausgenutzt um den Fehler zu minimieren. (Eine ausführliche Erklärung zum &#039;&#039;cleveren Runden&#039;&#039; findet sich in einer [http://www.mikrocontroller.net/topic/170617#1631916 Forumsdiskussion].) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* &lt;br /&gt;
  UART-Init: &lt;br /&gt;
Berechnung des Wertes für das Baudratenregister &lt;br /&gt;
aus Taktrate und gewünschter Baudrate&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann&lt;br /&gt;
   F_CPU im Makefile definiert werden, eine nochmalige Definition&lt;br /&gt;
   hier wuerde zu einer Compilerwarnung fuehren. Daher &amp;quot;Schutz&amp;quot; durch&lt;br /&gt;
   #ifndef/#endif &lt;br /&gt;
&lt;br /&gt;
   Dieser &amp;quot;Schutz&amp;quot; kann zu Debugsessions führen, wenn AVRStudio &lt;br /&gt;
   verwendet wird und dort eine andere, nicht zur Hardware passende &lt;br /&gt;
   Taktrate eingestellt ist: Dann wird die folgende Definition &lt;br /&gt;
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) &lt;br /&gt;
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU&lt;br /&gt;
   noch nicht definiert: */&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000&amp;quot;&lt;br /&gt;
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten &lt;br /&gt;
                         // Ohne ergeben sich unten Fehler in der Berechnung&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600UL      // Baudrate&lt;br /&gt;
&lt;br /&gt;
// Berechnungen&lt;br /&gt;
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden&lt;br /&gt;
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate&lt;br /&gt;
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.&lt;br /&gt;
&lt;br /&gt;
#if ((BAUD_ERROR&amp;lt;990) || (BAUD_ERROR&amp;gt;1010))&lt;br /&gt;
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! &lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Makros sind sehr praktisch, da damit sowohl automatisch der Wert für UBRR, als auch die Abweichung in der generierten (möglichen) von der gewünschten Baudrate berechnet wird. Im Falle einer zu hohen Abweichung (+/-1%) wird eine Fehlermeldung ausgegeben und der Compilerablauf abgebrochen. Damit können viele Probleme mit &amp;quot;UART sendet komische Zeichen&amp;quot; vermieden werden. Ausserdem kann man mühelos die Einstellung an eine neue Taktfrequenz bzw. Baudrate anpassen, ohne selber rechnen oder in Tabellen nachschlagen zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung der UART Register kann im Hauptprogramm main() vorgenommen werden. Öfters wird jedoch eine Funktion z.&amp;amp;nbsp;B. uart_init() dafür geschrieben, die in der eigenen Codesammlung in mehreren Projekten verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Für einige AVR (z.&amp;amp;nbsp;B. ATmega169, ATmega48/88/168, AT90CAN jedoch nicht für z.&amp;amp;nbsp;B. ATmega16/32, ATmega128, ATtiny2313) wird durch die Registerdefinitionen der avr-libc (io*.h) auch für Controller mit zwei UBRR-Registern (UBRRL/UBRRH) ein UBRR bzw. UBRR0 als &amp;quot;16-bit-Register&amp;quot; definiert und man kann den Wert direkt per UBRR = UBRR_VAL zuweisen. Intern werden dann zwei Zuweisungen für UBRRH und UBRRL generiert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* UART-Init Bsp. ATmega48 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UBRR0 = UBRR_VAL;&lt;br /&gt;
  UCSR0B |= (1&amp;lt;&amp;lt;TXEN0);&lt;br /&gt;
  // Frame Format: Asynchron 8N1&lt;br /&gt;
  UCSR0C = (1&amp;lt;&amp;lt;UCSZ01)|(1&amp;lt;&amp;lt;UCSZ00);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die einzelne Anweisung ist nicht bei allen Controllern möglich, da die beiden Register nicht bei allen aufeinanderfolgende Addressen aufweisen. Die getrennte Zuweisung an UBRRH und UBRRL wie im nächsten Beispiel gezeigt, ist universeller und portabler und daher vorzuziehen. Wichtig ist, dass UBRRH &#039;&#039;&#039;vor&#039;&#039;&#039; UBRRL geschrieben wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* UART-Init Bsp. ATmega16 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);  // UART TX einschalten&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0);  // Asynchron 8N1 &lt;br /&gt;
&lt;br /&gt;
  UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
  UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inzwischen gibt es in der avr-libc Makros für obige Berechnung der UBRR Registerwerte aus Taktrate F_CPU und Baudrate BAUD. Dazu wird die Includedatei  [http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html &amp;lt;util/setbaud.h&amp;gt;] eingebunden, nachdem F_CPU und die gewünschte Baudrate definiert wurden. Einige Beispiele zur Anwendung finden sich in der Dokumentation der avr-libc. Im Quellcode kann dann analog zur oben gezeigten Vorgehensweise einfach das Makro UBRR_VALUE (bzw. UBRRH_VALUE und UBRRL_VALUE) an der entsprechenden Stelle eingesetzt werden. Es wird auch automatisch ermittelt, ob der U2X-Modus (vgl. Datenblatt) zu geringeren Abweichungen führt und dann dem Makro USE_U2X ein Wert ungleich null zugewiesen. Ein Beispiel (angelehnt an die avr-libc-Dokumentation):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt; &lt;br /&gt;
#define F_CPU 1000000 /* evtl. bereits via Compilerparameter definiert */&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)   &lt;br /&gt;
{&lt;br /&gt;
   UBRRH = UBRRH_VALUE;&lt;br /&gt;
   UBRRL = UBRRL_VALUE;&lt;br /&gt;
   /* evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt)&lt;br /&gt;
      UBRR = UBRR_VALUE;&lt;br /&gt;
   */&lt;br /&gt;
#if USE_2X&lt;br /&gt;
   /* U2X-Modus erforderlich */&lt;br /&gt;
   UCSRA |= (1 &amp;lt;&amp;lt; U2X);&lt;br /&gt;
#else&lt;br /&gt;
   /* U2X-Modus nicht erforderlich */&lt;br /&gt;
   UCSRA &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
   // hier weitere Initialisierungen (TX und/oder RX aktivieren, Modus setzen &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html Dokumentation der avr-libc zu &amp;lt;util/setbaud.h&amp;gt;]&lt;br /&gt;
* [http://www.wormfood.net/avrbaudcalc.php WormFood&#039;s AVR Baud Rate Calculator] online.&lt;br /&gt;
* [http://www.gjlay.de/helferlein/avr-uart-rechner.html AVR Baudraten-Rechner] in JavaScript&lt;br /&gt;
&lt;br /&gt;
== Senden mit dem UART ==&lt;br /&gt;
&lt;br /&gt;
=== Senden einzelner Zeichen ===&lt;br /&gt;
&lt;br /&gt;
Um nun ein Zeichen auf die Schnittstelle auszugeben, müssen wir dasselbe&lt;br /&gt;
lediglich in das &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister schreiben. Vorher ist zu prüfen, ob das UART-Modul bereit ist, das zu sendende Zeichen entgegenzunehmen. Die Bezeichnungen des/der Statusregisters mit dem Bit UDRE ist abhängig vom Controllertypen (vgl. Datenblatt).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&amp;amp;nbsp;B. fuer ATmega16:&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)))  /* warten bis Senden moeglich                   */&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    UDR = &#039;x&#039;;                    /* schreibt das Zeichen x auf die Schnittstelle */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schreiben einer Zeichenkette (String) ===&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe &amp;quot;String senden&amp;quot; wird durch zwei Funktionen abgearbeitet. Die universelle/controllerunabhängige Funktion uart_puts übergibt jeweils ein Zeichen der Zeichenkette an eine Funktion uart_putc, die abhängig von der vorhandenen Hardware implementiert werden muss. In der Funktion zum Senden eines Zeichens ist darauf zu achten, dass vor dem Senden geprüft wird, ob der UART bereit ist den &amp;quot;Sendeauftrag&amp;quot; entgegenzunehmen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* ATmega16 */&lt;br /&gt;
int uart_putc(unsigned char c)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)))  /* warten bis Senden moeglich */&lt;br /&gt;
    {&lt;br /&gt;
    }                             &lt;br /&gt;
&lt;br /&gt;
    UDR = c;                      /* sende Zeichen */&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* puts ist unabhaengig vom Controllertyp */&lt;br /&gt;
void uart_puts (char *s)&lt;br /&gt;
{&lt;br /&gt;
    while (*s)&lt;br /&gt;
    {   /* so lange *s != &#039;\0&#039; also ungleich dem &amp;quot;String-Endezeichen&amp;quot; */&lt;br /&gt;
        uart_putc(*s);&lt;br /&gt;
        s++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die in uart_putc verwendeten Schleifen, in denen gewartet wird bis die UART-Hardware zum senden bereit ist, sind insofern etwas kritisch, da während des Sendens eines Strings nicht mehr auf andere Ereignisse reagiert werden kann. Universeller ist die Nutzung von FIFO(first-in first-out)-Puffern, in denen die zu sendenden bzw. empfangenen Zeichen/Bytes zwischengespeichert und in Interruptroutinen an die U(S)ART-Hardware weitergegeben bzw. von ihr ausgelesen werden. Dazu existieren fertige Komponenten (Bibliotheken, Libraries), die man recht einfach in eigene Entwicklungen integrieren kann. Es empfiehlt sich, diese Komponenten zu nutzen und das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
=== Schreiben von Variableninhalten ===&lt;br /&gt;
&lt;br /&gt;
Sollen Inhalte von Variablen (Ganzzahlen, Gleitkomma) in &amp;quot;menschenlesbarer&amp;quot; Form gesendet werden, ist vor dem Transfer eine Umwandlung in Zeichen (&amp;quot;ASCII&amp;quot;) erforderlich. Bei nur einer Ziffer ist diese Umwandlung relativ einfach: man addiert den ASCII-Wert von Null zur Ziffer und kann diesen Wert direkt senden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_putc (s.o.)&lt;br /&gt;
&lt;br /&gt;
int main (void) &lt;br /&gt;
{&lt;br /&gt;
   // Ausgabe von 0123456789&lt;br /&gt;
   char c;&lt;br /&gt;
&lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   for (uint8_t i=0; i&amp;lt;=9; ++i) {&lt;br /&gt;
      c = i + &#039;0&#039;;&lt;br /&gt;
      uart_putc( c );&lt;br /&gt;
      // verkuerzt: uart_putc( i + &#039;0&#039; );&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll mehr als eine Ziffer ausgegeben werden, bedient man sich zweckmäßigerweise vorhandener Funktionen zur Umwandlung von Zahlen in Zeichenketten/Strings. Die Funktion der avr-libc zur Umwandlung von vorzeichenbehafteten 16bit-Ganzzahlen (int16_t) in Zeichenketten heißt &#039;&#039;itoa&#039;&#039; (Integer to ASCII). Man muss der Funktion einen Speicherbereich zur Verarbeitung (buffer) mit Platz für alle Ziffern, das String-Endezeichen (&#039;\0&#039;) und evtl. das Vorzeichen bereitstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_putc, uart_puts (s.o.)&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   char s[7];&lt;br /&gt;
   int16_t i = -12345;&lt;br /&gt;
   &lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   itoa( i, s, 10 ); // 10 fuer radix -&amp;gt; Dezimalsystem&lt;br /&gt;
   uart_puts( s );&lt;br /&gt;
&lt;br /&gt;
   // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:&lt;br /&gt;
   uart_puts( itoa( i, s, 10 ) );&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für vorzeichenlose 16bit-Ganzzahlen (uint16_t) exisitert &#039;&#039;utoa&#039;&#039;. Die Funktionen für 32bit-Ganzzahlen (int32_t und uint32_t) heißen &#039;&#039;ltoa&#039;&#039; bzw. &#039;&#039;ultoa&#039;&#039;. Da 32bit-Ganzzahlen mehr Stellen aufweisen können, ist ein entsprechend größerer Pufferspeicher vorzusehen.&lt;br /&gt;
&lt;br /&gt;
Auch Gleitkommazahlen (float/double) können mit bereits vorhandenen Funktionen in Zeichenfolgen umgewandelt werden, dazu existieren die Funktionen &#039;&#039;dtostre&#039;&#039; und &#039;&#039;dtostrf&#039;&#039;. dtostre nutzt Exponentialschreibweise (&amp;quot;engineering&amp;quot;-Format). (Hinweis: z.Zt. existiert im avr-gcc kein &amp;quot;echtes&amp;quot; double, intern wird immer mit &amp;quot;einfacher Genauigkeit&amp;quot;, entsprechend float, gerechnet.) &lt;br /&gt;
&lt;br /&gt;
dtostrf und dtostre benötigen die libm.a der avr-libc. Bei Nutzung von Makefiles ist der Parameter -lm in in LDFLAGS anzugeben (Standard in den WinAVR/mfile-Makefilevorlagen). Nutzt man AVRStudio als IDE für den GNU-Compiler (gcc-Plugin) ist die libm.a unter Libaries auszuwählen: Project -&amp;gt; Configurations Options -&amp;gt; Libaries -&amp;gt; libm.a mit dem Pfeil nach rechts einbinden. Siehe auch die [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|FAQ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_putc, uart_puts (s.o.)&lt;br /&gt;
&lt;br /&gt;
/* lt. avr-libc Dokumentation:&lt;br /&gt;
char* dtostrf(&lt;br /&gt;
  double __val,&lt;br /&gt;
  char   __width,&lt;br /&gt;
  char   __prec,&lt;br /&gt;
  char * __s&lt;br /&gt;
)  &lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   // Pufferspeicher ausreichend groß&lt;br /&gt;
   // evtl. Vorzeichen + width + Endezeichen:&lt;br /&gt;
   char s[8]; &lt;br /&gt;
   float f = -12.345;&lt;br /&gt;
   &lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   dtostrf( f, 6, 3, s ); &lt;br /&gt;
   uart_puts( s );&lt;br /&gt;
   // verkürzt: uart_puts( dtostrf( f, 7, 3, s ) );&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Empfangen ==&lt;br /&gt;
=== Einzelne Zeichen empfangen ===&lt;br /&gt;
&lt;br /&gt;
Zum Empfang von Zeichen muss der Empfangsteil des UART bei der Initialisierung aktiviert werden, indem das RXEN-Bit im jeweiligen Konfigurationsregister (UCSRB bzw UCSR0B/UCSR1B) gesetzt wird. Im einfachsten Fall wird solange gewartet, bis ein Zeichen empfangen wurde, dieses steht dann im UART-Datenregister (UDR bzw. UDR0 und UDR1 bei AVRs mit 2 UARTS) zur Verfügung (sogen. &amp;quot;Polling-Betrieb&amp;quot;). Ein Beispiel für den ATmega16:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Siehe auch obere Baudrateneinstellung */&lt;br /&gt;
/* USART-Init beim ATmega16 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
    UCSRB |= (1&amp;lt;&amp;lt;RXEN);                         // UART RX einschalten&lt;br /&gt;
    UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0);  // Asynchron 8N1 &lt;br /&gt;
&lt;br /&gt;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Zeichen empfangen */&lt;br /&gt;
uint8_t uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)))   // warten bis Zeichen verfuegbar&lt;br /&gt;
        ;&lt;br /&gt;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und die Anwendung in einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// hier Makro für die Baudratenberechnung &lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_getc (s.o.)&lt;br /&gt;
 &lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  uart_init();&lt;br /&gt;
  while (1) &lt;br /&gt;
  {&lt;br /&gt;
    uint8_t c;&lt;br /&gt;
    c = uart_getc();&lt;br /&gt;
&lt;br /&gt;
    // hier etwas mit c machen z.B. auf PORT ausgeben&lt;br /&gt;
    DDRC = 0xFF; // PORTC Ausgang&lt;br /&gt;
    PORTC = c;&lt;br /&gt;
  }&lt;br /&gt;
  return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion uart_getc() blockiert allerdings den Programmablauf, denn es wird gewartet, bis ein Zeichen empfangen wird! Möchte man das Warten vermeiden, kann das RXC-Bit in einer Programmschleife abgefragt werden und dann nur bei gesetztem RXC-Bit UDR ausgelesen werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// hier Makro für die Baudratenberechnung &lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_getc (s.o.)&lt;br /&gt;
 &lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  uart_init();&lt;br /&gt;
  while (1) &lt;br /&gt;
  {&lt;br /&gt;
    if ( (UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)) )&lt;br /&gt;
    {&lt;br /&gt;
      // Zeichen wurde empfangen, jetzt abholen&lt;br /&gt;
      uint8_t c;&lt;br /&gt;
      c = uart_getc();&lt;br /&gt;
      // hier etwas mit c machen z.B. auf PORT ausgeben&lt;br /&gt;
      DDRC = 0xFF; // PORTC Ausgang&lt;br /&gt;
      PORTC = c;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // Kein Zeichen empfangen, Restprogramm ausführen...&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eleganter und in den meisten Anwendungsfällen &amp;quot;stabiler&amp;quot; ist die Vorgehensweise, die empfangenen Zeichen in einer Interrupt-Routine einzulesen und zur späteren Verarbeitung in einem Eingangsbuffer (FIFO-Buffer) zwischenzuspeichern. Dazu existieren fertige und gut getestete [[Libraries|Bibliotheken]] &amp;lt;!-- &amp;quot;echte Libraries&amp;quot; (.a) wie im Verweis beschrieben sind hier eigentlich nicht gemeint, verwirrt hier etwas, da AVR-&amp;quot;Libraries&amp;quot; meist per #defines anpassbare Source-Codes sind, vielleicht so: --&amp;gt; und Quellcodekomponenten (z.&amp;amp;nbsp;B. UART-Library von P. Fleury, procyon-avrlib und einige in der &amp;quot;Academy&amp;quot; von avrfreaks.net).&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html Dokumenation der avr-libc/stdlib.h]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_sprintf_und_printf Die Nutzung von sprintf und printf]&lt;br /&gt;
* [http://homepage.hispeed.ch/peterfleury/ Peter Fleurys] UART-Bibiliothek fuer avr-gcc/avr-libc&lt;br /&gt;
&amp;lt;!-- nimmermehr: * siehe auch: Weiterführende Informationen inkl. Beispielen für die Nutzung von stdio-Funktionen (printf etc.) im [[AVR-Tutorial:_UART]]. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: 9bit&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Zeichenketten (Strings) ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Zeichenketten, muß man sich zunächst darüber im klaren sein, daß es ein Kriterium geben muß, an dem der µC erkennen kann, wann ein Text zu Ende ist. Sehr oft wird dazu das Zeichen &#039;Return&#039; benutzt, um das Ende eines Textes zu markieren. Dies ist vom Benutzer einfach eingebbar und er ist auch daran gewöhnt, daß er eine Eingabezeile mit einem Druck auf die Return Taste abgeschlossen wird.&lt;br /&gt;
&lt;br /&gt;
Prinzipiell gibt es jedoch keine Einschränkung bezüglich dieses speziellen Zeichens. Es muß nur sichergestellt werden, daß dieses spezielle &#039;Ende eines Strings&#039; - Zeichen nicht mit einem im Text vorkommenden Zeichen verwechselt werden kann. Wenn also im zu übertragenden Text beispielsweise kein &#039;;&#039; vorkommt, dann spricht nichts dagegen, den Benutzer die Eingabe eines Textes mit einem &#039;;&#039; abschließen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die durchaus übliche Annahme getroffen, daß eine Stringübertragung identisch ist mit der Übertragung einer Textzeile und daher mit einem Return (&#039;\n&#039;) abgeschlossen wird.&lt;br /&gt;
&lt;br /&gt;
Das Problem der Übertragung eines Strings reduziert sich damit auf die Aufgabenstellung: Empfange und sammle Zeichen in einem char Array, bis entweder das Array voll ist oder das Text Ende Zeichen&#039; empfangen wurde. Danach wird der empfangene Text noch mit einem &#039;\0&#039; Zeichen abgeschlossen um einen Standard C-String daraus zu machen, mit dem dann weiter gearbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
/* Zeichen empfangen */&lt;br /&gt;
uint8_t uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)))   // warten bis Zeichen verfuegbar&lt;br /&gt;
        ;&lt;br /&gt;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_gets( char* Buffer, uint8_t MaxLen )&lt;br /&gt;
{&lt;br /&gt;
  uint8_t NextChar;&lt;br /&gt;
  uint8_t StringLen = 0;&lt;br /&gt;
&lt;br /&gt;
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen&lt;br /&gt;
&lt;br /&gt;
                                  // Sammle solange Zeichen, bis:&lt;br /&gt;
                                  // * entweder das String Ende Zeichen kam&lt;br /&gt;
                                  // * oder das aufnehmende Array voll ist&lt;br /&gt;
  while( NextChar != &#039;\n&#039; &amp;amp;&amp;amp; StringLen &amp;lt; MaxLen - 1 ) {&lt;br /&gt;
    *Buffer++ = NextChar;&lt;br /&gt;
    StringLen++;&lt;br /&gt;
    NextChar = uart_getc();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
                                  // Noch ein &#039;\0&#039; anhängen um einen Standard&lt;br /&gt;
                                  // C-String daraus zu machen&lt;br /&gt;
  *Buffer = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf ist darauf zu achten, dass das empfangende Array auch mit einer&lt;br /&gt;
vernünftigen Größe definiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  char Line[40];      // String mit maximal 39 zeichen&lt;br /&gt;
&lt;br /&gt;
  uart_gets( Line, sizeof( Line ) );&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Benutzung von sizeof() ist allerdings zu beachten, dass sizeof() nicht die Anzahl der Elemente des Arrays liefert, sondern die Länge in Byte. Da ein char nur ein Byte lang ist, passt der Aufruf &#039;uart_gets(Line, sizeof( Line ) );&#039; in diesem Fall. Falls man - aus welchen Gründen auch immer - andere Datentypen benutzen möchte, sollte man zur korrekten Angabe der Array-Länge folgende Vorgehensweise bevorzugen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
  int Line[40];      // Array vom Typ int&lt;br /&gt;
&lt;br /&gt;
  uart_gets( Line, sizeof( Line ) / sizeof( Line[0] ) );&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interruptbetrieb==&lt;br /&gt;
&lt;br /&gt;
Hier wird das Grundwissen des Artikels [[Interrupt]] und des Abschnitts [[AVR-GCC-Tutorial#Programmieren_mit_Interrupts|AVR-GCC-Tutorial: Programmieren_mit_Interrupts]] vorausgesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Empfangen (RX) ===&lt;br /&gt;
&lt;br /&gt;
Beim ATmega8 muss das &#039;&#039;&#039;RXCIE&#039;&#039;&#039; Bit im Register UCSRB gesetzt werden, damit ein Interrupt beim Empfang eines Zeichens ausgelöst werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* siehe auch obere Baudrateneinstellung */&lt;br /&gt;
/* USART-Init beim ATmega16 */&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;RXEN)|(1&amp;lt;&amp;lt;TXEN)|(1&amp;lt;&amp;lt;RXCIE);  // UART RX, TX und RX Interrupt einschalten&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0);  // Asynchron 8N1 &lt;br /&gt;
&lt;br /&gt;
  UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
  UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich muss &amp;quot;Global Interrupt Enable&amp;quot; aktiviert sein (sei()). Interrupt-spezifische Definitionen werden über die Includedatei eingebunden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Interrupt wird immer ausgelöst, wenn ein Zeichen erfolgreich empfangen wurde. Zusätzlich braucht man die Interruptserviceroutine (ISR). &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel enthält die ISR einen FIFO-Puffer (First in, First out). Dafür werden ein paar globale Variablen und Makros benötigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define UART_MAXSTRLEN 10&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart_str_complete = 0;     // 1 .. String komplett empfangen&lt;br /&gt;
volatile uint8_t uart_str_count = 0;&lt;br /&gt;
volatile char uart_string[UART_MAXSTRLEN + 1] = &amp;quot;&amp;quot;;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(USART_RXC_vect)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char nextChar;&lt;br /&gt;
&lt;br /&gt;
  // Daten aus dem Puffer lesen&lt;br /&gt;
  nextChar = UDR;&lt;br /&gt;
  if( uart_str_complete == 0 ) {	// wenn uart_string gerade in Verwendung, neues Zeichen verwerfen&lt;br /&gt;
&lt;br /&gt;
    // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird&lt;br /&gt;
    if( nextChar != &#039;\n&#039; &amp;amp;&amp;amp;&lt;br /&gt;
        nextChar != &#039;\r&#039; &amp;amp;&amp;amp;&lt;br /&gt;
        uart_str_count &amp;lt; UART_MAXSTRLEN - 1 ) {&lt;br /&gt;
      uart_string[uart_str_count] = nextChar;&lt;br /&gt;
      uart_str_count++;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      uart_string[uart_str_count] = &#039;\0&#039;;&lt;br /&gt;
      uart_str_count = 0;&lt;br /&gt;
      uart_str_complete = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Funktion: Wurde eine komplette Zeichenkette empfangen, also das Ende (\n oder \r) erkannt oder die maximale Länge &#039;&#039;UART_MAXSTRLEN&#039;&#039; erreicht, wird die globale Variable &#039;&#039;uart_str_complete&#039;&#039; auf &#039;1&#039; gesetzt. Damit wird dem Hauptprogramm, welches auf diese Variable pollt, mitgeteil, dass die Zeichenkette &#039;&#039;uart_string&#039;&#039; zur Verarbeitung bereit steht. Nach der Verarbeitung der Zeichenkette in der entsprechenden main-Routine, muss die Variable &#039;&#039;uart_str_complete&#039;&#039; wieder auf &#039;0&#039; zurück gesetzt werden. Dadurch werden alle neu empfangenen Zeichen wieder in den globalen Puffer geschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Baustelle) ===&lt;br /&gt;
&lt;br /&gt;
* Empfangen (Receive) (Anm.: z.T. erledigt)&lt;br /&gt;
** ggf. Fallstricke ([http://www.mikrocontroller.net/topic/84256#707214 UDR in der ISR lesen!])&lt;br /&gt;
** Komplettes, einfaches Beispiel ([http://www.mikrocontroller.net/topic/84228#707052 Echo] (noch buggy beim Datenzugriff, siehe Lit. 2+3!)), ggf. LED zur ISR-Empfangsanzeige oder Overflow-Anzeige&lt;br /&gt;
&lt;br /&gt;
* Senden (Transmit)&lt;br /&gt;
** Variante &amp;quot;UART Data Register Empty&amp;quot; (UDRE) [http://www.mikrocontroller.net/topic/101472#882716]&lt;br /&gt;
** Variante &amp;quot;UART Transmit Complete&amp;quot; (TXC) &lt;br /&gt;
&lt;br /&gt;
* FIFO-Puffer [http://www.mikrocontroller.net/topic/101472#882716], Ringpuffer (Byte Buffering (circular))&lt;br /&gt;
&lt;br /&gt;
* UART-Bibliotheken &lt;br /&gt;
** [http://homepage.hispeed.ch/peterfleury/avr-software.html UART-Library] von Peter Fleury (UART (interrupt driven), Byte Buffering (circular))&lt;br /&gt;
** [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] von Pascal Stang (UART (interrupt driven), Byte Buffering (circular), VT100 Terminal Output)&lt;br /&gt;
&lt;br /&gt;
* Literatur &lt;br /&gt;
** [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=48188 avrfreaks.net Tutorial] inkl. Diskussion (engl.)&lt;br /&gt;
** avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_16bitio Why do some 16-bit timer registers sometimes get trashed?]&lt;br /&gt;
&lt;br /&gt;
==Software-UART==&lt;br /&gt;
&lt;br /&gt;
Falls die Zahl der vorhandenen Hardware-UARTs nicht ausreicht, können weitere Schnittstellen über sogennante Software-UARTs ergänzt werden. Es gibt dazu (mindestens) zwei Ansätze: &lt;br /&gt;
* Der bei AVRs üblichste Ansatz basiert auf dem Prinzip, dass ein externer Interrupt-Pin für den Empfang (&amp;quot;RX&amp;quot;) genutzt wird. Das Startbit löst den Interrupt aus, in der Interrupt-Routine (ISR) wird der externe Interrupt deaktiviert und ein Timer aktiviert. In der Interrupt-Routine des Timers wird der Zustand des Empfangs-Pins entsprechend der Baudrate abgetastet. Nach Empfang des Stop-Bits wird der externe Interrupt wieder aktiviert. Senden kann über einen beliebigen Pin (&amp;quot;TX&amp;quot;) erfolgen, der entsprechend der Baudrate und dem zu sendenden Zeichen auf 0 oder 1 gesetzt wird. Die Implementierung ist nicht ganz einfach, es existieren dazu aber fertige Bibliotheken (z.&amp;amp;nbsp;B. bei [http://www.avrfreaks.net/ avrfreaks] oder in der [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon avrlib]).&lt;br /&gt;
* Ein weiterer Ansatz erfordert keinen Pin mit &amp;quot;Interrupt-Funktion&amp;quot; aber benötigt mehr Rechenzeit. Jeder Input-Pin kann als Empfangspin (RX) dienen. Über einen Timer wird der Zustand des RX-Pins mit einem vielfachen der Baudrate abgetastet (dreifach scheint üblich) und High- bzw. Lowbits anhand einer Mindestanzahl identifiziert. (Beispiel: &amp;quot;Generic Software Uart&amp;quot; Application-Note von IAR)&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs (z.&amp;amp;nbsp;B. ATtiny26 oder ATmega48,88,168,169) verfügen über ein Universal Serial Interface (USI), das teilweise UART-Funktion übernehmen kann. Atmel stellt eine Application-Note bereit, in der die Nutzung des USI als UART erläutert wird (im Prinzip &amp;quot;Hardware-unterstützter Software-UART&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Handshaking==&lt;br /&gt;
Wenn der Sender ständig sendet, wird irgendwann der Fall eintreten, daß der Empfänger nicht bereit ist, neue Zeichen zu empfangen. In diesem Fall muß durch ein &#039;&#039;&#039;Handshake-Verfahren&#039;&#039;&#039; die Situation bereinigt werden. Handshake bedeutet nichts anderes, als daß der Empfänger dem Sender mitteilt, daß er zur Zeit keine Daten annehmen kann und der Sender die Übertragung der nächsten Zeichen solange einstellen soll, bis der Empfänger signalisiert, daß er wieder Zeichen aufnehmen kann.&lt;br /&gt;
===Hardwarehandshake (RTS/CTS)===&lt;br /&gt;
Beim Hardwarehandshake werden zusätzlich zu den beiden Daten-Übertragungsleitungen noch 2 weitere Leitungen benötigt: &#039;&#039;&#039;RTS&#039;&#039;&#039; (&#039;&#039;&#039;R&#039;&#039;&#039;equest &#039;&#039;&#039;T&#039;&#039;&#039;o &#039;&#039;&#039;S&#039;&#039;&#039;end) und &#039;&#039;&#039;CTS&#039;&#039;&#039; (&#039;&#039;&#039;C&#039;&#039;&#039;lear &#039;&#039;&#039;T&#039;&#039;&#039;o &#039;&#039;&#039;S&#039;&#039;&#039;end). Jeder der beiden Kommunikationspartner ist verpflichtet, bevor ein Zeichen gesendet wird, den Zustand der &#039;&#039;&#039;RTS&#039;&#039;&#039; Leitung zu überprüfen. Nur wenn die Gegenstelle darauf Empfangsbereitschaft signalisiert, darf das Zeichen gesendet werden. Um der Gegenstelle zu signalisieren, daß sie zur Zeit keine Zeichen schicken soll, wird die Leitung &#039;&#039;&#039;CTS&#039;&#039;&#039; benutzt.&lt;br /&gt;
&lt;br /&gt;
===Softwarehandshake (XON/XOFF)===&lt;br /&gt;
Beim Softwarehandshake sind keine speziellen Leitungen notwendig. Statt dessen werden besondere ASCII-Zeichen benutzt, die der Gegenstelle signalisieren, daß Senden einzustellen bzw. wieder aufzunehmen.&amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;XOFF&#039;&#039;&#039; Aufforderung das Senden einzustellen&lt;br /&gt;
* &#039;&#039;&#039;XON&#039;&#039;&#039;  Gegenstelle darf wieder senden&lt;br /&gt;
&lt;br /&gt;
Nachteilig bei einem Softwarehandshake ist es, dass dadurch keine direkte binäre Datenübertragung mehr möglich ist. Von den möglichen 256 Bytewerten werden ja 2 (nämlich &#039;&#039;&#039;XON&#039;&#039;&#039; und &#039;&#039;&#039;XOFF&#039;&#039;&#039;) für besondere Zwecke benutzt und fallen daher aus.&lt;br /&gt;
&lt;br /&gt;
==Galvanische Trennung==&lt;br /&gt;
Für eine geringe Überspannungsfestigkeit empfielt es sich, die Datenkanäle über Optokoppler zu führen. Es bietet sich z.b. der 6N138 an, ein &amp;quot;normaler&amp;quot; CNY-17 ist für hohe Baudraten nicht brauchbar.&lt;br /&gt;
&lt;br /&gt;
==Fehlersuche==&lt;br /&gt;
Erstaunlich oft wird im Forum der Hilferuf laut: &amp;quot;Meine UART funktioniert nicht, was mache ich falsch&amp;quot;. In der überwiegenden Mehrzahl der Fälle stellt sich dann heraus, daß es sich um ein Hardwareproblem handelt, wobei da wiederrum der Löwenanteil auf das Konto einer nicht korrekt eingestellten Taktrate geht: Der µC benutzt nicht einen angeschlossenen Quarz, so wie er auch im Programm eingetragen ist, sondern läuft immer noch mit dem internen RC-Takt. Daraus resultiert aber auch, daß der Baudraten Konfigurationswert falsch berechnet wird.&lt;br /&gt;
&lt;br /&gt;
Hilfreich zum Aufspüren solcher Fehler ist auch die [[AVR_Checkliste#UART/USART|AVR-Checkliste]].&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
Tipps zur Verarbeitung von Strings sind in den [[FAQ]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;/div&gt;</summary>
		<author><name>Rolfn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8051&amp;diff=58787</id>
		<title>8051</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8051&amp;diff=58787"/>
		<updated>2011-07-21T21:06:39Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die &#039;&#039;&#039;8051&#039;&#039;&#039;-Familie (besser: [http://developer.intel.com/design/mcs51/ MCS-51]) ist eine Prozessorarchitektur von Intel. Der Original 8051 ist mittlerweile veraltet, aber es gibt hunderte Varianten (Derivate) davon, die teilweise durchaus auf dem aktuellen Stand der Technik sind.&lt;br /&gt;
&lt;br /&gt;
Kenndaten des Original 8051:&lt;br /&gt;
* jeweils bis zu 64 kB externer Daten- und Programmspeicher adressierbar&lt;br /&gt;
* 128 Byte internes RAM (8052: 256 Byte)&lt;br /&gt;
* 2 [[Timer]]/Counter (8052: 3 Timer/Counter)&lt;br /&gt;
* 2 externe Interrupts&lt;br /&gt;
* 4 8-bit I/O Ports, zwei davon für den Zugriff auf externen Speicher&lt;br /&gt;
* Hardware [[UART]]&lt;br /&gt;
&lt;br /&gt;
Der Original 8051 ist ein [[Maskenprogrammierung|maskenprogrammierter]] Mikrocontroller; die ROM-lose Variante heißt 8031. Für einen Befehl benötigt er mindestens 12 Takte. Befehls- und Datenspeicher sind logisch getrennt, auch wenn diese über einen einzigen gemultiplexten externen Bus adressiert werden - sofern externe Speicher verwendet werden. Ob es sich hierbei um eine [[Harvard-Architektur]] oder eine [[Von Neumann-Architektur]] handelt, ist umstritten (siehe [[Diskussion:8051]]). In der Standardbeschaltung ist kein Code im Datenspeicher als Programmcode ausführbar. Dieses lässt sich jedoch durch Verschalten von PSEN und RD per AND-Gatter erreichen. Diese Methode wird während der Programmentwicklung gerne verwendet, siehe [http://plit.de/asem-51/bdesign.htm BOOT-51].&lt;br /&gt;
&lt;br /&gt;
Ein bekannter Vertreter diese Familie ist der [http://www.infineon.com/cgi/ecrm.dll/ecrm/scripts/prod_ov.jsp?oid=13738 80C535] von Infineon. Der ist zwar mittlerweile ebenfalls veraltet, wird allerdings gerne noch im Schulunterricht verwendet. Mittlerweile heißt er C515 und wird ab Juli 2005 von Firma Infineon nicht mehr produziert. Das momentan einzige Derivat von Infineon ist die xc800-Reihe(Stand 2009).&lt;br /&gt;
&lt;br /&gt;
Aktuellere Vertreter dieser Familie sind z.&amp;amp;nbsp;B. die &lt;br /&gt;
[http://www.analog.com/MicroConverter MicroConverter®] von [http://www.analog.com Analog Devices], die [http://www.atmel.com/dyn/products/param_table.asp?family_id=604&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC AT89-Familie] von [http://www.atmel.com Atmel], die [http://focus.ti.com/docs/search/paramsearch.jhtml?familyId=630&amp;amp;tfsection=param_table&amp;amp;templateId=4&amp;amp;showAssociated=false MSC12-Familie] von [[Texas Instruments]] oder die [http://www.maxim-ic.com/quick_view2.cfm/qv_pk/4078 DS89C430] von [http://www.maxim-ic.com Maxim] (Dallas). &lt;br /&gt;
&lt;br /&gt;
Moderne 8051-Derivate warten unter anderem neben höherer Taktfrequenz, [[I2C]]-Bus, [[DA-Wandler]] und [[AD-Wandler]] mit einer geringeren Taktteilung auf. Dadurch werden zur Ausführung eines Befehls nicht mehr 12, sondern nur noch 6, 4 Takte oder sogar nur noch ein Takt benötigt. Durch einen internen [[Flash-ROM]] als Programmspeicher entfällt die Notwendigkeit ein externes [[EPROM]] anzuschließen. Darüber hinaus verwenden einige [[USB]]-Mikrocontroller einen 8051-Kern, beispielsweise die EzUSB von [http://www.cypress.com/ Cypress],  die TUSBxxxx-Serie von [[Texas Instruments]] oder der AT89C5131A-M von Atmel.&lt;br /&gt;
&lt;br /&gt;
Die Architektur ist für C-Compiler wegen des begrenzten Stack-Speichers und den vielen notwendigen Spracherweiterungen eher weniger geeignet: push und pop Befehle stehen nur für die unteren 256 Byte Ram zur Verfügung, in denen auch die 4 Bänke a 8 Register liegen. Braucht man einen größeren Stack so ist man darauf angewiesen, das der Compiler push und pop als langsamere XRAM Zugriffe emuliert. (small &amp;lt;-&amp;gt; large memory model). &lt;br /&gt;
Die SFRs teilen sich 128 Adressen mit dem oberen Teil des internen RAMs. Die SFRs werden direkt, die oberen 128 Byte RAM indirekt adressiert. Bei den unteren 128 Byte RAM sind beide Adressierungsarten möglich. Da es sich um einen indirekten Zugriff handelt, können auch die oberen 128 Byte RAM für den Stack genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.keil.com/dd/search_parm.asp Parametric Device Search] von Keil&lt;br /&gt;
* [http://www.erikbuchmann.de/ Erik Buchmanns Mikrocontroller-Seite] - Assemblerkurs und mehrere Projekte&lt;br /&gt;
* [http://www.8052.com/ 8052.com] - Tutorials, Codesammlung, Projekte (Englisch)&lt;br /&gt;
* [http://www.woe.de.vu/ World Of Electronics] - Projekte mit den 8051-Controllern von Atmel&lt;br /&gt;
* [http://www.nomad.ee/micros/8052bas.html 8052 BASIC Projects] - IDE-Interface&lt;br /&gt;
* der Makroassembler [http://plit.de/asem-51/ ASEM-51] von W.W. Heinz (Freeware)&lt;br /&gt;
* der Makroassembler [http://www.metaice.com/ASM51/ASM51.htm ML-ASM51] von Metalink (Freeware)&lt;br /&gt;
* der Simulator [http://home.arcor.de/jensaltmann/jsim-e.htm JSIM-51] von Jens Altmann (Freeware)&lt;br /&gt;
* Der Simulator [http://www.edsim51.com/index.html EdSim51] von James Rogers (Freeware, Java)&lt;br /&gt;
* die Entwicklungsumgebung [http://www.opcube.com/home.html MIDE-51 Studio] von K. Worapoht (Freeware)&lt;br /&gt;
* der Universalassembler [http://www.alfsembler.de/ AS] für 69 (!) Prozessorfamilien von Alfred Arnold (GPL)&lt;br /&gt;
* der ANSI-C Compiler [http://sdcc.sourceforge.net/ SDCC] für 8051/DS80C390/Z80 von Sandeep Dutta (GPL)&lt;br /&gt;
* [http://turbo51.com Turbo51 - Free Pascal compiler for 8051]&lt;br /&gt;
* [http://et-tutorials.de/4313/ubersicht-zum-8051-mikrocontroller-kurs/  VIDEO-Kurs zur C-Programmierung eines 8051]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;br /&gt;
[[Category:8051| ]]&lt;/div&gt;</summary>
		<author><name>Rolfn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Fuses&amp;diff=58358</id>
		<title>AVR Fuses</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Fuses&amp;diff=58358"/>
		<updated>2011-07-08T11:38:45Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: Atmega fusebit doctor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Regelmäßig wiederkehrende Beiträge im Forum zeigen, dass die Fuses der [[AVR]] doch einige Tücken in sich bergen. Dieser Artikel kann die &amp;lt;font color=FF0000&amp;gt;Recherche im Datenblatt&amp;lt;/font&amp;gt; nicht ersetzen, sondern soll lediglich helfen, auf die Problemstellen aufmerksam zu werden.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliche Vorgehensweise ==&lt;br /&gt;
&lt;br /&gt;
Bei einem neuen µC ist es grundsätzlich notwendig im Datenblatt genau dieses µCs den Auslieferungszustand der Fuses zu ermitteln. So werden beispielsweise die ATmega mit aktiviertem internen Oszillator ausgeliefert und man darf sich dementsprechend nicht wundern, wenn der µC einfach nicht mit dem angeschlossenen Quarz (XTAL) oszillieren will. &lt;br /&gt;
&lt;br /&gt;
Neueinsteigern wird das Programmieren mit einem &amp;quot;nutzerfreundlichen&amp;quot; Programmer mit GUI empfohlen: z.&amp;amp;nbsp;B. [[AVR-Studio]] STK500/AVRISP-Plugin, [[AVR-Studio]] AVRProg (für AVR910 Programmer) oder [[Pony-Prog_Tutorial|PonyProg]]. Hier sollten die Fuses erst einmal vom µC ausgelesen werden. Im Vergleich mit dem Datenblatt kann man dann feststellen, ob nun die dargestellten Häkchen invertiert sind oder nicht. Dann ändert man nur die relevanten Bits und schreibt diese in den Controller.&lt;br /&gt;
&lt;br /&gt;
Bei Atmel AVR µCs heisst eine Fuse setzen (programmieren) übrigens, dieses Bit auf Null zu setzen, das wird manchmal gerne falsch verstanden (siehe auch Erklärung in den Forumbeiträgen [http://www.mikrocontroller.net/forum/read-1-311460.html#311532 hier] und [http://www.mikrocontroller.net/forum/read-1-244943.html#245005 hier]).&lt;br /&gt;
&lt;br /&gt;
Empfehlenswert ist es auch, den [http://www.engbedded.com/fusecalc AVR Fuse Calculator] zu Rate ziehen, um die richtigen Fuse Einstellungen zu finden.&lt;br /&gt;
&lt;br /&gt;
Eine andere Möglichkeit ist die Nutzung der unter http://www.nongnu.org/avr-libc/user-manual/group__avr__fuse.html beschriebenen Funktionen.&lt;br /&gt;
&lt;br /&gt;
== Kompatibilitätsfuses und manchmal lästige Defaults ==&lt;br /&gt;
&lt;br /&gt;
Einige Prozessoren haben eine Werkseinstellung, die zu Problemen führen kann. Wenn der Prozessor JTAG unterstützt (ab Mega16 aufwärts), so ist ab Werk die JTAG Schnittstelle eingeschaltet, was dazu führt, daß einige Portpins nicht wie gewohnt funktionieren (nämlich die an denen das JTAG Interface herausgeführt wird). In so einem Fall ist es das Beste, die entsprechende Fuse &#039;&#039;&#039;JTAGEN&#039;&#039;&#039; umzusetzen, um so das JTAG Interface abzuschalten, wenn es nicht gebraucht wird.&lt;br /&gt;
&lt;br /&gt;
Auf einem Mega128 ist ab Werk immer die sog. M103 Kompatibiliätsfuse gesetzt. Diese Fuse muß unbedingt abgeschaltet werden, ansonsten verhält sich der Prozessor wie ein Mega103 mit völlig anderer Speicherbelegung. Wird in so einen Prozessor ein für den Mega128 programmiertes Programm geladen, so stürzt das Programm beim ersten Unterprogrammaufruf ab, weil der Stack an einer völlig falschen Stelle sitzt.&lt;br /&gt;
&lt;br /&gt;
== SPIEN, DWEN und RSTDISBL ==&lt;br /&gt;
&lt;br /&gt;
Für Anfänger gilt der gut gemeinte Ratschlag: Finger weg von SPIEN, RSTDISBL und DWEN!&lt;br /&gt;
&lt;br /&gt;
Besonders &amp;quot;heimtückisch&amp;quot; ist die auf einigen AVR (Tiny12,13 Tiny26, Mega8 .?.) vorhandene Möglichkeit, den Resetpin zum I/O-Pin zu machen. Wird &#039;&#039;&#039;RSTDISBL&#039;&#039;&#039; programmiert, hat man mit seriellen [[AVR_In_System_Programmer|ISP-Programmieradaptern]] keinen Zugriff mehr. Man sollte diese Option daher nur nutzen, wenn der zusätzliche I/O-Pin wirklich benötigt wird und der Zugriff auf den µC durch einen funktionierenden [[Bootloader]] gesichert ist oder man einen [[AVR HV-Programmer]] zur Hand hat. Rücksetzen kann man diese Fuse allerdings nur mehr mit einem HV-Programmer, ein Bootloader kann prinzipiell keine Fuses ändern.&lt;br /&gt;
&lt;br /&gt;
Die Fuse &#039;&#039;&#039;SPIEN&#039;&#039;&#039; für serielles &amp;quot;low voltage&amp;quot; ISP kann per ISP nicht verändert werden. Hat man SPIEN per JTAG oder High-Voltage-Programming deaktiviert, sollte man wieder den Ursprungszustand herstellen, falls der Controller danach wieder per ISP programmiert werden soll.&lt;br /&gt;
&lt;br /&gt;
Auch &#039;&#039;&#039;DWEN&#039;&#039;&#039; bietet bei modernen AVR-Controllern (z.&amp;amp;nbsp;B. ATmega48, 88, 168, einigen ATtiny) die Möglichkeit sich &amp;quot;auszusperren&amp;quot;. Wenn die [[debugWIRE]]-Schnittstelle aktiviert ist, ist keine &amp;quot;low voltage&amp;quot; ISP-Programmierung mehr möglich. debugWIRE kann nur über die debugWIRE-Schnittstelle (JTAGICE MKII oder AVR Dragon) oder High-Voltage-Programming deaktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.wiki.elektronik-projekt.de/mikrocontroller/avr/fusebit_tutorial Fusebits Tutorial auf elektronik-projekt.de]&lt;br /&gt;
* [http://diy.elektroda.eu/atmega-fusebit-doctor-hvpp/?lang=en Atmega fusebit doctor (HVPP+HVSP)]&lt;br /&gt;
* [http://mightyohm.com/blog/products/avr-hv-rescue-shield/ AVR HV Rescue Shield] by MightyOhm&lt;br /&gt;
&lt;br /&gt;
== Taktquellen Fuse Einstellung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; margin:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Tabelle aus einem AVR-Datenblatt&#039;&#039;&#039; (Beispiel)&lt;br /&gt;
! Device Clocking Options Select || CKSEL3..0&lt;br /&gt;
|-&lt;br /&gt;
| External Crystal/Ceramic Resonator || 1111 - 1010&lt;br /&gt;
|-&lt;br /&gt;
| External Low-frequency Crystal || 1001&lt;br /&gt;
|-&lt;br /&gt;
| External RC Oscillator || 1000 - 0101&lt;br /&gt;
|-&lt;br /&gt;
| Calibrated Internal RC Oscillator || 0100 - 0001&lt;br /&gt;
|-&lt;br /&gt;
| External Clock || 0000&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Neben dem Abschalten des Resetpins kann man sich allerdings noch durch ungeschicktes Setzen der Taktquelle aus dem Controller aussperren. Dies ist die häufigste Variante, mit der sich Neulinge aus einem AVR aussperren. Dabei wird irrtümlich anstelle eines &#039;&#039;externen Quarzes&#039;&#039; ein &#039;&#039;externer Quarzoszillator&#039;&#039; (Taktquelle, external Clock) mithilfe der Fusebits eingestellt. Beide Varianten benötigen aber eine unterschiedliche Anpassungschaltung innerhalb des Mikrocontrollers. Mit der Folge, dass ein externer Quarz bei Aktivierung Anpassungsschaltung für einen Quarzoszillator (oder generell für einen externen Takt) einfach nicht mehr anschwingt. Der Mikrocontroller hat somit keine Taktquelle und arbeitet nicht mehr.&lt;br /&gt;
&lt;br /&gt;
Für einen externen Quarz ist die Einstellung &#039;&#039;External Crystal/Ceramic Resonator&#039;&#039; notwendig, also eine Einstellung von &#039;&#039;1111&#039;&#039;. Unglücklicherweise ist bei den vielen Fusebit Einstellprogrammen nicht auf den ersten Blick offensichtlich, ob ein gesetztes Häkchen nun eine 1 oder eine 0 bedeutet. Anstatt auf &#039;&#039;1111&#039;&#039; werden die Fusebits auf &#039;&#039;0000&#039;&#039; gesetzt und damit ein &#039;&#039;External Clock&#039;&#039; eingestellt. Ein &#039;&#039;External Clock&#039;&#039; ist aber ein Quarzoszillator. Ein Quarz wird an so einer Einstellung nicht ins Schwingen kommen.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluss von Taktquellen siehe auch:&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Erg.C3.A4nzende_Hinweise_zur_Taktversorgung_.28kann_.C3.BCbersprungen_werden.29 Ergänzende Hinweise zur Taktversorgung] im [[AVR-Tutorial]]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR_Checkliste#Quarz_oder_Quarzoszillator_angeschlossen.3F Quarz oder Quarzoszillator angeschlossen?] in der [[AVR Checkliste]]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR_Checkliste#Fuses_richtig_gesetzt.3F Fuses richtig gesetzt?] in der [[AVR Checkliste]]&lt;br /&gt;
&lt;br /&gt;
=== Reaktivieren bei fehlerhaften Taktquellen-Fuse-Einstellungen ===&lt;br /&gt;
&lt;br /&gt;
Retten kann man einen AVR bei jeder falschen Taktquellen-Fuseeinstellung (Clock statt Quarz etc.), indem man an XTAL1 einen Takt anlegt. Falls ein weiterer AVR zur Verfügung steht, einfach einen Pin als Ausgang schalten und in einer  Endlosschleife auf high/low setzen. Jede andere Art Frequenzgenerator funktioniert auch, am einfachsten ein Quarzoszillator - die Teile mit 4 Beinchen, oder falls ohnehin ein Oszilloskop am Arbeitsplatz steht, dessen Rechtecksignal zum Abgleichen der Tastköpfe. Die Frequenz ist dabei eher unkritisch (&amp;lt;16 bzw. 20 MHz). &#039;&#039;&#039;Wichtig&#039;&#039;&#039; ist dabei die ISP-Frequenz, welche &#039;&#039;&#039;kleiner&#039;&#039;&#039; als 1/4 des CPU Taktes sein muss! Den Ausgang des Generators an XTAL1 des &amp;quot;verfusten&amp;quot; AVR anschliessen, eventuell die im Aufbau noch vorhandene Taktquelle (z.&amp;amp;nbsp;B. Quarz) sicherheitshalber abklemmen. Dann per ISP auf richtige Taktquelle einstellen. Alle GND-Anschlüsse bei allen genutzten Teilen verbinden, ebenso VCC für die gesamte Schaltung am Besten aus einer Quelle. 100nF als Enkoppelkondesator am AVR nicht vergessen, wenn es mal schnell auf einem Steckbrett passieren soll! Alle SEL und SUT-Fuses auf &amp;quot;1&amp;quot; dürfte bei Vewendung eines Quarzes erstmal weiterhelfen. Die Reset-Disable-Fuse und Debugwire-Enable-Fuse kann mit dieser Methode nicht zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Die CKDIV8-Fuse ist im Auslieferungszustand &amp;quot;programmed&amp;quot;=0, hat also ein Häkchen in PonyProg. Das bedeutet, dass die Quarzfrequenz intern durch 8 geteilt wird. D.h. man kann einen neuen AVR mit theoretisch maximal 250 kHz ISP-Takt programmieren. &#039;&#039;&#039;Praktisch&#039;&#039;&#039; sollte man &#039;&#039;&#039;maximal 125 kHz&#039;&#039;&#039; nutzen, denn durch Toleranzen kann der interne RC-Oszillator auch mal mit 900 kHz laufen, dann geht es mit 250 kHz nicht oder nur sporadisch. Ggf. mit noch niedrigeren Taktraten probieren, wenn das der Programmieradapter erlaubt. &lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.klaus-leidinger.de/mp/Mikrocontroller/meinetools.html#Preserver AVR-Preserver] von Klaus Leidinger (4 MHz mit Quarzoszillator).&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/evertool/index.html Evertool von Martin Thomas]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/81630#681808 Reaktivieren mit dem 1 MHz Kalibriersignal eines Oszilloskops] (Idee von Jörg im Forum)&lt;br /&gt;
&lt;br /&gt;
=== Reaktivieren beim CLKPR-Problem (Attiny13) ===&lt;br /&gt;
&lt;br /&gt;
Beim Attiny13 (und anderen) kann man aus dem Programm heraus die Taktquelle mit dem Vorteilerregister CLKPR heruntersetzen. Beim nächsten ISP-Programmieren kann das zu Problemen führen, wenn das Programm anläuft, die Taktquelle sehr langsam schaltet und dann erst in den ISP-Programmiermodus geschaltet wird. Travel Rec. beschreibt wie man mit einem Pull-Down-Widerstand an RESET Anlaufen des problematischen Programms verhindert [http://www.mikrocontroller.net/topic/166204#1587458].&lt;br /&gt;
&lt;br /&gt;
== Vergleich der Fuses bei verschiedenen Programmen ==&lt;br /&gt;
&lt;br /&gt;
Die Darstellung der Fuses in den verschiedenen Bedienprogrammen für ISP Geräte weicht voneinander ab und das kann den Anfänger ganz schön irritieren (mich hat es ;-). Daher hier ein Vergleich ausgelesener Werte bei drei verschiedenen Bedienprogrammen und dem gleichen programmierten AVR (ATmega32 mit externer Clock). &lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Achtung: Das ist nur ein Beispiel! Schaut euch euer Board an, lest in eurer Dokumentation und übernehmt &#039;&#039;nicht&#039;&#039; einfach die angezeigten Beispielwerte!}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AVR Studio ===&lt;br /&gt;
&lt;br /&gt;
Am gelungensten ist wohl die Darstellung in AVR Studio: man klickt vorne an, was man will (Häkchen gesetzt oder nicht) und &amp;quot;hinten&amp;quot; kümmert sich AVR Studio um die Fusebits. Ähnlich komfortabel arbeitet der AVR Fuse Calculator von Mark Hämmerling (s.u.), nur dass man die eingestellten Werte noch von Hand-zu-Fuss in seinen ISP Programmer übertragen muss.&lt;br /&gt;
&amp;lt;gallery perrow=&amp;quot;2&amp;quot; widths=&amp;quot;270&amp;quot; heights=&amp;quot;280&amp;quot; caption=&amp;quot;Fuse-Darstellung in AVR Studio&amp;quot;&amp;gt;&lt;br /&gt;
Bild:Avrstudio.png|Darstellung in [[AVR-Studio|AVR Studio]] 4.12&lt;br /&gt;
Bild:Avrstudio4.13.png|Darstellung in AVR Studio 4.13&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Pony-Prog_Tutorial|Ponyprog2000]]===&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Achtung: Die Abbildung soll nur das grundsätzliche Aussehen der Einstelldialogs zeigen. Es ist &#039;&#039;keine&#039;&#039; Empfehlung für irgendeine bestimme Einstellung. Die gewünschte Einstellung &#039;&#039;muss&#039;&#039; aus dem Datenblatt ermittelt werden!&lt;br /&gt;
&lt;br /&gt;
:Vor dem Einstellen der Wunschkonfiguration muss die vorhandene Einstellung per READ aus dem AVR ausgelesen werden (die neuste Version macht das jetzt automatisch). Macht man das nicht, kann (und wird ([http://www.mikrocontroller.net/topic/73479#603445])) es zur Blockade des AVR kommen.&lt;br /&gt;
&lt;br /&gt;
:Weiter ist zu beachten, dass bei PonyProg ein gesetztes Häkchen einer 0 im Datenblatt entspricht!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ponyprog2000.png|thumb|right|300px|Bei PonyProg entspricht ein gesetztes Häkchen einer &#039;&#039;&#039;0&#039;&#039;&#039; im Datenblatt]]&lt;br /&gt;
&lt;br /&gt;
CKSEL0-CKSEL3: Sind diese, wie in der Abbildung gezeigt, gesetzt, dann wird bei einem ATMega8/ATMega16 ein externer Takt (Oszillator, sonstiger Taktgeber) benutzt. Für einen Quarz sind im PonyProg die Häkchen bei CKSEL0 - CKSEL3 &amp;lt;b&amp;gt;nicht&amp;lt;/b&amp;gt; gesetzt. Für andere Prozessoren &amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;im Datenblatt&amp;lt;/font&amp;gt; die korrekte Einstellung ermitteln. Im Zweifel gilt &amp;lt;b&amp;gt;immer&amp;lt;/b&amp;gt; das Datenblatt.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle noch mal die &amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Warnung&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;: Die Beschaltung der CKSEL Fuses ist kritisch! Lieber mit dem Datenblatt 3 mal abklären ob die Einstellung stimmt. Dabei aber beachten:&lt;br /&gt;
* Ein Quarz ist &amp;lt;b&amp;gt;kein&amp;lt;/b&amp;gt; &amp;quot;external clock&amp;quot;. Für einen Quarz wird im Datenblatt die Bezeichnung &amp;quot;crystal oscillator&amp;quot; benutzt.&lt;br /&gt;
* Bei PonyProg wird eine 1 aus dem Datenblatt durch ein &amp;lt;b&amp;gt;nicht&amp;lt;/b&amp;gt; gesetztes Häkchen symbolisiert.&lt;br /&gt;
* Vor dem Neusetzen der Fuse-Bits &amp;lt;b&amp;gt;unbedingt&amp;lt;/b&amp;gt; vorher die momentane Einstellung vom Chip auslesen lassen! Bei einem nagelneuen Prozessor sind die Fuse Bits so gesetzt, dass er mit dem internen Taktgenerator auf 1Mhz arbeitet. Das Muster der Häkchen mit dem vorgegebenen Muster für diese Einstellung im Datenblatt vergleichen (diese Einstellung ist im Datenblatt als &amp;lt;i&amp;gt;Default&amp;lt;/i&amp;gt; markiert) um sicher verstanden zu haben, wie das mit den Häkchen funktioniert. Erst dann die Änderung vornehmen und neu schreiben.&lt;br /&gt;
* Fuse Bits werden immer alle gleichzeitig gelesen und geschrieben! Daher &amp;lt;font color=FF0000&amp;gt;immer&amp;lt;/font&amp;gt; vor dem Verändern von Fusebits die momentan im Mikrocontroller gespeicherten Fusebits auslesen - die gewünschten Änderungen durchführen - und erst dann die veränderten Werte zurückschreiben!&lt;br /&gt;
&lt;br /&gt;
Falls man sich doch vertut und dem Prozessor eine falsche Einstellung gegeben hat, dann wird er vom Brennprogramm nicht mehr erkannt, egal welches Programm dies ist. Widerstehen sie aber der Versuchung, dieselbe Einstellung mit einem anderen Prozessor noch einmal zu versuchen. Der ver-fuste Prozessor ist nicht defekt und die falsche Fuse Stellung wird auch mit einem anderen Prozessor nicht funktionieren. Der ver-fuste Prozessor kann [[AVR_Fuses#Reaktivieren_bei_fehlerhaften_Taktquellen-Fuse-Einstellungen|wiederbelebt]] werden!&lt;br /&gt;
&lt;br /&gt;
=== [[AVRDUDE]] ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrdude.png|thumb|right|300px|avrdude zeigt den Zustand der Fuses auf dem Terminal]]&lt;br /&gt;
AVRDUDE ist ein Konsolenprogramm und liefert den Zustand der Fuses als HEX-Wert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude.exe: Version 5.1&lt;br /&gt;
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/&lt;br /&gt;
&lt;br /&gt;
System wide configuration file is &amp;quot;D:\WINAVR\BIN\avrdude.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Using Port            : com1&lt;br /&gt;
Using Programmer      : stk500v2&lt;br /&gt;
AVR Part              : ATMEGA32&lt;br /&gt;
Chip Erase delay      : 9000 us&lt;br /&gt;
PAGEL                 : PD7&lt;br /&gt;
BS2                   : PA0&lt;br /&gt;
RESET disposition     : dedicated&lt;br /&gt;
RETRY pulse           : SCK&lt;br /&gt;
serial program mode   : yes&lt;br /&gt;
parallel program mode : yes&lt;br /&gt;
Timeout               : 200&lt;br /&gt;
StabDelay             : 100&lt;br /&gt;
CmdexeDelay           : 25&lt;br /&gt;
SyncLoops             : 32&lt;br /&gt;
ByteDelay             : 0&lt;br /&gt;
PollIndex             : 3&lt;br /&gt;
PollValue             : 0x53&lt;br /&gt;
Memory Detail         :&lt;br /&gt;
&lt;br /&gt;
            Block Poll               Page                       Polled&lt;br /&gt;
Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack&lt;br /&gt;
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------&lt;br /&gt;
eeprom         4    10    64    0 no       1024    4      0  9000  9000 0xff 0xff&lt;br /&gt;
flash         33     6    64    0 yes     32768  128    256  4500  4500 0xff 0xff&lt;br /&gt;
lfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00&lt;br /&gt;
hfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00&lt;br /&gt;
lock           0     0     0    0 no          1    0      0  2000  2000 0x00 0x00&lt;br /&gt;
signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00&lt;br /&gt;
calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00&lt;br /&gt;
&lt;br /&gt;
Programmer Type : STK500V2&lt;br /&gt;
Description     : Atmel STK500 V2&lt;br /&gt;
Hardware Version: 15&lt;br /&gt;
Firmware Version: 2.10&lt;br /&gt;
Topcard         : Unknown&lt;br /&gt;
Vtarget         : 0.0 V&lt;br /&gt;
Varef           : 5.0 V&lt;br /&gt;
Oscillator      : 3.686 MHz&lt;br /&gt;
SCK period      : 0.1 us&lt;br /&gt;
&lt;br /&gt;
avrdude.exe: AVR device initialized and ready to accept instructions&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100% 0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude.exe: Device signature = 0x1e9502&lt;br /&gt;
avrdude.exe: safemode: lfuse reads as 20&lt;br /&gt;
avrdude.exe: safemode: hfuse reads as DB&lt;br /&gt;
&lt;br /&gt;
avrdude.exe: safemode: lfuse reads as 20&lt;br /&gt;
avrdude.exe: safemode: hfuse reads as DB&lt;br /&gt;
avrdude.exe: safemode: Fuses OK&lt;br /&gt;
&lt;br /&gt;
avrdude.exe done.  Thank you.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrdude_fc.png|thumb|300px|right|[http://www.engbedded.com/cgi-bin/fc.cgi AVR Fuse Calculator] ]]&lt;br /&gt;
Zur Entschlüsselung kann man prima den Online-Rechner [http://www.engbedded.com/fusecalc/ AVR Fuse Calculator] von Mark Hämmerling nehmen.&lt;br /&gt;
&lt;br /&gt;
{{Clear}} &lt;br /&gt;
&lt;br /&gt;
[[Bild:Burn-O-Mat.png|thumb|300px|right|[http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_avrdude_gui_online.html Burn-O-Mat] ]]&lt;br /&gt;
Oder man steuert AVRDUDE über ein grafisches User Interface (&#039;&#039;&#039;GUI&#039;&#039;&#039;), z.&amp;amp;nbsp;B. mit dem von Torsten Brischalle in JAVA geschriebenen [[Burn-o-mat|AVR Burn-O-Mat]]. Das Programm läuft unter Windows, Linux und anderen Betriebssystemen, für die Java erhältich ist. (Homepage: [http://avr8-burn-o-mat.aaabbb.de/ AVR8 Burn-O-Mat]) Auf der Homepage ist auch eine [http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_avrdude_gui_online.html Online-Version], mit der der Hex-Code der Fuses berechnet und die Kommandozeilenparameter für AVRDUDE ausgegeben werden können.&lt;br /&gt;
&lt;br /&gt;
Mittels der Kommandozeile kann man avrdude wie folgt verwenden um die Fuses zu schreiben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c PROGRAMMER -P PORT -p PART -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/95882#827101 Fuses im Programm auslesen] von Andreas Kaiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Kategorie: AVR-Programmer und -Bootloader]]&lt;br /&gt;
&lt;br /&gt;
* Auf der Internetseite [http://www.engbedded.com/fusecalc/ Engbedded AVR Fuse Calculator] kann man sich die Fuses nach den eigenen Vorgaben berechnen lassen.&lt;/div&gt;</summary>
		<author><name>Rolfn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Absolute_Beginner-AVR_Steckbrettprojekte&amp;diff=58341</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=58341"/>
		<updated>2011-07-07T13:42:36Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: /* PWM   Pulsweitenmodulation */&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| Mega 88]] wird aus einer 9V Block-Batterie und dem [[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]] festgelegt, dass der 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 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 PortD im Einzelschrittmodus (F10) betrachten. &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 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 D0bis3 Ausgänge und D4bis7 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;
&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;
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;
&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 sag 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 470Ohm 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>Rolfn</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Platinenhersteller&amp;diff=58329</id>
		<title>Platinenhersteller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Platinenhersteller&amp;diff=58329"/>
		<updated>2011-07-06T09:02:45Z</updated>

		<summary type="html">&lt;p&gt;Rolfn: /* Contag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Die Vor- und Nachteile von Platinenherstellern/-lieferanten werden relativ häufig im [http://www.mikrocontroller.net/forum/platinen Forum] diskutiert (und führen ab und zu zu Flamewars :-). Damit man schnell einen Überblick über die verschiedenen Möglichkeiten erhält, soll hier eine Liste zusammengetragen werden.&lt;br /&gt;
&lt;br /&gt;
Jeder kann/soll seinen Beitrag leisten, d.h. wenn man einen Platinenlieferanten kennt, der noch nicht erwähnt ist, einfach hinzufügen. Falls man den Hersteller nicht so gut kennt, einfach mal den Namen und die URL hinzufügen, es gibt sicherlich andere, die den Hersteller so gut kennen, dass sie sich zutrauen, ein Urteil über die Leistung zu fällen.&lt;br /&gt;
&lt;br /&gt;
Eigentümer oder Mitarbeiter der gelisteten Firmen mögen bitte der Versuchung widerstehen, die Einträge mit werbeähnlichen Texten oder Werbung zu ergänzen. Zufriedene Kunden mögen bitte darauf achten, ihre Zufriedenheit so zu formulieren, dass nicht der Eindruck entsteht, der Eintrag sei von einem Hersteller zur &amp;quot;Verschönerung&amp;quot; gemacht worden.&lt;br /&gt;
&lt;br /&gt;
PS.: Das Ganze soll so ähnlich werden wie [[Elektronik-Versender]], da hat das auch sehr gut geklappt!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diese Seite kann nur von angemeldeten Benutzern bearbeitet werden!&#039;&#039;&#039; Bei neuen Einträgen bitte die Sortierung beachten.&lt;br /&gt;
&lt;br /&gt;
Einige Hinweise, Hilfestellungen zur Platinenfertigung und Auftragsvergabe gibt es auch in der [http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.6 de.sci.electronics-FAQ].&lt;br /&gt;
&lt;br /&gt;
===Preise===&lt;br /&gt;
Zur besseren Vergleichbarkeit bei jedem Hersteller dazu schreiben, was &#039;&#039;&#039;eine doppelseitige durchkontaktierte Eurokarte (160mm x 100mm) mit deutscher MwSt.&#039;&#039;&#039; ohne Versand kostet.&lt;br /&gt;
Dazu noch die Lieferzeit und ob Lötstopplack und Bestückungsdruck dabei ist.&lt;br /&gt;
&#039;&#039;Zusätzlich&#039;&#039; kann man noch die Preise für andere Formate, Stückzahlen etc. dazu schreiben.&lt;br /&gt;
&lt;br /&gt;
== Liste der Hersteller ==&lt;br /&gt;
&lt;br /&gt;
=== Deutschland ===&lt;br /&gt;
&lt;br /&gt;
==== Aetzwerk Gmbh ====&lt;br /&gt;
Homepage: http://www.aetzwerk.de&lt;br /&gt;
&lt;br /&gt;
* verschicken unaufgeforderte Newsletter&lt;br /&gt;
&lt;br /&gt;
Eigendarstellung:&lt;br /&gt;
&lt;br /&gt;
* Leiterplatten, bei denen Preis und Qualität stimmen&lt;br /&gt;
* Einfache Onlinepreisberechnung&lt;br /&gt;
* Ein- und doppelseitige Leiterplatten, Multilayer (s. a. Produktspektrum auf der Homepage) &lt;br /&gt;
* Expressfertigung&lt;br /&gt;
* SMD-Schablonen&lt;br /&gt;
&lt;br /&gt;
==== amsTechnology ====&lt;br /&gt;
Homepage: http://www.amstechnology.de&lt;br /&gt;
* Leiterplatten und Bestückung (Prototypen und Kleinserien, bis hin zur Großserie)&lt;br /&gt;
* Sehr schnell&lt;br /&gt;
* Ein- und doppelseitige Leiterplatten, Multilayer. &lt;br /&gt;
* Layoutservice&lt;br /&gt;
* SMD- und THT Bestückung&lt;br /&gt;
* Gerätebau&lt;br /&gt;
* günstige Preise&lt;br /&gt;
* sehr gute Qualität&lt;br /&gt;
* Lieferzeit an 3 AT&lt;br /&gt;
* Bauelementebeschaffung auch schon bei 1 Stück (super funktioniert)&lt;br /&gt;
&lt;br /&gt;
==== andus electronic ====&lt;br /&gt;
Homepage: http://www.andus.de&lt;br /&gt;
* Prototypen Fertigung&lt;br /&gt;
* Top Qualität&lt;br /&gt;
* Top Service&lt;br /&gt;
* Vergleichsweise Teuer&lt;br /&gt;
&lt;br /&gt;
==== ANTtronic ====&lt;br /&gt;
Homepage: http://www.anttronic.de/pcb/&lt;br /&gt;
&amp;lt;!-- früher http://www.gsel.de --&amp;gt;&lt;br /&gt;
* gute Preise, aber Lieferzeit beachten!&lt;br /&gt;
* 1 Europlatine einseitig kein Lötstoplack 17€ inkl. MwSt +7€ Versand&lt;br /&gt;
* 1 Europlatine doppelseitig &#039;&#039;nicht durchkontaktiert&#039;&#039; kein Lötstoplack 23€ inkl. MwSt +7€ Versand; 2Stück 37€&lt;br /&gt;
&lt;br /&gt;
==== Basista Leiterplatten ====&lt;br /&gt;
Homepage: http://www.basista.de&lt;br /&gt;
* Eurokarte doppelseitig für 52€ inkl. MwSt / mit Stopplack + Best.Druck 94€ inkl. MwSt&lt;br /&gt;
* Prototypen standardmäßig chemisch zinnbehandelt&lt;br /&gt;
* Preise OK&lt;br /&gt;
* Früher geliefert ohne Aufpreis (7 statt 10 AT)&lt;br /&gt;
* Qualität OK&lt;br /&gt;
&lt;br /&gt;
==== Bauer-Elektronik ====&lt;br /&gt;
Homepage: http://www.bauer-leiterplatten.de/&lt;br /&gt;
* Eurokarte doppelseitig für 61€ inkl. MwSt 8AT Lieferzeit / Stopplack +10% / Best.Druck +10%&lt;br /&gt;
* Prototypen aktivzinnbehandelt, dieses lässt sich laut Firmenangaben noch nach Jahren löten&lt;br /&gt;
* Eildienst 2h: Versand am selben Tag bei Einsendung bis 13:00 400€ für 2dm²&lt;br /&gt;
&lt;br /&gt;
==== B&amp;amp;B Gruppe====&lt;br /&gt;
&lt;br /&gt;
Homepage: http://www.bb-gruppe.de&lt;br /&gt;
*Hersteller aus Mittweida/Sachsen&lt;br /&gt;
*Standardformate&lt;br /&gt;
*Starflex, FlexLam, Dickkupfer bis 500µm, Dünnstleiterplatte und vieles mehr&lt;br /&gt;
&lt;br /&gt;
==== Contag====&lt;br /&gt;
&lt;br /&gt;
Homepage: http://www.contag.de&lt;br /&gt;
* SAUSCHNELL- ab 4 STUNDEN(!)&lt;br /&gt;
* Aber auch sehr teuer&lt;br /&gt;
* Qualität sehr gut&lt;br /&gt;
&lt;br /&gt;
==== Elischer Leiterplatten ====&lt;br /&gt;
e-mail: Melischer@aol.com&lt;br /&gt;
* sehr gute Preise, Qual.1A&lt;br /&gt;
* 3KW Lieferzeit&lt;br /&gt;
* Daten laut Google:  Dipl.-Ing. A. Elischer, Am Forst 7, 72574 Bad Urach  Tel. 07125-4498&lt;br /&gt;
* Layoutentwurf, LP Entwicklung, herstellen, bestücken, löten, prüfen&lt;br /&gt;
&lt;br /&gt;
==== Elk Tronic ====&lt;br /&gt;
&lt;br /&gt;
Homepage [http://www.elk-tronic.de/ http://www.elk-tronic.de]&lt;br /&gt;
*Entwicklung und Fertigung von Kleingeräten und Kleinserien&lt;br /&gt;
*Verkauf von IC-Adaptern und Bauteilen&lt;br /&gt;
&lt;br /&gt;
==== Fischer Leiterplatten GmbH ====&lt;br /&gt;
Homepage: http://www.fischer-leiterplatten.de&lt;br /&gt;
* 1 Europlatine inkl. Lack, E-Test, ohne Bestückungsdruck für 46,41€ inkl. MwSt in 10 Tagen + Versand&lt;br /&gt;
* 1 Europlatine inkl. Lack, E-Test, Best.-Druck top oder bottom für 58,31€ inkl. MwSt in 10 Tagen + Versand&lt;br /&gt;
* 1 Europlatine inkl. Lack, E-Test, Best.-Druck doppelseitig für 117,81€ inkl. MwSt in 10 Tagen + Versand&lt;br /&gt;
* max. 4 lagig&lt;br /&gt;
* Bestückungsdruck doppelseitig&lt;br /&gt;
* Bohrungen no limit&lt;br /&gt;
* min Clearance 0,15mm (Standard)&lt;br /&gt;
* min Bohrdurchmesser 0,3mm (Standard)&lt;br /&gt;
* Gerber/Eagle/Protel/Target&lt;br /&gt;
* mehrere Leiterplatten können auf einer Europakarte, zum Preis einer Europakarte, zusammengefasst werden und werden automatisch vereinzelt.&lt;br /&gt;
* Überlieferung wird kostenlos beigelegt. (Sprich: in der Regel werden mehr Leiterplatten geliefert als bestellt.)&lt;br /&gt;
* Verkauf nur an Gewerbetreibende (aber es wird kein Gewerbenachweis verlangt ;) )&lt;br /&gt;
* Erfahrungen: [http://www.mikrocontroller.net/topic/209947#2078731]&lt;br /&gt;
&lt;br /&gt;
==== GLS Leiterplatten-Service GmbH ====&lt;br /&gt;
Homepage: http://www.leiterplattenprototypen.de&lt;br /&gt;
* Prototypenfertigung bei Chemnitz&lt;br /&gt;
* Top Qualität (mittleres Preisniveau)&lt;br /&gt;
* Top Service&lt;br /&gt;
* Prüfung der Layoutdaten in der CAM&lt;br /&gt;
* Standardlieferzeit: 10 Arbeitstage&lt;br /&gt;
* Eilservice bis 3 Arbeitstage (mit Aufpreis)&lt;br /&gt;
* Oberfläche Standard: HAL bleifrei; aber auch z.&amp;amp;nbsp;B. chem. Gold, chem. Zinn und HAL bleihaltig&lt;br /&gt;
* einseitige, nichtdurchkontaktierte Leiterplatten &lt;br /&gt;
* durchkontaktierte Leiterplatten&lt;br /&gt;
* Multilayer: bis 8-Lagen&lt;br /&gt;
* bietet zusätzlichen Service rund um die Leiterplatte: Erstellung von Leiterplattenlayouts und Digitalisierung/Scannen von alten Fertigungsfilmen, Papierausdrucken oder vorhandenen Musterleiterplatten&lt;br /&gt;
* SMD Schablonen&lt;br /&gt;
&lt;br /&gt;
==== HAKA Elektronik-Leiterplatten GmbH ====&lt;br /&gt;
Homepage: http://www.haka-lp.de/&lt;br /&gt;
* Zwillingsangebot: 2 identische Europakarten für 50€ (durchkontaktiert, Lötstop, kein Bestückungsdruck, nur Eagle- oder Target-Dateien), auch hierbei kostenlose Duplizierung kleinerer Layouts&lt;br /&gt;
* Zwillingsangebot: 2 identische Doppel-Eurokarten (200x160) für 90€, gleiche Bedingungen wie oben&lt;br /&gt;
* bei Platinen kleiner 1 qdm gibt es entsprechend mehr ohne Aufpreis&lt;br /&gt;
* Lieferzeit ab 3 Werktage&lt;br /&gt;
* sehr gute Qualität&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Auf der Homepage ist von Platinen nichts mehr zu sehen --Esko&lt;br /&gt;
==== LED-Hobby ====&lt;br /&gt;
Homepage: http://www.led-hobby.de/&lt;br /&gt;
* Kleinster Leiterbahnabstand: 0,2mm&lt;br /&gt;
* Kleinste Leiterbahnbreite: 0,2mm&lt;br /&gt;
* Kleinste Bohrung: 0,3mm&lt;br /&gt;
* Preis 0,35 EUR pro 1 x 1 cm (folglich 56,- EUR für eine doppelseitige Europakarte)&lt;br /&gt;
* RoHS-konform, made in Germany.&lt;br /&gt;
* Es sind alle Konturen, durchkontaktierte Bohrungen, Verzinnung (bleifrei) und beidseitiger grüner Lötstopplack enthalten. Kein Aufpreis, kein Grundpreis, keine Nacharbeit. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IBR Leiterplatten GmbH &amp;amp; Co. KG ====&lt;br /&gt;
Homepage: http://www.ringler.de&lt;br /&gt;
* sehr freundlicher und kompetenter Service&lt;br /&gt;
* reagiert sehr schnell&lt;br /&gt;
* Qualität TOP&lt;br /&gt;
* Preise TOP - günstige Einmalkosten/Setup&lt;br /&gt;
* kann auch Dinge wie Alu,Starrflex,fine pitch oder 0,1 er vias&lt;br /&gt;
* Lieferzeit ab 2 Tage&lt;br /&gt;
* 2 Lagen in 10 Tagen - 10 Lagen Multilayer ohne besondere Nachfrage binnen 18 Tagen geliefert&lt;br /&gt;
* liefert generell schneller als bestätigt / macht auch Rahmenaufträge&lt;br /&gt;
* Mehrmengen bei Prototypen werden kostenlos geliefert&lt;br /&gt;
* SMD-Schablonen&lt;br /&gt;
&lt;br /&gt;
==== ILFA Feinstleitertechnik GmbH ====&lt;br /&gt;
Homepage: http://www.ilfa.de&lt;br /&gt;
&lt;br /&gt;
==== LEITON ====&lt;br /&gt;
Homepage: [http://www.leiton.de/ leiterplatten-online.de]&lt;br /&gt;
* Flexible Leiterplatten online kalkulieren&lt;br /&gt;
* Alle Layouts werden in der CAM eingehend geprüft&lt;br /&gt;
* Schnellste Bearbeitung von Anfragen &lt;br /&gt;
* Diverse Spezialfertigungen (Aluminiumkern, HF, hoch-Tg etc.)&lt;br /&gt;
* Fließender Übergang vom Prototyp in die Serie möglich&lt;br /&gt;
* Niederlassungen in Hongkong &amp;amp; China für Großserien (LeitOn HK Ltd.)&lt;br /&gt;
* Relativ günstig&lt;br /&gt;
* bei mehreren kleinen Leiterplatten wird nach Gesamtfläche berechnet, nicht nach Mindestfläche x Mindestpreis x Stückzahl&lt;br /&gt;
* Doppelseitige Europlatine mit Lötstop in 8 Tagen 61,25 Eur&lt;br /&gt;
* In 15 Tagen 49 Eur&lt;br /&gt;
* Gute Qualität&lt;br /&gt;
* Bis 8-lagig und ab 12 Std.&lt;br /&gt;
&lt;br /&gt;
==== Microcirtec  ====&lt;br /&gt;
Homepage: http://www.microcirtec.de&lt;br /&gt;
* Direct - Online - Shop — zum Kalkulieren-Bestellen und Kaufen&lt;br /&gt;
* Mit Auftragsverfolgung per Online&lt;br /&gt;
* Vom Rapid Prototyping bis zur Rapid Mass-Production&lt;br /&gt;
* Qualität betrachten wir als selbstverständlich&lt;br /&gt;
* Allerdings ist die Anmelde-Prozedur ein Drama&lt;br /&gt;
* Preiswert&lt;br /&gt;
&lt;br /&gt;
==== mmetoolshop / MME-Leiterplatten ====&lt;br /&gt;
Homepage: http://mme-pcb.de&lt;br /&gt;
eBay: http://stores.ebay.de/mmetoolshop&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/73790 Thread &#039;MME-PCB, Erfahrungen&#039;]&lt;br /&gt;
* Verkauft sowohl über die eigene Homepage als auch über eBay (zu identischen Konditionen)&lt;br /&gt;
* Europakarte: ES: 20,60 EUR, DSDK: 41,50 EUR&lt;br /&gt;
* Durchkontaktierung bei zweiseitigen Leiterplatten ist im Preis inbegriffen&lt;br /&gt;
* Trennen und Bohren inklusive&lt;br /&gt;
* Stopplack (11€) und Bestückungsdruck (16€) kosten extra&lt;br /&gt;
* min. Abstand 0,20 mm,  min. Leiterbahnbreite 0,20 mm, kleinste Bohrung 0,4 mm&lt;br /&gt;
&amp;lt;!-- * sehr gute Qualität --&amp;gt;&lt;br /&gt;
* Lieferzeit 8-12 Arbeitstage (bei mir waren es nur 5 Werktage)&lt;br /&gt;
* Überlieferung kostet nichts (häufig wird eine Leiterplatte mehr geliefert, bei mir waren es bei vier bestellten Platinen zwei mehr)&lt;br /&gt;
* Mit einer bestellten einseitigen Platine (DIL Bauteile) bin ich sehr zufrieden&lt;br /&gt;
* Die auf der Seite beworbene Lierferzeit wird meist nicht eingehalten.&lt;br /&gt;
* Bis zu zehn unterschiedliche Karten können in einem Auftrag gepoolt werden -&amp;gt; preiswerter weil dm² kosten über alle gerechnet werden.&lt;br /&gt;
* Antwortet bei mir nicht auf emails, telefonisch kaum zu erreichen.&lt;br /&gt;
&lt;br /&gt;
==== Multi PCB Ltd. ====&lt;br /&gt;
Homepage: http://www.multipcb.de/leiterplatten.html&lt;br /&gt;
&amp;lt;!-- nur http://www.multipcb.de zeigt ein Upload-Form (6.4.09 FF und IE) --&amp;gt;&lt;br /&gt;
* nur für Gewerbetreibende&lt;br /&gt;
* Eurokarte doppelseitig mit Lötstopplack und Bestückungsdruck 78€ inkl. MwSt&lt;br /&gt;
* Online Kalkulator&lt;br /&gt;
&amp;lt;!-- (wurde von &amp;quot;ordentlich&amp;quot; auf &amp;quot;hervorragend&amp;quot; vom einem sehr zufriedenen Kunden umgeändert oder vom Anbieter? Anbieter finden ihre Produkte hoffentlich alle hervorragend. &amp;quot;Sehr gute Qualität&amp;quot; nun ohnehin schon unten) * hervoragende Qualität bei gutem Preis  * interessant für Serien; neuer günstiger Service für Prototypen --&amp;gt;&lt;br /&gt;
* farbiger Lötstopplack und Bestückungsdruck möglich&lt;br /&gt;
* 48 Stunden Express&lt;br /&gt;
* Kompletter Design-Rule-Check der CAM-Daten&lt;br /&gt;
* Diverse Spezialfertigungen (Flex, Starrflex, Metallkern, HF, hoch-Tg, etc.)&lt;br /&gt;
* Sehr gute Qualität&lt;br /&gt;
&lt;br /&gt;
==== M &amp;amp; V Leiterplatten - Vertriebs GmbH ====&lt;br /&gt;
Homepage: &amp;lt;!-- http://www.mvpcb.de/ alte Adresse--&amp;gt; http://pcb-center.de/&lt;br /&gt;
* Bin sehr zufrieden, gute Preise, 10 - 14 Tage&lt;br /&gt;
* Top Qualität, nichts auszusetzen&lt;br /&gt;
* Qualität sehr gut, hohe Auflösung, auch SMD fine pitch möglich&lt;br /&gt;
* Eurokarte doppelseitig 2xStopplack FR4 bleifrei konturgefräst  63€ inkl. MwSt zzgl. Versand&lt;br /&gt;
* Eurokarte einseitig    1xStopplack FR4 bleifrei konturgefräst  44€ inkl. MwSt zzgl. Versand&lt;br /&gt;
&lt;br /&gt;
* Freundlicher Kontakt, Leiterplatten sehen gut aus, lieferten 6 Tage zu frueh!&lt;br /&gt;
* Biszu fünf unterschiedliche Karten können in einem Auftrag gepoolt werden -&amp;gt; preiswerter weil dm² kosten über alle gerechnet werden.&lt;br /&gt;
&lt;br /&gt;
==== PCB Pool ====&lt;br /&gt;
Homepage: http://www.pcb-pool.de/&lt;br /&gt;
* ideal für einzelne Boards und Klein(st)serien&lt;br /&gt;
* Preise im üblichen Rahmen&lt;br /&gt;
* Günstigere Preise für 10er oder 20er Auflage&lt;br /&gt;
* sehr gute Qualität&lt;br /&gt;
* Lieferzeit ab 2 AT&lt;br /&gt;
* SMD-Schablonen&lt;br /&gt;
* Kosten vor Bestellung eindeutig ersichtlich - keine unerwarteten Nebenkosten&lt;br /&gt;
&lt;br /&gt;
==== Q-print/Q-PCB ====&lt;br /&gt;
Homepage: http://www.Q-PCB.de&lt;br /&gt;
* ideal für einzelne Boards und Klein(st)serien&lt;br /&gt;
* supergünstige Preise &lt;br /&gt;
* gute Qualität (u.U. Lötstop etwas unsauber)&lt;br /&gt;
* keine Zusatzpreise für 2x Lötstoplack o.ä.&lt;br /&gt;
* 150 µm kleinste Strukturbreite&lt;br /&gt;
* ohne Aufpreis bekommt man entweder HAL oder Ni/Au, gegen Aufpreis kann man aus einem von beiden wählen&lt;br /&gt;
* SMD-Schablonen&lt;br /&gt;
* Lieferzeit ab 4 AT&lt;br /&gt;
* Platine 50mm x 60mm, doppelseitig: ~45€ incl. Versand und ~5€ Nachnahme&lt;br /&gt;
* Platine 85mm x 58mm, doppelseitig: 33€ zzgl 6,80 Versand&lt;br /&gt;
* Platine 100mm x 160mm, doppelseitig: 49€ +7€ für Lötstopp +6,80€ Versand&lt;br /&gt;
&lt;br /&gt;
==== SMTstencil (Großbritannien) ====&lt;br /&gt;
SMD-Schablonen aus Polyester gelasert, preiswert, kleinste Strukturen 0,25 x 0,25 mm², kleinster Abstand 0,3 mm&lt;br /&gt;
&lt;br /&gt;
Homepage: http://smtstencil.co.uk/&lt;br /&gt;
&lt;br /&gt;
==== Steimer Leiterplatten GmbH ====&lt;br /&gt;
Homepage: http://www.steimer.de&lt;br /&gt;
&lt;br /&gt;
==== The PCB-Shop / Europrint Deutschland GmbH ====&lt;br /&gt;
Homepage: http://www.thepcbshop.com&lt;br /&gt;
* Punktabzug, da der Preisrechner nur mit Internet Explorer funktioniert&lt;br /&gt;
* gute Qualität&lt;br /&gt;
* guter Preis (inkl. gratis Überlieferungen - 30 kleine Platinen bestellt, 35 bekommen)&lt;br /&gt;
* wenig Statusinformationen (Link zur Statusseite kommt per Mail, dort ändert sich der Status und der Empfänger eigentlich täglich - ist aber trotzdem fristgerecht angekommen)&lt;br /&gt;
&lt;br /&gt;
==== Würth Elektronik GmbH &amp;amp; Co. KG ====&lt;br /&gt;
Homepage: http://www.we-online.de&lt;br /&gt;
* gehört sicherlich nicht zu den preisgünstigsten&lt;br /&gt;
* kann Bauteile in der Leiterplatte fertigen (R, C, Potis u.a.)&lt;br /&gt;
* beherrscht Microvias in allen erdenklichen Varianten&lt;br /&gt;
* sehr kompetentes Ansprechpersonal&lt;br /&gt;
&lt;br /&gt;
==== Onlineshop WEdirekt ====&lt;br /&gt;
&amp;lt;!-- Benutzer:Bede hat diese Beitrag eingefügt und sonst nie etwas im Wiki geschrieben, daher höchstwahrscheinlich Spam. Daher positive Meinung entfernt --&amp;gt;&lt;br /&gt;
Homepage: http://www.wedirekt.de&lt;br /&gt;
* PCB&#039;s in Basistechnologie, 2-8 Lagen&lt;br /&gt;
* SMD Schablonen in allen Ausführungen&lt;br /&gt;
* Europlatine doppelseitig mit Lötstopplack 67€ inkl. MwSt&lt;br /&gt;
* Design- und Applikationsfachbücher rund um EMV&lt;br /&gt;
&amp;lt;!-- * online kalkulieren und bestellen&lt;br /&gt;
* günstig, super Qualität  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Deutschland sehr günstige===&lt;br /&gt;
Diese Hersteller zeichnen sich durch einen sehr günstigen Preis von &#039;&#039;&#039;unter 30€ pro doppelseitiger Eurokarte&#039;&#039;&#039; aus und können &#039;&#039;&#039;keine Durchkontaktierungen&#039;&#039;&#039; herstellen.&lt;br /&gt;
&lt;br /&gt;
==== Cadgrafik Bauriedl (nur Filme) ====&lt;br /&gt;
Homepages: http://cadgrafik-bauriedl.de/leiterplattenfilme.htm&lt;br /&gt;
&amp;lt;!-- identischer Inhalt: http://www.so-pbdl.de/leiterplattenfilme.htm --&amp;gt;&lt;br /&gt;
* Überträgt Layouts auf hochwertige Folie/Film zum Selberätzen&lt;br /&gt;
* 1,15 € / 100 cm² Film, 2,50 € Mindestbestellwert (Stand März 2009)&lt;br /&gt;
* 2 € Porto (Stand März 2009)&lt;br /&gt;
&lt;br /&gt;
==== EBC Utz Kohl ====&lt;br /&gt;
Homepage: [http://www.e-b-c-elektronik.de http://www.e-b-c-elektronik.de]&lt;br /&gt;
* recht einfach gehalten, daher wirklich günstig&lt;br /&gt;
* Ideal für den Bastler, denen es auf den Preis ankommt&lt;br /&gt;
* Geätzt einseitig Euroformat 160 x 100mm 16,- EUR (zzgl 1,- EUR  Entsorgungspauschale pro Platine)&lt;br /&gt;
* Geätzt doppelseitig Euroformat 160 x 100mm 26,20 (zzgl 2,- EUR  Entsorgungspauschale pro Platine)&lt;br /&gt;
* doppelseitige Platinen sind nicht durchkontaktiert !&lt;br /&gt;
* eigentlich ein Ladengeschäft, versendet jedoch auch&lt;br /&gt;
&lt;br /&gt;
==== Platinenbelichter ====&lt;br /&gt;
Homepage: http://www.platinenbelichter.de&lt;br /&gt;
* sehr preiswert&lt;br /&gt;
* Ein- und Doppelseitig bis 300x200mm&lt;br /&gt;
* eine doppelseitige Europlatine kostet 13,50 EUR Grundpreis + Bohrung 1,8cent + Optionen&lt;br /&gt;
* Keine Durchkontaktierungen möglich&lt;br /&gt;
* Lieferzeit von bis zu 8 &#039;&#039;&#039;Arbeits&#039;&#039;&#039;tagen nach Geldeingang&lt;br /&gt;
* Qualität ist mehr als ausreichend für TQFP&lt;br /&gt;
Nachteile&lt;br /&gt;
* er vergisst auch mal die Platinen abzuschicken&lt;br /&gt;
* Unstimmigkeiten (bezüglich der Platine) werden nur auf Nachfragen behoben, solange liegt die Platine bei ihm rum.&lt;br /&gt;
* unter ungünstigen Umständen kommt es auch mal zu Verzögerungen von über 2 Wochen&lt;br /&gt;
&lt;br /&gt;
==== Platinendesign ====&lt;br /&gt;
Homepage: http://www.platinendesign.de/&lt;br /&gt;
* sehr preiswert&lt;br /&gt;
* Ein- und Doppelseitig bis 200x250mm&lt;br /&gt;
* eine doppelseitige Europlatine kostet 14 EUR Grundpreis + Bohrung 2cent + Optionen&lt;br /&gt;
* keine Durchkontaktierungen möglich&lt;br /&gt;
*Lötstoplack grün&lt;br /&gt;
* Lieferzeit von bis zu 8 &#039;&#039;&#039;Arbeits&#039;&#039;&#039;tagen nach Geldeingang&lt;br /&gt;
&lt;br /&gt;
==== Ätzstudio Objektif ====&lt;br /&gt;
&lt;br /&gt;
e-mail: objektif@gmx.de&lt;br /&gt;
* Europlatine ab 9,-- Euro&lt;br /&gt;
* Sehr hohe Qualität&lt;br /&gt;
* Chemische Verzinnung ist möglich&lt;br /&gt;
* Bohrung möglich, 3 Cent pro Bohrung&lt;br /&gt;
* Lieferzeit meistens nach Geldeingang oder 1 Woche&lt;br /&gt;
* Keine Durchkontaktierungen und Lötstopplack möglich&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ausland ===&lt;br /&gt;
&lt;br /&gt;
==== BatchPCB ====&lt;br /&gt;
Homepage: http://www.batchpcb.com (USA)&lt;br /&gt;
* Vermittler und keine eigene Herstellung (&amp;quot;PCB pooling service&amp;quot;), Hersteller vermutlich meist [[Platinenhersteller#Gold Phoenix|Gold Phoenix]]&lt;br /&gt;
* verbandelt mit Sparkfun (&amp;quot;off shoot of Spark Fun Electronics&amp;quot;)&lt;br /&gt;
* &amp;quot;We only offer one service at this time: 2 layer PCBs with soldermask both sides and silkscreen both sides. The minimum trace width is 8mil with 8 mil spacing.&amp;quot;&lt;br /&gt;
* relativ günstig, lange Lieferzeiten, weiteres siehe Homepage und [http://batchpcb.com/index.php/Faq BatchPCB FAQ]&lt;br /&gt;
&lt;br /&gt;
==== BILEX-LP ====&lt;br /&gt;
Homepage http://www.bilex-lp.com/ (Bulgarien)&lt;br /&gt;
* deutschsprechender Ansprechpartner&lt;br /&gt;
* liefern bleifreie Platinen(RoHs konform)&lt;br /&gt;
* 31€ für eine doppelseitige Eurokarte ohne Lack und Druck&lt;br /&gt;
* SMD- und THT Bestückung &lt;br /&gt;
* Layoutservice &lt;br /&gt;
* Lieferzeit ab 3-4 AT &lt;br /&gt;
* insgesamt von 5 bis 7 AT Anlieferung bei Airmail (Porto ab 4,-Euro)&lt;br /&gt;
* FedEx wollte von Bulgarien aus ab 27,-Euro, 1-2AT)&lt;br /&gt;
* Löcher größer 6 mm wurden nicht gebohrt, sondern gefräst(gegen Anfrage)&lt;br /&gt;
* Berichtete Qualitätsmängel (in Einzelfällen): ausgefranste Plantinenfräsung, Lötstoplack hebt ab(nur bei Sn-Pb beschichtung, nicht bei Ni-Au).&lt;br /&gt;
* Fräsungen müssen extra bestellt werden! Aber trotzdem günstig&lt;br /&gt;
&lt;br /&gt;
==== CUBE CZ s.r.o. ====&lt;br /&gt;
Homepage http://www.cube.cz/ (Tschechische Republik)&lt;br /&gt;
&lt;br /&gt;
==== Euro PCB Ltd. ====&lt;br /&gt;
Homepage http://www.europcb.com/ (Großbritannien)&lt;br /&gt;
* Günstige Leiterplatten&lt;br /&gt;
* Schnelle Lieferung&lt;br /&gt;
* Qualitativ OK&lt;br /&gt;
&lt;br /&gt;
==== Gold Phoenix ====&lt;br /&gt;
Homepage http://www.goldphoenixpcb.biz/ (VR China)&lt;br /&gt;
&lt;br /&gt;
==== ITead Studio PCB prototyping service ====&lt;br /&gt;
Homepage http://iteadstudio.com/store/index.php?main_page=index&amp;amp;cPath=19_20 (VR China)&lt;br /&gt;
* Sehr günstige Leiterplatten&lt;br /&gt;
* Relativ günstige Lieferung&lt;br /&gt;
* 5 Stück mit jeweils 5x5cm für 8,30€&lt;br /&gt;
* Qulität relativ gut&lt;br /&gt;
* Teilweise Probleme mit Gerberdateien, die knapp am Limit (6 mil) sind&lt;br /&gt;
* Testvideo: [http://www.eevblog.com/2011/03/11/eevblog-155-itead-studio-pcb-prototype-goof/ EEVBlog #155]&lt;br /&gt;
&lt;br /&gt;
==== MakePCB ====&lt;br /&gt;
Homepage http://www.makepcb.com/ (Shanghai, VR China)&lt;br /&gt;
* Ich habe bei MakePCB Platinen geordert und als Zahlungsart Paypal angegeben. Die automatische Bestaetigung kam, es stand nochmal explizit drin dass ich Paypal als Zahlungsart gewaehlt habe und die Bemerkung, dass bei Zahlungsart Paypal in 2 Tagen eine Mail an die gleiche Adresse kaeme mit den Daten für Paypal. Naja, nach 4 Tagen war immernoch nichts da, ich habe denen eine Mail geschrieben und nochmal nach den &amp;quot;versprochenen&amp;quot; Paypaldaten gefragt. Drei Tage spaeter war immernoch nichts da, also habe ich die Bestellung abgebrochen. Am 8. Tag kam die Zahlungsforderung über Paypal, kein Wort der Erklaerung. Am 10. Tag kamen zwei identische Mails, die sagten man haette die PayPal-Zahlungsaufforderung schon geschickt. Irgendwas laeuft in dem Laden also schief.&lt;br /&gt;
&lt;br /&gt;
==== OLIMEX Ltd. ====&lt;br /&gt;
Homepage http://www.olimex.com (Bulgarien)&lt;br /&gt;
&lt;br /&gt;
Habe mehrere Jahre bei Olimex meine Prototypen herstellen lassen. Stets saubere Arbeit erhalten. Bis ich denen mal falsche Gerber-Dateien zusandte. Als ich einige Stunden spaeter den Fehler bemerkt hatte, bat ich um Stornierung und Neuzusendung. Gegen ein zusaetzliches Entgelt wurde dies akzeptiert.&lt;br /&gt;
Die angesagten Zusatzkosten wurden zwar von mir nicht abgebucht, aber ich erhielt  1 Woche spaeter die anfaenglich falsch zugesandten PCB&#039;s.&lt;br /&gt;
Die Zusammenfassung des darauffolgenden Email-Verkehrs: Ein Schulterzucken seitens Olimex und die Bitte, eine neue, kostenpflichte Bestellung zu taetigen.&lt;br /&gt;
&lt;br /&gt;
==== PAD2PAD ====&lt;br /&gt;
Homepage http://www.pad2pad.com/ (USA)&lt;br /&gt;
* Bestücken die Platinen auch mit Digikey-Bauteilen.&lt;br /&gt;
&lt;br /&gt;
==== PCBCart ====&lt;br /&gt;
Homepage http://www.pcbcart.com/ (China)&lt;br /&gt;
* auch kompliziertere Designs&lt;br /&gt;
* schnell und zuverlässig&lt;br /&gt;
* Eurokarte doppelseitig mit Lötstopp beidseitig und Bestückungsdruck kostet 60€ ohne MwSt +15€ Versand&lt;br /&gt;
* 2Stück 64€ ohne MwSt +15€ Versand&lt;br /&gt;
* 10Stück 90€ ohne MwSt +15€ Versand&lt;br /&gt;
* Eurokarte einseitig ohne Lötstopp und ohne Bestückungsdruck kosten 10Stück 71€ ohne MwSt +19€ Versand&lt;br /&gt;
&lt;br /&gt;
==== PCBPro ====&lt;br /&gt;
Homepage http://www.pcbpro.com/ (USA)&lt;br /&gt;
* Bei größeren Mengen (z.&amp;amp;nbsp;B. 100 Stück) sehr niedrige Preise&lt;br /&gt;
&lt;br /&gt;
==== Top-Tec-PCB ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Geschäftsbetrieb eingestellt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Homepage http://www.top-tec-pcb.com/ (Großbritannien)&lt;br /&gt;
* Günstig für Klein- bis Großserien&lt;br /&gt;
* Discount bei Nachbestellung&lt;br /&gt;
* sehr gute Technik (z.&amp;amp;nbsp;B. 100µm Bohren oder 75µm Leiterbahn)&lt;br /&gt;
* deutschsprechender Ansprechpartner&lt;br /&gt;
* liefern bleifreie Platinen (HAL, chem. Gold, Silber u. Zinn)&lt;br /&gt;
* 48h Eildienst&lt;br /&gt;
&lt;br /&gt;
==== The PCB Shop ====&lt;br /&gt;
Homepage http://www.thepcbshop.com/ (Belgien)&lt;br /&gt;
* Für einfache Sachen&lt;br /&gt;
* Preisrechner funktioniert nur mit IE&lt;br /&gt;
&lt;br /&gt;
==== PIU-Printex ====&lt;br /&gt;
Homepage http://www.piu-printex.at/ (Österreich)&lt;br /&gt;
* Bei größeren Mengen (&amp;gt; 20 Stück, einseitig, viele Bohrungen) günstig&lt;br /&gt;
* Bearbeitung innerhalb 6 AT&lt;br /&gt;
* Telefonische Kontaktaufnahme bei Rückfragen&lt;br /&gt;
* Ich war sehr positiv überrascht.&lt;br /&gt;
&lt;br /&gt;
==== Vi&amp;amp;Rus International ====&lt;br /&gt;
Euro 160x100 für Euro 58,- incl. Express-Versand&lt;br /&gt;
&lt;br /&gt;
http://www.vrint-pcb.com&lt;br /&gt;
&lt;br /&gt;
* 3 (!) Arbeitstage&lt;br /&gt;
* RoHS, ENIG&lt;br /&gt;
* 2 Lagen, durchkontaktiert&lt;br /&gt;
* Lötstop beideitig&lt;br /&gt;
* Bestückungsdruck&lt;br /&gt;
* E-Test&lt;br /&gt;
* incl. Vereinzelungen (gefräst)&lt;br /&gt;
* incl. Versand (1 AT), also am 4. AT geliefert&lt;br /&gt;
* Erstklassige Qualität, auch bei Fine-Pitch; schneller, freundlicher Support.&lt;br /&gt;
&lt;br /&gt;
== Preisvergleichstabellen (Stand Februar 2010) ==&lt;br /&gt;
&lt;br /&gt;
Preise für 1, 2 Europlatinen (160x100), FR4 1.6mm, HAL bleifrei, 150µm Leiter, 0.3mm Bohren, doppelseitig, 8AT, kein Bestückungsdruck, inkl. MwSt, ohne Versand.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;text-align:left&amp;quot; |Hersteller !!Preis (€) 1x !!Preis (€) 2x&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; colspan=&amp;quot;3&amp;quot; |&#039;&#039;ohne Lötstopp, ohne E-Test&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Basista Leiterplatten&#039;&#039;&#039;|| 43,66 || 81,61&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Fischer Leiterplatten GmbH&#039;&#039;&#039; (10AT, immer mit LS.+E-T.)|| 46,41 || 73,07&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;HAKA Elektronik-Leiterplatten GmbH&#039;&#039;&#039;|| 64,54 || 106,13&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;LEITON&#039;&#039;&#039;|| 54,98 || 104,51&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;MME-Leiterplatten&#039;&#039;&#039; (200µm Leiter)|| 41,44 || ?&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;PCB Pool&#039;&#039;&#039;|| 50,27 || 100,54&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Q-print/Q-PCB&#039;&#039;&#039;|| 55,62 || 95,89&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; colspan=&amp;quot;3&amp;quot; |&#039;&#039;mit Lötstopp, mit E-Test&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Basista Leiterplatten&#039;&#039;&#039;|| 77,66 || 115,61&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Fischer Leiterplatten GmbH&#039;&#039;&#039; (10AT)|| 46,41 || 73,07&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;LEITON&#039;&#039;&#039;|| 88,79 || 147,39&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Multi PCB Ltd. Leiterplatten&#039;&#039;&#039; (6AT)|| 78,06 || 156,13&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;M &amp;amp; V Leiterplatten - Vertriebs GmbH&#039;&#039;&#039;|| 62,83 || 125,66 &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Onlineshop WEdirekt&#039;&#039;&#039;|| 128,75 || 172,38&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Preise für 1, 2, 10 Europlatinen (160x100), FR4 1.6mm, HAL bleifrei, 150µm Leiter, 0.3mm Bohren, doppelseitig, 8AT, 1x Bestückungsdruck, 2x Lötstopp, E-Test, inkl. MwSt, ohne Versand.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller !! Preis (€) 1x !!Preis (€) 2x !!Preis (€) 10x !! Nachbest. (€) 10x&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; colspan=&amp;quot;5&amp;quot; |&#039;&#039;mit Lötstopp, mit Bestückungsdruck, mit E-Test&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Fischer Leiterplatten GmbH&#039;&#039;&#039; (10AT)|| 58,31 || 84,97 || 337,72 || 219,91 &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;HAKA Elektronik-Leiterplatten GmbH&#039;&#039;&#039;|| 82,54 || 124,13 || 302,08 || 284,08 &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;LEITON&#039;&#039;&#039;|| 124,37 || 187,15 || 389,84 || x &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Multi PCB Ltd. Leiterplatten&#039;&#039;&#039;|| 78,06 || 156,13 || 272,27 || 180,64&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;M &amp;amp; V Leiterplatten - Vertriebs GmbH&#039;&#039;&#039;|| 110,43 || 173,26 || ? || ? &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;PCB Pool&#039;&#039;&#039;|| 122,29 || 129,26 || 407,58 || x &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Q-print/Q-PCB&#039;&#039;&#039;|| 96,80 || 166,90 || 834,48 || x &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot; |&#039;&#039;&#039;Onlineshop WEdirekt&#039;&#039;&#039;|| 145,18 || 190,64 || 379,49 || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.jackaltac.com/faq --&amp;gt; grafischer Vergleich der Platinenkosten]&lt;br /&gt;
&lt;br /&gt;
== Lohnbestücker - Kleinserien ==&lt;br /&gt;
&lt;br /&gt;
==== PCB Pool ====&lt;br /&gt;
Homepage: http://www.pcb-pool.com/ppde/info_pcb_assembling.html&lt;br /&gt;
* Prototyp &amp;amp; Kleinserien, Größere Stückzahlen auf Anfrage&lt;br /&gt;
* SMD bis 0402, THT&lt;br /&gt;
* 5 Tage ab Eingang aller Bauteile &lt;br /&gt;
&lt;br /&gt;
==== riese electronic GmbH ====&lt;br /&gt;
Homepage: http://www.riese-electronic.de/leistungen_prototype.html&lt;br /&gt;
* SMD bis 0201, THT&lt;br /&gt;
* BGAs inkl Röntgen&lt;br /&gt;
* macht auch Großserien&lt;br /&gt;
* 5 Tage ab Eingang aller Bauteile, Express möglich&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[http://www.cadsoft.de/Boardhouses/ Übersicht von Cadsoft, sortiert nach PLZ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Platinen| ]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>Rolfn</name></author>
	</entry>
</feed>