<?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=46.223.151.173</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=46.223.151.173"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/46.223.151.173"/>
	<updated>2026-04-10T23:40:09Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=80084</id>
		<title>Temperatursensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=80084"/>
		<updated>2013-12-19T19:10:42Z</updated>

		<summary type="html">&lt;p&gt;46.223.151.173: /* Thermoelement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Will man mit einem [[Mikrocontroller]] Temperaturen messen, dann braucht man&lt;br /&gt;
* einen [[Sensor]], der die Temperatur z.&amp;amp;nbsp;B. in eine Spannung oder einen Strom umsetzt&lt;br /&gt;
* einen [[ADC | AD-Wandler]], der das Signal digitalisiert. Der kann auf dem Sensor oder dem Mikrocontroller integriert sein.&lt;br /&gt;
&lt;br /&gt;
Temperatursensoren gibt es nun in allen möglichen Varianten. Vom temperaturabhängigen [[Widerstand]] bis zum fertig abgeglichenen All-in-one-Bauteil mit digitalem Ausgang. Wie bei allen Sensoren sollte man auch hier genau hinschauen und [[Auflösung und Genauigkeit]] unterscheiden.&lt;br /&gt;
&lt;br /&gt;
== Analoge Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== PT100 ===&lt;br /&gt;
&lt;br /&gt;
Unter einem PT100 versteht man einen Platinwiderstand, der bei 0°C einen Widerstand von 100Ω hat.&lt;br /&gt;
Platinwiderstände sind temperaturabhängige Widerstände mit hoher Wiederholgenauigkeit und Konstanz[http://de.wikipedia.org/wiki/Konstante].  Wegen der relativ geringen Widerstandsänderung von nur ca. 0,4Ω pro Grad ist etwas mehr Schaltungsaufwand erforderlich als bei anderen Sensoren. Genauere Formeln zur Temperaturbestimmung gibt es u.a. bei [http://de.wikipedia.org/wiki/Pt100 Wikipedia]. Ein Schaltplan findet sich bei der [http://www.heise.de/ct/artikel/Sensibelchen-289608.html c&#039;t].&lt;br /&gt;
&lt;br /&gt;
Die Sensoren gibt es auch mit anderen Widerstandswerten, z.&amp;amp;nbsp;B. mit 1000&amp;amp;Omega; und heißen dann entsprechend PT1000.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* genormt&lt;br /&gt;
* großer Meßbereich&lt;br /&gt;
* hohe Linearität&lt;br /&gt;
* hohe Wiederholgenauigkeit&lt;br /&gt;
* einfach austauschbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* relativ teuer (bei segor.de ab 3,80&amp;amp;euro;)&lt;br /&gt;
* brauchen aufwändigere Auswerteschaltung&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://de.wikibooks.org/wiki/Linearisierung_von_resistiven_Sensoren/_Pt100 Wikibooks: Linearisierung von resistiven Sensoren - PT100]&lt;br /&gt;
* [http://www.heise.de/ct/04/22/236/ c&#039;t-Artikel: Mikrocontroller-Programmierung: Timer, Sensoren und Drehgeber (mit PT100 Schaltung)]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/3450 Maxim AN3450 Positive Analog Feedback Compensates PT100 Transducer]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/4875 Maxim AN4875 High-Accuracy Temperature Measurements Call for Platinum Resistance Temperature Detectors (PRTDs) and Precision Delta-Sigma ADCs]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/01154a.pdf Microchip AN1154 Precision RTD Instrumentation for Temperature Sensing]&lt;br /&gt;
* [http://www.analog.com/static/imported-files/application_notes/AN709_0.pdf Analog Devices AN709 RTD Interfacing and Linearization Using an ADuC8xx MicroConverter]&lt;br /&gt;
&lt;br /&gt;
=== NTC/PTC ===&lt;br /&gt;
&lt;br /&gt;
NTC und PTC sind temperaturabhängige Widerstände.&lt;br /&gt;
&lt;br /&gt;
* NTC (engl. &#039;&#039;&#039;N&#039;&#039;&#039;egative &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Heißleiter), hat bei hohen Temperaturen seinen niedrigsten Widerstand, z.&amp;amp;nbsp;B. Silizium&lt;br /&gt;
* PTC (engl. &#039;&#039;&#039;P&#039;&#039;&#039;ositive &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Kaltleiter), hat bei niedrigen Temperaturen seinen geringsten Widerstand, z.&amp;amp;nbsp;B. Glühlampe&lt;br /&gt;
&lt;br /&gt;
Um den Widerstandswert zu messen schaltet man sie mit einem normalen Widerstand oder einer [[Konstantstromquelle]] in Reihe zu einem [[Spannungsteiler]] und misst den Spannungsabfall. Eine Beispielschaltung findet sich [http://www.mathar.com/msp_thermo1.html hier].&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* billig (z.B. [http://www.reichelt.de/?ARTICLE=9594 KTY81-110] bei Reichelt  ~0,60&amp;amp;euro;)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* müssen für höhere Genauigkeiten abgeglichen werden&lt;br /&gt;
* brauchen A/D-Wandler&lt;br /&gt;
* sind nichtlinear&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* KTY10-5&lt;br /&gt;
* KTY13-6&lt;br /&gt;
* KTY81-121&lt;br /&gt;
* KTY81-122&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.sprut.de/electronic/temeratur/temp.htm Temperaturabhängige Stromquelle und NTC/PTC inclusive Linearisierung]&lt;br /&gt;
*[http://www.umnicom.de/Elektronik/Mikrokontroller/Atmel/AtFan/AtFan.html#2.2.2 Berechnung des Linearisierungswiderstandes für gewünschten Temperaturbereich] der fällt sonst immer vom Himmel&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/208587#2065880 KTY 10-5 Formelprobleme]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/225563 Codesammlung: Beispiel mit 0,5°C Auflösung]&lt;br /&gt;
* [http://preis-ing.de/e_calc/index.php?seite=auternzc Automatisches Erzeugen von C-Code zur NTC Auswertung] Aus den NTC Parametern und den Anforderungen wird  ein schneller und schlanker C-Code generiert.&lt;br /&gt;
&lt;br /&gt;
=== LMx35 ===&lt;br /&gt;
&lt;br /&gt;
Eine IC-Familie, die pro Kelvin Temperaturänderung ihre Ausgangsspannung um 10&amp;amp;nbsp;mV ändert. Die ICs gibt es in verschiedenen Genauigkeiten und Temperaturbereichen mit den Bezeichnungen LM135(A), LM235(A) und LM335(A). Der günstigste ist der LM335 mit einem Temperaturbereich von −40 … +100°C.&lt;br /&gt;
In verschiedenen Bauformen erhältlich. Beispielschaltungen finden sich im [http://www.national.com/ds.cgi/LM/LM135.pdf Datenblatt] und [http://www.suessbrich.info/elek/elektherm1.html hier]&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C)&lt;br /&gt;
* relativ billig (LM335 bei Reichelt ab 0,76&amp;amp;nbsp;€)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* bei längerer Anschlussleitung störanfällig&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.schramm-software.de/tipps/temperaturmessung/analogsensoren.htm Test-Schaltungen und -Code zur Auswertung mit ADC (AVR-Assembler)]&lt;br /&gt;
&lt;br /&gt;
=== LM334 ===&lt;br /&gt;
&lt;br /&gt;
Ein IC ähnlich dem LM335 mit dem Unterschied, dass der durch das IC fließende Strom proportional von der Temperatur abhängt. Mit einer einfachen Schaltung aus nur zwei Widerständen kann man dann den Strom in einer Weise wandeln, dass pro Kelvin eine Spannungsänderung von 10mV ausgegeben wird. Da die Strom-Spannungswandlung auf der Platine (und damit nahe am AD-Wandler) stattfindet und die Übertragung des Messwerts durch einen Strom stattfindet, sind Störungen durch Netzbrumm etc. viel geringer als beim LM335&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
&amp;lt;!-- * hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C) &lt;br /&gt;
Laut Datenblatt +-3°C&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* relativ billig ([http://www.reichelt.de/?ARTICLE=10468 Reichelt 0,54 &amp;amp;euro;])&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* Bereich 0°C-70°C&lt;br /&gt;
&lt;br /&gt;
Ähnliche ICs:&lt;br /&gt;
* AD592 (Ausgangsstrom 1µA pro Kelvin, absolute Temperatur) [http://www.reichelt.de/?ARTICLE=3825 Reichelt: 3,75 €], Conrad 174912 8,50 &amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
=== SMT160-30 ===&lt;br /&gt;
&lt;br /&gt;
Ist ein Zwischending zwischen Digital und Analog. Sein Ausgangssignal ist ein digitales PWM-Signal, zu dessen Messung man am besten den Input-Capture-Eingang eines Mikrocontrollers verwendet. Man kann ihn also wie einen analogen Sensor nur indirekt auslesen, anstatt über einen AD-Wandler hier über einen Timer.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Digitales PWM-Signal ist unempfindlich gegen Störeinflüsse&lt;br /&gt;
* gibt es in SO8, TO18, TO92 und &amp;lt;b&amp;gt;TO220&amp;lt;/b&amp;gt;, gut befestigbar, z.B am Kühlkörper&lt;br /&gt;
* linear&lt;br /&gt;
* kein Abgleich nötig&lt;br /&gt;
&lt;br /&gt;
Nachteile (viele):&lt;br /&gt;
* benötigt Timer&lt;br /&gt;
* jittert extrem, genaue Messungen nur über Mittelung / Filterung möglich&lt;br /&gt;
* nicht nur das PWM-Verhältnis, sondern auf die Frequenz ist temp-abhängig (1-4kHz)&lt;br /&gt;
* teuer (Farnell 10,90&amp;amp;euro; +16%, Conrad 9,xx&amp;amp;euro; , www.hy-line.de ??).&lt;br /&gt;
* TO92 Gehäuse ist günstiger, dafür weniger genau&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* http://www.hy-line.de/co/sensor-tec/hersteller/smartec/smt-160-30/index.html&lt;br /&gt;
&lt;br /&gt;
=== Thermoelement ===&lt;br /&gt;
&lt;br /&gt;
Ein Thermoelement besteht im einfachsten Fall aus zwei ungleichen Metallendrähten, die an einem Punkt miteinander verbunden sind und bei dem die Verbindungsstelle einer anderen Temperatur ausgesetzt ist als die offenen Enden der Drähte. An den offenen Enden der Drähten entsteht eine Spannung (Thermospannung). Dieser Effekt wurde 1821 von Thomas Seebeck entdeckt ([http://de.wikipedia.org/wiki/Seebeck-Effekt Seebeck-Effekt] bei Wikipedia). Eine weitere Anwendung ist der thermoelektrische Generator (&amp;quot;Thermogenerator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
* MCP3421 18bit ADC 15SPS, I2C, auch mit andere Auflösungen erhältlich, Thermoelement kann direkt angeschlossen werden!&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* über einen sehr weiten Temperaturbereich einsetzbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* die sehr geringen Temperaturspannungen im Mikrovoltbereich benötigen eine sehr gute Auswertelektronik (guter Analogteil + AD-Wandler).&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
&amp;lt;!-- Der Link wird von NI umgebogen zur Homepage. Recherche nach dem Autor brachte nix hervor :-(&lt;br /&gt;
* [http://digital.ni.com/worldwide/germany.nsf/web/all/7A4F02BAEFEC22AC802567F6003E0D6E  Temperaturmessung mit Thermoelementen] - Eine Einführung von David Potter (deutsche Überarbeitung: G.Sinkovic) (inkl. Erläuterung der Kaltstellenkompensation) --&amp;gt;&lt;br /&gt;
* [http://www.sensorwell.at/fileadmin/templates/images/data_sheets/temperatur_messtechnik.pdf Warum Thermoelemente Relativtemperaturen messen! oder Was ist eine Kaltstelle?] - Technische Information von www.sensorwell.at (PDF, ca. 600kB)&lt;br /&gt;
&lt;br /&gt;
== Digitale Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== DS1621 ===&lt;br /&gt;
&lt;br /&gt;
Der DS1621 ist Temperatursensor und A/D-Wandler in einem. Er gibt seine Daten per [[I²C]]-[[Bus]] aus. Ein Schaltplan für einen elektronischen Thermometer mit diesem IC findet sich [http://www.myplace.nu/avr/thermo/ hier].&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* da I²C ein Bus ist, kann man mehrere DS1621 und andere I²C-Bausteine zusammen anschließen und braucht dafür trotzdem nur zwei I/O-Ports.&lt;br /&gt;
* Messbereich -55°C to +125°C &lt;br /&gt;
* Genauigkeit +-0,5°C&lt;br /&gt;
* Auflösung besser 0,01°C, wenn man die beiden Zählerregister (Count-Remain und Count-per-C) auswertet&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* teuer (Segor 5,80&amp;amp;euro;; RS 3,95&amp;amp;euro;; Conrad 5,22&amp;amp;euro;)&lt;br /&gt;
* obwohl die meisten Register [[Speicher#NVRAM | nichtflüchtig]] sind, kann man ihn nicht als Stand-Alone-Thermostat einsetzen, da er erst nach einem Start-Conversion-Befehl zu messen beginnt.&lt;br /&gt;
&lt;br /&gt;
Nachfolger:&lt;br /&gt;
* DS1631, DS1631A (Auto-Start-&amp;gt; Stand-Alone-Thermostat), DS1731&lt;br /&gt;
* weitere Stand-Alone-Thermostaten: DS1821, DS1629&lt;br /&gt;
&lt;br /&gt;
=== LM75 ===&lt;br /&gt;
&lt;br /&gt;
Der LM75 ist so ähnlich wie der DS1621, allerdings nur in SMD erhältlich und nicht so genau. Er ist aber öfters mal auf PC-Mainboards zu finden, so dass man beim Schlachten eines solchen günstig an einen Temperatursensor kommen kann. Eine Beispiel Schaltplan mit einem ATmega8 findet man [http://www.ucblog.de/2010/09/mikrocontroller-thermometer-schaltplan/ hier]&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* I²C-Bus Ausgang&lt;br /&gt;
* billiger als DS1621 (Reichelt 1,45 &amp;amp;euro;; RS 3V: 3,75&amp;amp;euro;; 5V: 2,72&amp;amp;euro;)&lt;br /&gt;
* Auflösung +-0,5°C&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur im SMD-Gehäuse erhältlich&lt;br /&gt;
* relativ ungenau (+-2°C), kann man jedoch kalibrieren / kompensieren&lt;br /&gt;
&lt;br /&gt;
Kompatible Typen:&lt;br /&gt;
* AD7415ART&lt;br /&gt;
* DS7505S+&lt;br /&gt;
&lt;br /&gt;
=== LM76 ===&lt;br /&gt;
&lt;br /&gt;
Der LM76 ähnlich dem LM75, bietet aber eine 8-fach höhere Auflösung und eine Genauigkeit von 0.5 bzw. 1°C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* höhere Auflösung&lt;br /&gt;
* höhere Genauigkeit&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* schwerer zu beschaffen&lt;br /&gt;
&lt;br /&gt;
=== TMP175 / TMP75 ===&lt;br /&gt;
&lt;br /&gt;
Ähnelt dem LM75 stark! Temperatursensor von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
=== DS18S20 / DS18B20 ===&lt;br /&gt;
&lt;br /&gt;
Der DS18S20 (Nachfolger des DS1820) und DS18B20 sind scheinbar Temperatursensoren und A/D-Wandler in einem. Wenn man genauer hinschaut, stellt man fest, dass es sich um direktwandelnde Sensoren handelt. Die Temperatur wird ohne Umweg über eine analoge Zwischengröße (Spannung oder Strom) in ein digitales Signal überführt.&lt;br /&gt;
&lt;br /&gt;
Die Datenkommunikation erfolgt über ein 1-Wire-Interface, wodurch man am [[Mikrocontroller]] mit nur einem einzigen I/O-Pin auskommen kann. Außerdem beherrschen sie die parasitäre Stromversorgung, d.h., man braucht für Daten und Stromversorgung zusammen nur zwei Leitungen.&lt;br /&gt;
&lt;br /&gt;
Beim DS18B20 sind Auflösungen von 9, 10, 11 und 12 Bits konfigurierbar. Je kleiner die Auflösung, desto kürzer ist die Messzeit. Der DS18S20 hat eine feste Auflösung von 12 Bits, wobei die unteren 3 Bits aufwändiger auszuwerten sind als beim DS18B20. Der DS18S20 ist als Ersatz für den DS1820 gedacht. Der Hersteller empfiehlt den DS18B20 für Neuentwicklungen.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* Genauigkeit +-0,5°C&lt;br /&gt;
* 1-Wire-Ausgang&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* relativ teuer: Reichelt: 2,50&amp;amp;euro; / CSD: 1,85&amp;amp;euro; / Conrad 5,08&amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.avr-projekte.de/ds18b20.htm Ein oder mehrere DS18B20 DS18S20 über Romcode einlesen. AVR-Assembler]&lt;br /&gt;
* [http://pic-projekte.de/wiki/index.php?title=Ansteuerung_eines_DS18S20 Ansteuern eines DS18S20 in C (PIC)]&lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18S20.pdf Datenblatt DS18S20] &lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf Datenblatt DS18B20]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/4377 Vergleich DS18B20 &amp;lt;-&amp;gt; DS18S20]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/6505 Code zur Ansteuerung (ASM ATTiny12)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/14792 Code zur Ansteuerung (AVR-GCC)]&lt;br /&gt;
* [http://gandalf.arubi.uni-kl.de/avr_projects/tempsensor/ Code zur Ansteuerung mit CRC-Prüfung (AVR-GCC)]&lt;br /&gt;
* [http://www.schramm-software.de/tipps/temperaturmessung/digitalsensoren.htm Code zur Ansteuerung mit CRC-Prüfung (AVR-Assembler)]&lt;br /&gt;
* [http://chaokhun.kmitl.ac.th/~kswichit/avrthermo/avrthermo.html LED-Thermometer mit AT90S2313 (C)]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-248219.html Webserver zur Ansteuerung von bis zu 63 Bausteinen]&lt;br /&gt;
* [http://www.teslabs.com/openplayer/docs/docs/other/ds18b20_pre1.pdf PDF Anleitung zur Beschaltung und Programmierung (C)]&lt;br /&gt;
*[http://www.digitemp.com/building.shtml Anleitung Sensorfühleraufbau (DigiTemp)]&lt;br /&gt;
* http://www.mikrocontroller.net/topic/14792 &lt;br /&gt;
* http://www.mikrocontroller.net/topic/232156 (Timing der parasitären Versorgung)&lt;br /&gt;
&lt;br /&gt;
=== DS1822 ===&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie DS18S20, aber weniger genau (+-2°) und in großen Stückzahlen billiger. Wegen der geringeren Verbreitung kommt der Preisvorteil aber bei Einzelstücken nicht beim Kunden an. So kostet er bei Reichelt mit 3,50&amp;amp;euro; mehr als der DS18S20.&lt;br /&gt;
&lt;br /&gt;
=== DS1921 / DS1922 ===&lt;br /&gt;
&lt;br /&gt;
Sind wie die DS1821 1-wire-Sensoren mit zusätzlicher Logging-Funktion.&lt;br /&gt;
Im iButton-Gehäuse befindet sich eine Lithium-Zelle, eine RTC, CMOS-RAM und der Temp-Sensor. Nach umfangreicher Progammierung startet der Button seine Mission (Aufzeichnung des Temperaturverlaufs).&lt;br /&gt;
Gibt es auch mit zusätzlicher Feuchtemessung (DS1923).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TSic ===&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren werden baugleich von 3 Herstellern angeboten:&lt;br /&gt;
* ZMD ([http://www.zmd.biz/temp.php?group=temp&amp;amp;content=products Homepage]) ([http://tarr.uspto.gov/servlet/tarr?regser=serial&amp;amp;entry=78673282 Trademark])&lt;br /&gt;
* IST AG ([http://www.ist-ag.com/eh/ist-ag/de/home.nsf/contentview/8F5D32432CAC53C2C1257405003C2433 Homepage])&lt;br /&gt;
* Hygrosens ([http://www.hygrosens.de/english/shop/list.html?tx_ttproducts_pi1%5Bcat%5D=11&amp;amp;cHash=dcd89b823b Homepage])&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren ([http://www.zmd.biz/pdf/ZMD%20TSic%20Data%20Sheet%20V3%207.pdf Datenblatt]) geben ihre Temperaturmessdaten automatisch in einem festen Intervall aus. Daher muss der Host nur warten bis die nächsten Messdaten rausgeschickt werden. Die TSic Sensoren die es im freien Handel gibt, geben ihre Messdaten alle 100ms (10Hz) aus. &lt;br /&gt;
Zur Übertragung wird das [http://www.zmd.biz/pdf/IST_TSic_ZACwire_V2.3%20Digital%20Output_17-Oct-06.pdf ZACwire] Protokoll benutzt. Es handelt sich um eine einfach zwei Byte Übertragung per Manchester-Code. Diese zwei Byte repräsentieren den digital gewandelten Temperaturwert. Im Gegensatz zu Sensoren wie den DS18xxx von Dallas muss dieser Wert aber erst auf einen dezimalen Wert umgerechnet werden. &lt;br /&gt;
Die Sensoren kommen mit 3 Pins aus (VCC, GND, Dout).&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Bereits kalibriert&lt;br /&gt;
* Verschiedene Genauigkeiten lieferbar&lt;br /&gt;
* Sehr einfaches Kommunikationsprotokoll&lt;br /&gt;
* Geringer Stromverbrauch&lt;br /&gt;
* Hochgenau: bis zu +/- 0.1°C (TSic 50x)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Recht teuer (Reichelt: 4,70&amp;amp;euro; für den TSic206)&lt;br /&gt;
* Nur ein Sensor an einem I/O nutzbar (Kein Bussystem)&lt;br /&gt;
&lt;br /&gt;
Achtung! &lt;br /&gt;
Die TSic Sensoren gibt es auch als Version mit analog Ausgang. Bei der Typenbezeichnung gibt die 3. Stelle an ob es sich um die analog- oder Digitalversion handelt (1 = analog, 6 = digital). &lt;br /&gt;
Der TSic201 ist also analog, wärend der TSic206 ein digitaler ist.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/283615#3025721 ZACwire Protokoll im Logic Analyzer]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/159774?goto=3157908#3157908 C-Code, (ohne Interrupt und ohne Timer) Sensor wird eingeschaltet-&amp;gt;gelesen-&amp;gt;ausgeschaltet]&lt;br /&gt;
* [http://www.avr-projekte.de/zacwireasm.htm Zacwire Protokoll, AVR-Assembler]&lt;br /&gt;
* [http://www.loetstelle.net/projekte2/tsic306/tsic306.php GCC AtMega8 Interruptgesteuerte Statemachine für TSIC206/306]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/45573#347765 Ansatz zum Empfang der Daten]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/225554# Beispiel mit Strobe ohne Interrupt]&lt;br /&gt;
* [http://www.zmd.biz/temp.php?group=temp&amp;amp;content=products Herstellerseite mit Datenblättern und FAQ]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/82087 Diskussion mit Beispielcode (MSP430, AVR, PIC) blockierend]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/144424#1367539 C++ Interrupt]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/88847 noch mehr C, problematisch Interrupt]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/151791#1426974 C für ATmega8]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/159149#1510455 auch problematisch]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/188462#1837622 fertiger Code zum Einlesen des Zacwire-Protokolls für PIC in ASM]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=55103 RN: Bascom]&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=tsic* Suche in den Foren]&lt;br /&gt;
* [http://www.avr-projekte.de/tinyclock.htm TSIC206 Thermometer mit Uhr und Kalender. Komplette Bauanleitung mit ASM Quellcode für AT-Tiny2313]&lt;br /&gt;
* [http://www.andeanelectronic.com/?q=node/6 TSIC Routinen für Arduino von Andean Electronic aus Peru - Quelltext Dokumentation in Englisch]&lt;br /&gt;
&lt;br /&gt;
=== SHT1x/SHT7x ===&lt;br /&gt;
&lt;br /&gt;
Der SHT1x/SHT7x (SHT10, SHT11, SHT15, STH71, SHT75) sind kombinierte Temperatur- und Feuchtesensoren von [http://www.sensirion.com Sensirion]. Sie unterscheiden sich in Bauform und Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* digitale Schnittstelle mit einfacher [[I²C]]-&#039;&#039;ähnlicher&#039;&#039; Ansteuerung&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* Beispielcode (C, MC51) auf der Sensirion-Seite verfügbar (relativ leicht portierbar)&lt;br /&gt;
* interne Heizelemente (Funktionsprüfung, &amp;quot;raue&amp;quot; Umgebung)&lt;br /&gt;
* Spannungsmonitor (&amp;quot;Battery fail&amp;quot;)&lt;br /&gt;
* sehr hohe Genauigkeit&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* kann nicht am [[I²C]] Bus betrieben werden, theoretisch gleiche Clockleitung möglich, fixe Adresse&lt;br /&gt;
* relativ teuer (Farnell 18,60&amp;amp;euro;)(SHT11 bei CSD 14€)&lt;br /&gt;
&lt;br /&gt;
[http://www.sensirion.com/en/01_humidity_sensors/00_humidity_sensors.htm Übersicht] der Temperatur- /Feutchtigkeitssensoren von Sensirion.&lt;br /&gt;
&lt;br /&gt;
=== SHT21 ===&lt;br /&gt;
&lt;br /&gt;
[http://www.sensirion.com Sensirion] bietet auch den SHT21 Feuchtigkeits- und Temperatursensor an, welcher wesentlich genauer ist.&lt;br /&gt;
    &lt;br /&gt;
Vorteile:&lt;br /&gt;
* I2C digital, PWM and SDM/analog Volt Ausgabe&lt;br /&gt;
* Maximal 5 Messungen/s @ 14bit&lt;br /&gt;
* Temperaturbereich von -40 – +125°C&lt;br /&gt;
* Feuchtigkeit mit einer Genauigkeit von +-3%RH&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
*  teuer (Farnell 23 €, Segor 29 €)&lt;br /&gt;
* nur als SMD-Package&lt;br /&gt;
&lt;br /&gt;
Application Notes und Datenblätter findet man [http://www.sensirion.com/en/01_humidity_sensors/10_Overview.htm hier].&lt;br /&gt;
&lt;br /&gt;
=== ADT7310 / ADT7xxx-Familie von AD ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.analog.com/en/sensors/digital-temperature-sensors/adt7310/products/product.html ADT7310] von [http://www.analog.com/ Analog Devices] besitzt eine Auflösung von 16 Bit und eine Genauigkeit von ±0.5°C im Bereich von −40°C bis +105°C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Ansteuerung per [[SPI]] ADT73xx  oder  [[I2C]] ADT74xx&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* hohe [[Auflösung und Genauigkeit]]: 16 Bit&lt;br /&gt;
** ADT7x02 2,00°&lt;br /&gt;
** ADT7x01 1,00°&lt;br /&gt;
** ADT7x10 0,40 / 0,50°&lt;br /&gt;
** ADT7x20 0,20 / 0,25°&lt;br /&gt;
* auch für automotive / als Die lieferbar&lt;br /&gt;
* programmierbarer [[Interrupt]]ausgang für Unter- und Übertemperatur&lt;br /&gt;
* relativ günstig (ca. 3-8€ bei Digi-Key, Stand 12/2011)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
NB: Der ADT7421 von ONsemi passt nicht in dieses Schema (1°C Resolution)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TSYS01 / G-NICO-018 von Measurement Specialties Inc. ===&lt;br /&gt;
* sehr hohe [[Auflösung und Genauigkeit]]:  0,10° @ -5°C … +50°C   16/24 Bit&lt;br /&gt;
* Gehäuse 16-VQFN Exposed Pad&lt;br /&gt;
* SPI / I2C über Pin auswählbar&lt;br /&gt;
* Preis: 8,60 (4,40 @1k) bei Digikey&lt;br /&gt;
kleiner Nachteil: der Sensor liefert den ADC-Wert und die Kompensationskonstanten (5 Polymon-Koeffizienten), mit denen im µC die Temperatur berechnet werden muss.&lt;br /&gt;
&lt;br /&gt;
=== SE95 ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.nxp.com/documents/data_sheet/SE95.pdf SE95] von NXP hat 13 Bit Auflösung, Genauigkeit ±2°C im Messbereich von -55°C bis +125°C, I²C, Gehäuse SO8 und TSSOP8. Einzelstück-Preis bei Segor 1,50€ (2012/I)&lt;br /&gt;
&lt;br /&gt;
== Preisübersicht ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Preisübersicht 11/2012&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil   || Segor || RS-Components || Conrad || Farnell || Reichelt || DigiKey&lt;br /&gt;
|-&lt;br /&gt;
| AD592     || 21,40 || 5,74          || 6,43   || 5,90    || 3,95     || 4,61&lt;br /&gt;
|-&lt;br /&gt;
| ADT7310   ||  -    || -             || -      || 4,56    || -        || 3,02&lt;br /&gt;
|-&lt;br /&gt;
| ADT7410   ||  -    || 3,35          || -      || 2,71    || -        || 3,02&lt;br /&gt;
|-&lt;br /&gt;
| DS1621    ||  7,60 || 5,29          || 5,08   || 5,65    || -        || 4,54&lt;br /&gt;
|-&lt;br /&gt;
| DS1629    ||  8,70 || 8,68          || -      || 5,00    || 6,50     || 7,65&lt;br /&gt;
|-&lt;br /&gt;
| DS1631    ||  8,00 || 2,91          || -      || 3,11    || -        || 3,94&lt;br /&gt;
|-&lt;br /&gt;
| DS1731    ||  -    || -             || -      || 9,79    || -        || 3,81&lt;br /&gt;
|-&lt;br /&gt;
| DS1821    ||  5,90 || 5,27          || 6,27   || -       || -        || 5,05&lt;br /&gt;
|-&lt;br /&gt;
| DS18B20   ||  2,50 || 3,06          || -      || 3,26    || 3,20     || 3,93&lt;br /&gt;
|-&lt;br /&gt;
| DS1921    ||  -    || 26,15         || -      || -       || -        || 21,13&lt;br /&gt;
|-&lt;br /&gt;
| DS1922    ||  -    || 62,00         || -      || -       || -        || 43,11&lt;br /&gt;
|-&lt;br /&gt;
| DS1923    ||  -    || 97,96         || -      || -       || -        || 80,30&lt;br /&gt;
|-&lt;br /&gt;
| KTY81/121 ||  -    || -             || -      || 0,79    || 0,59     || 0,85&lt;br /&gt;
|-&lt;br /&gt;
| LM75      ||  1,50 || 0,68          || 3,64   || 0,81    || 1,45     || 0,82&lt;br /&gt;
|-&lt;br /&gt;
| LM76      ||  -    || 2,83          || -      || 3,02    || -        || 2,39&lt;br /&gt;
|-&lt;br /&gt;
| LM135     || 10,10 || 10,28         || -      || 8,95    || 7,95     || 10,26&lt;br /&gt;
|-&lt;br /&gt;
| LM235     ||  -    || -             || -      || 1,80    || 1,40     || 1,26&lt;br /&gt;
|-&lt;br /&gt;
| LM334     ||  0,90 || 0,72          || 1,67   || 1,01    || 0,49     || 0,74&lt;br /&gt;
|-&lt;br /&gt;
| LM335     ||  1,30 || 0,56          || 1,92   || 0,55    || 0,71     || 0,80&lt;br /&gt;
|-&lt;br /&gt;
| PT100     ||  3,80 || 3,99          || 4,00   || 9,79    || 4,27     || 0,68&lt;br /&gt;
|-&lt;br /&gt;
| SE95      ||  1,50 || 0,63          || -      || 1,45    || -        || 1,00&lt;br /&gt;
|-&lt;br /&gt;
| SHT11     || 26,00 || 24,38         || 33,20  || 25,65   || -        || 36,76&lt;br /&gt;
|-&lt;br /&gt;
| SHT15     ||  -    || 27,69         || 36,30  || 28,72   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT21     || 29,50 || 18,10         || -      || 21,16   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT71     || 25,40 || 29,06         || 36,89  || 30,88   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT75     ||  -    || 33,77         || 42,48  || 35,52   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SMT160-30 ||  -    || 9,28          || 8,14   || 12,38   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| TMP75     ||  -    || 0,80          || -      || 0,85    || -        || 1,37&lt;br /&gt;
|-&lt;br /&gt;
| TSic206   ||  -    || -             || 5,84   || -       || 4,20     || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>46.223.151.173</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=79965</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=79965"/>
		<updated>2013-12-12T21:57:20Z</updated>

		<summary type="html">&lt;p&gt;46.223.151.173: /* Alle Ground-Anschlüsse beschaltet? */&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 und Probleme aufzulisten und zu erklären, was man dagegen tun kann.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Anderen Controller benutzt als den im Schaltplan: Pinkompatibilität sichergestellt? ===&lt;br /&gt;
&lt;br /&gt;
Nur wenige AVR-Controller sind pinkompatibel und damit untereinander austauschbar. Manchmal liegen gar die am dringensten benötigten Funktionen (ISP-Programmierung) bei anderen Controllern auf anderen Pins. Unbedingt vorher die Belegungen anhand der Datenblätter vergleichen!&lt;br /&gt;
&lt;br /&gt;
=== Fuses richtig gesetzt? ===&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 bestimmen. Ein häufiger Fehler ist beispielsweise, dass die falsche Taktquelle gewählt wurde (Fuse &amp;quot;CKSEL&amp;quot; etc.): einige AVRs können mit dem internen Oszillator (&amp;lt;i&amp;gt;internal R/C&amp;lt;/i&amp;gt;), mit einem externen Oszillator (&amp;lt;i&amp;gt;external clock&amp;lt;/i&amp;gt;), mit einem Quarz (&amp;lt;i&amp;gt;external crystal&amp;lt;/i&amp;gt;) oder mit einem Resonator (&amp;lt;i&amp;gt;external R/C&amp;lt;/i&amp;gt;) betrieben werden. Wenn die Einstellung über die Fusebits nicht dazu passt (z. B. &amp;lt;i&amp;gt;external clock&amp;lt;/i&amp;gt; statt &amp;lt;i&amp;gt;external crystal&amp;lt;/i&amp;gt;), fehlt dem Controller unter Umständen der Systemtakt und er läuft nicht an, oder man bekommt auf der seriellen Schnittstelle Nonsens, oder die Timer bzw. Zeitschleifen im Programm laufen zu langsam oder zu schnell.&lt;br /&gt;
&lt;br /&gt;
Eine andere Fuse (JTAGEN) schaltet auf einem Port (z.&amp;amp;nbsp;B. PORTC auf ATMega32) die JTAG-Unterstützung ein bzw. aus. Wenn sie eingeschaltet ist, funktionieren vier Bits dieses Ports nicht wie gewohnt, da sie für die JTAG-Schnittstelle reserviert werden.&lt;br /&gt;
&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;
=== ISP-Adapter ===&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;
&lt;br /&gt;
Bei seriellem Programmer mit Controller (STK500, Atmel AVRISP etc.): Programmieren dauert sehr lange, es gibt Fehler. Abhilfe: ISP Taktrate richtig einstellen (&amp;lt;1/4 F_CPU).&lt;br /&gt;
&lt;br /&gt;
Beim Programmieren mit dem usbasp Programmieradapter muss die Geschwindigkeit richtig eingestellt werden. Bei einem AVR der auf den eingebauten 1 Mhz läuft muss mit langsamer Geschwindigkeit (Jumper zu) programmiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Programmieren via SPI und angeschlossene SPI-Hardware ===&lt;br /&gt;
Wenn Peripherie über SPI angebunden ist, muss sich diese zum Programmierzeitpunkt auf dem Bus neutral verhalten. Normalerweise bedeutet dies, dass die Slave-Select/Chip-Select-Leitungen der Peripherie auf high gezogen werden müssen, wenn die Chips keinen internen Pull-Up haben. Werte von 10 kΩ bis 100 kΩ für normale Anwendungen haben sich bewährt.&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung richtig angeschlossen? ===&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 Messgerät direkt an den Anschlüssen des AVRs kontrollieren (VCC-GND, AVCC-GND) prüfen, 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;
=== Reset-Pin korrekt beschaltet? ===&lt;br /&gt;
&lt;br /&gt;
Der Reset-Anschluss am AVR ist &#039;active-low&#039;, d. h. wenn man den Pin mit GND (Masse) verbindet, wird der Controller zurückgesetzt gehalten. Zwar haben die meisten(!) AVRs einen internen Pullup-Widerstand, der den Reset-Pin gegen VCC &amp;quot;zieht&amp;quot;, dieser ist jedoch relativ hochohmig (ca. 50 kΩ, vgl. Datenblatt) und reicht in extrem stark gestörter Umgebung nicht aus, um den Reset-Pin sicher &amp;quot;hochzuhalten&amp;quot;. Als Mindestbeschaltung empfiehlt sich dringend, einen externen Pullup-Widerstand vorzusehen (typisch 10 kΩ), der den Reset-Pin mit VCC verbindet. Er sollte nicht kleiner als 4,7 kΩ sein, da der Programmieradapter sonst eventuell den Reset-Pin während des Programmiervorgangs nicht sicher auf &amp;quot;low&amp;quot; ziehen kann. Mit einem Oszilloskop kann man gut überprüfen, ob der Pegel am Reset-Pin sauber zwischen high und low wechselt. Zusätzlich sollte man auch noch einen Kondensator 47 nF oder 100 nF zwischen Reset-Pin und GND anordnen. Dieses RC-Glied sorgt dafür, dass der Controller beim Einschalten der Versorgungsspannung für eine definierte Zeitspanne im Reset gehalten wird. Im laufenden Betrieb sorgt der Kondensator dafür, dass der Reseteingang unempfindlich gegenüber Spikes und Glitches wird. Er sollte deshalb unmittelbar in Pin-Nähe beim Prozessor untergebracht werden. Dieser Kondensator darf jedoch nicht verwendet werden, wenn [[debugWIRE]] möglich sein soll.&lt;br /&gt;
&lt;br /&gt;
Atmel empfiehlt zusätzlich noch zum Schutz vor Überspannungen eine externe Diode nach VCC (&amp;quot;Clamp-Diode&amp;quot;), da für den Reset-Pin keine interne vorhanden ist. Diese Diode bereitet jedoch bei manchen Programmieradaptern Schwierigkeiten. Allerdings schützt die Diode den Controller davor, in den High-Voltage Programming Mode zu schalten, zum Beispiel als Folge von Störspannung wegen EMV, und dadurch den Programmspeicher zu überschreiben.&lt;br /&gt;
&lt;br /&gt;
=== Flashen / Lesen / Fuse nur einmal möglich ===&lt;br /&gt;
&lt;br /&gt;
Es kann vorkommen, dass ein AVR nur einmal programmiert werden kann, danach geht es nicht mehr (z.B. Typ wird nicht mehr erkannt). Erst nachdem die Versorgungsspannung getrennt / wieder verbunden ist, geht es erneut.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall ist meistens der Resetpin kurzgeschlossen, daher lässt sich der AVR einmal programmieren.&lt;br /&gt;
&lt;br /&gt;
Der Reset PIN müsste bei korrekter Beschaltung eine Spannung nahe VCC (z.B. 4.9V) aufweisen, ist die Spannung bei GND, ist der Pin kurzgeschlossen und verursacht dieses Problem.&lt;br /&gt;
&lt;br /&gt;
=== Abblockkondensator(en) ordnungsgemäß installiert? ===&lt;br /&gt;
&lt;br /&gt;
Abblockkondensatoren dienen dazu, hochfrequente Störungen, die durch Schaltvorgänge verursacht werden können, nach GND abzuleiten, so das sie den Integrierten Schaltkreis, also das IC nicht erreichen. Dort würden sie Funktionsstörungen verursachen. Diesen Zweck erfüllen sie optimal, wenn folgende Regeln eingehalten werden: &lt;br /&gt;
&lt;br /&gt;
* Ein Abblockkondensator sollte möglichst dicht am IC sitzen&lt;br /&gt;
* eine niederimpedante Anbindung sollte gegeben sein - also keine Stegleitungen. Dies bedeutet, das die Versorgungsspannung erst durch das Pad des Abblockkondensators fließen MUSS und dann weiter zm IC gereicht wird.&lt;br /&gt;
&lt;br /&gt;
* Jedes IC in einer Schaltung sollte einen Abblockkondensator besitzen.&lt;br /&gt;
&lt;br /&gt;
* Bei ICs mit mehreren Anschlüssen für VCC sollte jeder VCC-Pin mit einem eigenen Abblockkondensator beschaltet werden (z. B. AVRs in SMD-Bauform wie dem ATmega16A also mit vier Kondensatoren). Dabei ist darauf zu achten, jeder Abblokkondesnator  mit einem eigenen Via auf die niederimpedante (heißt Hochfrequenz gut leiten) großflächige, nicht unterbrochene Massefläche kontaktiert wird.&lt;br /&gt;
&lt;br /&gt;
* Es sollten keramische Kondensatoren mit einer Kapazität von maximal 100 nF verwendet werden. Größere Kondensatoren, etwa 10 µF-Elkos, sind für diese Aufgabe &#039;&#039;nicht&#039;&#039; geeignet, weil sie &amp;quot;zu langsam&amp;quot; sind (der Widerstand=Impedanz ist bei hochfrequenzen Spannungen zu groß - ein schneller (hochfrequenter) Spannungsimpuls kann so nicht abgeleitet werden)!&lt;br /&gt;
&lt;br /&gt;
=== Quarz oder Quarzoszillator angeschlossen? ===&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 [[Quarze und AVR|Quarz]] mehr angeschlossen werden. Man kann in den [[AVR Fuses|Fuse-Bits]] aber einstellen, dass man einen externen Taktgenerator (&#039;&#039;external clock&#039;&#039;, z. B. Quarzoszillator) oder externen Quarz (&#039;&#039;external crystal&#039;&#039;) verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Dann, oder wenn der AVR keinen internen Takt hat, wird an die entsprechenden Pins des Controllers ein Quarz (&#039;&#039;external crystal&#039;&#039;, Bauelement mit zwei &amp;quot;Beinchen&amp;quot;) oder Quarzoszillator (&#039;&#039;external clock&#039;&#039;, Bauelement mit vier &amp;quot;Beinchen&amp;quot;) angeschlossen. Im Falle eines Quarzes werden die XTAL-Pins mit den beiden Anschlüssen des Quarzes und jeweils mit einem Kondensator (ca. 12 bis 22 pF) (vgl. Datenblatt ATMega 8) gegen Masse angeschlossen. Im Falle eines Quarzoszillators reicht es aus, den Taktausgang mit dem XTAL1-Pin zu verbinden, und den XTAL2-Pin unbeschaltet zu lassen. Die Fuses sind entsprechend einzustellen.&lt;br /&gt;
&lt;br /&gt;
=== Alle Ground-Anschlüsse beschaltet? ===&lt;br /&gt;
&lt;br /&gt;
Bei IC&#039;s mit mehreren Ground-Anschlüssen müssen immer alle Anschlüsse beschaltet werden. Siehe http://www.mikrocontroller.net/forum/read-1-107259.html&lt;br /&gt;
&lt;br /&gt;
=== Alle Lötstellen in Ordnung? ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kalte&amp;quot;, d.h. schlechte Lötstellen erkennt man an ihrer matten Oberfläche (bei bleihaltigem Lot). 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;
&lt;br /&gt;
Bei kleinen Abständen (SMD-Bauteile) müssen besonders Verbindungen zwischen benachbarten Lötungen kontrolliert werden.&lt;br /&gt;
&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;
=== Eingänge ===&lt;br /&gt;
&lt;br /&gt;
Taster müssen:&lt;br /&gt;
&lt;br /&gt;
* entprellt werden ([[Entprellung]])&lt;br /&gt;
&lt;br /&gt;
* einen [[AVR-GCC-Tutorial#Tasten_und_Schalter|Pullup-Widerstand]] 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;
&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;
Symptome: Aufgrund des Prellens bekommt man bei einem Tastendruck statt eines Signals mehrere, und beim fehlenden Pullup fängt man sich Störungen (z.&amp;amp;nbsp;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 z.&amp;amp;nbsp;B. bei einem Tastendruck eine LED angehen, dann leuchtet die LED durch das Netzbrummen plötzlich mit 50 Hz anstatt aus zu sein.&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;
&lt;br /&gt;
* active high: Taster zwischen Port-Pin und VCC; externen Widerstand zwischen Port-Pin und GND.&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&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.&amp;amp;nbsp;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;
=== Besonderheiten bei ATmega128 und seinen Derivaten im 64-Pin-Gehäuse===&lt;br /&gt;
&lt;br /&gt;
[[Bild:isp.png|thumb|300px|right|ISP-Adapter]]&lt;br /&gt;
Der ATmega64 und der ATmega128 sowie alle vom ATMega128 abgeleiteten AVRs im 64-Pin-Gehäuse (ATMega641/1281/2561 sowie AT90CAN32/64/128, Ausnahmen sind nur AT90USB64/128, die eine ganz andere Pinbelegung haben) haben besondere Fallstricke, über die man bei nicht ausreichendem Datenblattstudium leicht stolpert. &lt;br /&gt;
&lt;br /&gt;
* Der erste betrifft den Anschluss 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:&lt;br /&gt;
:* MOSI → PE0 (Pin 2)&lt;br /&gt;
:* MISO → PE1 (Pin 3)&lt;br /&gt;
:* SCK → PB1 (Pin 11)&lt;br /&gt;
:* RESET → RESET (Pin 20)&lt;br /&gt;
: PEN (Pin 1) hat für normale ISP-Adapter keine Bedeutung und kann offen gelassen oder direkt mit Vcc verbunden werden. Die Benutzung der Pins PDI und PDO anstelle von MOSI und MISO gilt für praktisch alle ATmega128-Derivate im 64-Pin-TQFP-Gehäuse, darunter AT90CAN32/64/128 und ATmega641/1281/2561. Im Zweifelsfall im Datenblatt (Pin Configuration) nachsehen, ob PE0 und PE1 mit &amp;quot;PDI&amp;quot; bzw. &amp;quot;PDO&amp;quot; beschriftet sind.&lt;br /&gt;
&lt;br /&gt;
* Die zweite kleine Gemeinheit betrifft die M103C-Fuse (ATmega103 Compatibility Mode, nur bei den ATmega-Typen, nicht beim AT90CAN32/64/128). Diese ist bei fabrikneuen Atmega64/128 gesetzt und sorgt dafür, dass sich diese wie ein Atmega103 verhalten.&lt;br /&gt;
** Dies hat zur Folge, dass ein für den ATmega64 oder ATmega128 geschriebenes Programm beim ersten RET abstürzt, da der SRAM an einer anderen Stelle endet als erwartet und somit der Prozessor keine gültige Rücksprungadresse vom Stack holen kann. &lt;br /&gt;
** Außerdem funktionieren einige IO-Pins an PORTC, PORTF und PORTG anders.&lt;br /&gt;
** Für weitere Infos bzgl. [[TWI]], [[UART]], [[Timer]], [[Bootloader]] und Kalibrierung des internen RC-Oszillators unbedingt das Datenblatt lesen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Mainschleife vorhanden? ===&lt;br /&gt;
&lt;br /&gt;
Insbesondere beim Testen von Interrupts kann es passieren, dass man keine eigentliche Programmschleife vorsieht, weil ja alles in den Interrupts passiert. Das fuehrt dazu, dass der Controller nach Abarbeiten aller Befehle in &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main(void) {}&amp;lt;/syntaxhighlight&amp;gt; seine Arbeit einstellt und daher auch keine Interrupts mehr funktionieren. Demnach sollte bei rein Interrupt-basierten Programmen die Funktion mindestens so aussehen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main(void)&lt;br /&gt;
{&lt;br /&gt;
    // hier Interrupts definieren&lt;br /&gt;
    // und einschalten&lt;br /&gt;
    while (1){}&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alle Interruptvektoren definiert? ===&lt;br /&gt;
&lt;br /&gt;
Wenn man irgendwelche [[Interrupt]]vektoren verwendet, sollte man alle definieren, auch die nicht benutzten. Passiert es dann aufgrund eines Fehlers, dass 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;
Ausserdem sollte man immer im Datenblatt des Controllers nachsehen, wie die Interrupttabelle aufgebaut ist. Die kleinen AVRs verwenden ein RCALL zum Anspringen der Interrupts, welches 1 Wort lang ist. Die grossen AVRs mit mehr als 8 KiBi FLASH verwenden ein CALL, welches 2 Worte lang ist. Verwendet man nun  den falschen Befehl, verschieben sich die Einsprungadressen und das Chaos ist perfekt.&lt;br /&gt;
&lt;br /&gt;
In einem komplett interruptlosen Programm kann man auf die Interrupttabelle selbstverständlich verzichten (erkennbar daran, dass nirgendwo im Code Interrupts mittels Assembler-Befehl SEI eingeschaltet werden).&lt;br /&gt;
&lt;br /&gt;
Oft hilft es einen Catch All Interruptvektor zu definieren um herauszufinden ob ein Fehler (z.B. ein Neubeginn des Programms) vorliegt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR (BADISR_vect)&lt;br /&gt;
{&lt;br /&gt;
    // Hier eine Fehlerausgabe definieren.&lt;br /&gt;
    // Z.B. UART-Ausgabe oder ein PIN toggeln&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann findet man solche Fehler recht schnell.&lt;br /&gt;
&lt;br /&gt;
=== Alle Konfigurationsregister korrekt initialisiert? ===&lt;br /&gt;
&lt;br /&gt;
Alle benötigten Konfigurationsregister (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;
=== Stackpointer initialisiert? (Nur in Assembler relevant) ===&lt;br /&gt;
&lt;br /&gt;
Fehlerbeschreibung: &#039;&#039;Das Programm lief, bis ein &amp;quot;rcall&amp;quot; oder ein Interrupt eingefügt wurde. Danach ging plötzlich gar nichts mehr.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wahrscheinliche Ursache: Der Stack ist ein spezieller Bereich im RAM, der von Sprungbefehlen und Interruptaufrufen 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;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;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;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 16bit-Register in richtiger Reihenfolge geladen/gelesen? (Nur in Assembler relevant) ===&lt;br /&gt;
&lt;br /&gt;
Bei den 16-bit Registern (z.&amp;amp;nbsp;B. Timer1) genau die Hinweise im Kapitel &amp;quot;Accessing 16-bit Registers&amp;quot; beachten!&lt;br /&gt;
&lt;br /&gt;
So muss z.&amp;amp;nbsp;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 muss 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.&amp;amp;nbsp;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 muss, da zwischen diesen beiden einzelnen Lese-/Schreib-Befehlen kein Interrupt auftreten 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.&amp;amp;nbsp;B. TCNT1 anstatt TCNT1H und TCNT1L einzeln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Flag richtig gelöscht? ===&lt;br /&gt;
&lt;br /&gt;
Ein beliebter Fehler ist, dass man überliest, dass gesetzte Flags (z.&amp;amp;nbsp;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.&amp;amp;nbsp;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, &#039;&#039;&#039;keine&#039;&#039;&#039; &#039;0&#039;. Trotzdem wird das Bit dadurch &#039;0&#039; z.&amp;amp;nbsp;B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    TIFR = (1&amp;lt;&amp;lt;TOV0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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.&amp;amp;nbsp;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.&amp;amp;nbsp;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 muss 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 &#039;&#039;&#039;nicht&#039;&#039;&#039; mit einer Veroderung des Registers (z.&amp;amp;nbsp;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;
&lt;br /&gt;
=== Alle Interrupt Variablen als volatile bezeichnet? ===&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort volatile kann als Attribut an Variablen gehängt werden. Der Ausdruck „volatile int i“ versieht die Integervariable i mit dem Attribut volatile. Das Attribut weist den Compiler an, diese Variable nicht zu optimieren, sondern im Speicher abzulegen und zu beachten, dass diese Variable von anderen Prozessen geändert werden kann. Normale Variablen können durch den Compiler auf Register reduziert werden, oder die Daten werden einmalig aus dem Speicher geladen und erst am Ende des Programmes wieder zurückgeschrieben. Das kann Probleme bereiten, wenn beispielsweise in einer [[Interrupt]]routine die Variable verändert wird. Darum müssen alle globalen Variablen, die in einer Interruptroutine geändert werden, mit diesem Schlüsselwort versehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo nötig Variablenzugriff atomar gestaltet? ===&lt;br /&gt;
Der Zugriff auf Variablen &amp;gt;8 Bit welche in der ISR und in der Hauptfunktion genutzt werden muss [[atomar]] erfolgen. Das Vergessen dieser Regel führt selten zu Problemen, aber wenn dann zu schwer Nachvollziehbaren...&lt;br /&gt;
&lt;br /&gt;
=== Die Programmierfrequenz passend? ===&lt;br /&gt;
&lt;br /&gt;
Sollte ein Programmieren nicht möglich sein erst einmal die Programmiergeschwindigkeit bei AVR dude mit der Option&lt;br /&gt;
-B bitclock anpassen&lt;br /&gt;
wobei bitclock die Perioden dauer in Milisekunden (floating-point Zahl) ist. Normalerweise -B 1 für Controller mit &amp;gt;=4MHz daher ist bei der Erstprogrammierung ein höherer Wert zu versuchen.&lt;br /&gt;
&lt;br /&gt;
== Serielle Verbindungen ==&lt;br /&gt;
&lt;br /&gt;
=== [[I²C]]/[[TWI]] ===&lt;br /&gt;
&lt;br /&gt;
Sind die Leitungen SCL und SDA mit einem Pullup-Widerstand ausgestattet? Die I²C-Bus-Leitungen SCL und SDA müssen über einen Pullup-Widerstand mit einem Wert von 4,7 kΩ bis 10 kΩ mit der Versorgungsspannung (+5 V) verbunden sein.&lt;br /&gt;
&lt;br /&gt;
=== UART/USART ===&lt;br /&gt;
&lt;br /&gt;
==== Übertragungsprobleme durch falschen oder ungenauen Takt ====&lt;br /&gt;
&lt;br /&gt;
* Der interne [[Oszillator]] ist recht ungenau und nicht temperaturstabil. Daher kann die Umgebungstemperatur auch den [[UART|USART]]-Takt verändern. Für serielle, asynchrone Kommunikation per UART sollte man deshalb immer einen Quarz oder einen Oszillator verwenden, egal bei welcher Baudrate: 3% Fehler sind immer 3% Fehler, egal ob bei 1200 oder 9600 [[Baud]]. Falls doch der interne Oszillator verwendet wird: Wurde er für die richtige Frequenz und Betriebsspannung kalibriert?&lt;br /&gt;
&lt;br /&gt;
* Nicht mit allen Quarzen kann man alle Baudraten genau genug erzeugen. Deswegen gibt es [[Baudratenquarz]]e wie z.&amp;amp;nbsp;B. 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.&amp;amp;nbsp;B. in [[Bascom AVR|BASCOM]], [[C]]), dann muss dort der Takt &#039;&#039;genau&#039;&#039; angegeben werden. Setzt man z.&amp;amp;nbsp;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% zu hoch wäre. Damit funktioniert die Übertragung nicht mehr.&lt;br /&gt;
&lt;br /&gt;
* Im AVR-Studio kann man die Taktfrequenz sowohl über ein &amp;lt;code&amp;gt;#define F_CPU&amp;lt;/code&amp;gt; im Quelltext als auch über das Optionsmenu oder das selbsterstellte Makefile einstellen. Es darf nur &#039;&#039;eine&#039;&#039; Variante verwendet werden!&lt;br /&gt;
&lt;br /&gt;
* Wenn ein externer Oszillator oder Quarz angeschlossen ist: Sind die [[AVR Fuses | Fuses]] des Controllers so gesetzt, dass er auch verwendet wird?&lt;br /&gt;
&lt;br /&gt;
* Ist die Fuse CLKDIV &#039;&#039;nicht&#039;&#039; programmiert?&lt;br /&gt;
&lt;br /&gt;
* Es taucht auch des öfteren das Missverständnis auf, dass man nur F_CPU verändern muss, um den µC mit einem anderen Takt laufen zu lassen. Dem ist nicht so. Der µC-Takt wird durch die Fuses bzw. den eventuell angeschlossenen Quarz oder Quarzoszillator bestimmt. F_CPU dient nur dazu, die dadurch festgelegte Frequenz im C-Programm zur Verfügung zu haben. F_CPU ist nur eine Information, mit der man bei der Programmierung arbeiten kann. Aber ein anderer F_CPU-Wert führt nicht dazu, dass der µC dann magisch auf diese Frequenz umgestellt wird.&lt;br /&gt;
&lt;br /&gt;
* Um zu prüfen, ob der externe Quarz auch wirklich verwendet wird, kann man  mittels _delay_ms() testweise eine LED im Sekundentakt blinken lassen. Den Unterschied zwischen Quarz und internem RC-Oszillator kann man bei grösseren Frequenzunterschieden leicht sehen. Ebenso sieht man, ob versehentlich die CLKDIV Fuse gesetzt ist: die Blinkfrequenz ist dann achtmal langsamer. Allerdings muss man auch hier aufpassen. Siehe [[AVR-GCC-Tutorial#Warteschleifen (delay.h)|AVR-GCC-Tutorial: Warteschleifen]].&lt;br /&gt;
&lt;br /&gt;
Im folgenden Programm muss angepasst werden:&lt;br /&gt;
*Die vermeintliche Taktfrequenz F_CPU&lt;br /&gt;
*der Port und der Pin, an dem eine LED angeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Wird das Programm laufen gelassen, muss die LED 1 Sekunde ein/1 Sekunde aus sein. Stimmen die Zeiten nicht, ist das ein deutlicher Hinweis darauf, dass die tatsächlich vom µC verwendete Taktfrequenz nicht mit der in F_CPU angegebenen übereinstimmt. Das Programm muss mit aktivierter Optimierung &amp;lt;code&amp;gt;-Os&amp;lt;/code&amp;gt; compiliert werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Testprogramm für CPU Takt&lt;br /&gt;
// Hier die vermeintliche Taktrate des µC eintragen&lt;br /&gt;
// Im Beispiel hier: 1Mhz&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 1000000&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Hier die tatsächlich verwendeten Parameter angeben&lt;br /&gt;
&lt;br /&gt;
#define LED_PORT    PORTB&lt;br /&gt;
#define LED_DDR     DDRB&lt;br /&gt;
#define LED_PIN     PB0&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   LED_DDR |= 1 &amp;lt;&amp;lt; LED_PIN;&lt;br /&gt;
&lt;br /&gt;
   while (1)&lt;br /&gt;
   {&lt;br /&gt;
      LED_PORT ^= 1 &amp;lt;&amp;lt; LED_PIN;&lt;br /&gt;
      _delay_ms(1000);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Erscheinen im Terminalprogramm kryptische Zeichen anstatt ordentlichen Buchstaben (z.&amp;amp;nbsp;B. ü statt A), liegt das zu 99,9% an einer falsch eingestellten/erzeugten Baudrate im Mikrocontroller. Meistens wiederum liegt dies daran, dass der µC nicht mit der vermeintlichen Taktrate läuft und daher die Baudratenparameter falsch berechnet werden.&lt;br /&gt;
&lt;br /&gt;
* URSEL-Bit in UCSRC: Bei der Initialisierung der UART beachtet, wenn das für den verwendeten AVR notwendig ist, siehe [[AVR-GCC-Tutorial/Der_UART#Die_UART-Register|AVR-GCC-Tutorial/Der UART: Die UART-Register]].&lt;br /&gt;
&lt;br /&gt;
* In den Tutorials für [[AVR-Tutorial: UART |Assembler]] und [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_UART GCC] wird die Nutzung recht gut erklärt und mit Beispielen erläutert.&lt;br /&gt;
&lt;br /&gt;
==== Sonstige Fehlerquellen bei UART/USART ====&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.&amp;amp;nbsp;B. GND-Anschluss am RS232-Stecker nicht belegt oder dergleichen).&lt;br /&gt;
&lt;br /&gt;
* Der Pegelwandler/Inverter (z.&amp;amp;nbsp;B. MAX232) muss mit Kondensatoren für die internen Ladungspumpen beschaltet werden. Beim MAX232 sind dies mindestens vier Kondensatoren ≥ 1 µF (Polung beachten!), beim MAX202, MAX232A und MAX3232 vier Kondensatoren ≥ 100 nF. Hinzu kommt der obligatorische Abblockkondensator von 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? Modem- oder Nullmodemkabel?&lt;br /&gt;
&lt;br /&gt;
* Bei Kommunikation mit PC: ist die serielle Schnittstelle richtig konfiguriert? Nicht nur Baudrate, Stopp- und Parity-Bits, sondern auch Handshakeverhalten muss stimmen (kein Hardwarehandshake bei ausschließlicher Verwendung der Pins RX/TX).&lt;br /&gt;
&lt;br /&gt;
* Wird das Signal eventuell durch zusätzliche Chips invertiert? (EEPROM von FT232 falsch Programmiert)&lt;br /&gt;
&lt;br /&gt;
* Die Hardware und Verkabelung kann man schnell prüfen, indem man den Pin R1OUT bzw. R2OUT mit T1IN bzw. T2IN am MAX232 miteinander verbindet (je nachdem welches Pinpaar verwendet wird). Dann sollte man auf dem PC ein Terminalprogramm wie Hyperterminal starten und nach dem Eingeben von Zeichen diese sofort angezeigt bekommen, egal mit welcher Baudrate. Lediglich die Flusssteuerung muss auf &amp;quot;Kein&amp;quot; eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
: Man muss aber beachten, dass T1IN bzw. T2IN für diesen Test &#039;&#039;nicht&#039;&#039; mit dem Mikrocontroller verbunden sein darf, weil sonst zwei Ausgänge miteinander verbunden sind, siehe [[Ausgangsstufen Logik-ICs]]. Wenn der µC gesockelt ist, kann man ihn dafür einfach aus dem Sockel nehmen und die RX/TX Pins direkt im µC-Sockel mit einem Stück Draht verbinden.&lt;br /&gt;
&lt;br /&gt;
* UART Ausgabe-Pin als Output-Pin deklariert?&lt;br /&gt;
&lt;br /&gt;
* Spannung an Pin 15 und 16 liegt an? (Falsche Zeichen kommen an, aber in der richtigen Reihenfolge. Beim Test durch Kurzschluss von T1IN und R1OUT kommt nichts an)&lt;br /&gt;
&lt;br /&gt;
=== SPI (Hardware) ===&lt;br /&gt;
* Master Mode: SS Pin als Ausgang oder auf High gelegt? (siehe hier: [http://www.holger-klabunde.de/avr/avrhelp.htm] )&lt;br /&gt;
* SPI zu schnell&lt;br /&gt;
* Hängen andere SPI-Devices am Bus, die undefiniertes CS haben?&lt;br /&gt;
* Sind die DDR-Register der SPI-Ports richtig gesetzt?&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
&lt;br /&gt;
* Sind die Pullup-Widerstände deaktiviert? (im allgemeinen)&lt;br /&gt;
* (im speziellen) Bei einige Controllern liegt der JTAG mit auf den ADC-Pins. Die betroffenen ADC-Kanäle werden erst richtig funktionieren, wenn der JTAG deaktiviert ist. Das geht per Fuse oder - wenn man an die Fuses nicht mehr herrankommen sollte, weil man mit einem Bootloader arbeitet - auch per Software.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.atmel.com/images/atmel-2521-avr-hardware-design-considerations_application-note_avr042.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>46.223.151.173</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=79964</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=79964"/>
		<updated>2013-12-12T21:56:22Z</updated>

		<summary type="html">&lt;p&gt;46.223.151.173: /* Abblockkondensator(en) ordnungsgemäß installiert? */&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 und Probleme aufzulisten und zu erklären, was man dagegen tun kann.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Anderen Controller benutzt als den im Schaltplan: Pinkompatibilität sichergestellt? ===&lt;br /&gt;
&lt;br /&gt;
Nur wenige AVR-Controller sind pinkompatibel und damit untereinander austauschbar. Manchmal liegen gar die am dringensten benötigten Funktionen (ISP-Programmierung) bei anderen Controllern auf anderen Pins. Unbedingt vorher die Belegungen anhand der Datenblätter vergleichen!&lt;br /&gt;
&lt;br /&gt;
=== Fuses richtig gesetzt? ===&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 bestimmen. Ein häufiger Fehler ist beispielsweise, dass die falsche Taktquelle gewählt wurde (Fuse &amp;quot;CKSEL&amp;quot; etc.): einige AVRs können mit dem internen Oszillator (&amp;lt;i&amp;gt;internal R/C&amp;lt;/i&amp;gt;), mit einem externen Oszillator (&amp;lt;i&amp;gt;external clock&amp;lt;/i&amp;gt;), mit einem Quarz (&amp;lt;i&amp;gt;external crystal&amp;lt;/i&amp;gt;) oder mit einem Resonator (&amp;lt;i&amp;gt;external R/C&amp;lt;/i&amp;gt;) betrieben werden. Wenn die Einstellung über die Fusebits nicht dazu passt (z. B. &amp;lt;i&amp;gt;external clock&amp;lt;/i&amp;gt; statt &amp;lt;i&amp;gt;external crystal&amp;lt;/i&amp;gt;), fehlt dem Controller unter Umständen der Systemtakt und er läuft nicht an, oder man bekommt auf der seriellen Schnittstelle Nonsens, oder die Timer bzw. Zeitschleifen im Programm laufen zu langsam oder zu schnell.&lt;br /&gt;
&lt;br /&gt;
Eine andere Fuse (JTAGEN) schaltet auf einem Port (z.&amp;amp;nbsp;B. PORTC auf ATMega32) die JTAG-Unterstützung ein bzw. aus. Wenn sie eingeschaltet ist, funktionieren vier Bits dieses Ports nicht wie gewohnt, da sie für die JTAG-Schnittstelle reserviert werden.&lt;br /&gt;
&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;
=== ISP-Adapter ===&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;
&lt;br /&gt;
Bei seriellem Programmer mit Controller (STK500, Atmel AVRISP etc.): Programmieren dauert sehr lange, es gibt Fehler. Abhilfe: ISP Taktrate richtig einstellen (&amp;lt;1/4 F_CPU).&lt;br /&gt;
&lt;br /&gt;
Beim Programmieren mit dem usbasp Programmieradapter muss die Geschwindigkeit richtig eingestellt werden. Bei einem AVR der auf den eingebauten 1 Mhz läuft muss mit langsamer Geschwindigkeit (Jumper zu) programmiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Programmieren via SPI und angeschlossene SPI-Hardware ===&lt;br /&gt;
Wenn Peripherie über SPI angebunden ist, muss sich diese zum Programmierzeitpunkt auf dem Bus neutral verhalten. Normalerweise bedeutet dies, dass die Slave-Select/Chip-Select-Leitungen der Peripherie auf high gezogen werden müssen, wenn die Chips keinen internen Pull-Up haben. Werte von 10 kΩ bis 100 kΩ für normale Anwendungen haben sich bewährt.&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung richtig angeschlossen? ===&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 Messgerät direkt an den Anschlüssen des AVRs kontrollieren (VCC-GND, AVCC-GND) prüfen, 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;
=== Reset-Pin korrekt beschaltet? ===&lt;br /&gt;
&lt;br /&gt;
Der Reset-Anschluss am AVR ist &#039;active-low&#039;, d. h. wenn man den Pin mit GND (Masse) verbindet, wird der Controller zurückgesetzt gehalten. Zwar haben die meisten(!) AVRs einen internen Pullup-Widerstand, der den Reset-Pin gegen VCC &amp;quot;zieht&amp;quot;, dieser ist jedoch relativ hochohmig (ca. 50 kΩ, vgl. Datenblatt) und reicht in extrem stark gestörter Umgebung nicht aus, um den Reset-Pin sicher &amp;quot;hochzuhalten&amp;quot;. Als Mindestbeschaltung empfiehlt sich dringend, einen externen Pullup-Widerstand vorzusehen (typisch 10 kΩ), der den Reset-Pin mit VCC verbindet. Er sollte nicht kleiner als 4,7 kΩ sein, da der Programmieradapter sonst eventuell den Reset-Pin während des Programmiervorgangs nicht sicher auf &amp;quot;low&amp;quot; ziehen kann. Mit einem Oszilloskop kann man gut überprüfen, ob der Pegel am Reset-Pin sauber zwischen high und low wechselt. Zusätzlich sollte man auch noch einen Kondensator 47 nF oder 100 nF zwischen Reset-Pin und GND anordnen. Dieses RC-Glied sorgt dafür, dass der Controller beim Einschalten der Versorgungsspannung für eine definierte Zeitspanne im Reset gehalten wird. Im laufenden Betrieb sorgt der Kondensator dafür, dass der Reseteingang unempfindlich gegenüber Spikes und Glitches wird. Er sollte deshalb unmittelbar in Pin-Nähe beim Prozessor untergebracht werden. Dieser Kondensator darf jedoch nicht verwendet werden, wenn [[debugWIRE]] möglich sein soll.&lt;br /&gt;
&lt;br /&gt;
Atmel empfiehlt zusätzlich noch zum Schutz vor Überspannungen eine externe Diode nach VCC (&amp;quot;Clamp-Diode&amp;quot;), da für den Reset-Pin keine interne vorhanden ist. Diese Diode bereitet jedoch bei manchen Programmieradaptern Schwierigkeiten. Allerdings schützt die Diode den Controller davor, in den High-Voltage Programming Mode zu schalten, zum Beispiel als Folge von Störspannung wegen EMV, und dadurch den Programmspeicher zu überschreiben.&lt;br /&gt;
&lt;br /&gt;
=== Flashen / Lesen / Fuse nur einmal möglich ===&lt;br /&gt;
&lt;br /&gt;
Es kann vorkommen, dass ein AVR nur einmal programmiert werden kann, danach geht es nicht mehr (z.B. Typ wird nicht mehr erkannt). Erst nachdem die Versorgungsspannung getrennt / wieder verbunden ist, geht es erneut.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall ist meistens der Resetpin kurzgeschlossen, daher lässt sich der AVR einmal programmieren.&lt;br /&gt;
&lt;br /&gt;
Der Reset PIN müsste bei korrekter Beschaltung eine Spannung nahe VCC (z.B. 4.9V) aufweisen, ist die Spannung bei GND, ist der Pin kurzgeschlossen und verursacht dieses Problem.&lt;br /&gt;
&lt;br /&gt;
=== Abblockkondensator(en) ordnungsgemäß installiert? ===&lt;br /&gt;
&lt;br /&gt;
Abblockkondensatoren dienen dazu, hochfrequente Störungen, die durch Schaltvorgänge verursacht werden können, nach GND abzuleiten, so das sie den Integrierten Schaltkreis, also das IC nicht erreichen. Dort würden sie Funktionsstörungen verursachen. Diesen Zweck erfüllen sie optimal, wenn folgende Regeln eingehalten werden: &lt;br /&gt;
&lt;br /&gt;
* Ein Abblockkondensator sollte möglichst dicht am IC sitzen&lt;br /&gt;
* eine niederimpedante Anbindung sollte gegeben sein - also keine Stegleitungen. Dies bedeutet, das die Versorgungsspannung erst durch das Pad des Abblockkondensators fließen MUSS und dann weiter zm IC gereicht wird.&lt;br /&gt;
&lt;br /&gt;
* Jedes IC in einer Schaltung sollte einen Abblockkondensator besitzen.&lt;br /&gt;
&lt;br /&gt;
* Bei ICs mit mehreren Anschlüssen für VCC sollte jeder VCC-Pin mit einem eigenen Abblockkondensator beschaltet werden (z. B. AVRs in SMD-Bauform wie dem ATmega16A also mit vier Kondensatoren). Dabei ist darauf zu achten, jeder Abblokkondesnator  mit einem eigenen Via auf die niederimpedante (heißt Hochfrequenz gut leiten) großflächige, nicht unterbrochene Massefläche kontaktiert wird.&lt;br /&gt;
&lt;br /&gt;
* Es sollten keramische Kondensatoren mit einer Kapazität von maximal 100 nF verwendet werden. Größere Kondensatoren, etwa 10 µF-Elkos, sind für diese Aufgabe &#039;&#039;nicht&#039;&#039; geeignet, weil sie &amp;quot;zu langsam&amp;quot; sind (der Widerstand=Impedanz ist bei hochfrequenzen Spannungen zu groß - ein schneller (hochfrequenter) Spannungsimpuls kann so nicht abgeleitet werden)!&lt;br /&gt;
&lt;br /&gt;
=== Quarz oder Quarzoszillator angeschlossen? ===&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 [[Quarze und AVR|Quarz]] mehr angeschlossen werden. Man kann in den [[AVR Fuses|Fuse-Bits]] aber einstellen, dass man einen externen Taktgenerator (&#039;&#039;external clock&#039;&#039;, z. B. Quarzoszillator) oder externen Quarz (&#039;&#039;external crystal&#039;&#039;) verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Dann, oder wenn der AVR keinen internen Takt hat, wird an die entsprechenden Pins des Controllers ein Quarz (&#039;&#039;external crystal&#039;&#039;, Bauelement mit zwei &amp;quot;Beinchen&amp;quot;) oder Quarzoszillator (&#039;&#039;external clock&#039;&#039;, Bauelement mit vier &amp;quot;Beinchen&amp;quot;) angeschlossen. Im Falle eines Quarzes werden die XTAL-Pins mit den beiden Anschlüssen des Quarzes und jeweils mit einem Kondensator (ca. 12 bis 22 pF) (vgl. Datenblatt ATMega 8) gegen Masse angeschlossen. Im Falle eines Quarzoszillators reicht es aus, den Taktausgang mit dem XTAL1-Pin zu verbinden, und den XTAL2-Pin unbeschaltet zu lassen. Die Fuses sind entsprechend einzustellen.&lt;br /&gt;
&lt;br /&gt;
=== Alle Ground-Anschlüsse beschaltet? ===&lt;br /&gt;
&lt;br /&gt;
Bei AVRs mit mehreren Ground-Anschlüssen müssen alle Anschlüsse beschaltet werden. Siehe http://www.mikrocontroller.net/forum/read-1-107259.html&lt;br /&gt;
&lt;br /&gt;
=== Alle Lötstellen in Ordnung? ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kalte&amp;quot;, d.h. schlechte Lötstellen erkennt man an ihrer matten Oberfläche (bei bleihaltigem Lot). 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;
&lt;br /&gt;
Bei kleinen Abständen (SMD-Bauteile) müssen besonders Verbindungen zwischen benachbarten Lötungen kontrolliert werden.&lt;br /&gt;
&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;
=== Eingänge ===&lt;br /&gt;
&lt;br /&gt;
Taster müssen:&lt;br /&gt;
&lt;br /&gt;
* entprellt werden ([[Entprellung]])&lt;br /&gt;
&lt;br /&gt;
* einen [[AVR-GCC-Tutorial#Tasten_und_Schalter|Pullup-Widerstand]] 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;
&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;
Symptome: Aufgrund des Prellens bekommt man bei einem Tastendruck statt eines Signals mehrere, und beim fehlenden Pullup fängt man sich Störungen (z.&amp;amp;nbsp;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 z.&amp;amp;nbsp;B. bei einem Tastendruck eine LED angehen, dann leuchtet die LED durch das Netzbrummen plötzlich mit 50 Hz anstatt aus zu sein.&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;
&lt;br /&gt;
* active high: Taster zwischen Port-Pin und VCC; externen Widerstand zwischen Port-Pin und GND.&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&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.&amp;amp;nbsp;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;
=== Besonderheiten bei ATmega128 und seinen Derivaten im 64-Pin-Gehäuse===&lt;br /&gt;
&lt;br /&gt;
[[Bild:isp.png|thumb|300px|right|ISP-Adapter]]&lt;br /&gt;
Der ATmega64 und der ATmega128 sowie alle vom ATMega128 abgeleiteten AVRs im 64-Pin-Gehäuse (ATMega641/1281/2561 sowie AT90CAN32/64/128, Ausnahmen sind nur AT90USB64/128, die eine ganz andere Pinbelegung haben) haben besondere Fallstricke, über die man bei nicht ausreichendem Datenblattstudium leicht stolpert. &lt;br /&gt;
&lt;br /&gt;
* Der erste betrifft den Anschluss 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:&lt;br /&gt;
:* MOSI → PE0 (Pin 2)&lt;br /&gt;
:* MISO → PE1 (Pin 3)&lt;br /&gt;
:* SCK → PB1 (Pin 11)&lt;br /&gt;
:* RESET → RESET (Pin 20)&lt;br /&gt;
: PEN (Pin 1) hat für normale ISP-Adapter keine Bedeutung und kann offen gelassen oder direkt mit Vcc verbunden werden. Die Benutzung der Pins PDI und PDO anstelle von MOSI und MISO gilt für praktisch alle ATmega128-Derivate im 64-Pin-TQFP-Gehäuse, darunter AT90CAN32/64/128 und ATmega641/1281/2561. Im Zweifelsfall im Datenblatt (Pin Configuration) nachsehen, ob PE0 und PE1 mit &amp;quot;PDI&amp;quot; bzw. &amp;quot;PDO&amp;quot; beschriftet sind.&lt;br /&gt;
&lt;br /&gt;
* Die zweite kleine Gemeinheit betrifft die M103C-Fuse (ATmega103 Compatibility Mode, nur bei den ATmega-Typen, nicht beim AT90CAN32/64/128). Diese ist bei fabrikneuen Atmega64/128 gesetzt und sorgt dafür, dass sich diese wie ein Atmega103 verhalten.&lt;br /&gt;
** Dies hat zur Folge, dass ein für den ATmega64 oder ATmega128 geschriebenes Programm beim ersten RET abstürzt, da der SRAM an einer anderen Stelle endet als erwartet und somit der Prozessor keine gültige Rücksprungadresse vom Stack holen kann. &lt;br /&gt;
** Außerdem funktionieren einige IO-Pins an PORTC, PORTF und PORTG anders.&lt;br /&gt;
** Für weitere Infos bzgl. [[TWI]], [[UART]], [[Timer]], [[Bootloader]] und Kalibrierung des internen RC-Oszillators unbedingt das Datenblatt lesen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Mainschleife vorhanden? ===&lt;br /&gt;
&lt;br /&gt;
Insbesondere beim Testen von Interrupts kann es passieren, dass man keine eigentliche Programmschleife vorsieht, weil ja alles in den Interrupts passiert. Das fuehrt dazu, dass der Controller nach Abarbeiten aller Befehle in &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main(void) {}&amp;lt;/syntaxhighlight&amp;gt; seine Arbeit einstellt und daher auch keine Interrupts mehr funktionieren. Demnach sollte bei rein Interrupt-basierten Programmen die Funktion mindestens so aussehen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main(void)&lt;br /&gt;
{&lt;br /&gt;
    // hier Interrupts definieren&lt;br /&gt;
    // und einschalten&lt;br /&gt;
    while (1){}&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alle Interruptvektoren definiert? ===&lt;br /&gt;
&lt;br /&gt;
Wenn man irgendwelche [[Interrupt]]vektoren verwendet, sollte man alle definieren, auch die nicht benutzten. Passiert es dann aufgrund eines Fehlers, dass 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;
Ausserdem sollte man immer im Datenblatt des Controllers nachsehen, wie die Interrupttabelle aufgebaut ist. Die kleinen AVRs verwenden ein RCALL zum Anspringen der Interrupts, welches 1 Wort lang ist. Die grossen AVRs mit mehr als 8 KiBi FLASH verwenden ein CALL, welches 2 Worte lang ist. Verwendet man nun  den falschen Befehl, verschieben sich die Einsprungadressen und das Chaos ist perfekt.&lt;br /&gt;
&lt;br /&gt;
In einem komplett interruptlosen Programm kann man auf die Interrupttabelle selbstverständlich verzichten (erkennbar daran, dass nirgendwo im Code Interrupts mittels Assembler-Befehl SEI eingeschaltet werden).&lt;br /&gt;
&lt;br /&gt;
Oft hilft es einen Catch All Interruptvektor zu definieren um herauszufinden ob ein Fehler (z.B. ein Neubeginn des Programms) vorliegt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR (BADISR_vect)&lt;br /&gt;
{&lt;br /&gt;
    // Hier eine Fehlerausgabe definieren.&lt;br /&gt;
    // Z.B. UART-Ausgabe oder ein PIN toggeln&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann findet man solche Fehler recht schnell.&lt;br /&gt;
&lt;br /&gt;
=== Alle Konfigurationsregister korrekt initialisiert? ===&lt;br /&gt;
&lt;br /&gt;
Alle benötigten Konfigurationsregister (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;
=== Stackpointer initialisiert? (Nur in Assembler relevant) ===&lt;br /&gt;
&lt;br /&gt;
Fehlerbeschreibung: &#039;&#039;Das Programm lief, bis ein &amp;quot;rcall&amp;quot; oder ein Interrupt eingefügt wurde. Danach ging plötzlich gar nichts mehr.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wahrscheinliche Ursache: Der Stack ist ein spezieller Bereich im RAM, der von Sprungbefehlen und Interruptaufrufen 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;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;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;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 16bit-Register in richtiger Reihenfolge geladen/gelesen? (Nur in Assembler relevant) ===&lt;br /&gt;
&lt;br /&gt;
Bei den 16-bit Registern (z.&amp;amp;nbsp;B. Timer1) genau die Hinweise im Kapitel &amp;quot;Accessing 16-bit Registers&amp;quot; beachten!&lt;br /&gt;
&lt;br /&gt;
So muss z.&amp;amp;nbsp;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 muss 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.&amp;amp;nbsp;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 muss, da zwischen diesen beiden einzelnen Lese-/Schreib-Befehlen kein Interrupt auftreten 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.&amp;amp;nbsp;B. TCNT1 anstatt TCNT1H und TCNT1L einzeln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Flag richtig gelöscht? ===&lt;br /&gt;
&lt;br /&gt;
Ein beliebter Fehler ist, dass man überliest, dass gesetzte Flags (z.&amp;amp;nbsp;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.&amp;amp;nbsp;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, &#039;&#039;&#039;keine&#039;&#039;&#039; &#039;0&#039;. Trotzdem wird das Bit dadurch &#039;0&#039; z.&amp;amp;nbsp;B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    TIFR = (1&amp;lt;&amp;lt;TOV0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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.&amp;amp;nbsp;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.&amp;amp;nbsp;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 muss 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 &#039;&#039;&#039;nicht&#039;&#039;&#039; mit einer Veroderung des Registers (z.&amp;amp;nbsp;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;
&lt;br /&gt;
=== Alle Interrupt Variablen als volatile bezeichnet? ===&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort volatile kann als Attribut an Variablen gehängt werden. Der Ausdruck „volatile int i“ versieht die Integervariable i mit dem Attribut volatile. Das Attribut weist den Compiler an, diese Variable nicht zu optimieren, sondern im Speicher abzulegen und zu beachten, dass diese Variable von anderen Prozessen geändert werden kann. Normale Variablen können durch den Compiler auf Register reduziert werden, oder die Daten werden einmalig aus dem Speicher geladen und erst am Ende des Programmes wieder zurückgeschrieben. Das kann Probleme bereiten, wenn beispielsweise in einer [[Interrupt]]routine die Variable verändert wird. Darum müssen alle globalen Variablen, die in einer Interruptroutine geändert werden, mit diesem Schlüsselwort versehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo nötig Variablenzugriff atomar gestaltet? ===&lt;br /&gt;
Der Zugriff auf Variablen &amp;gt;8 Bit welche in der ISR und in der Hauptfunktion genutzt werden muss [[atomar]] erfolgen. Das Vergessen dieser Regel führt selten zu Problemen, aber wenn dann zu schwer Nachvollziehbaren...&lt;br /&gt;
&lt;br /&gt;
=== Die Programmierfrequenz passend? ===&lt;br /&gt;
&lt;br /&gt;
Sollte ein Programmieren nicht möglich sein erst einmal die Programmiergeschwindigkeit bei AVR dude mit der Option&lt;br /&gt;
-B bitclock anpassen&lt;br /&gt;
wobei bitclock die Perioden dauer in Milisekunden (floating-point Zahl) ist. Normalerweise -B 1 für Controller mit &amp;gt;=4MHz daher ist bei der Erstprogrammierung ein höherer Wert zu versuchen.&lt;br /&gt;
&lt;br /&gt;
== Serielle Verbindungen ==&lt;br /&gt;
&lt;br /&gt;
=== [[I²C]]/[[TWI]] ===&lt;br /&gt;
&lt;br /&gt;
Sind die Leitungen SCL und SDA mit einem Pullup-Widerstand ausgestattet? Die I²C-Bus-Leitungen SCL und SDA müssen über einen Pullup-Widerstand mit einem Wert von 4,7 kΩ bis 10 kΩ mit der Versorgungsspannung (+5 V) verbunden sein.&lt;br /&gt;
&lt;br /&gt;
=== UART/USART ===&lt;br /&gt;
&lt;br /&gt;
==== Übertragungsprobleme durch falschen oder ungenauen Takt ====&lt;br /&gt;
&lt;br /&gt;
* Der interne [[Oszillator]] ist recht ungenau und nicht temperaturstabil. Daher kann die Umgebungstemperatur auch den [[UART|USART]]-Takt verändern. Für serielle, asynchrone Kommunikation per UART sollte man deshalb immer einen Quarz oder einen Oszillator verwenden, egal bei welcher Baudrate: 3% Fehler sind immer 3% Fehler, egal ob bei 1200 oder 9600 [[Baud]]. Falls doch der interne Oszillator verwendet wird: Wurde er für die richtige Frequenz und Betriebsspannung kalibriert?&lt;br /&gt;
&lt;br /&gt;
* Nicht mit allen Quarzen kann man alle Baudraten genau genug erzeugen. Deswegen gibt es [[Baudratenquarz]]e wie z.&amp;amp;nbsp;B. 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.&amp;amp;nbsp;B. in [[Bascom AVR|BASCOM]], [[C]]), dann muss dort der Takt &#039;&#039;genau&#039;&#039; angegeben werden. Setzt man z.&amp;amp;nbsp;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% zu hoch wäre. Damit funktioniert die Übertragung nicht mehr.&lt;br /&gt;
&lt;br /&gt;
* Im AVR-Studio kann man die Taktfrequenz sowohl über ein &amp;lt;code&amp;gt;#define F_CPU&amp;lt;/code&amp;gt; im Quelltext als auch über das Optionsmenu oder das selbsterstellte Makefile einstellen. Es darf nur &#039;&#039;eine&#039;&#039; Variante verwendet werden!&lt;br /&gt;
&lt;br /&gt;
* Wenn ein externer Oszillator oder Quarz angeschlossen ist: Sind die [[AVR Fuses | Fuses]] des Controllers so gesetzt, dass er auch verwendet wird?&lt;br /&gt;
&lt;br /&gt;
* Ist die Fuse CLKDIV &#039;&#039;nicht&#039;&#039; programmiert?&lt;br /&gt;
&lt;br /&gt;
* Es taucht auch des öfteren das Missverständnis auf, dass man nur F_CPU verändern muss, um den µC mit einem anderen Takt laufen zu lassen. Dem ist nicht so. Der µC-Takt wird durch die Fuses bzw. den eventuell angeschlossenen Quarz oder Quarzoszillator bestimmt. F_CPU dient nur dazu, die dadurch festgelegte Frequenz im C-Programm zur Verfügung zu haben. F_CPU ist nur eine Information, mit der man bei der Programmierung arbeiten kann. Aber ein anderer F_CPU-Wert führt nicht dazu, dass der µC dann magisch auf diese Frequenz umgestellt wird.&lt;br /&gt;
&lt;br /&gt;
* Um zu prüfen, ob der externe Quarz auch wirklich verwendet wird, kann man  mittels _delay_ms() testweise eine LED im Sekundentakt blinken lassen. Den Unterschied zwischen Quarz und internem RC-Oszillator kann man bei grösseren Frequenzunterschieden leicht sehen. Ebenso sieht man, ob versehentlich die CLKDIV Fuse gesetzt ist: die Blinkfrequenz ist dann achtmal langsamer. Allerdings muss man auch hier aufpassen. Siehe [[AVR-GCC-Tutorial#Warteschleifen (delay.h)|AVR-GCC-Tutorial: Warteschleifen]].&lt;br /&gt;
&lt;br /&gt;
Im folgenden Programm muss angepasst werden:&lt;br /&gt;
*Die vermeintliche Taktfrequenz F_CPU&lt;br /&gt;
*der Port und der Pin, an dem eine LED angeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Wird das Programm laufen gelassen, muss die LED 1 Sekunde ein/1 Sekunde aus sein. Stimmen die Zeiten nicht, ist das ein deutlicher Hinweis darauf, dass die tatsächlich vom µC verwendete Taktfrequenz nicht mit der in F_CPU angegebenen übereinstimmt. Das Programm muss mit aktivierter Optimierung &amp;lt;code&amp;gt;-Os&amp;lt;/code&amp;gt; compiliert werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Testprogramm für CPU Takt&lt;br /&gt;
// Hier die vermeintliche Taktrate des µC eintragen&lt;br /&gt;
// Im Beispiel hier: 1Mhz&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 1000000&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Hier die tatsächlich verwendeten Parameter angeben&lt;br /&gt;
&lt;br /&gt;
#define LED_PORT    PORTB&lt;br /&gt;
#define LED_DDR     DDRB&lt;br /&gt;
#define LED_PIN     PB0&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   LED_DDR |= 1 &amp;lt;&amp;lt; LED_PIN;&lt;br /&gt;
&lt;br /&gt;
   while (1)&lt;br /&gt;
   {&lt;br /&gt;
      LED_PORT ^= 1 &amp;lt;&amp;lt; LED_PIN;&lt;br /&gt;
      _delay_ms(1000);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Erscheinen im Terminalprogramm kryptische Zeichen anstatt ordentlichen Buchstaben (z.&amp;amp;nbsp;B. ü statt A), liegt das zu 99,9% an einer falsch eingestellten/erzeugten Baudrate im Mikrocontroller. Meistens wiederum liegt dies daran, dass der µC nicht mit der vermeintlichen Taktrate läuft und daher die Baudratenparameter falsch berechnet werden.&lt;br /&gt;
&lt;br /&gt;
* URSEL-Bit in UCSRC: Bei der Initialisierung der UART beachtet, wenn das für den verwendeten AVR notwendig ist, siehe [[AVR-GCC-Tutorial/Der_UART#Die_UART-Register|AVR-GCC-Tutorial/Der UART: Die UART-Register]].&lt;br /&gt;
&lt;br /&gt;
* In den Tutorials für [[AVR-Tutorial: UART |Assembler]] und [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_UART GCC] wird die Nutzung recht gut erklärt und mit Beispielen erläutert.&lt;br /&gt;
&lt;br /&gt;
==== Sonstige Fehlerquellen bei UART/USART ====&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.&amp;amp;nbsp;B. GND-Anschluss am RS232-Stecker nicht belegt oder dergleichen).&lt;br /&gt;
&lt;br /&gt;
* Der Pegelwandler/Inverter (z.&amp;amp;nbsp;B. MAX232) muss mit Kondensatoren für die internen Ladungspumpen beschaltet werden. Beim MAX232 sind dies mindestens vier Kondensatoren ≥ 1 µF (Polung beachten!), beim MAX202, MAX232A und MAX3232 vier Kondensatoren ≥ 100 nF. Hinzu kommt der obligatorische Abblockkondensator von 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? Modem- oder Nullmodemkabel?&lt;br /&gt;
&lt;br /&gt;
* Bei Kommunikation mit PC: ist die serielle Schnittstelle richtig konfiguriert? Nicht nur Baudrate, Stopp- und Parity-Bits, sondern auch Handshakeverhalten muss stimmen (kein Hardwarehandshake bei ausschließlicher Verwendung der Pins RX/TX).&lt;br /&gt;
&lt;br /&gt;
* Wird das Signal eventuell durch zusätzliche Chips invertiert? (EEPROM von FT232 falsch Programmiert)&lt;br /&gt;
&lt;br /&gt;
* Die Hardware und Verkabelung kann man schnell prüfen, indem man den Pin R1OUT bzw. R2OUT mit T1IN bzw. T2IN am MAX232 miteinander verbindet (je nachdem welches Pinpaar verwendet wird). Dann sollte man auf dem PC ein Terminalprogramm wie Hyperterminal starten und nach dem Eingeben von Zeichen diese sofort angezeigt bekommen, egal mit welcher Baudrate. Lediglich die Flusssteuerung muss auf &amp;quot;Kein&amp;quot; eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
: Man muss aber beachten, dass T1IN bzw. T2IN für diesen Test &#039;&#039;nicht&#039;&#039; mit dem Mikrocontroller verbunden sein darf, weil sonst zwei Ausgänge miteinander verbunden sind, siehe [[Ausgangsstufen Logik-ICs]]. Wenn der µC gesockelt ist, kann man ihn dafür einfach aus dem Sockel nehmen und die RX/TX Pins direkt im µC-Sockel mit einem Stück Draht verbinden.&lt;br /&gt;
&lt;br /&gt;
* UART Ausgabe-Pin als Output-Pin deklariert?&lt;br /&gt;
&lt;br /&gt;
* Spannung an Pin 15 und 16 liegt an? (Falsche Zeichen kommen an, aber in der richtigen Reihenfolge. Beim Test durch Kurzschluss von T1IN und R1OUT kommt nichts an)&lt;br /&gt;
&lt;br /&gt;
=== SPI (Hardware) ===&lt;br /&gt;
* Master Mode: SS Pin als Ausgang oder auf High gelegt? (siehe hier: [http://www.holger-klabunde.de/avr/avrhelp.htm] )&lt;br /&gt;
* SPI zu schnell&lt;br /&gt;
* Hängen andere SPI-Devices am Bus, die undefiniertes CS haben?&lt;br /&gt;
* Sind die DDR-Register der SPI-Ports richtig gesetzt?&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
&lt;br /&gt;
* Sind die Pullup-Widerstände deaktiviert? (im allgemeinen)&lt;br /&gt;
* (im speziellen) Bei einige Controllern liegt der JTAG mit auf den ADC-Pins. Die betroffenen ADC-Kanäle werden erst richtig funktionieren, wenn der JTAG deaktiviert ist. Das geht per Fuse oder - wenn man an die Fuses nicht mehr herrankommen sollte, weil man mit einem Bootloader arbeitet - auch per Software.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.atmel.com/images/atmel-2521-avr-hardware-design-considerations_application-note_avr042.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>46.223.151.173</name></author>
	</entry>
</feed>