<?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=141.99.254.253</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=141.99.254.253"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/141.99.254.253"/>
	<updated>2026-04-10T13:49:05Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED-Matrix&amp;diff=55952</id>
		<title>LED-Matrix</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED-Matrix&amp;diff=55952"/>
		<updated>2011-03-18T22:40:37Z</updated>

		<summary type="html">&lt;p&gt;141.99.254.253: Bezugsquelle aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In einer [[LED]]-Matrix sind jeweils die Kathoden und Anoden der LEDs in Zeilen bzw. Spalten verbunden. Der Vorteil besteht darin, dass weniger Kontakte nach außen geführt und angesteuert werden müssen, ebenso sinkt der Verdrahtungsaufwand im Modul bzw. auf der Platine. Die Ansteuerung erfolgt dabei im sogenannten Multiplexbetrieb. Prinzipiell kann man sowohl die Zeilen als auch die Spalten multiplexen. Die nachfolgende Beschreibung bezieht sich auf das Multiplexen von Spalten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LEDmatrix_5x7.png|right|thumb|220px|Eine 5&amp;amp;times;7 LED-Matrix]]&lt;br /&gt;
&lt;br /&gt;
==Multiplexbetrieb==&lt;br /&gt;
&lt;br /&gt;
[http://de.wikipedia.org/wiki/Multiplexverfahren Multiplexverfahren (Wikipedia)]&lt;br /&gt;
&lt;br /&gt;
Der Trick einer LED-Matrix besteht darin, dass jeweils immer nur eine Spalte wirklich leuchtet. Die anderen sind ausgeschaltet. Wird nun in schneller Folge jede Spalte einmal angeschaltet. So entsteht aufgrund der Trägheit des menschlichen Auges ein scheinbar vollständiges Bild, bei dem alle LEDs gleichzeitig leuchten. Wird dieser Zyklus schnell genug durchlaufen, ist das Bild flimmerfrei, was ab ca. 100Hz erreicht wird. In Ausnahmefällen kann jedoch eine bewegte LED-Matrix auch bei höheren Multiplexfrequenzen als flimmernd erscheinen, z.&amp;amp;nbsp;B. LED-Bremsleuchten, LED-Anzeigen an Zügen oder Strassenbahnen.&lt;br /&gt;
&lt;br /&gt;
Der Ablauf der Steuerung ist recht einfach:&lt;br /&gt;
&lt;br /&gt;
#alle Spalten auschalten, Muster für Spalte C1 an Zeilen R1..R7 anlegen, Spalte C1 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
#alle Spalten auschalten, Muster für Spalte C2 an Zeilen R1..R7 anlegen, Spalte C2 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
#alle Spalten auschalten, Muster für Spalte C3 an Zeilen R1..R7 anlegen, Spalte C3 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
#alle Spalten auschalten, Muster für Spalte C4 an Zeilen R1..R7 anlegen, Spalte C4 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
#alle Spalten auschalten, Muster für Spalte C5 an Zeilen R1..R7 anlegen, Spalte C5 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
# Zyklus beginnt bei 1.&lt;br /&gt;
&lt;br /&gt;
Praktisch wird man dazu einen [[Timer]] per [[Interrupt]] verwenden, keine Warteschleifen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LEDmatrix_timing.png|left|thumb|700px|Multiplexzeitdiagramm]]&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&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;
!LEDs  ||  IOs  ||  Vorwiderstände &lt;br /&gt;
|-&lt;br /&gt;
|16    ||    8  ||      4      &lt;br /&gt;
|-&lt;br /&gt;
|64    ||   16  ||      8     &lt;br /&gt;
|-&lt;br /&gt;
|1024  ||   64  ||     32     &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Durch Einsatz der Multiplexverfahrens können mit relativ wenigen Ansteuerbauteilen (IO-Pins, Transistoren, Stromquellen) sehr viele LEDs gesteuert werden. Während bei direkter Ansteuerung für jede LED ein IO-Pin sowie eine Stromquelle bzw. Vorwiderstand benötig würde,  ist in einer zweiachsigen LED-Matrix der Aufwand für die Bauteile deutlich geringer:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\text{Anzahl der Bauteile} = \sqrt\text{Anzahl der LEDs}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
==Ansteuerung==&lt;br /&gt;
&lt;br /&gt;
Der verringerte Aufwand an Bauteilen kommt jedoch nicht ohne Nachteile. Da jede Spalte in einer Matrix mit N Spalten immer nur für 1/N der Zeit für einen vollen Bildaufbau aktiv ist, muss in dieser Zeit die gleiche Lichtmenge (=Energie) abgegeben werden, damit die genauso hell erscheint, wie wenn sie konstant mit Strom versorgt wird. Dazu muss der N-fache Strom fliessen. Demensprechend müssen die Vorwiderstände bzw. Stromquellen dimensioniert sein. Doch das führt zu zwei Problemen.&lt;br /&gt;
&lt;br /&gt;
# Der Pulsstrom durch eine LED kann nicht beliebig gesteigert werden. Genaue Angaben dazu gibt es im Datenblatt. Als grobe Abschätzung kann man sagen, dass die meisten LEDs bis etwa 1:10 gemuxt werden können, darüberhinaus werden die Pulsströme zu hoch (20mA Betriebsstrom =&amp;gt; 200 mA Pulsstrom!)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
#Die hohen Pulsströme verkraften die LEDs wirklich nur ganz kurz, sie brauchen die Ausschaltzeit um wieder abzukühlen! D.H. Die Ansteuerung des Multiplex darf NIE stehen bleiben, sonst brennen die LEDs durch! Für die Testphase der Matrix sowie Softwareentwicklung sollte man deshalb die Ströme stark veringern, die LEDs sind dann zwar wesenlich dunkler, überleben aber einen Softwareabsturz der Steuerung. Wenn am Ende alles getestet ist und man sich sicher ist daß die Steuerung funktioniert, kann man den Strom der Matrix wieder auf das volle Niveau erhöhen. Um ganz sicher zu gehen kann man einen Watchdog mit minimaler Laufzeit oder ein [[Monoflop]] verwenden, um im Fehlerfall die Stromversorgung bzw. Ansteuerung der LEDs abzuschalten.&lt;br /&gt;
&lt;br /&gt;
Um die Helligkeit der LEDs im Multiplexbetrieb voll zu nutzen muss meistens ein höherer Strom geschaltet werden, als Mikrocontroller es können. Eine [[LED]] muss aufgrund ihrer Kennlinie an einer Stromquelle betrieben werden. Im einfachsten Fall ist das ein in Reihe geschalteter Widerstand an einer Spannungsquelle. Ob man die Zeilen oder Spalten einer Matrix multiplext ist im Prinzip egal, aber manchmal ist es schlicht logisch sinnvoller. So ist z.B. bei einer LED-Laufschrift mit 8 Zeilen und 40 Spalten es sinnvoll, die Zeilen mit 1:8 zu multiplexen und nicht die Spalten mit 1:40! Generell kann man das in einer Schaltung so erkennen. Die gemultiplexte Dimension hat vor den Leistungsschaltern keine Vorwiderstände bzw. Konstantstromquellen sondern geht direkt an die LEDs. &lt;br /&gt;
&lt;br /&gt;
===Direkt===&lt;br /&gt;
&lt;br /&gt;
In einigen Projekten im Internet sieht man LED-Matritzen direkt per Mikrocontroller angesteuert, ohne Transistoren. Das geht praktisch nur mit Low-Current Bauteilen, sonst sind die LEDs auf Grund des geringen Stroms zu dunkel.&lt;br /&gt;
&lt;br /&gt;
=== Transistoren ===&lt;br /&gt;
&lt;br /&gt;
Das ist der Normalfall. Man kann diskrete [[Transistor|Transistoren]] (z.&amp;amp;nbsp;B. BC846, BC337) benutzen.&lt;br /&gt;
&lt;br /&gt;
Eine praktische Umsetzung kann man hier sehen. Q1-Q8 arbeiten als Emitterfolger ([[Transistor#Kollektorschaltung_(Emitterfolger)|Kollektorschaltung]]), darum gibt es hier auch keine [[Basiswiderstand | Basiswiderstände]]. Q9-Q13 arbeiten ganz einfach in [[Transistor#Emitterschaltung|Emitterschaltung]]. Dadurch braucht man nur NPN Transistoren,  die Schaltung ist dadurch auch relativ schnell. Einziger Nachteil ist ein um ca. 0,5 V höherer Spannungsverlust an Q1-Q8 im Vergleich zu PNP-Transistoren in Emitterschaltung. Das spielt hier aber keine große Rolle.&lt;br /&gt;
&lt;br /&gt;
Ein Schieberegister ist im Prinzip ein Seriell-Parallel-Wandler.&lt;br /&gt;
Das hat mit Multiplexbetrieb eigentlich nichts direkt zu tun, es ist vielmehr eine Erweiterung der IO-Pins (siehe auch [[Porterweiterung mit SPI]] und [[AVR-Tutorial: Schieberegister]]).&lt;br /&gt;
&lt;br /&gt;
Eine weitere Schaltung mit Schieberegistern ist im &amp;quot;Retro-Spiel zum Selberbauen&amp;quot; [http://www.elo-web.de/elo/entwicklung-und-projekte/ping-pong Ping-Pong] von Burkhard Kainka verwendet worden. Hier werden die 10 Zeilen mit Atmega8-Portpins über 100 &amp;amp;Omega; Widerstände [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/ping-pong/ping-pong-selbst-programmieren] gegen 12 Schieberegister-Spalten zweier 4094D CMOS-ICs geschaltet, um eine Matrix aus 120 roten SMD-LEDs zu steuern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LED_Matrix_8x5.png|thumb|right|250px|Multiplexansteuerung mit Schieberegistern und Transistoren]]&lt;br /&gt;
&lt;br /&gt;
==== Berechnung ====&lt;br /&gt;
&lt;br /&gt;
Will man nun seine Schaltung optimal betreiben, muss man ausrechnen wieviel Strom geschaltet werden muss. Wie oben bereits beschrieben, teilt sich der gemultiplexte Strom im Verhältnis 1:N auf die LEDs auf, in diesem Beispiel hier 1:5. Der Treiber für die Zeilen muss diesen im Extremfall kontinuierlich an jedem Ausgang zur Verfügung stellen, wenn nämlich alle LEDs der Matrix aktiv sind. Der Treiber für die Spalten ist pro Kanal nur 1:N der Multiplexzeit aktiv, muss aber währenddessen den gesamten Nennstrom der Matrix schalten können! Das sind schnell mal ein paar Ampere, wie die nachfolgenden Beispiele zeigen!&lt;br /&gt;
&lt;br /&gt;
Gegeben:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Nenn}&amp;lt;/math&amp;gt;: Nennstrom der LEDs: 4mA&lt;br /&gt;
*&amp;lt;math&amp;gt;U_{F}&amp;lt;/math&amp;gt;: Flußspannung der LEDs: 2,2V&lt;br /&gt;
*&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: Multiplexverhältnis (Spalten): 1:5&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: Zeilen in der Matrix: 8&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{Sat}&amp;lt;/math&amp;gt;: Sättigungsspannung des Low Side Transistors, hier Q9-Q13 mit ca. 0,7V&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{BE}&amp;lt;/math&amp;gt;: Basis-Emitter-Spannung des High Side Transistors, hier Q1-Q8 ca. 0,7V&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Zeil}&amp;lt;/math&amp;gt;: Dauerstrom der Zeilentreiber = Pulsstrom der LEDs&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Spl}&amp;lt;/math&amp;gt;: Pulsstrom der Spaltentreiber&lt;br /&gt;
*&amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand für LED-Zeilen &lt;br /&gt;
*&amp;lt;math&amp;gt;P_V&amp;lt;/math&amp;gt;: Verlustleistung der Vorwiderstände&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Zeil} = I_{Nenn} \cdot N = 4mA \cdot 5 = 20mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Spl} = I_{Nenn} \cdot N \cdot S = 4mA \cdot 5 \cdot 7 = 140mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V = \frac{U}{I} = \frac{Vcc - U_{Sat} - U_{BE}-U_F}{I_{Nenn} \cdot N}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V=\frac{5V-0,7V-0,7V-2,2V}{4mA \cdot 5} \approx 68 \Omega&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V=I_{Zeil}^2 \cdot R = 20mA^2 \cdot 68 \Omega = 27mW&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
=== Treiber ===&lt;br /&gt;
&lt;br /&gt;
Bei grossen Anzeigen mit vielen LEDs werden die Pulsströme bisweilen schon recht hoch. Hier wird man dann mehr auf Treiber (z.&amp;amp;nbsp;B. ULN2803)zurück greifen. Vor allem die Schalter für die gemultiplexte Dimension, hier im Beispiel die Zeilen, müssen sehr große Ströme schalten.&lt;br /&gt;
&lt;br /&gt;
[[bild:LED-Matrix-ULN-UDN.png|thumb|right|250px|Multiplexansteuerung mit integrierten Treibern]]&lt;br /&gt;
&lt;br /&gt;
==== Berechnung ====&lt;br /&gt;
&lt;br /&gt;
Gegeben:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Nenn}&amp;lt;/math&amp;gt;: Nennstrom der LED-Stränge: 15mA&lt;br /&gt;
*&amp;lt;math&amp;gt;U_{F}&amp;lt;/math&amp;gt;: Flußspannung der LED-Stränge: 7V&lt;br /&gt;
*&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: Multiplexverhältnis (Zeilen): 1:4&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: Spalten in der Matrix 8&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{IC1}&amp;lt;/math&amp;gt;: Sättigungsspannung des Low Side Switch, hier IC1 mit ca. 1V&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{IC2}&amp;lt;/math&amp;gt;: Sättigungsspannung des High Side Switch, hier IC2 mit ca. 2V&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Spl}&amp;lt;/math&amp;gt;: Dauerstrom der Spaltentreiber = Pulsstrom der LEDs&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Zeil}&amp;lt;/math&amp;gt;: Pulsstrom der Zeilentreiber&lt;br /&gt;
*&amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand für LED-Spalten&lt;br /&gt;
*&amp;lt;math&amp;gt;P_V&amp;lt;/math&amp;gt;: Verlustleistung der Vorwiderstände &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Spl} = I_{Nenn} \cdot N = 15mA \cdot 4 = 60mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Zeil} = I_{Nenn} \cdot N \cdot S = 15mA \cdot 4 \cdot 8 = 480mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V = \frac{U}{I} = \frac{Vcc - U_{IC1} - U_{IC2}-U_F}{I_{Nenn} \cdot N}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V=\frac{12V-1V-2V-7V}{15mA \cdot 4}=33 \Omega&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V=I_{Spl}^2 \cdot R = 60mA^2 \cdot 33 \Omega = 119mW&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
60mA kann IC2 dauerhaft auf jedem Kanal liefern, 500mA Pulsstrom sind für IC1 schon die absolute Grenze laut Datenblatt. Der Spannungsverlust &amp;lt;math&amp;gt;U_{IC1}&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;U_{IC2}&amp;lt;/math&amp;gt; ist bei diesen relativ alten ICs recht hoch, mit modernen MOSFETs erreicht man hier deutlich kleinere Werte und damit auch kleinere Verlustleistungen bzw. höhere Ströme.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
=== MOSFETs ===&lt;br /&gt;
&lt;br /&gt;
Bei Strömen über 1A nimmt man heute meist [[FET|MOSFETs]].&lt;br /&gt;
&lt;br /&gt;
[[bild:LED-Matrix-MOSFET.png|thumb|right|250px|Multiplexansteuerung mit MOSFETs]]&lt;br /&gt;
&lt;br /&gt;
==== Berechnung ====&lt;br /&gt;
&lt;br /&gt;
Die Berechnung erfolgt analog zum vorherigen Beispiel, nur mit dem Unterschied, daß die MOSFETs deutlich kleinere Spannungsabfälle zu verzeichnen haben. Damit die MOSFETs schnell schalten werden [[MOSFET-Übersicht| MOSFET-Treiber]] eingesetzt. Für die P-Kanal MOSFETs nutzt man hier im Beispiel einen echten [[MOSFET-Übersicht##Mosfet-Treiber | MOSFET-Treiber]], die N-Kanal MOSFETS kann man hier mit einem einfachen CMOS-Inverter ansteuern. Das geht bei kleinen Logic Level MOSFETs mit 1-2nF Gatekapazität noch ausreichend schnell, bei größeren MOSFETs ist auch hier ein echter MOSFET-Treiber nötig. Der berühmt-berüchtigte Gatewiderstand kann hier entfallen, die Ausgänge der CMOS-Inverter sind bereits hochohmig genug, um parasitäre Schingungen zu dämpfen. Nimmt man für den Inverter einen HCT-Typ, so wirkt der gleichzeitig als [[Pegelwandler]] und die Matrix kann mit 3,3V Signalen angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Gegeben:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Nenn}&amp;lt;/math&amp;gt;: Nennstrom der LED-Stränge: 25mA&lt;br /&gt;
*&amp;lt;math&amp;gt;U_{F}&amp;lt;/math&amp;gt;: Flußspannung der LED-Stränge: 9V&lt;br /&gt;
*&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: Multiplexverhältnis (Zeilen): 1:8&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: Spalten in der Matrix: 8&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{DS-ON, high}&amp;lt;/math&amp;gt;: Einschaltwiderstand der High Side MOSFETs : 0,25&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{DS-ON, low}&amp;lt;/math&amp;gt;: Einschaltwiderstand der Low Side MOSFETs: 0,13&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Spl}&amp;lt;/math&amp;gt;: Dauerstrom der Spaltentreiber = Pulsstrom der LEDs&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Zeil}&amp;lt;/math&amp;gt;: Pulsstrom der Zeilentreiber&lt;br /&gt;
*&amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand für LED-Spalten &lt;br /&gt;
*&amp;lt;math&amp;gt;P_V&amp;lt;/math&amp;gt;: Verlustleistung der Vorwiderstände&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Spl} = I_{Nenn} \cdot N = 25mA \cdot 8 = 200mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Zeil} = I_{Nenn} \cdot N \cdot S = 25mA \cdot 8 \cdot 8 = 1600mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V = \frac{U}{I} = \frac{Vcc - I_{Spl} \cdot R_{DS-ON, high} - I_{Zeil} \cdot R_{DS-ON, low} -U_F}{I_{Spl}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V=\frac{12V - 0,2A \cdot 0,25 \Omega - 1,6A \cdot 0,13 \Omega -9V}{0,2A} \approx 13 \Omega&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V=I_{Spl}^2 \cdot R = 200mA^2 \cdot 13 \Omega = 520mW&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der gesparte Spannungsabfall über den MOSFETs genutzt, um LEDs mit höherer Flußspannung in Reihe schalten, womit der Wirkungsgrad ansteigt. Liegt die LED-Betriebsspannung über 15V braucht man einen sogenannten [[Treiber | High Side Driver]], weil dann die Gates der P-Kanal MOSFETs nicht mehr direkt angesteuert werden können. Ein einfaches Beispiel findet man [http://www.mikrocontroller.net/attachment/34752/P_FET.png hier].&lt;br /&gt;
&lt;br /&gt;
===Dimmen===&lt;br /&gt;
&lt;br /&gt;
Multiplexen kann auch mit [[PWM]] kombiniert werden. Dabei ist die Multiplexzeit einer Spalte gleich der PWM-Periodendauer. Allerdings kann hier der Rechenaufwand für die CPU schon recht hoch werden, da die meisten Mikrocontroller nicht so viele PWM-Kanäle in Hardware zur Verfügung stellen und die PWM in Software nachgebildet werden muss ([[Soft-PWM]]).&lt;br /&gt;
&lt;br /&gt;
Falls die Multiplexzeit klein genug gewählt wird, kann man in Grenzen auch per gezieltem Ein- und Abschalten in Grenzen eine Dimmfunktion erreichen. Um hier allerdings noch flimmerfreie Ergebnisse zu erzielen, sollte die Multiplexfrequenz mit den geplanten Dimmstufen multipliziert werden (bspw. 16 Dimmstufen bei 100 Hz Multiplexfrequenz = 1600 Hz angepasste Multiplexfrequenz), was die Rechenzeit wieder rum schnell in die Höhe treiben kann. Dimmen selbst erreicht man dann mit entsprechend angepassten Schaltzeiten (bspw. 25% Helligkeit = 4x LED an, 12x LED aus bei insgesamt 16 Dimmstufen, dann von vorne).&lt;br /&gt;
&lt;br /&gt;
=== Spezielle ICs ===&lt;br /&gt;
&lt;br /&gt;
Neben den typischen Treiberbausteinen für möglichst hohe Ströme, die weiter unten aufgeführt sind, gibt es auch noch integrierte Lösungen für das direkte Betreiben einer LED-Matrix an der [[SPI]] oder [[I2C]]-Schnittstelle. Beispiele sind hier MAXIM 7219 und 7221 für 8x8 LED-Matrizen oder 8x8-Segmentanzeigen. Zwischen beiden Modi wird per Software gewechselt. Die ICs bieten einige Vorteile, wie automatische Dimmung und großzügiges Freischaufeln von CPU-Kapazität auf dem Mikrocontroller. Außerdem können die ICs dank SPI kaskadiert werden wie normale [[AVR-Tutorial: Schieberegister|Schieberegister]] und somit eine nahezu unbegrenzte Zahl an LEDs ansteuern. Allerdings ist der Strom für die integrierten Stromsenken auf etwa 50 mA begrenzt, was bei einigen Displays zu wenig sein kann. Hier muss man wieder Vor- und Nachteile abwägen. Weitere ICs bei [http://www.maxim-ic.com Maxim] umfassen Standardfälle wie 5x7 Matrizen oder 7-, 10-, 14-Segment LED-Anzeigen mit 4 bis 16 Stellen. Diese ICs gibt es dann allerdings leider nicht bei den [[Elektronikversender|Standardversandhändlern]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bauteil                  || Beschreibung                          || Bezugsquelle&lt;br /&gt;
|-&lt;br /&gt;
|ULN2803                  || 8fach NPN-Transistorarray, 500mA      ||&lt;br /&gt;
|-&lt;br /&gt;
|ULN2003                  || 7fach NPN-Transistorarray, 500mA      ||&lt;br /&gt;
|-&lt;br /&gt;
|UDN2981                  || 8fach High Side Treiber, 500mA        ||&lt;br /&gt;
|-&lt;br /&gt;
|TLC5921                  || 16 Bit-Schieberegister plus Latch&amp;lt;BR&amp;gt; mit Konstantstromsenken, max. 80mA pro Ausgang       ||&lt;br /&gt;
|-&lt;br /&gt;
|TLC5922                  &lt;br /&gt;
|| 16 Bit-Schieberegister plus Latch mit Konstantstromsenken, max. 80mA pro Ausgang&amp;lt;BR&amp;gt;Dimmung jedes einzelnen Kanals mit 7 Bit möglich, pinkompatibel zum TLC5921      ||&lt;br /&gt;
|-&lt;br /&gt;
|TLC5940 || 16 Bit-Schieberegister plus Latch mit Konstantstromsenken, max. 120mA pro Ausgang&amp;lt;BR&amp;gt;Dimmung jedes einzelnen Kanals mit 6 Bit plus 12 Bit PWM möglich || mouser.com&lt;br /&gt;
|-&lt;br /&gt;
|CAT4016&lt;br /&gt;
|| 16 Bit-Schieberegister/Latch mit Konstantstromsenken(max. 100mA), günstig || Farnell&lt;br /&gt;
|-&lt;br /&gt;
|TPIC6B595&lt;br /&gt;
|| 8-Bit Schieberegister + Leistungstreiber, 500mA      ||&lt;br /&gt;
|-&lt;br /&gt;
|IRF7304                  || 2fach P-Kanal MOSFET, 3,5A, SO-8 Gehäuse ||&lt;br /&gt;
|-&lt;br /&gt;
|MAX7219                  || Seriell angesteuerter 8x8 Matrizentreiber ||&lt;br /&gt;
|-&lt;br /&gt;
|MAX7221                  || Seriell angesteuerter 8x8 Matrizentreiber ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:LED-Matrix-TLC5921.png|thumb|right|250px|Multiplexansteuerung mit Special-ICs]]&lt;br /&gt;
&lt;br /&gt;
==== Berechnung ====&lt;br /&gt;
&lt;br /&gt;
Der TLC5921 und seine zahlreichen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=480&amp;amp;uiTemplateId=NODE_STRY_PGE_T Kollegen] von [http://www.ti.com Texas Instruments] bieten eine komfortable Möglichkeit zur Ansteuerung von LED-Matritzen. Der TLC5921 besitzt 16 Ausgänge, welche als [[Konstantstromquelle]] arbeiten. Der Konstantstrom wird dabei über einen Widerstand eingestellt. Es entfallen somit die Vorwiderstände. Der Vorteil ist, dass Schwankungen der LED-Flußspannung oder Versorgungsspannung ausgeglichen werden, ohne dass die Helligkeit der LEDs sich dabei ändert. Außerdem erlauben die besseren Typen der Baureihe wie z.B. der TLC5922 eine Dimmung der einzelnen Kanäle. Doch Vorsicht! Die Verlustleistung des ICs ist groß, ca. 4W mit ausreichender [[Kühlkörper#Die_Platine_als_Kühlkörper |Kühlung]], aber nicht endlos. Denn die Restspannung aus Betriebsspannung und LED-Flußspannung fällt über dem IC ab. Als Minimum gilt je nach Strom 0,5-1V, welches über dem TLC5921 abfallen muss, damit er korrekt arbeitet. Nach oben wird die Grenze durch die Verlustleistung und max. Spannung von 17V gesetzt. Weiterhin ist zu beachten, dass hier das Multiplexing der Zeilen und Spalten vertauscht wurde.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Nenn}&amp;lt;/math&amp;gt;: Nennstrom der LED-Stränge: 10mA&lt;br /&gt;
*&amp;lt;math&amp;gt;U_{F}&amp;lt;/math&amp;gt;: Flußspannung der LED-Stränge: 9V&lt;br /&gt;
*&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: Multiplexverhältnis (Zeilen): 1:8&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: Spalten in der Matrix: 8&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{DS-ON, high}&amp;lt;/math&amp;gt;: Einschaltwiderstand der High Side MOSFETs : 0,25&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Spl}&amp;lt;/math&amp;gt;: Dauerstrom der Spaltentreiber = Pulsstrom der LEDs&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Zeil}&amp;lt;/math&amp;gt;: Pulsstrom der Zeilentreiber&lt;br /&gt;
*&amp;lt;math&amp;gt;P_V&amp;lt;/math&amp;gt;: Verlustleistung des TLC5921&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Spl} = I_{Nenn} \cdot N = 10mA \cdot 8 = 80mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Zeil} = I_{Nenn} \cdot N \cdot S = 10mA \cdot 8 \cdot 8 = 640mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V=I_{Spl} \cdot S \cdot U_{Rest} = I_{Spl} \cdot S \cdot (Vcc - U_F - I_{Zeil} \cdot R_{DS-ON, high})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V= 80mA \cdot 8 \cdot (12V - 9V - 1,6A \cdot 0,25 \Omega) = 1{,}66W&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[LED cube]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/209988#new Forenbeitrag]: Nachleuchten beim Multiplexen vermeiden&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=%2Bled+%2Bmatrix&amp;amp;forums%5B%5D=1&amp;amp;forums%5B%5D=2&amp;amp;forums%5B%5D=4&amp;amp;forums%5B%5D=6 Beiträge zum Thema LED-Matrix im Forum]&lt;br /&gt;
* [http://home.wanadoo.nl/electro1/avr/dotmatrix.htm Dotmatrix mit ATtiny2313 ansteuern, engl.]&lt;br /&gt;
* [http://www.braindrum.de/tools/leddotmatrix/leddotmatrix.htm LED-Dotmatrix mit ATmega16 ansteuern]&lt;br /&gt;
* Open Project [http://www.tiletoy.org/ TileToy] is a modular, electronic game prototype for tangible LED game tiles (PIC). [http://www.youtube.com/watch?v=XVmhlLvJNHc Youtube-Video]&lt;br /&gt;
* [http://www.kalanda.com/scroller-de-7x5-leds-basado-en-micro-attiny2313.html Eine 5x7 Matrix mit ATtiny2313 angesteuert, spanisch]&lt;br /&gt;
* [http://www.saccade.com/writing/projects/Puzzlemation/Puzzlemation.html Modulare Dotmatrixanzeige, engl.]&lt;br /&gt;
* [http://spritesmods.com/?art=ledmatrix Dotmatrix, engl.]&lt;br /&gt;
* [http://www.harbaum.org/till/ledmatrix/ Große LED-Matrix mit RS232 Ansteuerung, engl.]&lt;br /&gt;
* [https://www.das-labor.org/wiki/Blinken_Borgs Blinken_Borgs] Diverse Projekte von &#039;&#039;Das Labor&#039;&#039;&lt;br /&gt;
* [http://www.werkzeugh.at/intern/deflatable-led-matrix/ Eine aufblasbare LED-Matrix!]&lt;br /&gt;
* [http://metalab.at/wiki/MetaLEDs 8x48 LED-Matrix]&lt;br /&gt;
* [http://www.das-labor.org/wiki/Blinken_Borgs LED-Würfel mit 5^3 RGB-LEDs]&lt;br /&gt;
* [http://www.ulrichradig.de/home/index.php/avr/avr-mega-dis LED-Matrix bei Ulrich Radig]&lt;br /&gt;
* [http://www.elo-web.de/elo/entwicklung-und-projekte/ping-pong/laufschrift Eine kleine Laufschrift auf der Ping-Pong-Platine] von Sascha Bader (C, Atmega8)&lt;br /&gt;
* [http://www.sparkfun.com/tutorials/47 12 Fuß (3,6m) Wanduhr auf Sparkfun.com]&lt;br /&gt;
* [http://www.decadecounter.com/vta/articleview.php?item=879 Gigantic 5x7 LED Matrix] by AnubisTTP&lt;br /&gt;
* [http://klautesblog.blogspot.com/search/label/LED%20Matrix Mikes LED Matrix (21 x 21 LEDs)] by klaute&lt;br /&gt;
* [http://blinkenlights.net/ Blinkenlights] keine LEDs, aber groß (CCC)!&lt;br /&gt;
* Die riesige LED Tafel am [http://money.howstuffworks.com/nasdaq-marketsite-tower.htm Time Square] in New York, 105m hoch und 1 MW Spitzenverbrauch!&lt;br /&gt;
* Nochmal ein Artikel zur [http://bits.blogs.nytimes.com/2008/11/20/towering-led-sign-will-light-times-square/ Time Square LED-Wand] &lt;br /&gt;
&lt;br /&gt;
[[Category:Displays und Anzeigen]]&lt;/div&gt;</summary>
		<author><name>141.99.254.253</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Schaltungssimulation&amp;diff=49839</id>
		<title>Schaltungssimulation</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Schaltungssimulation&amp;diff=49839"/>
		<updated>2010-08-10T08:42:45Z</updated>

		<summary type="html">&lt;p&gt;141.99.254.253: /* SPECTRE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Analog==&lt;br /&gt;
Für Analogsimulation und Mixed-Mode (Digital/Analog) ist Spice State-of-the-art. Spice ist inzwischen von vielen Herstellern erhältlich.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://bwrc.eecs.berkeley.edu/classes/icbook/spice/ The Spice Page] des EECS Department of the University of California at Berkeley.&lt;br /&gt;
&lt;br /&gt;
===PSpice===&lt;br /&gt;
&lt;br /&gt;
http://www.orcad.com/download.orcaddemo.aspx&lt;br /&gt;
* nur für Windows&lt;br /&gt;
* kostenlos mit Größeneinschränkung&lt;br /&gt;
* Version 8 ist etwas übersichtlicher als die aktuelle&lt;br /&gt;
* Einführungen&lt;br /&gt;
** http://people.fh-landshut.de/~wlf/Pspice/Einfuehrung/Einfuehrung.pdf&lt;br /&gt;
** http://www.elektronikschule.de/~krausg/ (links im Menü &amp;quot;Einstieg in PSpice leichtgemacht&amp;quot;)&lt;br /&gt;
** [http://www.spicelab.de/index.htm Robert Heinemanns PSPICE-Seiten]&lt;br /&gt;
&lt;br /&gt;
===Simplorer===&lt;br /&gt;
&lt;br /&gt;
http://www.ansoft.com/downloads.cfm&lt;br /&gt;
*kostenlose Studentenversion&lt;br /&gt;
*Anmeldung erforderlich&lt;br /&gt;
*Besondere Eignung für Leistungselektronik&lt;br /&gt;
*Möglichkeit den Simulationsablauf durch Zustandsgraphen zu steuern&lt;br /&gt;
*Besonders einfache Möglichkeit Kennlinien zur Parametersteuerung zu verwenden&lt;br /&gt;
*Integration verschiedener physikalischer Domänen möglich (Mechanik, Hydraulik, Elektrik (...) )&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Leistungselektronik und Domänenübergriff: Mit den integrierten Mos-Fet Modellen (Level 1-3) wird eine B6 Brücke aufgebaut. Über die Zustandsgraphen kann eine&lt;br /&gt;
Raumzeigermodulation programmiert werden die über alpha-beta Koordinaten gesteuert&lt;br /&gt;
wird. Die Brücke steuert einen Asynchronmotor (Flussmodell) an diesem ist eine&lt;br /&gt;
Mechanische Last angeschlossen, z.B ein Feder-Dämpfer-System. Nun kann der Einfluss der Feder-Komponente auf die Zwischenkreisspannung analysiert werden.&lt;br /&gt;
&lt;br /&gt;
Simplorer wird überwiegend im Mechatronischen Bereich eingesetzt. Die Studentenversion ist leider Stark eingeschränkt.&lt;br /&gt;
&lt;br /&gt;
===LTspice/SwitcherCAD===&lt;br /&gt;
[[Datei:LTspice4-screenshot.png|miniatur|300px|Screenshot von LTspice 4]]&lt;br /&gt;
http://www.linear.com/company/software.jsp&lt;br /&gt;
&lt;br /&gt;
* Kostenlos&lt;br /&gt;
* Keinerlei Einschränkungen bezüglich Anzahl der Bauteile oder Knotenzahl&lt;br /&gt;
* SPICE-Simulator integriert unter einer graphischen Oberfläche zum Zeichnen von zu simulierenden Schaltungen&lt;br /&gt;
* Zum Einstieg empfehlenswert, da sehr übersichtlich&lt;br /&gt;
* Von einem Halbleiterhersteller (Linear Technologies). Kommt daher mit einer großen Anzahl von Modellen für Linear Technology Bauelemente und vielen Beispielen für diese. Darüber hinaus erlaubt Linear die Verwendung als allgemeines Werkzeug zum Schaltplan-Zeichnen und zur SPICE-Simulation.&lt;br /&gt;
* Das Programm heißt inzwischen offiziell LTspice IV. Man findet oft noch die älteren Bezeichnungen LTspice/SwitcherCAD, LTspice/SwitcherCAD III, SwitcherCAD/LTspice, SwCAD oder LTspice in älteren Unterlagen.  &lt;br /&gt;
* Windows-Software(98, 2000, XP, Vista, W7), läuft mit WINE unter Linux.&lt;br /&gt;
* Handbuch (entspricht der Programm-Hilfe): http://ltspice.linear.com/software/scad3.pdf&lt;br /&gt;
* Kleine Einführung:&amp;lt;!-- Dieser Link funktioniert offenbar nicht mehr. http://www.lme.fh-muenchen.de/lst/spice/LTSpiceInfo.pdf --&amp;gt; http://www.ee.hm.edu/fk/lab/lst/spice/LTSpiceInfo.pdf&lt;br /&gt;
* Längere, empfehlenswerte Einführung und zugehörige Beispielschaltungen: http://highered.mcgraw-hill.com/sites/0073106941/student_view0/lt_spice_instructions_and_support_files.html&lt;br /&gt;
* Trotz graphischer Oberfläche kommt man früher oder später nicht darum herum, sich mit den Feinheiten von SPICE direkt auseinander zu setzen, wenn man ein spezielles Verhalten der Simulation braucht.&lt;br /&gt;
* International User Group: http://groups.yahoo.com/group/LTspice/&lt;br /&gt;
* Eine Menge Modelle und eine gute Einführung (die beste wie ich finde) http://www.elektronikschule.de/~krausg/&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Bauteilen, die aus verschiedenen Quellen stammen, ist nach Anmeldung in der obigen User Group zu bekommen. Dort gibt es auch die Modelle zum Download. Die erste Anlaufquelle, um häufig eingesetzte Bauteile zu finden.&lt;br /&gt;
&lt;br /&gt;
Andere Halbleiterhersteller liefern normalerweise keine explizit für LTspice vorgesehenen oder getesteten Modelle, da sie natürlicherweise nicht einen Mitbewerber (Linear Technologies) unterstützen wollen. LTspice versteht jedoch normale SPICE-Modelle (.SUBCKT, .MODEL, usw.). Da LTspice weitgehend die SPICE-Erweiterungen von PSPICE versteht, können auch PSPICE-Modelle in LTspice verwendet werden. Allerdings muss man eventuell, wie bei reinen SPICE Textmodellen, ein eigenes Schaltzeichen-Symbol für das Bauteil erstellen (LTspice versteht diesen Teil von PSPICE nicht).&lt;br /&gt;
&lt;br /&gt;
Das einbinden von Fremdmodellen wird im Handbuch / der Programm-Hilfe von LTspice erklärt. Jedoch nicht im Hauptteil, sondern im Kapitel &#039;&#039;FAQ&#039;&#039;, wo die Erklärungen gerne übersehen werden.&lt;br /&gt;
&lt;br /&gt;
===SIMetrix===&lt;br /&gt;
Größeneinschränkung&lt;br /&gt;
ab Win 2000 und teilw. Linux&lt;br /&gt;
http://www.catena.uk.com/site/downloads/SIMetrixIntro.htm&lt;br /&gt;
&lt;br /&gt;
===ngSpice===&lt;br /&gt;
&lt;br /&gt;
http://ngspice.sourceforge.net/&lt;br /&gt;
* Kommandozeilenorientiert&lt;br /&gt;
* für Linux, Windows, MacOS&lt;br /&gt;
* Anleitung für gEDA und Spice http://www.brorson.com/gEDA/SPICE/t1.html&lt;br /&gt;
* [http://sourceforge.net/projects/gspiceui/ GSpiceUI - A graphic interface for SPICE] (Linux)&lt;br /&gt;
&lt;br /&gt;
===TCLSpice===&lt;br /&gt;
&lt;br /&gt;
http://tclspice.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
* TclSpice ist eine verbesserte Version von Berkeley Spice und benutzt die Tcl/Tk Skript Sprache. &lt;br /&gt;
* open-source (BSD Lizenz) basierend auf NG-Spice Quellcode&lt;br /&gt;
&lt;br /&gt;
===Micro-Cap===&lt;br /&gt;
&lt;br /&gt;
http://www.spectrum-soft.com&lt;br /&gt;
* nur für Windows&lt;br /&gt;
* Evaluation Version (mit Einschränkungen) nach Registrierung erhältlich&lt;br /&gt;
&lt;br /&gt;
===NI MultiSim / Electronics Workbench===&lt;br /&gt;
&lt;br /&gt;
http://www.ni.com/multisim/&lt;br /&gt;
http://www.electronicsworkbench.com/edu/eduhom.html&lt;br /&gt;
&lt;br /&gt;
* Electronics Workbench wurde von National Instruments aufgekauft. In NIs MultiSim aufgegangen.&lt;br /&gt;
* 30-Tage Testversionen erhältlich&lt;br /&gt;
* nur für Windows&lt;br /&gt;
* Ab Wine 1.0 und bis MultiSim 9 auch auf Linux lauffähig&lt;br /&gt;
&lt;br /&gt;
===Tina===&lt;br /&gt;
http://www.tina.com/&lt;br /&gt;
* sehr eingeschränkte Demo-Version (PCB Layout nur mit weniger als 50 Pads erlaubt)&lt;br /&gt;
* [http://focus.ti.com/docs/toolsw/folders/print/tina-ti.html Tina-TI Version von Texas Instrument] ähnlich dem LTSpice von Linear Technology, ebenfalls kostenlos&lt;br /&gt;
&lt;br /&gt;
===Gnucap===&lt;br /&gt;
* http://www.geda.seul.org/tools/gnucap/&lt;br /&gt;
* [http://sourceforge.net/projects/gspiceui/ GSpiceUI - A graphic interface] (Linux)&lt;br /&gt;
&lt;br /&gt;
===qucs===&lt;br /&gt;
http://qucs.sourceforge.net/&lt;br /&gt;
* freie Software&lt;br /&gt;
* für Linux, Windows, OS X&lt;br /&gt;
* viele Modelle aus dem HF-Bereich&lt;br /&gt;
&lt;br /&gt;
=== lcfilter ===&lt;br /&gt;
http://www-users.cs.york.ac.uk/~fisher/lcfilter/&lt;br /&gt;
Online-Filterberechnung L-C-Filter&lt;br /&gt;
&lt;br /&gt;
=== eispice ===&lt;br /&gt;
&lt;br /&gt;
http://www.thedigitalmachine.net/eispice.html&lt;br /&gt;
&lt;br /&gt;
SPICE ähnlicher Schaltungssimulator mit Python Interface&lt;br /&gt;
&lt;br /&gt;
=== Yenka Analogue Electronics ===&lt;br /&gt;
&lt;br /&gt;
[http://www.yenka.com/ Yenka] is a simulator for designing circuits using analogue electronic components. Mac OS X or Windows XP/Vista. You can use all Yenka products free of charge at home.&lt;br /&gt;
&lt;br /&gt;
=== Solve Elec ===&lt;br /&gt;
&lt;br /&gt;
With [http://www.physicsbox.com/indexsolveelec2en.html Solve Elec] you can:&lt;br /&gt;
* draw and analyze electrical circuits functioning in direct or alternating current&lt;br /&gt;
* get literal formulas and values for current intensities and voltages defined in the circuit.&lt;br /&gt;
* verify circuit related equations.&lt;br /&gt;
* draw graphs.&lt;br /&gt;
* get the equivalent circuit of displayed circuit&lt;br /&gt;
* browse an integrated documentation&lt;br /&gt;
* edit, save and print reports made of various elements displayed in main window &lt;br /&gt;
(MacOSX, Windows, Free)&lt;br /&gt;
&lt;br /&gt;
==Digital==&lt;br /&gt;
&lt;br /&gt;
===Simulo===&lt;br /&gt;
http://www.codeplex.com/simulo&lt;br /&gt;
* Simple and modern digital simulation program. It&#039;s based upon .NET Framework 3.5 SP1 and WPF.&lt;br /&gt;
&lt;br /&gt;
===DigitalSimulator===&lt;br /&gt;
http://www.draw2d.org/digitalsimulator/&lt;br /&gt;
* Windows und Online Browser Variante verfügbar&lt;br /&gt;
&lt;br /&gt;
=== HADES ===&lt;br /&gt;
http://tams-www.informatik.uni-hamburg.de/applets/hades/html/index.html&lt;br /&gt;
* betriebssystemunabhängig (Java)&lt;br /&gt;
&lt;br /&gt;
=== mkfilter ===&lt;br /&gt;
http://www-users.cs.york.ac.uk/~fisher/mkfilter/&lt;br /&gt;
Online-Digitalfilterberechnung FIR, IIR&lt;br /&gt;
&lt;br /&gt;
=== edef ===&lt;br /&gt;
[http://edef.sourceforge.net/ edef] - A simple discrete event simulation. The edef framework can be used to simulate typical logical circuits, autoregressive processes or digital controller circuits and maybe some more. It is designed to be simple enougth for use in schools or other educational context. It is also truly easy to extend.&lt;br /&gt;
&lt;br /&gt;
=== TkGate ===&lt;br /&gt;
[http://www.tkgate.org/ TkGate] is a event driven digital circuit simulator with a tcl/tk-based graphical editor. (GPL)&lt;br /&gt;
&lt;br /&gt;
=== Atanua ===&lt;br /&gt;
&lt;br /&gt;
[http://atanua.org/ Atanua ] is a real-time logic simulator, designed to help in learning of basic boolean logic and electronics. It uses OpenGL hardware-accelerated rendering and a custom UI designed for a fast workflow and a very low learning curve, letting the students concentrate on learning the subject instead of spending time learning the tool. (Personal non-commercial license: Free. Andere Nutzungen: siehe Webseite)&lt;br /&gt;
&lt;br /&gt;
=== MMLogic ===&lt;br /&gt;
&lt;br /&gt;
[http://www.softronix.com/logic.html MMLogic] is a MultiMedia Logic Design System for Windows (NT/2K/Xp/95/98/ME, now Freeware)&lt;br /&gt;
&lt;br /&gt;
=== Yenka Digital Electronics ===&lt;br /&gt;
&lt;br /&gt;
[http://www.yenka.com/ Yenka] is a simulator for designing circuits using digital 4000 and 7400 series electronic components. Mac OS X or Windows XP/Vista. You can use all Yenka products free of charge at home.&lt;br /&gt;
&lt;br /&gt;
=== KSimus ===&lt;br /&gt;
&lt;br /&gt;
[http://ksimus.berlios.de/ KSimus] is a simulator for KDE.&lt;br /&gt;
&lt;br /&gt;
=== Digital Simulator ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mit.edu/~ara/ds.html Digital Simulator] has a toolbar of digital circuit elements, including logic gates, flip-flops, switches, and indicators. Drawing a circuit with Digital Simulator is like using a paint program. You click the element&#039;s icon on the toolbar, then click where you want the element to go. You use a similar procedure to draw wires and indicate connections. It&#039;s that simple. Free for educational institutions or students. (Windows 3.1, 95/NT)&lt;br /&gt;
&lt;br /&gt;
=== KLogic ===&lt;br /&gt;
&lt;br /&gt;
[http://www.a-rostin.de/indexd.html KLogic] ist eine Anwendung zum einfachen Entwurf und zur Simulation von Digitalschaltungen. KLogic ermöglicht einen einfachen Aufbau von Schaltungen aus Standardkomponenten wie UND, ODER, XOR, und Flipflops wie RS und JK. Um komplexere und wiederverwendbare Schaltungen zu entwerfen, können Teilschaltungen gespeichert und wiederverwendet werden.  (Linux, GPL)&lt;br /&gt;
Die letzte Version stammt aus dem Jahr 2006 und läuft leider recht instabil. Es gibt mittlerweile jede Menge grafisch unschöne Stellen und, schlimmer noch, auch diverse Bugs, die einen Crash verursachen.&lt;br /&gt;
&lt;br /&gt;
== Mixed Analog-Digital ==&lt;br /&gt;
&lt;br /&gt;
===SPECTRE===&lt;br /&gt;
Mixed AD-Simulator auf der Basis von Spice&lt;br /&gt;
&lt;br /&gt;
===HSPICE===&lt;br /&gt;
P-Spice-ähnlicher Simulator, der sowohl ABM-Modelle, als auch eigens erstellte library-Modelle verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
===XSPICE===&lt;br /&gt;
http://users.ece.gatech.edu/~mrichard/Xspice/&lt;br /&gt;
&lt;br /&gt;
=== DOLPHIN SMASH ===&lt;br /&gt;
http://www.dolphin-integration.com/medal/smash/smash_overview.html&lt;br /&gt;
* Dolphin Smash is a mixed-signal, multi-language simulator for IC or PCB designs. It uses [[SPICE]] syntax for analog descriptions, [[Verilog]]-HDL and [[VHDL]] for digital, Verilog-A/AMS, VHDL-AMS and ABCD (a combination of SPICE and C) for analog behavioral, and C for [[DSP]] algorithms.&lt;br /&gt;
* Logik, Analog und Mixed-Simulation&lt;br /&gt;
* Für Linux und Windows&lt;br /&gt;
* Engeschränkte Evaluationsversion erhältlich&lt;br /&gt;
&lt;br /&gt;
===GNU-Radio===&lt;br /&gt;
http://gnuradio.org/redmine/wiki/gnuradio&lt;br /&gt;
GNU Radio is a free software development toolkit that provides the signal processing runtime and processing blocks to implement software radios using readily-available, low-cost external RF hardware and commodity processors. It is widely used in hobbyist, academic and commercial environments to support wireless communications research as well as to implement real-world radio systems.&lt;br /&gt;
&lt;br /&gt;
=== Oregano ===&lt;br /&gt;
&lt;br /&gt;
http://oregano.gforge.lug.fi.uba.ar/&lt;br /&gt;
&lt;br /&gt;
Beschreibung von [http://elettrolinux.com/Simulations/oregano-an-electrical-tool.html elettrolinux.com]:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oregano&#039;&#039;&#039; is a LINUX application for schematic capture and simulation of electronic circuits. Oregano has an user friendly graphic interface that allows to design and describe the circuit to simulate. It provides a wide variety of component libraries, including CMOS, TTL, lineal, operational amplifiers, and a lot more! Oregano lets you simulate the designed circuits. The actual simulation is performed by Berkeley Spice BSIM, GnuCAP or the new generation NGSpice. Oregano is licensed under the terms of the GNU GPL.&lt;br /&gt;
&lt;br /&gt;
=== VirtualBreadboard ===&lt;br /&gt;
&lt;br /&gt;
[http://www.virtualbreadboard.com/ VirtualBreadboard] is an easy to use simulation and modelling tool that can be used in place of a real breadboard for quickly performing experiments and testing out electronic and microcontroller ([[PIC]]) powered &#039;embedded&#039; applications. (Seit Version 3.3.12 11 July 2009 Freeware, Windows)&lt;br /&gt;
&lt;br /&gt;
==Hochfrequenztechnik==&lt;br /&gt;
&lt;br /&gt;
=== Linksammlungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.circuitsage.com/tline.html Transmission Line Design and Analysis]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ansoft ===&lt;br /&gt;
Homepage: http://www.ansoft.de/downloads.cfm&lt;br /&gt;
&lt;br /&gt;
*Studentenversionen mit eingeschränken Funktionen&lt;br /&gt;
*Maxwell SV: Simulation von elektrischen und magnetischen Feldern (2D) &lt;br /&gt;
*Simplorer SV: Schaltungssimulation&lt;br /&gt;
*PExprt SV: Berechung von Schaltnetzteilen&lt;br /&gt;
&lt;br /&gt;
=== Aplac ===&lt;br /&gt;
Homepage: http://www.aplac.com&lt;br /&gt;
&lt;br /&gt;
AWR-APLAC offers a low-cost University License for educational and&lt;br /&gt;
non-commercial academic research use for universities and &lt;br /&gt;
other educational institutions.&lt;br /&gt;
&lt;br /&gt;
=== ARRL Radio Designer ===&lt;br /&gt;
für 169&amp;amp;#8364; bei http://www.ukw-berichte.de erhältlich  http://www.arrl.org&lt;br /&gt;
* Amateurversion der amerikanischen Design-Software Super Compact.&lt;br /&gt;
* Mittlerweile durch Ansoft Designer (ehem. Ansoft Serenade) überholt&lt;br /&gt;
&lt;br /&gt;
=== AADE Filter Design ===&lt;br /&gt;
Homepage: http://www.aade.com/filter.htm&lt;br /&gt;
&lt;br /&gt;
kostenlose Analog-Filterberechnung:&lt;br /&gt;
* Butterworth, Chebyshev, Elliptic (Cauer), Bessel, Legendre and Linear Phase&lt;br /&gt;
* low-pass, high-pass, band-Pass, and band-reject filters.&lt;br /&gt;
* Coupled Resonator band-pass filters&lt;br /&gt;
* Crystal Ladder band-pass filters using identical crystals&lt;br /&gt;
&lt;br /&gt;
=== ActiveFilterDesign ===&lt;br /&gt;
Active Filter Design für Matlab, kostenloser Download: http://academics.vmi.edu/ee_js/Research/Programs/materials/AFD12.zip&lt;br /&gt;
&lt;br /&gt;
Handbuch: http://academics.vmi.edu/ee_js/Research/Programs/materials/Analog%20Filter%20Designer.pdf&lt;br /&gt;
&lt;br /&gt;
* FIR, IIR, analoge Filter, Synthese und Analyse&lt;br /&gt;
&lt;br /&gt;
=== Elsie ===&lt;br /&gt;
http://www.tonnesoftware.com/elsie.html&lt;br /&gt;
a Windows electrical filter design and analysis program handling all of the usual options (family, topology, bandwidth, etc.). It has a nice toolbox including real-time tuning modes and optimization. Outputs are presentation quality. Student edition is free. &lt;br /&gt;
&lt;br /&gt;
=== FastHenry ===&lt;br /&gt;
Windowsversion http://www.fastfieldsolvers.com/&lt;br /&gt;
&lt;br /&gt;
* open source&lt;br /&gt;
* Impedanzextraktion (R und L) aus 3D-Geometrieen&lt;br /&gt;
* Erfasst Skin-, Proximity-Effekte, magnetische Kopplungseffekte&lt;br /&gt;
* Erstellung von Spice-Modellen möglich&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FilterFree ===&lt;br /&gt;
http://www.nuhertz.com/filter/&lt;br /&gt;
&lt;br /&gt;
Filter Free is the free version of Filter Solutions and Filter Light. Functionality is limited 3rd order analog and IIR filters, and 10 tap FIR filters. Filters are synthesized. Frequency, time, and reflection analysis are performed on the ideal, unmodified filters only. Transfer functions are displayed in standard form only.&lt;br /&gt;
&lt;br /&gt;
=== HP AppCAD ===&lt;br /&gt;
http://www.hp.woodshot.com/&lt;br /&gt;
&lt;br /&gt;
RF design software is provided free of charge by Agilent Technologies&lt;br /&gt;
as a service to the RF and microwave design community&lt;br /&gt;
&lt;br /&gt;
Läuft unter Windows ab 95c/NT4&lt;br /&gt;
&lt;br /&gt;
=== Nova.exe ===&lt;br /&gt;
http://www.pcb-pool.com/ppde/service_downloads.html&lt;br /&gt;
&lt;br /&gt;
NOVA is a program that can be used to analyze most linear (AC) circuits. It&lt;br /&gt;
can calculate voltage, phase, and delay at any circuit point (node) at any&lt;br /&gt;
frequencies. Most (AC) circuit analysis programs can only give useful results&lt;br /&gt;
for low frequencies (below 10 Mhz). NOVA can do this but it can also be used&lt;br /&gt;
for RF and microwave circuits. Microwave circuits require the analysis be done&lt;br /&gt;
in terms of S-parameters, rather then AC voltages.  NOVA does AC, time domain,&lt;br /&gt;
and S-parameter analysis.This version of NOVA has circuit tweaking while in the graph mode. You may find it extremely useful. Vary a component and watch the response, return loss, and delay change. &lt;br /&gt;
&lt;br /&gt;
Gutes altes DOS-Programm, AC- oder S-Parameter-Darstellung.&lt;br /&gt;
Ausdruck unter WinXP nur mit Screenshot-Programm möglich, getestet z.&amp;amp;nbsp;B. mit Snarf15: http://www.idcomm.com/personal/lorenblaney/SNARF15.ZIP&lt;br /&gt;
&lt;br /&gt;
=== PUFF - Microwave Design Software ===&lt;br /&gt;
für 22&amp;amp;#8364; bei http://www.ukw-berichte.de/ erhältlich&lt;br /&gt;
* altes DOS-Programm für HF-Simulation und Platinenentwurf&lt;br /&gt;
* Microstrip HF-Berechnungen, Smith-Diagramm&lt;br /&gt;
* in den UKW-Berichten standen schon mehrere Artikel mit Beispielen&lt;br /&gt;
* zur Nutzung einer Kombination aus PUFF und Ansoft SV (=Studentenversion)&lt;br /&gt;
&lt;br /&gt;
=== Microwave-Office / Tx-Line ===&lt;br /&gt;
Gratis: Tx-Line, ein &amp;quot;interactive transmission line calculator&amp;quot; &lt;br /&gt;
http://web.appwave.com/Products/Microwave_Office/Feature_Guide.php?bullet_id=9&lt;br /&gt;
&lt;br /&gt;
=== RF-Sim 99 ===&lt;br /&gt;
kostenlos z.&amp;amp;nbsp;B. von: http://www.janson-soft.de/amateurfunk/rfsim99/rfsim99.htm&lt;br /&gt;
&lt;br /&gt;
oder neben anderen PDFs zur HF-Technik: http://home.sandiego.edu/~ekim/e194rfs01/&lt;br /&gt;
* Berechnung aktiver und passiver Filter einschließlich Schaltplaneingabe&lt;br /&gt;
* Ausgabe von Frequenz- und Phasengang, Smith-Diagramm&lt;br /&gt;
&lt;br /&gt;
=== Smith Plot ===&lt;br /&gt;
Neben diversen Mathcad-Beispielen und Skripten aus der HF-Technik eine Smith-Chart-Software:&lt;br /&gt;
http://www.fritz.dellsperger.net/downloads.htm&lt;br /&gt;
&lt;br /&gt;
=== Sonnet Lite ===&lt;br /&gt;
Sonnet Lite provides a full-wave EM solution for 3D planar circuits&lt;br /&gt;
A fully functional and powerful EM analysis software. &lt;br /&gt;
Get started on your EM analysis within the next 30 minutes by downloading SONNET Lite!&lt;br /&gt;
http://www.sonnetusa.com/products/lite/&lt;br /&gt;
http://www.sonnetsoftware.com/&lt;br /&gt;
&lt;br /&gt;
===qucs===&lt;br /&gt;
http://qucs.sourceforge.net/&lt;br /&gt;
* freie Software&lt;br /&gt;
* für Linux, Windows, OS X&lt;br /&gt;
* hervorragende technische Dokumentation&lt;br /&gt;
* Impedanzrechenfunktionen für Strip- und Microstripleitungen&lt;br /&gt;
* Filterberechnungstool&lt;br /&gt;
&lt;br /&gt;
==Antennensimulation==&lt;br /&gt;
&lt;br /&gt;
=== cocoaNEC ===&lt;br /&gt;
Homepage: http://homepage.mac.com/chen/w7ay/cocoaNEC/index.html&lt;br /&gt;
* Design und modulierung von Antennen&lt;br /&gt;
* MacOS X (PowerPC und Intel)&lt;br /&gt;
* Frei erhältlich (mit Quellcode)&lt;br /&gt;
&lt;br /&gt;
=== EZ-NEC ===&lt;br /&gt;
Homepage: http://eznec.com/&lt;br /&gt;
* Antennenberechnung&lt;br /&gt;
demo program allows only 20 segments, which limits the complexity of antenna&lt;br /&gt;
you can analyze. (EZNEC 4.0 allows 500 )&lt;br /&gt;
&lt;br /&gt;
=== MiniNEC ===&lt;br /&gt;
Homepage: http://www.emsci.com/&lt;br /&gt;
* Antennenberechnung mittels &amp;quot;Momentenmethode&amp;quot; (Zerlegung der Antenne in kleine Segmente, Überlagerung der Teilfelder)&lt;br /&gt;
* eingeschränkte Studenten/Amateurversion erhältlich&lt;br /&gt;
* NEC = Numerical Electromagnetics Code&lt;br /&gt;
&lt;br /&gt;
=== SuperNEC ===&lt;br /&gt;
Homepage: http://www.supernec.com/&lt;br /&gt;
* Antennenberechnung mittels &amp;quot;Momentenmethode&amp;quot;&lt;br /&gt;
* 30-Tage-Testversion sowie unbegrenzt lauffähige Studentenversion (gegen Nachweis) erhältlich&lt;br /&gt;
&lt;br /&gt;
=== MMANA ===&lt;br /&gt;
Homepage (deutsche Version) : http://dl2kq.de/mmana/4-7.htm&lt;br /&gt;
&lt;br /&gt;
Kostenlose Antennen-Analysesoftware, auf der mit MININEC Version 3 eingeführten Momentenmethode basierend&lt;br /&gt;
&lt;br /&gt;
== Sonstige ==&lt;br /&gt;
&lt;br /&gt;
=== FEMM ===&lt;br /&gt;
* [http://femm.foster-miller.net/wiki/HomePage Finite Element Method Magnetics] (FEMM)&lt;br /&gt;
&lt;br /&gt;
=== GALEMU ===&lt;br /&gt;
&lt;br /&gt;
[http://bu3sch.de/joomla/index.php/galpal-emulator Galemu] is a [[GAL]]/[[PAL]] chip emulator. (GPL)&lt;br /&gt;
&lt;br /&gt;
==Numerische Berechnungswerkzeuge==&lt;br /&gt;
&lt;br /&gt;
===Derive===&lt;br /&gt;
http://education.ti.com&lt;br /&gt;
&lt;br /&gt;
===FreeMat===&lt;br /&gt;
http://freemat.sourceforge.net&lt;br /&gt;
* freier MatLab-Clone&lt;br /&gt;
* für Windows, Linux, Mac OS X&lt;br /&gt;
&lt;br /&gt;
===GAUSS===&lt;br /&gt;
Wissenschaftliche Simulationssoftware zur Berechung 3-dimensionaler Ladungsverteilungen in z.&amp;amp;nbsp;B. Halbleitern. Kann aus Geometrie und Dotierungsprofilen die Halbleitergleichungen ableiten.&lt;br /&gt;
&lt;br /&gt;
===GnuPlot===&lt;br /&gt;
http://www.gnuplot.info/&lt;br /&gt;
* freie Software&lt;br /&gt;
* für Linux, Windows und weitere&lt;br /&gt;
* sehr mächtiges Tool, aber eher im Bereich der Datenauswertung (Diagramme)&lt;br /&gt;
* [http://ttsiodras.googlepages.com/gnuplotStreaming.html Visualize real-time data streams with Gnuplot] (Perl)&lt;br /&gt;
&lt;br /&gt;
===Maple===&lt;br /&gt;
http://www.maplesoft.com/&lt;br /&gt;
* Wissenschaftliche Analyse und Simulationssystem zur Lösung komplexester Aufgaben der Mathematik. Lizenzpflichtig.&lt;br /&gt;
&lt;br /&gt;
===JMathLib===&lt;br /&gt;
http://mathlib.sourceforge.net&lt;br /&gt;
* freier Matlab-Clone in 100% Java&lt;br /&gt;
* für Windows, Linux, ...&lt;br /&gt;
&lt;br /&gt;
===MatLab===&lt;br /&gt;
http://www.mathworks.com/&lt;br /&gt;
&lt;br /&gt;
===MuPad===&lt;br /&gt;
http://www.mupad.de/&lt;br /&gt;
&lt;br /&gt;
===Mathcad===&lt;br /&gt;
http://www.mathsoft.com/ http://www.ptc.com/appserver/mkt/products/home.jsp?k=3901&lt;br /&gt;
* rechnen mit Formeln wie auf dem Papier&lt;br /&gt;
&lt;br /&gt;
===Maxima===&lt;br /&gt;
http://maxima.sourceforge.net/&lt;br /&gt;
* freie Software für Linux, OSX, Windows&lt;br /&gt;
&lt;br /&gt;
===Octave===&lt;br /&gt;
http://www.octave.org/&lt;br /&gt;
* freier MatLab-Clone. Die Syntax ist überwiegend identisch&lt;br /&gt;
* für Linux, Windows, OSX&lt;br /&gt;
&lt;br /&gt;
===GNU R===&lt;br /&gt;
http://www.r-project.org/&lt;br /&gt;
* freier S-Clone. Die Syntax ist überwiegend identisch&lt;br /&gt;
* für Linux, Windows, OSX&lt;br /&gt;
&lt;br /&gt;
===SciLab===&lt;br /&gt;
http://www.scilab.org/&lt;br /&gt;
* freie Software&lt;br /&gt;
* für Linux, Windows, MacOS&lt;br /&gt;
* stellt eine C++ Library bereit, die in eigene DSP-Systeme eingebunden werden kann&lt;br /&gt;
&lt;br /&gt;
===scipy===&lt;br /&gt;
scipy [http://www.scipy.org/] ist eine Erweiterung der Skriptsprache Python [http://www.python.org] mit numerischen Funktionen&lt;br /&gt;
* freie Software&lt;br /&gt;
* für Linux, Windows, OSX&lt;br /&gt;
&lt;br /&gt;
== Online Schaltungssimulatoren ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/79658#664688 Diskussion im Forum]&lt;br /&gt;
* http://www.falstad.com/circuit/&lt;br /&gt;
* [http://www.intersil.com/isim/ Intersil’s iSim]&lt;br /&gt;
* [http://smile.hsu-hh.de/Schaltungen/Index.htm WSPICE] (fixe Schaltungen)&lt;br /&gt;
* [http://micropci1.imtek.uni-freiburg.de/svs/ spicy VOLTsim]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.elektronikschule.de/~krausg/ Elektronikschule.de von Gunthard Kraus] (ORCAD-PSPICE, LTspice IV)&lt;/div&gt;</summary>
		<author><name>141.99.254.253</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Festkommaarithmetik&amp;diff=24584</id>
		<title>Festkommaarithmetik</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Festkommaarithmetik&amp;diff=24584"/>
		<updated>2007-11-13T10:34:24Z</updated>

		<summary type="html">&lt;p&gt;141.99.254.253: /* ITOA selbst gemacht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
&lt;br /&gt;
Ein immer wiederkehrendes Problem ist die Anzeige von Messwerten per UART/RS232 oder LCD. Die Messwerte werden praktisch immer von [[AD-Wandler]]n oder anderen Sensoren in digitaler Form geliefert. Doch wie wandelt man diese in eine &amp;quot;normale&amp;quot; Anzeige wie z.B. 4,56V um?&lt;br /&gt;
&lt;br /&gt;
Der einfachste Ansatz ist der Einsatz von Gleitkommazahlen. Dabei gilt nahezu immer die Formel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Eingangsspannung = \frac{ADC \hbox{-} Wert \cdot Referenzspannung}{ 2^{Bitbreite_{ADC}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den so errechneten Wert der Eingangsspannung kann man einfach per C-Funktion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
sprintf(mein_string, &amp;quot;%2.4f&amp;quot;, Eingangsspannung);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in einen String umwandeln und dann auf ein LCD oder den UART ausgeben.&lt;br /&gt;
&lt;br /&gt;
Soweit so gut. Das Problem ist &amp;quot;nur&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Das Rechnen mit Gleitkommazahlen ist auf den meisten Mikrocontrollern mit recht viel Rechenzeit sowie Programmspeicher verbunden, da diese keine Befehle zur direkten Verarbeitung von Gleitkommazahlen haben. Alle Rechnungen werden mit Hilfe von Bibliotheksfunktionen nachgebildet.&lt;br /&gt;
* Die Ausgabe von Gleitkommazahlen per sprintf und Konsorten benötigt ebenfalls sehr viel Programmspeicher, da diese Funktionen sehr mächtig und damit umfangreich sind&lt;br /&gt;
&lt;br /&gt;
== Die Lösung ==&lt;br /&gt;
&lt;br /&gt;
Die allerwenigsten Anwendungen benötigen die volle Leistung von Gleitkommazahlen (Dynamikbereich). Wesentlich sinnvoller ist die Anwendung von Festkommazahlen. Diese sind normale Integerzahlen (ganzzahlig ohne Kommastellen), allerdings mit &amp;quot;gedachten&amp;quot; Kommastellen. Wie geht das? Ganz einfach. Anstatt 10,45 kann man auch 1045 schreiben und die beiden letzten Stellen als Nachkommastellen betrachten. 1045 kann man in einer ganz normalen 16 Bit Integervariable speichern. Und auch damit rechnen!&lt;br /&gt;
&lt;br /&gt;
Anstatt nun in Gleitkomma zu schreiben und zu rechnen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = \frac{756 \cdot 5,0}{1024}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird geschrieben&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = \frac{756 \cdot 5000}{1024}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Referenzspannung wird in 1/1000 V (mV) ausgedrückt und damit gerechnet. Das Ergebnis ist eine Spannung in mV. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;Wichtig&amp;lt;/B&amp;gt; ist dabei, daß&lt;br /&gt;
&lt;br /&gt;
* erst alle Multiplikationen und dann erst die Divisionen durchgeführt werden, um Rundungsfehler zu minimieren&lt;br /&gt;
* in sämtlichen Zwischenergebnissen keine arithmetischen Überläufe auftreten, also genügend grosse Variablen benutzen (16/32/64 Bit Integer)&lt;br /&gt;
&lt;br /&gt;
Doch wie wird nun diese Zahl in einen darstellbaren String umgewandelt? Im einfachsten Fall durch Verwendung der C-Funktion itoa (Integer to ASCII). Diese ist auf vielen Mikrocontrollern als C-Bibliothek verfügbar. Wenn dies jedoch nicht so sein sollte muss man sie selber schreiben. Und da wir hier etwas lernen wollen, werden wir das auch tun.&lt;br /&gt;
&lt;br /&gt;
== ITOA selbst gemacht ==&lt;br /&gt;
&lt;br /&gt;
Wie funktioniert nun die Umwandlung einer Zahl in einen String? Ganz einfach. Für jede Stelle der Dezimalzahl muss ein ASCII-Zeichen erzeugt werden. Wenn z.B. die Zahl 28943 in einen String gewandelt werden soll muss am Ende der String die ASCII-Codes 0x32, 0x38, 0x39, 0x34, 0x33 und 0x00 (Stringabschlusszeichen, Stringterminator) enthalten. Wie man bei genauem Hinsehen sieht, besteht der ASCII-Code einer Zahl zwischen 0..9 immer aus 0x30 + Zahl. Das ist einfach. Und wie kommt man nun an die einzelnen Ziffern? Dazu wird eine MODULO Operation durchgeführt. Diese liefert den Rest einer ganzzahligen Division.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
228943 MOD 10 =       3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun gehts an die nächste Stelle. Dazu wird die Zahl einfach durch 10 dividiert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
228943 / 10 = 2894&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und nun das Spiel von vorn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2894 MOD 10 =        4&lt;br /&gt;
2894 / 10   = 289&lt;br /&gt;
289 MOD 10  =        9&lt;br /&gt;
289 / 10    = 28&lt;br /&gt;
28 MOD 10   =        8&lt;br /&gt;
28 / 10     = 2&lt;br /&gt;
2 MOD 10    =        2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das wars eigentlich schon. Beachtet werden muss nur, dass bei dieser Methode die einzelnen Stellen in umgekehrter Reihenfolge entstehen: Die höchstwertigen Stellen kommen erst zum Schluss.&lt;br /&gt;
&lt;br /&gt;
Hier ist nun unsere erste einfache Funktion, um eine vorzeichenlose 32 Bit Zahl in einen String umzuwandeln. Diese kann maximal 10 Dezimalstellen haben (0..4294967295), also wird ein Speicher für 11 Bytes benötigt (letztes Byte für den Stringterminator).  Bei dem Verfahren wird die Zahl rückwärts berechnet. Das muss bei der Ablage im Speicher berücksichtigt werden. Im Sinne der Verständlichkeit wurde bewusst auf Optimierungen und kompakt/kryptische Schreibweisen verzichtet. Der Syntax ist Standard-C und somit auf jedem Compiler nutzbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
Funktion zur Umwandlung einer vorzeichenlosen 32 Bit Zahl in einen String&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void my_uitoa(uint32_t zahl, char* string) {&lt;br /&gt;
  int8_t i;                             // schleifenzähler&lt;br /&gt;
&lt;br /&gt;
  string[10]=&#039;\0&#039;;                       // String Terminator&lt;br /&gt;
  for(i=9; i&amp;gt;=0; i--) {&lt;br /&gt;
    string[i]=(zahl % 10) +&#039;0&#039;;         // Modulo rechnen, dann den ASCII-Code von &#039;0&#039; addieren&lt;br /&gt;
    zahl /= 10;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion gibt auch führende Nullen aus. Das ist erstmal OK, denn so wissen wir immer wo unser gedachtes Komma ist. Bei der Ausgabe können die führenden Nullen unterdrückt werden. Wie das geht, wird weiter unten beschrieben.&lt;br /&gt;
&lt;br /&gt;
Benötigt man neben der Ausgabe für vorzeichenlose (unsigned) Werte auch noch eine Funktion für vorzeichenbehaftete Werte, so ist auch dieses keine Hexerei. Dazu verwenden wir ein zusätzliches Byte im String um das Vorzeichen zu speichern. Der String muss nun also mindestens 12 Bytes Speicherplatz zur Verfügung stellen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
Funktion zur Umwandlung einer vorzeichenbehafteten 32 Bit Zahl in einen String&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void my_itoa(int32_t zahl, char* string) {&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
&lt;br /&gt;
  string[11]=&#039;\0&#039;;                  // String Terminator&lt;br /&gt;
  if( zahl &amp;lt; 0 ) {                  // ist die Zahl negativ?&lt;br /&gt;
    string[0] = &#039;-&#039;;              &lt;br /&gt;
    zahl = -zahl;&lt;br /&gt;
  }&lt;br /&gt;
  else string[0] = &#039; &#039;;             // Zahl ist positiv&lt;br /&gt;
&lt;br /&gt;
  for(i=10; i&amp;gt;=1; i--) {&lt;br /&gt;
    string[i]=(zahl % 10) +&#039;0&#039;;     // Modulo rechnen, dann den ASCII-Code von &#039;0&#039; addieren&lt;br /&gt;
    zahl /= 10;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Digitaler Temperatursensor ===&lt;br /&gt;
&lt;br /&gt;
Anstatt eines ADC-Wertes werden oft auch Digitalwerte von Temperatursensoren verarbeitet. Der Weg ist hier identisch. Allerdings hat man keine Referenzspannung oder Referenztemperatur. Das ist aber kein Beinbruch. Z.B. der LM74 hat eine Auflösung von 1/16°C = 0,0625°C. Um das Messergebnis ohne Verlust von Auflösung auszugeben könnte man als erstes den Digitalwert auf 1/100 °C umrechnen. Das geschieht mit der Multiplikation mit 6,25. Doch Stop, das ist ja schon wieder ne Gleitkommazahl. Doch kein Problem, wir wissen ja wie wir das Problem lösen. Wir schieben das Komma um zwei Stellen nach rechts und multiplizieren mit 625 und wissen, dass das Ergbniss nun in 1/10000°C vorliegt. Über den physikalischen Sinn dieser Auflösung müssen wir nicht nachdenken, wichtig ist für uns nur, dass jetzt die Zahl einfach per itoa() umwandelbar ist. Allgemein kann man folgenden Ablauf zur Berechnung des Korrekturfaktors angeben&lt;br /&gt;
&lt;br /&gt;
* Den Korrekturfaktur &amp;lt;B&amp;gt;K&amp;lt;/B&amp;gt; mit vollen Kommastellen berechnen, dabei ist die neue Auflösung sinnvollerweise eine Dezimalzahl ( 0,1; 0,001 etc.) und kleiner als die alte Auflösung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K  = \frac{alte~Aufloesung}{neue~Aufloesung}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Den berechneten Korrekturfaktor solange mit 10 multiplizieren bis alle Nachkommastellen verschwunden sind bzw. durch Rundung ein akzeptabler Fehler entsteht. Für jede Multiplikation des Faktors mit 10 muss die neue Auflösung durch 10 dividiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Temperatur = Sensorwert \cdot K&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;Beispiel:&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alte Auflösung: 1/32°C&amp;lt;BR&amp;gt;&lt;br /&gt;
Neue Auflösung: 1/100°C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K = \frac{\frac{1}{32}}{\frac{1}{100}} = 3,125&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Der Korrekturfaktor 3,125 kann zweimal mit 10 multipliziert werden und dann auf 312 gerundet werden, das entspricht einem Rundungsfehler von gerade mal 1/624 = 0,16% ! Die neue Auflösung beträgt 1/10000°C. Wenn der Sensor nur 7 Bit Werte liefert kann das Ergebnis in einer 16 Bit Variablen gespeichert werden, darüber hinaus ist eine 32 Bit Variable notwendig.&lt;br /&gt;
&lt;br /&gt;
=== ADC allgemein ===&lt;br /&gt;
&lt;br /&gt;
Wenn man das obige ADC-Beispiel allgemein beschreiben will, dann gilt folgender Ablauf&lt;br /&gt;
&lt;br /&gt;
* Korrekturfaktor mit vollen Kommastellen berechnen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;alte Aufloesung = \frac{Referenzspannung}{2^{Bitbreite_{ADC}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K  = \frac{alte~Aufloesung}{neue~Aufloesung}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Den berechneten Korrekturfaktor K solange mit 10 multiplizieren bis alle Nachkommastellen verschwunden sind bzw. durch Rundung ein akzeptabler Fehler entsteht. Für jede Multiplikation des Faktors mit 10 muss die neue Auflösung durch 10 dividiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Eingangsspannung = ADC \hbox{-} Wert \cdot K&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;Beispiel:&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Referenzspannung : 5V&amp;lt;BR&amp;gt;&lt;br /&gt;
ADC Bitbreite : 10&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;alte Aufloesung = \frac{5V}{2^{10}} = \frac{5}{1024} = 0,0048828125\,V&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
neue Auflösung:  0,001 V = 1mV&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K = \frac{0,0048828125 V}{0,001V} = 4,8828125&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Korrekturfaktor 4,8828125 wird zweimal mit 10 multipliziert und dann auf 488 gerundet, das entspricht einem Rundungsfehler von gerade mal 0,05% ! Die neue Auflösung ist 0,00001 V = 10uV. Das Ergebnis muss in einer 32 Bit Variablen gespeichert werden, denn der grösste Messwert ergibt 1023*488 = 499224. Der Vorteil dieses allgemeinen Ansatzes ist vor allem, daß nur eine Multiplikation benötigt wird, im Gegensatz zu unserem allerersten Beispiel, welches eine Multiplikation und eine Division benötigt. Das spart einiges an Rechenzeit und Programmspeicherplatz.&lt;br /&gt;
&lt;br /&gt;
== Ergebnis runden ==&lt;br /&gt;
&lt;br /&gt;
Nach der Umrechung des ADC/Sensor-Wertes und dem Aufruf von my_uitoa() kann man sehr einfach eine Rundung durchführen. Dazu muss nur die erste Stelle, welche durch Rundung wegfallen soll, geprüft werden. Ist sie kleiner als der ASCII-Code von &#039;5&#039; (0x35) dann muss abgerundet werden, sprich alles bleibt wie es ist. Im anderen Fall muss aufgerundet werden, was bedeutet dass die letzte angezeigte Dezimalstelle um eins erhöht werden muss. Doch aufgepasst! Wenn z.B. in unserem String die Zahl 1995 steht und die letzte Stelle durch Rundung wegfallen soll, kommte es zum Übertrag. Die letzte 9 wird zur 0 + Übertrag. Die nächste linksstehende Stelle muss erhöht werden. Das ist &amp;quot;dummerweise&amp;quot; auch eine 9, also wieder ein Übertrag. Die letzte Ziffer ist 1, die wird nur auf zwei erhöht und der Übertrag endet.&lt;br /&gt;
&lt;br /&gt;
Basierend auf unserer Funktion my_uitoa() soll hier eine einfache Rundungsfunktion gezeigt werden. Auch diese arbeitet mit einem 11 Byte String, welcher vorher durch my_uitoa erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
Funktion zur Rundung einer vorzeichenlosen 32 Bit Zahl im Stringformat&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
char* string:  Zeiger auf String, welcher mit my_uitoa() erzeugt wurde&lt;br /&gt;
uint8_t digit: Offset im String, zeigt auf die Stelle welche zur Rundung ausgewertet werden soll&lt;br /&gt;
               gültiger Wertebereich ist 1..9 !&lt;br /&gt;
               Der Offset von 1 zeigt auf die zweite Stelle von links&lt;br /&gt;
               Der Offset von 9 zeigt auf die letzte Stelle von links&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void my_round(char* string, uint8_t digit) {&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
&lt;br /&gt;
  if (string[digit]&amp;gt;=&#039;5&#039;) {         // Aufrunden?&lt;br /&gt;
    for(i=(digit-1); i&amp;gt;=0; i--) {&lt;br /&gt;
      string[i] += 1;               // Aufrunden&lt;br /&gt;
      if (string[i]&amp;lt;=&#039;9&#039;)&lt;br /&gt;
        break;                      // kein Übertrag, schleife verlassen&lt;br /&gt;
      else&lt;br /&gt;
        string[i]=&#039;0&#039;;              // Übertrag und Überlauf&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for(i=digit; i&amp;lt;10; i++) string[i] =&#039;0&#039;;   // gerundete Stellen auf Null setzen&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion ist auch auf einen String anwendbar, welcher mit my_itoa() erzeugt wurde (also vorzeichenbehaftete Zahlen). Allerdings muss der Funktion ein Pointer auf das zweite Byte (char) übergeben werden, da im ersten das Vorzeichen gespeichert ist. Das geschieht am einfachsten so.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
my_round(my_sting+1, 5);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ergebnis ausgeben ==&lt;br /&gt;
&lt;br /&gt;
Nun haben wir unseren Messwert in eine Zahl mit der richtigen Einheit umgewandelt und gerundet. Jetzt folgt der letzte Schritt, die Ausgabe auf einen UART oder LCD. Dazu ist es meist wünschenswert führende Nullen nicht anzuzeigen. Also anstatt 0095,89 will man 95,89 ausgeben. Bei negativen Zahlen kommt noch das Vorzeichen hinzu.&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe auf LCD (HD44780 &amp;amp; CO) ===&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir unsere Zahl auf einem LCD ausgeben. Dazu braucht man die entsprechende Funktion lcd_data(), wie sie z.B. im [[AVR-GCC-Tutorial#LCD_Ansteuerung]] zu finden ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
Funktion zur Anzeige einer 32 Bit Zahl im Stringformat&lt;br /&gt;
auf einem LCD mit HD44780 Controller&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
char* string  : Zeiger auf String, welcher mit my_itoa() erzeugt wurde&lt;br /&gt;
uint8_t start : Offset im String, ab der die Zahl ausgegeben werden soll,&lt;br /&gt;
                das ist notwenig wenn Zahlen mit begrenztem Zahlenbereich&lt;br /&gt;
                ausgegeben werden sollen&lt;br /&gt;
                Vorzeichenlose Zahlen      : 0..10&lt;br /&gt;
                Vorzeichenbehaftete zahlen : 1..11&lt;br /&gt;
uint8_t komma : Offset im String, zeigt auf die Stelle an welcher das virtuelle&lt;br /&gt;
                Komma steht (erste Nachkommastelle)&lt;br /&gt;
                komma muss immer grösser oder gleich start sein !&lt;br /&gt;
&lt;br /&gt;
uint8_t frac  : Anzahl der Nachkommastellen&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void my_print_LCD(char* string, uint8_t start, uint8_t komma, uint8_t frac) {&lt;br /&gt;
&lt;br /&gt;
  uint8_t i;            // Zähler&lt;br /&gt;
  uint8_t flag=0;       // Merker für führende Nullen&lt;br /&gt;
&lt;br /&gt;
  // Vorzeichen ausgeben  &lt;br /&gt;
  if (string[0]==&#039;-&#039;) lcd_data(&#039;-&#039;); else lcd_data(&#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  // Vorkommastellen ohne führende Nullen ausgeben&lt;br /&gt;
  for(i=start; i&amp;lt;komma; i++) {&lt;br /&gt;
    if (flag==1 || string[i]!=&#039;0&#039;) {&lt;br /&gt;
      lcd_data(string[i]);&lt;br /&gt;
      flag = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else lcd_data(&#039; &#039;);         // Leerzeichen&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  lcd_data(&#039;,&#039;);                // Komma ausgeben&lt;br /&gt;
&lt;br /&gt;
  // Nachkommastellen ausgeben&lt;br /&gt;
  for(; i&amp;lt;(komma+frac); i++) lcd_data(string[i]);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion gibt zunächst das Vorzeichen aus, das ist einfach. Danach werden die Vorkommastellen ausgegeben. Aber es wird nur dann ein Zeichen ausgegeben, wenn vorher schon mal eins ausgegeben wurde (flag ==1) oder das aktuelle Zeichen keine &#039;0&#039; ist. Danach werden ganz normal die Nachkommastellen ausgegeben, hier ist eine Unterdrückung führender Nullen sogar mathematisch falsch!&lt;br /&gt;
&lt;br /&gt;
Genutzt wird die Funktion beispielsweise so, um dreistellige Zahlen bis 999 mit zwei Nachkommastellen auszugeben. Die Zahl selber hat sechs Nachkommastellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
char my_string[12]=&amp;quot;-0034567891\0&amp;quot;;&lt;br /&gt;
my_print_LCD(my_string, 2, 5, 2);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf dem LCD erscheint dann &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- 34.56&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann auch verwendet werden, um vorzeichenlose Zahlen auszugeben, welche mit my_uitoa() erzeugt wurden. Da an der ersten Stelle nie ein &#039;-&#039; steht, wird auch nie ein &#039;-&#039; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe auf UART ===&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe auf einen UART ist nahezu identisch. Auch hier braucht man eine Funktion putc(), welche ein einzelnes Zeichen auf den UART schreiben kann wie z.B. im [[AVR-Tutorial:UART:GCC]] beschrieben ist. Der Unterschied zur LCD-Ausgabe besteht darin, dass zwischen dem Vorzeichen und der Zahl keinerlei Leerzeichen eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
Funktion zur Ausgabe einer 32 Bit Zahl im Stringformat&lt;br /&gt;
auf den UART&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
char* string  : Zeiger auf String, welcher mit my_itoa() erzeugt wurde&lt;br /&gt;
uint8_t start : Offset im String, ab der die Zahl ausgegeben werden soll,&lt;br /&gt;
                das ist notwenig wenn Zahlen mit begrenztem Zahlenbereich&lt;br /&gt;
                ausgegeben werden sollen&lt;br /&gt;
                Vorzeichenlose Zahlen      : 0..10&lt;br /&gt;
                Vorzeichenbehaftete zahlen : 1..11&lt;br /&gt;
uint8_t komma : Offset im String, zeigt auf die Stelle an welcher das virtuelle&lt;br /&gt;
                Komma steht (erste Nachkommastelle);&lt;br /&gt;
                komma muss immer grösser oder gleich start sein !&lt;br /&gt;
&lt;br /&gt;
uint8_t frac  : Anzahl der Nachkommastellen&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void my_print_UART(char* string, uint8_t start, uint8_t komma, uint8_t frac) {&lt;br /&gt;
&lt;br /&gt;
  uint8_t i;            // Zähler&lt;br /&gt;
  uint8_t flag=0;       // Merker für führende Nullen&lt;br /&gt;
&lt;br /&gt;
  // Vorkommastellen ohne führende Nullen ausgeben&lt;br /&gt;
  for(i=start; i&amp;lt;komma; i++) {&lt;br /&gt;
    if (flag==1 || string[i]!=&#039;0&#039;) {&lt;br /&gt;
      if (flag==0 &amp;amp;&amp;amp; string[0]==&#039;-&#039;) putc(&#039;-&#039;);     // negatives Vorzeichen ausgeben&lt;br /&gt;
      putc(string[i]);&lt;br /&gt;
      flag = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  putc(&#039;,&#039;);                // Komma ausgeben&lt;br /&gt;
&lt;br /&gt;
  // Nachkommastellen ausgeben&lt;br /&gt;
  for(; i&amp;lt;(komma+frac); i++) putc(string[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann auch verwendet werden, um vorzeichenlose Strings auszugeben, welche mit my_uitoa() erzeugt wurden. Da an der ersten Stelle nie ein &#039;-&#039; steht, wird auch nie ein &#039;-&#039; ausgegeben.&lt;/div&gt;</summary>
		<author><name>141.99.254.253</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=12505</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=12505"/>
		<updated>2006-03-17T08:09:35Z</updated>

		<summary type="html">&lt;p&gt;141.99.254.253: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:AVR]]&lt;br /&gt;
Diese Seite soll als erste Anlaufstelle dienen, wenn der AVR-Mikrocontroller mal wieder nicht so will wie er soll. Es wird versucht, die Standardfehler aufzulisten und zu erklären, was man dagegen tun kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fuses richtig gesetzt?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die AVR-Controller haben &#039;Fuses&#039; (deutsch: &#039;Sicherungen&#039;), die das Verhalten des Prozessors auf grundlegender Ebene beeinflussen. Ein häufiger Fehler ist beispielsweise, dass die falsche Taktquelle gewählt wurde: einige AVRs können mit dem internen Oszillator oder mit einem externen Oszillator oder mit einem Quarz oder mit einem Resonator betrieben werden. Wenn die Einstellung über die Fusebits nicht dazu paßt, bekommt man auf der seriellen Schnittstelle Nonsens, und die Timer oder Zeitschleifen laufen mit der falschen Frequenz (evtl. läuft der Controller auch gar nicht).&lt;br /&gt;
Eine andere Fuse schaltet auf einem Port (z. B. PORTC auf ATMega32) die JTAG-Unterstützung ein bzw. aus. Wenn sie eingeschaltet ist, funktionieren vier Bits dieses Ports nicht wie gewohnt.&lt;br /&gt;
In dem zum STK500 gehörenden Entwicklungstool &#039;AVR Studio&#039; gibt es in der Programmer-Dialogbox einen Tab &#039;Fuses&#039;, der controllerabhängig den Status der Fusebits anzeigt und Änderungen ermöglicht.&lt;br /&gt;
Siehe auch: [[AVR Fuses]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISP-Adapter&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei ISP-Programmieradaptern für den Parallelport kann es zu Inkompatibilitäten mit manchen Ports kommen. Tritt das Problem auch auf, wenn der ISP-Adapter an einem anderen Rechner angeschlossen ist? Funktioniert es vielleicht mit einer anderen Software? Siehe auch: [[AVR In System Programmer]]).&lt;br /&gt;
Serielle Programmer: Programmieren dauert sehr lange, es gibt Fehler - ISP Taktrate richtig eingestellt (&amp;lt;1/4 F_CPU)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spannungsversorgung richtig angeschlossen?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der AVCC-Pin ist der Versorgungsanschluss für den [[AD-Wandler]] und den zugehörigen Port. Er ist nicht an allen AVRs vorhanden; wenn er aber vorhanden ist, so muss er auf jeden Fall angeschlossen sein, auch wenn der AD-Wandler nicht benutzt wird. Wird der AD-Wandler verwendet, sollte zur Verbesserung der Genauigkeit der AVCC-Pin über einen Lowpass-Filter angeschlossen werden (siehe Datenblatt).&lt;br /&gt;
Oft funktioniert die Programmierung des Controllers auch, wenn Vcc oder GND nicht richtig angeschlossen ist. Zur Sicherheit kann man mit einem [[Spannungsmesser]] direkt an den Anschlüssen des AVRs kontrollieren, ob die Verbindungen korrekt sind. Es empfiehlt sich, vor dem Einsetzen bzw. Einlöten des Controllers die Versorgungsanschlüsse nochmals zu prüfen, um sicherzustellen, dass man den IC nicht durch eine zu hohe Spannung aufgrund eines Fehlers in der Versorgung zerstört.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reset-Pin korrekt beschaltet?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Reset-Anschluss am AVR ist &#039;active-low&#039;, d. h. verbindet man den Pin mit GND (Masse), wird ein Reset ausgelöst. Zwar haben AVRs einen internen Pull-Up-Widerstand, der den Reset-Pin gegen VCC &amp;quot;zieht&amp;quot;, dieser ist jedoch sehr hochohmig und reicht unter Umständen nicht aus, um den Reset-Pin sicher &amp;quot;hochzuhalten&amp;quot;. Als Mindestbeschaltung empfiehlt sich dringend, einen externen Pull-Up-Widerstand vorzusehen (typ. 10 kOhm), der den Reset-Pin mit VCC verbindet. Er sollte nicht kleiner als 4,7 kOhm sein, da der Programmieradapter sonst eventuell den Reset-Pin während des Programmiervorgangs nicht sicher auf &amp;quot;low&amp;quot; ziehen kann. Zusätzlich sollte man auch noch einen Kondensator 47 nF oder 100 nF zwischen Reset-Pin und GND anordnen. (Atmel empfiehlt zusätzlich noch eine externe &amp;quot;Clamp-Diode&amp;quot; nach VCC, da für den Reset-Pin keine interne vorhanden ist. Diese Diode bereitet jedoch bei manchen Programmieradaptern Schwierigkeiten). Dieses RC-Glied sorgt dafür, dass beim Einschalten der Versorgungsspannung, für eine definierte Zeitspanne der Prozessor im Reset gehalten wird. Im laufenden Betrieb sorgt der Kondensator dafür, dass der Reseteingang unempfindlich gegenüber Spikes und Glitches wird. Der Kondensator sollte deshalb unmittelbar in Pin-Nähe beim Prozessor untergebracht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abblockkondensator(en) ordnungsgemäß installiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Abblockkondensatoren (&amp;quot;Bunker-Kondensatoren&amp;quot;) dienen dazu, Vorsorgungsspannungseinbrüche, die durch Schaltvorgänge verursacht werden können, zu kompensieren. Diesen Zweck erfüllen sie optimal, wenn folgende Regeln eingehalten werden: 1. Ein Abblockkondensator sollte möglichst dicht am IC sitzen, 2. Jedes IC in einer Schaltung sollte einen Abblockkondensator besitzen, 3. Bei ICs mit mehreren Anschlüssen für VCC und GND sollte jedes VCC-GND-Paar mit einem eigenen Abblockkondensator beschaltet werden  (z. B. AVRs in SMD-Bauform wie dem ATmega16A also mit vier Kondensatoren).  4.  Es sollten keramische Kondensatoren mit einer Kapazität von 100 nF verwendet werden. Größere Kondensatoren wie etwa 10 µF-Elkos sind für diese Aufgabe &amp;lt;i&amp;gt;nicht&amp;lt;/i&amp;gt; geeignet, weil sie &amp;quot;zu langsam&amp;quot; sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quarz angeschlossen?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die neueren AVRs haben einen internen [[Oszillator]], der im Auslieferungszustand über die entsprechenden Fuses eingeschaltet ist. In diesem Fall muss kein externer [[Quarz]] mehr angeschlossen werden. Man kann in den [[AVR Fuses|Fuse-Bits]] aber einstellen, dass man einen externen Taktgenerator (&#039;&#039;ext. Clock&#039;&#039;, z. B. Quarzoszillator) oder externen Quarz (&#039;&#039;ext. Crystal&#039;&#039;) verwenden möchte.&lt;br /&gt;
Dann, oder wenn der AVR keinen internen Takt hat, wird an die entsprechenden Pins des Controllers ein Quarz oder [[Quarzoszillator]] angeschlossen. Im Falle eines Quarzes werden die XTAL-Pins mit den beiden Anschlüssen des Quarzes und jeweils mit einem Kondensator (ca. 22 bis 27 pF) gegen Masse angeschlossen. Im Falle eines Quarzoszillators (Bauteil mit vier &amp;quot;Beinchen&amp;quot;) reicht es aus, den Taktausgang mit dem XTAL1-Pin zu verbinden, und den XTAL2-Pin unbeschaltet zu lassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Ground-Anschlüsse beschaltet?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei AVRs mit mehreren Ground-Anschlüssen müssen alle Anschlüsse beschaltet werden.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/forum/read-1-107259.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Lötstellen in Ordnung?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kalte&amp;quot;, d. h. schlechte Lötstellen erkennt man an ihrer matten Oberfläche. Bei beschädigten Lötstellen erkennt man oft einen Riss, der sich kreisförmig um die Mitte des Lötpunktes herum gebildet hat. Solche Stellen verursachen oft erst bei mechanischer Beanspruchung Probleme. &lt;br /&gt;
Bei kleinen Abständen (SMD-Bauteile) müssen besonders Verbindungen zwischen benachbarten Lötungen kontrolliert werden. &lt;br /&gt;
Bei Lochrasterplatinen kann man mit einem spitzen Messer (Bastelmesser) die Zwischenräume von möglichen leitenden Verbindungen befreien. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eingänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Taster müssen a) entprellt werden ([[Entprellung]]) und b) einen [[Pullup-Widerstand]]&lt;br /&gt;
besitzen, so sie &#039;&#039;active-low&#039;&#039; betrieben werden, d. h. wenn beim Tastendruck der Pin mit GND (Masse) verbunden wird (dies ist die übliche Anschaltung). Man kann einen externen Pull-Up Widerstand (typ. 10 kOhm) benutzen oder den internen aktivieren (DDR als Eingang also &amp;quot;0&amp;quot;, PORT auf &amp;quot;1&amp;quot;).&lt;br /&gt;
Symptome: Aufgrund des Prellens bekommt man bei einem Tastendruck statt eines Signals mehrere,&lt;br /&gt;
und beim fehlenden Pullup fängt man sich Störungen (z. B. das 50 Hz-Netzbrummen) ein, da der Pin nicht auf einem &amp;quot;definierten Pegel&amp;quot; liegt, wenn der Taster nicht geschlossen ist. Soll&lt;br /&gt;
z. B. bei einem Tastendruck eine LED angehen, dann leuchtet die LED durch das &lt;br /&gt;
Netzbrummen plötzlich mit 50 Hz anstatt aus zu sein.&lt;br /&gt;
Will man einen Taster &#039;&#039;active-high&#039;&#039; betreiben, soll also bei Tastendruck eine &amp;quot;1&amp;quot; in PIN gelesen werden, ist ein externer Pull-Down-Widerstand (typ. 10 kOhm) gegen GND anzuschließen, denn interne Pull-Downs sind nicht verfügbar.&lt;br /&gt;
&lt;br /&gt;
* active low: ein Anschluss des Tasters an den Port-Pin, den anderen Taster-Anschluss an GND; internen Pull-Up-Widerstand aktivieren oder externen Widerstand zwischen Port-Pin und VCC.&lt;br /&gt;
* active high: Taster zwischen Port-Pin und VCC; externen Widerstand zwischen Port-Pin und GND.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausgänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Man sollte darauf achten, das &amp;quot;kritische&amp;quot; Ausgänge, d. h. Ausgänge, über die nicht &amp;quot;nur&amp;quot; eine LED geschaltet wird, einen definierten Zustand haben, wenn der Portpin auf &amp;quot;Eingang&amp;quot; und damit hochohmig geschaltet ist. Dadurch wird sichergestellt, dass beim Einschalten nicht kurz ein Verbraucher geschaltet wird (z. B. &amp;quot;Zucken&amp;quot; eines Motors). Dies kann man bewerkstelligen, indem man extern Widerstände (auch hier Pull-Up bzw. Pull-Down genannt, typ. 10 kOhm) an den Ausgangs-Pins vorsieht, die den Ausgang auf den gewünschten Zustand ziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ATMega64 / ATMega128&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der ATMega64 und der ATMega128 haben zwei besondere Fallstricke, über die man bei nicht ausreichendem Datenblattstudium leicht stolpert. &lt;br /&gt;
&lt;br /&gt;
* Der erste betrifft den Anschluß der ISP-Signale (MISO, MOSI, SCK, RESET). Dieser erfolgt nicht wie bei den meisten anderen AVR-Controllern an den gleichnamigen Pins, sondern an PDI, PDO, SCK und RESET. Die Pinzuordnung ist:  MOSI-&amp;gt;PE0 (Pin 2), MISO-&amp;gt;PE1 (Pin 3), SCK-&amp;gt;PB1 (Pin 11) und RESET-&amp;gt;RESET (Pin 20). PEN (Pin 1) hat für normale ISP-Adapter keine Bedeutung und kann offen gelassen oder direkt mit Vcc verbunden werden.&lt;br /&gt;
&lt;br /&gt;
* Die zweite kleine Gemeinheit betrifft die &amp;quot;M103C&amp;quot;-Fuse. Diese ist bei fabrikneuen ATMega64 / 128 gesetzt und sorgt dafür, dass sich dieser wie ein ATMega103 verhält. Andererseits hat dies zur Folge, dass ein für den ATMega64 / 128 geschriebenes Programm beim ersten &amp;quot;ret&amp;quot; abstürzt, da der SRAM an einer anderen Stelle liegt als erwartet und somit der Prozessor keine gültige Rücksprungadresse vom Stack holen kann. Außerdem funktionieren einige IO-Pins nicht korrekt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Interruptvektoren definiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die [[Interrupt]]vektoren sollten alle definiert werden, auch wenn sie nicht verwendet werden. Passiert es dann aufgrund eines Fehlers, daß ein Interrupt unbeabsichtigt ausgeführt wird, so führt der Controller dann eine definierte Aktion aus. Benutzt man eine Hochsprache wie C oder Basic, nimmt einem der Compiler diese Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Bemerkung: Es gibt keine unbeabsichtigten Interrupts, sondern höchstens Programmfehler. Wer [[sei]] nicht braucht, braucht auch keine Interrupttabelle.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Konfigurationsregister korrekt initialisiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle benötigten Konfigurations[[register]] (auch &amp;quot;I/O-Register&amp;quot; genannt) eines Mikrocontrollers müssen korrekt initialisiert werden. Bei Fehlfunktionen sollten diese Konfigurationen noch einmal mit dem Datenblatt abgeglichen werden. &lt;br /&gt;
Manchmal ist es auch sinnvoll, bestimmte Funktionen explizit abzuwählen. Ein Beispiel hierfür ist der [[Analog-Komparator]] des AVR: Schaltet man diesen ab, wenn man ihn nicht benötigt, kann man dadurch ein wenig Strom sparen. &lt;br /&gt;
Wenn man besonders &amp;quot;sauber&amp;quot; programmieren möchte, initialisiert man Konfigurationsregister immer, d. h. auch wenn sie nicht im Programm verwendet werden. Dies verhindert mögliche zufällige Fehlkonfigurationen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stackpointer initialisiert? (Nur in Assembler relevant)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Fehlerbeschreibung: Das Programm lief, bis ein &amp;quot;rcall&amp;quot; oder ein Interrupt eingefügt wurde. Danach ging plötzlich garnichts mehr.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der [[Stack]] ist ein spezieller Bereich im RAM, der von Sprungbefehlen und [[Interrupt]]aufrufen dazu verwendet wird, die Rücksprungadresse ins Hauptprogramm zu speichern.  Da der Stack bei den AVRs nach &amp;quot;unten&amp;quot; wächst, d. h. in Richtung Anfang des RAMs, wird er üblicherweise ans Ende des RAMs gelegt. Der Stack muss vor der ersten Benutzung, am besten direkt am Anfang des Programms, initialisiert werden (sonst ist nach einem Sprung in ein Unterprogramm die Rücksprungadresse undefiniert und das Programm wird an einer unvorhersehbaren Stelle weiter ausgeführt, was in der Regel einen Absturz zur Folge hat). &amp;quot;Den Stack initialisieren&amp;quot; bedeutet, den Stackpointer auf den gewünschten &amp;quot;Startwert&amp;quot; zu setzen.  Meistens wird dafür die letzte RAM-Adresse gewählt. &lt;br /&gt;
&lt;br /&gt;
Die Initialisierung unterscheidet sich geringfügig je nach verwendetem AVR. Bei den alten AT90xxxx und den ATTinys ist sie mit zwei Zeilen erledigt:&lt;br /&gt;
&lt;br /&gt;
       ldi r16, RAMEND   ;Die Adresse der letzten Stelle im RAM in r16 laden&lt;br /&gt;
       out SPL, r16      ;Die Adresse in das Register SPL ausgeben&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Da die ATMegas mehr RAM haben, reicht das 8 bit-Register SPL nicht mehr, und es ist ein zweites (SPH) dazugekommen.  Die Initialisierung des Stacks erfordert hier vier Zeilen:&lt;br /&gt;
&lt;br /&gt;
       ldi r16, LOW(RAMEND)    ;Untere 8 bit des 16 bit-Wertes RAMEND laden&lt;br /&gt;
       out SPL, r16&lt;br /&gt;
       ldi r16, HIGH(RAMEND)   ;Obere 8 bit laden&lt;br /&gt;
       out SPH, r16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16bit-Register in richtiger Reihenfolge geladen/gelesen? (Nur in Assembler relevant)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei den 16-bit Registern (z.B. Timer1) genau die Hinweise im Kapitel &amp;quot;Accessing 16-bit Registers&amp;quot; beachten!&lt;br /&gt;
&lt;br /&gt;
So muß z.B. das High-Byte VOR dem Low-Byte geschrieben werden, weil mit dem Schreiben des Low Byte das gesamte Register &amp;quot;übernommen&amp;quot; wird.&lt;br /&gt;
Beim Lesen muß zuerst das Low-Byte gelesen werden, dann das High-Byte.&lt;br /&gt;
Es wird dadurch garantiert, dass sich zwischen den beiden einzelnen Befehlen nicht noch das Register weiter verändert, z.B. beim 16bit Counter.&lt;br /&gt;
Möglich wird das durch ein &amp;quot;temporary Register&amp;quot;, von dem es aber nur eines gibt - was beachtet werden muß, da zwischen diesen beiden einzelnen Lese-/Schreib-Befehlen kein Interrupt passieren darf, der selber das temporary Rgegister benutzt.&lt;br /&gt;
&lt;br /&gt;
In C oder Basic kümmert sich der Compiler um das Problem - man liest oder beschreibt dann einfach z.B. TCNT1 anstatt TCNT1H und TCNT1L einzeln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Flag richtig gelöscht?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein beliebter Fehler ist, dass man überliest, dass gesetzte Flags (z.B. die Interrupt-Flags) durch beschreiben mit einer &#039;1&#039; und nicht mit einer &#039;0&#039; gelöscht werden! &lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
* das Flag ist zuerst &#039;0&#039;&lt;br /&gt;
* das Ereignis (z.B. Zählerüberlauf, also Bit TOV0 in TIFR) tritt auf und setzt das jeweilige Bit im Register auf &#039;1&#039;&lt;br /&gt;
* wir haben auf die &#039;1&#039; gewartet und wollen das Bit nun wieder löschen und müssen dafür eine &#039;1&#039; (eins!) in das Register schreiben, KEINE &#039;0&#039;. Trotzdem wird das Bit dadurch &#039;0&#039; z.B.:&lt;br /&gt;
            TIFR = (1&amp;lt;&amp;lt;TOV0)&lt;br /&gt;
&lt;br /&gt;
Das ganze ist kein Fehler, sondern hat seine guten Gründe.&lt;br /&gt;
&lt;br /&gt;
Wenn Interrupts zugelassen sind (z.B. in TIMSK) und die Interruptroutine aufgerufen wird, werden diese Flags zumeist automatisch gelöscht.&lt;br /&gt;
&lt;br /&gt;
Der UART-Empfangs-Interrupt (RXC in UCSRA) jedoch nicht! Der wird gelöscht durch Auslesen des Empfangsregisters (UDR). Hier liegt wiederum ein beliebter Stolperstein: man prüft oft zuerst in der Interruptroutine die Fehlerflags (z.B. Parity) und macht dann manchmal den Fehler das empfangene Zeichen im Fehlerfall nicht auszulesen. Das führt dann zum Absturz (der IRQ wird immer wieder aufgerufen) - man muß also immer das UDR lesen auch wenn etwas Fehlerhaftes drinsteht!&lt;br /&gt;
&lt;br /&gt;
Zusätzlich ist zu beachten, dass in C die Interrupt-Flags NICHT mit einer veroderung des Registers (z.B. TIFR |= (1 &amp;lt;&amp;lt; TOV0)) gelöscht werden sollten, da bei dieser Operation alle anderen evtl. gesetzten Flags im betreffenden Register ebenfalls gelöscht werden. Es ist die Schreibweise von oben zu benutzen (also TIFR = (1 &amp;lt;&amp;lt; TOV0))!&lt;br /&gt;
&lt;br /&gt;
== Serielle Verbindungen ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;[[I2C]]: &#039;&#039;  Sind die Leitungen SCL und SDA mit einem Pullup-Widerstand ausgestattet ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die I2C-Bus-Leitungen SCL und SDA müssen über einen [[Pullup-Widerstand]] mit einem Wert von 4.7 kOhm bis 10 kOhm mit der Versorgungsspannung (+5 V) verbunden sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;[[UART]]/[[USART]]:&#039;&#039;  Übertragungsprobleme wegen falschem Takt?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* der interne [[Oszillator]] ist nicht [[temperaturstabil]]. Daher kann die Umgebungstemperatur auch den [[USART]]-Takt verändern. Für schnelle serielle Kommunikation sollte man deshalb immer einen Quarz(oszillator) verwenden. Falls doch der interne Oszillator verwendet wird, wurde er für die richtige Frequenz kalibriert?&lt;br /&gt;
&lt;br /&gt;
*  Nicht mit allen Quarzen kann man alle [[Baud]]raten exakt erzeugen; deswegen gibt es Quarze mit so &amp;quot;krummen&amp;quot; [[Frequenz]]en wie 3,6864 MHz. Näheres steht im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
* Geschieht die Konfiguration des U(S)ART automatisch durch die Programmiersprache (z. B. in [[BASCOM]]), dann muß dort der Takt &#039;&#039;genau&#039;&#039; angegeben werden. Setzt man z. B. einen 3,6864 MHz-Quarz ein, darf man dort nicht einfach &amp;quot;4 MHz&amp;quot; angeben, weil dann die Abweichung mit ca. 8 % viel zu hoch wäre. Damit funktioniert die Übertragung nicht mehr.&lt;br /&gt;
&lt;br /&gt;
* Funktioniert die Datenübertragung zum PC nur solange der Programmieradapter eingesteckt ist, deutet dies auf ein Problem mit der Masse hin (z. B. GND-Anschluß am RS232-Stecker nicht belegt oder dergleichen).&lt;br /&gt;
&lt;br /&gt;
* Der Pegelwandler/Inverter (z. B. MAX232/HIN232) muss mit Kondensatoren für die internen Ladungspumpen beschaltet werden. Beim MAX232 sind dies mindestens vier Kondensatoren &amp;gt;= 1 µF (Polung beachten!), beim MAX202 und MAX3232 vier Kondensatoren &amp;gt;= 100 nF. Hinzu kommt der obligatorische Abblockkondensator (100 nF keramisch) zwischen VCC und GND des ICs. Das jeweilige Datenblatt gibt Auskunft über die Beschaltung bei &amp;quot;typischer Anwendung&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* TX/RX vertauscht?&lt;br /&gt;
&lt;br /&gt;
* Wenn ein externer Oszillator oder Quarz angeschlossen ist: Sind die Fuses des Controllers so gesetzt, dass er auch verwendet wird?&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
&lt;br /&gt;
* Sind die Pullup-Widerstände deaktiviert?&lt;br /&gt;
&lt;br /&gt;
== Web-Links ==&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf Application Note AVR042: AVR Hardware Design Considerations]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1619.pdf Application Note AVR040: EMC Design Considerations]&lt;/div&gt;</summary>
		<author><name>141.99.254.253</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=12094</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=12094"/>
		<updated>2006-03-16T12:01:12Z</updated>

		<summary type="html">&lt;p&gt;141.99.254.253: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:AVR]]&lt;br /&gt;
Diese Seite soll als erste Anlaufstelle dienen, wenn der AVR-Mikrocontroller mal wieder nicht so will wie er soll. Es wird versucht, die Standardfehler aufzulisten und zu erklären, was man dagegen tun kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fuses richtig gesetzt?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die AVR-Controller haben &#039;Fuses&#039; (deutsch: &#039;Sicherungen&#039;), die das Verhalten des Prozessors auf grundlegender Ebene beeinflussen. Ein häufiger Fehler ist beispielsweise, dass die falsche Taktquelle gewählt wurde: einige AVRs können mit dem internen Oszillator oder mit einem externen Oszillator oder mit einem Quarz oder mit einem Resonator betrieben werden. Wenn die Einstellung über die Fusebits nicht dazu paßt, bekommt man auf der seriellen Schnittstelle Nonsens, und die Timer oder Zeitschleifen laufen mit der falschen Frequenz (evtl. läuft der Controller auch gar nicht).&lt;br /&gt;
Eine andere Fuse schaltet auf einem Port (z. B. PORTC auf ATMega32) die JTAG-Unterstützung ein bzw. aus. Wenn sie eingeschaltet ist, funktionieren vier Bits dieses Ports nicht wie gewohnt.&lt;br /&gt;
In dem zum STK500 gehörenden Entwicklungstool &#039;AVR Studio&#039; gibt es in der Programmer-Dialogbox einen Tab &#039;Fuses&#039;, der controllerabhängig den Status der Fusebits anzeigt und Änderungen ermöglicht.&lt;br /&gt;
Siehe auch: [[AVR Fuses]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISP-Adapter&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei ISP-Programmieradaptern für den Parallelport kann es zu Inkompatibilitäten mit manchen Ports kommen. Tritt das Problem auch auf, wenn der ISP-Adapter an einem anderen Rechner angeschlossen ist? Funktioniert es vielleicht mit einer anderen Software? Siehe auch: [[AVR In System Programmer]]).&lt;br /&gt;
Serielle Programmer: Programmieren dauert sehr lange, es gibt Fehler - ISP Taktrate richtig eingestellt (&amp;lt;1/4 F_CPU)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spannungsversorgung richtig angeschlossen?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der AVCC-Pin ist der Versorgungsanschluss für den [[AD-Wandler]] und den zugehörigen Port. Er ist nicht an allen AVRs vorhanden; wenn er aber vorhanden ist, so muss er auf jeden Fall angeschlossen sein, auch wenn der AD-Wandler nicht benutzt wird. Wird der AD-Wandler verwendet, sollte zur Verbesserung der Genauigkeit der AVCC-Pin über einen Lowpass-Filter angeschlossen werden (siehe Datenblatt).&lt;br /&gt;
Oft funktioniert die Programmierung des Controllers auch, wenn Vcc oder GND nicht richtig angeschlossen ist. Zur Sicherheit kann man mit einem [[Spannungsmesser]] direkt an den Anschlüssen des AVRs kontrollieren, ob die Verbindungen korrekt sind. Es empfiehlt sich, vor dem Einsetzen bzw. Einlöten des Controllers die Versorgungsanschlüsse nochmals zu prüfen, um sicherzustellen, dass man den IC nicht durch eine zu hohe Spannung aufgrund eines Fehlers in der Versorgung zerstört.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reset-Pin korrekt beschaltet?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Reset-Anschluss am AVR ist &#039;active-low&#039;, d. h. verbindet man den Pin mit GND (Masse), wird ein Reset ausgelöst. Zwar haben AVRs einen internen Pull-Up-Widerstand, der den Reset-Pin gegen VCC &amp;quot;zieht&amp;quot;, dieser ist jedoch sehr hochohmig und reicht unter Umständen nicht aus, um den Reset-Pin sicher &amp;quot;hochzuhalten&amp;quot;. Als Mindestbeschaltung empfiehlt sich dringend, einen externen Pull-Up-Widerstand vorzusehen (typ. 10 kOhm), der den Reset-Pin mit VCC verbindet. Er sollte nicht kleiner als 4,7 kOhm sein, da der Programmieradapter sonst eventuell den Reset-Pin während des Programmiervorgangs nicht sicher auf &amp;quot;low&amp;quot; ziehen kann. Zusätzlich sollte man auch noch einen Kondensator 47 nF oder 100 nF zwischen Reset-Pin und GND anordnen. (Atmel empfiehlt zusätzlich noch eine externe &amp;quot;Clamp-Diode&amp;quot; nach VCC, da für den Reset-Pin keine interne vorhanden ist. Diese Diode bereitet jedoch bei manchen Programmieradaptern Schwierigkeiten). Dieses RC-Glied sorgt dafür, dass beim Einschalten der Versorgungsspannung, für eine definierte Zeitspanne der Prozessor im Reset gehalten wird. Im laufenden Betrieb sorgt der Kondensator dafür, dass der Reseteingang unempfindlich gegenüber Spikes und Glitches wird. Der Kondensator sollte deshalb unmittelbar in Pin-Nähe beim Prozessor untergebracht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abblockkondensator(en) ordnungsgemäß installiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Abblockkondensatoren (&amp;quot;Bunker-Kondensatoren&amp;quot;) dienen dazu, Vorsorgungsspannungseinbrüche, die durch Schaltvorgänge verursacht werden können, zu kompensieren. Diesen Zweck erfüllen sie optimal, wenn folgende Regeln eingehalten werden: 1. Ein Abblockkondensator sollte möglichst dicht am IC sitzen, 2. Jedes IC in einer Schaltung sollte einen Abblockkondensator besitzen, 3. Bei ICs mit mehreren Anschlüssen für VCC und GND sollte jedes VCC-GND-Paar mit einem eigenen Abblockkondensator beschaltet werden  (z. B. AVRs in SMD-Bauform wie dem ATmega16A also mit vier Kondensatoren).  4.  Es sollten keramische Kondensatoren mit einer Kapazität von 100 nF verwendet werden. Größere Kondensatoren wie etwa 10 µF-Elkos sind für diese Aufgabe &amp;lt;i&amp;gt;nicht&amp;lt;/i&amp;gt; geeignet, weil sie &amp;quot;zu langsam&amp;quot; sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quarz angeschlossen?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die neueren AVRs haben einen internen [[Oszillator]], der im Auslieferungszustand über die entsprechenden Fuses eingeschaltet ist. In diesem Fall muss kein externer [[Quarz]] mehr angeschlossen werden. Man kann in den [[AVR Fuses|Fuse-Bits]] aber einstellen, dass man einen externen Taktgenerator (&#039;&#039;ext. Clock&#039;&#039;, z. B. Quarzoszillator) oder externen Quarz (&#039;&#039;ext. Crystal&#039;&#039;) verwenden möchte.&lt;br /&gt;
Dann, oder wenn der AVR keinen internen Takt hat, wird an die entsprechenden Pins des Controllers ein Quarz oder [[Quarzoszillator]] angeschlossen. Im Falle eines Quarzes werden die XTAL-Pins mit den beiden Anschlüssen des Quarzes und jeweils mit einem Kondensator (ca. 22 bis 27 pF) gegen Masse angeschlossen. Im Falle eines Quarzoszillators (Bauteil mit vier &amp;quot;Beinchen&amp;quot;) reicht es aus, den Taktausgang mit dem XTAL1-Pin zu verbinden, und den XTAL2-Pin unbeschaltet zu lassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Ground-Anschlüsse beschaltet?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei AVRs mit mehreren Ground-Anschlüssen müssen alle Anschlüsse beschaltet werden.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/forum/read-1-107259.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Lötstellen in Ordnung?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kalte&amp;quot;, d. h. schlechte Lötstellen erkennt man an ihrer matten Oberfläche. Bei beschädigten Lötstellen erkennt man oft einen Riss, der sich kreisförmig um die Mitte des Lötpunktes herum gebildet hat. Solche Stellen verursachen oft erst bei mechanischer Beanspruchung Probleme. &lt;br /&gt;
Bei kleinen Abständen (SMD-Bauteile) müssen besonders Verbindungen zwischen benachbarten Lötungen kontrolliert werden. &lt;br /&gt;
Bei Lochrasterplatinen kann man mit einem spitzen Messer (Bastelmesser) die Zwischenräume von möglichen leitenden Verbindungen befreien. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eingänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Taster müssen a) entprellt werden ([[Entprellung]]) und b) einen [[Pullup-Widerstand]]&lt;br /&gt;
besitzen, so sie &#039;&#039;active-low&#039;&#039; betrieben werden, d. h. wenn beim Tastendruck der Pin mit GND (Masse) verbunden wird (dies ist die übliche Anschaltung). Man kann einen externen Pull-Up Widerstand (typ. 10 kOhm) benutzen oder den internen aktivieren (DDR als Eingang also &amp;quot;0&amp;quot;, PORT auf &amp;quot;1&amp;quot;).&lt;br /&gt;
Symptome: Aufgrund des Prellens bekommt man bei einem Tastendruck statt eines Signals mehrere,&lt;br /&gt;
und beim fehlenden Pullup fängt man sich Störungen (z. B. das 50 Hz-Netzbrummen) ein, da der Pin nicht auf einem &amp;quot;definierten Pegel&amp;quot; liegt, wenn der Taster nicht geschlossen ist. Soll&lt;br /&gt;
z. B. bei einem Tastendruck eine LED angehen, dann leuchtet die LED durch das &lt;br /&gt;
Netzbrummen plötzlich mit 50 Hz anstatt aus zu sein.&lt;br /&gt;
Will man einen Taster &#039;&#039;active-high&#039;&#039; betreiben, soll also bei Tastendruck eine &amp;quot;1&amp;quot; in PIN gelesen werden, ist ein externer Pull-Down-Widerstand (typ. 10 kOhm) gegen GND anzuschließen, denn interne Pull-Downs sind nicht verfügbar.&lt;br /&gt;
&lt;br /&gt;
* active low: ein Anschluss des Tasters an den Port-Pin, den anderen Taster-Anschluss an GND; internen Pull-Up-Widerstand aktivieren oder externen Widerstand zwischen Port-Pin und VCC.&lt;br /&gt;
* active high: Taster zwischen Port-Pin und VCC; externen Widerstand zwischen Port-Pin und GND.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausgänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Man sollte darauf achten, das &amp;quot;kritische&amp;quot; Ausgänge, d. h. Ausgänge, über die nicht &amp;quot;nur&amp;quot; eine LED geschaltet wird, einen definierten Zustand haben, wenn der Portpin auf &amp;quot;Eingang&amp;quot; und damit hochohmig geschaltet ist. Dadurch wird sichergestellt, dass beim Einschalten nicht kurz ein Verbraucher geschaltet wird (z. B. &amp;quot;Zucken&amp;quot; eines Motors). Dies kann man bewerkstelligen, indem man extern Widerstände (auch hier Pull-Up bzw. Pull-Down genannt, typ. 10 kOhm) an den Ausgangs-Pins vorsieht, die den Ausgang auf den gewünschten Zustand ziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ATMega64 / ATMega128&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der ATMega64 und der ATMega128 haben zwei besondere Fallstricke, über die man bei nicht ausreichendem Datenblattstudium leicht stolpert. &lt;br /&gt;
&lt;br /&gt;
* Der erste betrifft den Anschluß der ISP-Signale (MISO, MOSI, SCK, RESET). Dieser erfolgt nicht wie bei den meisten anderen AVR-Controllern an den gleichnamigen Pins, sondern an PDI, PDO, SCK und RESET. Die Pinzuordnung ist:  MOSI-&amp;gt;PE0 (Pin 2), MISO-&amp;gt;PE1 (Pin 3), SCK-&amp;gt;PB1 (Pin 11) und RESET-&amp;gt;RESET (Pin 20). PEN (Pin 1) hat für normale ISP-Adapter keine Bedeutung und kann offen gelassen oder direkt mit Vcc verbunden werden.&lt;br /&gt;
&lt;br /&gt;
* Die zweite kleine Gemeinheit betrifft die &amp;quot;M103C&amp;quot;-Fuse. Diese ist bei fabrikneuen ATMega64 / 128 gesetzt und sorgt dafür, dass sich dieser wie ein ATMega103 verhält. Andererseits hat dies zur Folge, dass ein für den ATMega64 / 128 geschriebenes Programm beim ersten &amp;quot;ret&amp;quot; abstürzt, da der SRAM an einer anderen Stelle liegt als erwartet und somit der Prozessor keine gültige Rücksprungadresse vom Stack holen kann. Außerdem funktionieren einige IO-Pins nicht korrekt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Interruptvektoren definiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die [[Interrupt]]vektoren sollten alle definiert werden, auch wenn sie nicht verwendet werden. Passiert es dann aufgrund eines Fehlers, daß ein Interrupt unbeabsichtigt ausgeführt wird, so führt der Controller dann eine definierte Aktion aus. Benutzt man eine Hochsprache wie C oder Basic, nimmt einem der Compiler diese Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Bemerkung: Es gibt keine unbeabsichtigten Interrupts, sondern höchstens Programmfehler. Wer [[sei]] nicht braucht, braucht auch keine Interrupttabelle.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Konfigurationsregister korrekt initialisiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle benötigten Konfigurations[[register]] (auch &amp;quot;I/O-Register&amp;quot; genannt) eines Mikrocontrollers müssen korrekt initialisiert werden. Bei Fehlfunktionen sollten diese Konfigurationen noch einmal mit dem Datenblatt abgeglichen werden. &lt;br /&gt;
Manchmal ist es auch sinnvoll, bestimmte Funktionen explizit abzuwählen. Ein Beispiel hierfür ist der [[Analog-Komparator]] des AVR: Schaltet man diesen ab, wenn man ihn nicht benötigt, kann man dadurch ein wenig Strom sparen. &lt;br /&gt;
Wenn man besonders &amp;quot;sauber&amp;quot; programmieren möchte, initialisiert man Konfigurationsregister immer, d. h. auch wenn sie nicht im Programm verwendet werden. Dies verhindert mögliche zufällige Fehlkonfigurationen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stackpointer initialisiert? (Nur in Assembler relevant)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Fehlerbeschreibung: Das Programm lief, bis ein &amp;quot;rcall&amp;quot; oder ein Interrupt eingefügt wurde. Danach ging plötzlich garnichts mehr.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der [[Stack]] ist ein spezieller Bereich im RAM, der von Sprungbefehlen und [[Interrupt]]aufrufen dazu verwendet wird, die Rücksprungadresse ins Hauptprogramm zu speichern.  Da der Stack bei den AVRs nach &amp;quot;unten&amp;quot; wächst, d. h. in Richtung Anfang des RAMs, wird er üblicherweise ans Ende des RAMs gelegt. Der Stack muss vor der ersten Benutzung, am besten direkt am Anfang des Programms, initialisiert werden (sonst ist nach einem Sprung in ein Unterprogramm die Rücksprungadresse undefiniert und das Programm wird an einer unvorhersehbaren Stelle weiter ausgeführt, was in der Regel einen Absturz zur Folge hat). &amp;quot;Den Stack initialisieren&amp;quot; bedeutet, den Stackpointer auf den gewünschten &amp;quot;Startwert&amp;quot; zu setzen.  Meistens wird dafür die letzte RAM-Adresse gewählt. &lt;br /&gt;
&lt;br /&gt;
Die Initialisierung unterscheidet sich geringfügig je nach verwendetem AVR. Bei den alten AT90xxxx und den ATTinys ist sie mit zwei Zeilen erledigt:&lt;br /&gt;
&lt;br /&gt;
       ldi r16, RAMEND   ;Die Adresse der letzten Stelle im RAM in r16 laden&lt;br /&gt;
       out SPL, r16      ;Die Adresse in das Register SPL ausgeben&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Da die ATMegas mehr RAM haben, reicht das 8 bit-Register SPL nicht mehr, und es ist ein zweites (SPH) dazugekommen.  Die Initialisierung des Stacks erfordert hier vier Zeilen:&lt;br /&gt;
&lt;br /&gt;
       ldi r16, LOW(RAMEND)    ;Untere 8 bit des 16 bit-Wertes RAMEND laden&lt;br /&gt;
       out SPL, r16&lt;br /&gt;
       ldi r16, HIGH(RAMEND)   ;Obere 8 bit laden&lt;br /&gt;
       out SPH, r16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16bit-Register in richtiger Reihenfolge geladen/gelesen? (Nur in Assembler relevant)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei den 16-bit Registern (z.B. Timer1) genau die Hinweise im Kapitel &amp;quot;Accessing 16-bit Registers&amp;quot; beachten!&lt;br /&gt;
&lt;br /&gt;
So muß z.B. das High-Byte VOR dem Low-Byte geschrieben werden, weil mit dem Schreiben des Low Byte das gesamte Register &amp;quot;übernommen&amp;quot; wird.&lt;br /&gt;
Beim Lesen muß zuerst das Low-Byte gelesen werden, dann das High-Byte.&lt;br /&gt;
Es wird dadurch garantiert, dass sich zwischen den beiden einzelnen Befehlen nicht noch das Register weiter verändert, z.B. beim 16bit Counter.&lt;br /&gt;
Möglich wird das durch ein &amp;quot;temporary Register&amp;quot;, von dem es aber nur eines gibt - was beachtet werden muß, da zwischen diesen beiden einzelnen Lese-/Schreib-Befehlen kein Interrupt passieren darf, der selber das temporary Rgegister benutzt.&lt;br /&gt;
&lt;br /&gt;
In C oder Basic kümmert sich der Compiler um das Problem - man liest oder beschreibt dann einfach z.B. TCNT1 anstatt TCNT1H und TCNT1L einzeln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Flag richtig gelöscht?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein beliebter Fehler ist, dass man überliest, dass gesetzte Flags (z.B. die Interrupt-Flags) durch beschreiben mit einer &#039;1&#039; und nicht mit einer &#039;0&#039; gelöscht werden! &lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
* das Flag ist zuerst &#039;0&#039;&lt;br /&gt;
* das Ereignis (z.B. Zählerüberlauf, also Bit TOV0 in TIFR) tritt auf und setzt das jeweilige Bit im Register auf &#039;1&#039;&lt;br /&gt;
* wir haben auf die &#039;1&#039; gewartet und wollen das Bit nun wieder löschen und müssen dafür eine &#039;1&#039; (eins!) in das Register schreiben, KEINE &#039;0&#039;. Trotzdem wird das Bit dadurch &#039;0&#039; z.B.:&lt;br /&gt;
            TIFR = (1&amp;lt;&amp;lt;TOV0)&lt;br /&gt;
&lt;br /&gt;
Das ganze ist übrigends kein Fehler, sondern hat seine guten Gründe.&lt;br /&gt;
&lt;br /&gt;
Wenn Interrupts zugelassen sind (z.B. in TIMSK) und die Interruptroutine aufgerufen wird, werden diese Flags zumeist automatisch gelöscht.&lt;br /&gt;
&lt;br /&gt;
Der UART-Empfangs-Interrupt (RXC in UCSRA) jedoch nicht! Der wird gelöscht durch Auslesen des Empfangsregisters (UDR). Hier liegt wiederum ein beliebter Stolperstein: man prüft oft zuerst in der Interruptroutine die Fehlerflags (z.B. Parity) und macht dann manchmal den Fehler das empfangene Zeichen im Fehlerfall nicht auszulesen. Das führt dann zum Absturz (der IRQ wird immer wieder aufgerufen) - man muß also immer das UDR lesen auch wenn etwas Fehlerhaftes drinsteht!&lt;br /&gt;
&lt;br /&gt;
== Serielle Verbindungen ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;[[I2C]]: &#039;&#039;  Sind die Leitungen SCL und SDA mit einem Pullup-Widerstand ausgestattet ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die I2C-Bus-Leitungen SCL und SDA müssen über einen [[Pullup-Widerstand]] mit einem Wert von 4.7 kOhm bis 10 kOhm mit der Versorgungsspannung (+5 V) verbunden sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;[[UART]]/[[USART]]:&#039;&#039;  Übertragungsprobleme wegen falschem Takt?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* der interne [[Oszillator]] ist nicht [[temperaturstabil]]. Daher kann die Umgebungstemperatur auch den [[USART]]-Takt verändern. Für schnelle serielle Kommunikation sollte man deshalb immer einen Quarz(oszillator) verwenden. Falls doch der interne Oszillator verwendet wird, wurde er für die richtige Frequenz kalibriert?&lt;br /&gt;
&lt;br /&gt;
*  Nicht mit allen Quarzen kann man alle [[Baud]]raten exakt erzeugen; deswegen gibt es Quarze mit so &amp;quot;krummen&amp;quot; [[Frequenz]]en wie 3,6864 MHz. Näheres steht im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
* Geschieht die Konfiguration des U(S)ART automatisch durch die Programmiersprache (z. B. in [[BASCOM]]), dann muß dort der Takt &#039;&#039;genau&#039;&#039; angegeben werden. Setzt man z. B. einen 3,6864 MHz-Quarz ein, darf man dort nicht einfach &amp;quot;4 MHz&amp;quot; angeben, weil dann die Abweichung mit ca. 8 % viel zu hoch wäre. Damit funktioniert die Übertragung nicht mehr.&lt;br /&gt;
&lt;br /&gt;
* Funktioniert die Datenübertragung zum PC nur solange der Programmieradapter eingesteckt ist, deutet dies auf ein Problem mit der Masse hin (z. B. GND-Anschluß am RS232-Stecker nicht belegt oder dergleichen).&lt;br /&gt;
&lt;br /&gt;
* Der Pegelwandler/Inverter (z. B. MAX232/HIN232) muss mit Kondensatoren für die internen Ladungspumpen beschaltet werden. Beim MAX232 sind dies mindestens vier Kondensatoren &amp;gt;= 1 µF (Polung beachten!), beim MAX202 und MAX3232 vier Kondensatoren &amp;gt;= 100 nF. Hinzu kommt der obligatorische Abblockkondensator (100 nF keramisch) zwischen VCC und GND des ICs. Das jeweilige Datenblatt gibt Auskunft über die Beschaltung bei &amp;quot;typischer Anwendung&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* TX/RX vertauscht?&lt;br /&gt;
&lt;br /&gt;
* Wenn ein externer Oszillator oder Quarz angeschlossen ist: Sind die Fuses des Controllers so gesetzt, dass er auch verwendet wird?&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
&lt;br /&gt;
* Sind die Pullup-Widerstände deaktiviert?&lt;br /&gt;
&lt;br /&gt;
== Web-Links ==&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf Application Note AVR042: AVR Hardware Design Considerations]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1619.pdf Application Note AVR040: EMC Design Considerations]&lt;/div&gt;</summary>
		<author><name>141.99.254.253</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=12062</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=12062"/>
		<updated>2006-03-16T11:59:16Z</updated>

		<summary type="html">&lt;p&gt;141.99.254.253: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:AVR]]&lt;br /&gt;
Diese Seite soll als erste Anlaufstelle dienen, wenn der AVR-Mikrocontroller mal wieder nicht so will wie er soll. Es wird versucht, die Standardfehler aufzulisten und zu erklären, was man dagegen tun kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fuses richtig gesetzt?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die AVR-Controller haben &#039;Fuses&#039; (deutsch: &#039;Sicherungen&#039;), die das Verhalten des Prozessors auf grundlegender Ebene beeinflussen. Ein häufiger Fehler ist beispielsweise, dass die falsche Taktquelle gewählt wurde: einige AVRs können mit dem internen Oszillator oder mit einem externen Oszillator oder mit einem Quarz oder mit einem Resonator betrieben werden. Wenn die Einstellung über die Fusebits nicht dazu paßt, bekommt man auf der seriellen Schnittstelle Nonsens, und die Timer oder Zeitschleifen laufen mit der falschen Frequenz (evtl. läuft der Controller auch gar nicht).&lt;br /&gt;
Eine andere Fuse schaltet auf einem Port (z. B. PORTC auf ATMega32) die JTAG-Unterstützung ein bzw. aus. Wenn sie eingeschaltet ist, funktionieren vier Bits dieses Ports nicht wie gewohnt.&lt;br /&gt;
In dem zum STK500 gehörenden Entwicklungstool &#039;AVR Studio&#039; gibt es in der Programmer-Dialogbox einen Tab &#039;Fuses&#039;, der controllerabhängig den Status der Fusebits anzeigt und Änderungen ermöglicht.&lt;br /&gt;
Siehe auch: [[AVR Fuses]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISP-Adapter&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei ISP-Programmieradaptern für den Parallelport kann es zu Inkompatibilitäten mit manchen Ports kommen. Tritt das Problem auch auf, wenn der ISP-Adapter an einem anderen Rechner angeschlossen ist? Funktioniert es vielleicht mit einer anderen Software? Siehe auch: [[AVR In System Programmer]]).&lt;br /&gt;
Serielle Programmer: Programmieren dauert sehr lange, es gibt Fehler - ISP Taktrate richtig eingestellt (&amp;lt;1/4 F_CPU)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spannungsversorgung richtig angeschlossen?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der AVCC-Pin ist der Versorgungsanschluss für den [[AD-Wandler]] und den zugehörigen Port. Er ist nicht an allen AVRs vorhanden; wenn er aber vorhanden ist, so muss er auf jeden Fall angeschlossen sein, auch wenn der AD-Wandler nicht benutzt wird. Wird der AD-Wandler verwendet, sollte zur Verbesserung der Genauigkeit der AVCC-Pin über einen Lowpass-Filter angeschlossen werden (siehe Datenblatt).&lt;br /&gt;
Oft funktioniert die Programmierung des Controllers auch, wenn Vcc oder GND nicht richtig angeschlossen ist. Zur Sicherheit kann man mit einem [[Spannungsmesser]] direkt an den Anschlüssen des AVRs kontrollieren, ob die Verbindungen korrekt sind. Es empfiehlt sich, vor dem Einsetzen bzw. Einlöten des Controllers die Versorgungsanschlüsse nochmals zu prüfen, um sicherzustellen, dass man den IC nicht durch eine zu hohe Spannung aufgrund eines Fehlers in der Versorgung zerstört.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reset-Pin korrekt beschaltet?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Reset-Anschluss am AVR ist &#039;active-low&#039;, d. h. verbindet man den Pin mit GND (Masse), wird ein Reset ausgelöst. Zwar haben AVRs einen internen Pull-Up-Widerstand, der den Reset-Pin gegen VCC &amp;quot;zieht&amp;quot;, dieser ist jedoch sehr hochohmig und reicht unter Umständen nicht aus, um den Reset-Pin sicher &amp;quot;hochzuhalten&amp;quot;. Als Mindestbeschaltung empfiehlt sich dringend, einen externen Pull-Up-Widerstand vorzusehen (typ. 10 kOhm), der den Reset-Pin mit VCC verbindet. Er sollte nicht kleiner als 4,7 kOhm sein, da der Programmieradapter sonst eventuell den Reset-Pin während des Programmiervorgangs nicht sicher auf &amp;quot;low&amp;quot; ziehen kann. Zusätzlich sollte man auch noch einen Kondensator 47 nF oder 100 nF zwischen Reset-Pin und GND anordnen. (Atmel empfiehlt zusätzlich noch eine externe &amp;quot;Clamp-Diode&amp;quot; nach VCC, da für den Reset-Pin keine interne vorhanden ist. Diese Diode bereitet jedoch bei manchen Programmieradaptern Schwierigkeiten). Dieses RC-Glied sorgt dafür, dass beim Einschalten der Versorgungsspannung, für eine definierte Zeitspanne der Prozessor im Reset gehalten wird. Im laufenden Betrieb sorgt der Kondensator dafür, dass der Reseteingang unempfindlich gegenüber Spikes und Glitches wird. Der Kondensator sollte deshalb unmittelbar in Pin-Nähe beim Prozessor untergebracht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abblockkondensator(en) ordnungsgemäß installiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Abblockkondensatoren (&amp;quot;Bunker-Kondensatoren&amp;quot;) dienen dazu, Vorsorgungsspannungseinbrüche, die durch Schaltvorgänge verursacht werden können, zu kompensieren. Diesen Zweck erfüllen sie optimal, wenn folgende Regeln eingehalten werden: 1. Ein Abblockkondensator sollte möglichst dicht am IC sitzen, 2. Jedes IC in einer Schaltung sollte einen Abblockkondensator besitzen, 3. Bei ICs mit mehreren Anschlüssen für VCC und GND sollte jedes VCC-GND-Paar mit einem eigenen Abblockkondensator beschaltet werden  (z. B. AVRs in SMD-Bauform wie dem ATmega16A also mit vier Kondensatoren).  4.  Es sollten keramische Kondensatoren mit einer Kapazität von 100 nF verwendet werden. Größere Kondensatoren wie etwa 10 µF-Elkos sind für diese Aufgabe &amp;lt;i&amp;gt;nicht&amp;lt;/i&amp;gt; geeignet, weil sie &amp;quot;zu langsam&amp;quot; sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quarz angeschlossen?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die neueren AVRs haben einen internen [[Oszillator]], der im Auslieferungszustand über die entsprechenden Fuses eingeschaltet ist. In diesem Fall muss kein externer [[Quarz]] mehr angeschlossen werden. Man kann in den [[AVR Fuses|Fuse-Bits]] aber einstellen, dass man einen externen Taktgenerator (&#039;&#039;ext. Clock&#039;&#039;, z. B. Quarzoszillator) oder externen Quarz (&#039;&#039;ext. Crystal&#039;&#039;) verwenden möchte.&lt;br /&gt;
Dann, oder wenn der AVR keinen internen Takt hat, wird an die entsprechenden Pins des Controllers ein Quarz oder [[Quarzoszillator]] angeschlossen. Im Falle eines Quarzes werden die XTAL-Pins mit den beiden Anschlüssen des Quarzes und jeweils mit einem Kondensator (ca. 22 bis 27 pF) gegen Masse angeschlossen. Im Falle eines Quarzoszillators (Bauteil mit vier &amp;quot;Beinchen&amp;quot;) reicht es aus, den Taktausgang mit dem XTAL1-Pin zu verbinden, und den XTAL2-Pin unbeschaltet zu lassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Ground-Anschlüsse beschaltet?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei AVRs mit mehreren Ground-Anschlüssen müssen alle Anschlüsse beschaltet werden.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/forum/read-1-107259.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Lötstellen in Ordnung?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kalte&amp;quot;, d. h. schlechte Lötstellen erkennt man an ihrer matten Oberfläche. Bei beschädigten Lötstellen erkennt man oft einen Riss, der sich kreisförmig um die Mitte des Lötpunktes herum gebildet hat. Solche Stellen verursachen oft erst bei mechanischer Beanspruchung Probleme. &lt;br /&gt;
Bei kleinen Abständen (SMD-Bauteile) müssen besonders Verbindungen zwischen benachbarten Lötungen kontrolliert werden. &lt;br /&gt;
Bei Lochrasterplatinen kann man mit einem spitzen Messer (Bastelmesser) die Zwischenräume von möglichen leitenden Verbindungen befreien. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eingänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Taster müssen a) entprellt werden ([[Entprellung]]) und b) einen [[Pullup-Widerstand]]&lt;br /&gt;
besitzen, so sie &#039;&#039;active-low&#039;&#039; betrieben werden, d. h. wenn beim Tastendruck der Pin mit GND (Masse) verbunden wird (dies ist die übliche Anschaltung). Man kann einen externen Pull-Up Widerstand (typ. 10 kOhm) benutzen oder den internen aktivieren (DDR als Eingang also &amp;quot;0&amp;quot;, PORT auf &amp;quot;1&amp;quot;).&lt;br /&gt;
Symptome: Aufgrund des Prellens bekommt man bei einem Tastendruck statt eines Signals mehrere,&lt;br /&gt;
und beim fehlenden Pullup fängt man sich Störungen (z. B. das 50 Hz-Netzbrummen) ein, da der Pin nicht auf einem &amp;quot;definierten Pegel&amp;quot; liegt, wenn der Taster nicht geschlossen ist. Soll&lt;br /&gt;
z. B. bei einem Tastendruck eine LED angehen, dann leuchtet die LED durch das &lt;br /&gt;
Netzbrummen plötzlich mit 50 Hz anstatt aus zu sein.&lt;br /&gt;
Will man einen Taster &#039;&#039;active-high&#039;&#039; betreiben, soll also bei Tastendruck eine &amp;quot;1&amp;quot; in PIN gelesen werden, ist ein externer Pull-Down-Widerstand (typ. 10 kOhm) gegen GND anzuschließen, denn interne Pull-Downs sind nicht verfügbar.&lt;br /&gt;
&lt;br /&gt;
* active low: ein Anschluss des Tasters an den Port-Pin, den anderen Taster-Anschluss an GND; internen Pull-Up-Widerstand aktivieren oder externen Widerstand zwischen Port-Pin und VCC.&lt;br /&gt;
* active high: Taster zwischen Port-Pin und VCC; externen Widerstand zwischen Port-Pin und GND.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausgänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Man sollte darauf achten, das &amp;quot;kritische&amp;quot; Ausgänge, d. h. Ausgänge, über die nicht &amp;quot;nur&amp;quot; eine LED geschaltet wird, einen definierten Zustand haben, wenn der Portpin auf &amp;quot;Eingang&amp;quot; und damit hochohmig geschaltet ist. Dadurch wird sichergestellt, dass beim Einschalten nicht kurz ein Verbraucher geschaltet wird (z. B. &amp;quot;Zucken&amp;quot; eines Motors). Dies kann man bewerkstelligen, indem man extern Widerstände (auch hier Pull-Up bzw. Pull-Down genannt, typ. 10 kOhm) an den Ausgangs-Pins vorsieht, die den Ausgang auf den gewünschten Zustand ziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ATMega64 / ATMega128&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der ATMega64 und der ATMega128 haben zwei besondere Fallstricke, über die man bei nicht ausreichendem Datenblattstudium leicht stolpert. &lt;br /&gt;
&lt;br /&gt;
* Der erste betrifft den Anschluß der ISP-Signale (MISO, MOSI, SCK, RESET). Dieser erfolgt nicht wie bei den meisten anderen AVR-Controllern an den gleichnamigen Pins, sondern an PDI, PDO, SCK und RESET. Die Pinzuordnung ist:  MOSI-&amp;gt;PE0 (Pin 2), MISO-&amp;gt;PE1 (Pin 3), SCK-&amp;gt;PB1 (Pin 11) und RESET-&amp;gt;RESET (Pin 20). PEN (Pin 1) hat für normale ISP-Adapter keine Bedeutung und kann offen gelassen oder direkt mit Vcc verbunden werden.&lt;br /&gt;
&lt;br /&gt;
* Die zweite kleine Gemeinheit betrifft die &amp;quot;M103C&amp;quot;-Fuse. Diese ist bei fabrikneuen ATMega128 gesetzt und sorgt dafür, dass sich dieser wie ein ATMega103 verhält. Andererseits hat dies zur Folge, dass ein für den ATMega128 geschriebenes Programm beim ersten &amp;quot;ret&amp;quot; abstürzt, da der SRAM an einer anderen Stelle liegt als erwartet und somit der Prozessor keine gültige Rücksprungadresse vom Stack holen kann. Außerdem funktionieren einige IO-Pins nicht korrekt.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Interruptvektoren definiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die [[Interrupt]]vektoren sollten alle definiert werden, auch wenn sie nicht verwendet werden. Passiert es dann aufgrund eines Fehlers, daß ein Interrupt unbeabsichtigt ausgeführt wird, so führt der Controller dann eine definierte Aktion aus. Benutzt man eine Hochsprache wie C oder Basic, nimmt einem der Compiler diese Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Bemerkung: Es gibt keine unbeabsichtigten Interrupts, sondern höchstens Programmfehler. Wer [[sei]] nicht braucht, braucht auch keine Interrupttabelle.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Konfigurationsregister korrekt initialisiert?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle benötigten Konfigurations[[register]] (auch &amp;quot;I/O-Register&amp;quot; genannt) eines Mikrocontrollers müssen korrekt initialisiert werden. Bei Fehlfunktionen sollten diese Konfigurationen noch einmal mit dem Datenblatt abgeglichen werden. &lt;br /&gt;
Manchmal ist es auch sinnvoll, bestimmte Funktionen explizit abzuwählen. Ein Beispiel hierfür ist der [[Analog-Komparator]] des AVR: Schaltet man diesen ab, wenn man ihn nicht benötigt, kann man dadurch ein wenig Strom sparen. &lt;br /&gt;
Wenn man besonders &amp;quot;sauber&amp;quot; programmieren möchte, initialisiert man Konfigurationsregister immer, d. h. auch wenn sie nicht im Programm verwendet werden. Dies verhindert mögliche zufällige Fehlkonfigurationen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stackpointer initialisiert? (Nur in Assembler relevant)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Fehlerbeschreibung: Das Programm lief, bis ein &amp;quot;rcall&amp;quot; oder ein Interrupt eingefügt wurde. Danach ging plötzlich garnichts mehr.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der [[Stack]] ist ein spezieller Bereich im RAM, der von Sprungbefehlen und [[Interrupt]]aufrufen dazu verwendet wird, die Rücksprungadresse ins Hauptprogramm zu speichern.  Da der Stack bei den AVRs nach &amp;quot;unten&amp;quot; wächst, d. h. in Richtung Anfang des RAMs, wird er üblicherweise ans Ende des RAMs gelegt. Der Stack muss vor der ersten Benutzung, am besten direkt am Anfang des Programms, initialisiert werden (sonst ist nach einem Sprung in ein Unterprogramm die Rücksprungadresse undefiniert und das Programm wird an einer unvorhersehbaren Stelle weiter ausgeführt, was in der Regel einen Absturz zur Folge hat). &amp;quot;Den Stack initialisieren&amp;quot; bedeutet, den Stackpointer auf den gewünschten &amp;quot;Startwert&amp;quot; zu setzen.  Meistens wird dafür die letzte RAM-Adresse gewählt. &lt;br /&gt;
&lt;br /&gt;
Die Initialisierung unterscheidet sich geringfügig je nach verwendetem AVR. Bei den alten AT90xxxx und den ATTinys ist sie mit zwei Zeilen erledigt:&lt;br /&gt;
&lt;br /&gt;
       ldi r16, RAMEND   ;Die Adresse der letzten Stelle im RAM in r16 laden&lt;br /&gt;
       out SPL, r16      ;Die Adresse in das Register SPL ausgeben&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Da die ATMegas mehr RAM haben, reicht das 8 bit-Register SPL nicht mehr, und es ist ein zweites (SPH) dazugekommen.  Die Initialisierung des Stacks erfordert hier vier Zeilen:&lt;br /&gt;
&lt;br /&gt;
       ldi r16, LOW(RAMEND)    ;Untere 8 bit des 16 bit-Wertes RAMEND laden&lt;br /&gt;
       out SPL, r16&lt;br /&gt;
       ldi r16, HIGH(RAMEND)   ;Obere 8 bit laden&lt;br /&gt;
       out SPH, r16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16bit-Register in richtiger Reihenfolge geladen/gelesen? (Nur in Assembler relevant)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei den 16-bit Registern (z.B. Timer1) genau die Hinweise im Kapitel &amp;quot;Accessing 16-bit Registers&amp;quot; beachten!&lt;br /&gt;
&lt;br /&gt;
So muß z.B. das High-Byte VOR dem Low-Byte geschrieben werden, weil mit dem Schreiben des Low Byte das gesamte Register &amp;quot;übernommen&amp;quot; wird.&lt;br /&gt;
Beim Lesen muß zuerst das Low-Byte gelesen werden, dann das High-Byte.&lt;br /&gt;
Es wird dadurch garantiert, dass sich zwischen den beiden einzelnen Befehlen nicht noch das Register weiter verändert, z.B. beim 16bit Counter.&lt;br /&gt;
Möglich wird das durch ein &amp;quot;temporary Register&amp;quot;, von dem es aber nur eines gibt - was beachtet werden muß, da zwischen diesen beiden einzelnen Lese-/Schreib-Befehlen kein Interrupt passieren darf, der selber das temporary Rgegister benutzt.&lt;br /&gt;
&lt;br /&gt;
In C oder Basic kümmert sich der Compiler um das Problem - man liest oder beschreibt dann einfach z.B. TCNT1 anstatt TCNT1H und TCNT1L einzeln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Flag richtig gelöscht?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein beliebter Fehler ist, dass man überliest, dass gesetzte Flags (z.B. die Interrupt-Flags) durch beschreiben mit einer &#039;1&#039; und nicht mit einer &#039;0&#039; gelöscht werden! &lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
* das Flag ist zuerst &#039;0&#039;&lt;br /&gt;
* das Ereignis (z.B. Zählerüberlauf, also Bit TOV0 in TIFR) tritt auf und setzt das jeweilige Bit im Register auf &#039;1&#039;&lt;br /&gt;
* wir haben auf die &#039;1&#039; gewartet und wollen das Bit nun wieder löschen und müssen dafür eine &#039;1&#039; (eins!) in das Register schreiben, KEINE &#039;0&#039;. Trotzdem wird das Bit dadurch &#039;0&#039; z.B.:&lt;br /&gt;
            TIFR = (1&amp;lt;&amp;lt;TOV0)&lt;br /&gt;
&lt;br /&gt;
Das ganze ist übrigends kein Fehler, sondern hat seine guten Gründe.&lt;br /&gt;
&lt;br /&gt;
Wenn Interrupts zugelassen sind (z.B. in TIMSK) und die Interruptroutine aufgerufen wird, werden diese Flags zumeist automatisch gelöscht.&lt;br /&gt;
&lt;br /&gt;
Der UART-Empfangs-Interrupt (RXC in UCSRA) jedoch nicht! Der wird gelöscht durch Auslesen des Empfangsregisters (UDR). Hier liegt wiederum ein beliebter Stolperstein: man prüft oft zuerst in der Interruptroutine die Fehlerflags (z.B. Parity) und macht dann manchmal den Fehler das empfangene Zeichen im Fehlerfall nicht auszulesen. Das führt dann zum Absturz (der IRQ wird immer wieder aufgerufen) - man muß also immer das UDR lesen auch wenn etwas Fehlerhaftes drinsteht!&lt;br /&gt;
&lt;br /&gt;
== Serielle Verbindungen ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;[[I2C]]: &#039;&#039;  Sind die Leitungen SCL und SDA mit einem Pullup-Widerstand ausgestattet ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die I2C-Bus-Leitungen SCL und SDA müssen über einen [[Pullup-Widerstand]] mit einem Wert von 4.7 kOhm bis 10 kOhm mit der Versorgungsspannung (+5 V) verbunden sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;[[UART]]/[[USART]]:&#039;&#039;  Übertragungsprobleme wegen falschem Takt?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* der interne [[Oszillator]] ist nicht [[temperaturstabil]]. Daher kann die Umgebungstemperatur auch den [[USART]]-Takt verändern. Für schnelle serielle Kommunikation sollte man deshalb immer einen Quarz(oszillator) verwenden. Falls doch der interne Oszillator verwendet wird, wurde er für die richtige Frequenz kalibriert?&lt;br /&gt;
&lt;br /&gt;
*  Nicht mit allen Quarzen kann man alle [[Baud]]raten exakt erzeugen; deswegen gibt es Quarze mit so &amp;quot;krummen&amp;quot; [[Frequenz]]en wie 3,6864 MHz. Näheres steht im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
* Geschieht die Konfiguration des U(S)ART automatisch durch die Programmiersprache (z. B. in [[BASCOM]]), dann muß dort der Takt &#039;&#039;genau&#039;&#039; angegeben werden. Setzt man z. B. einen 3,6864 MHz-Quarz ein, darf man dort nicht einfach &amp;quot;4 MHz&amp;quot; angeben, weil dann die Abweichung mit ca. 8 % viel zu hoch wäre. Damit funktioniert die Übertragung nicht mehr.&lt;br /&gt;
&lt;br /&gt;
* Funktioniert die Datenübertragung zum PC nur solange der Programmieradapter eingesteckt ist, deutet dies auf ein Problem mit der Masse hin (z. B. GND-Anschluß am RS232-Stecker nicht belegt oder dergleichen).&lt;br /&gt;
&lt;br /&gt;
* Der Pegelwandler/Inverter (z. B. MAX232/HIN232) muss mit Kondensatoren für die internen Ladungspumpen beschaltet werden. Beim MAX232 sind dies mindestens vier Kondensatoren &amp;gt;= 1 µF (Polung beachten!), beim MAX202 und MAX3232 vier Kondensatoren &amp;gt;= 100 nF. Hinzu kommt der obligatorische Abblockkondensator (100 nF keramisch) zwischen VCC und GND des ICs. Das jeweilige Datenblatt gibt Auskunft über die Beschaltung bei &amp;quot;typischer Anwendung&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* TX/RX vertauscht?&lt;br /&gt;
&lt;br /&gt;
* Wenn ein externer Oszillator oder Quarz angeschlossen ist: Sind die Fuses des Controllers so gesetzt, dass er auch verwendet wird?&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
&lt;br /&gt;
* Sind die Pullup-Widerstände deaktiviert?&lt;br /&gt;
&lt;br /&gt;
== Web-Links ==&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf Application Note AVR042: AVR Hardware Design Considerations]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1619.pdf Application Note AVR040: EMC Design Considerations]&lt;/div&gt;</summary>
		<author><name>141.99.254.253</name></author>
	</entry>
</feed>