<?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=Stan</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=Stan"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Stan"/>
	<updated>2026-04-11T13:08:29Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=48161</id>
		<title>Temperatursensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=48161"/>
		<updated>2010-06-02T07:19:49Z</updated>

		<summary type="html">&lt;p&gt;Stan: Vandalismus rückgängig gemacht&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 umwandelt&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 Ohm 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 Ohm pro Grad ist etwas mehr Schaltungsaufwand erforderlich als bei anderen Sensoren. Genauere Formeln zur Temperaturbestimmung gibt es u.a. bei der [http://de.wikipedia.org/wiki/Pt100 Wikipedia]. Ein Schaltplan findet sich bei der [http://www.heise.de/ct/04/22/236/ 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;
* 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 aufwendigere Auswerteschaltung&lt;br /&gt;
&lt;br /&gt;
Links:&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;
&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 (Reichelt 0,29 &amp;amp;euro;)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* müssen abgeglichen werden&lt;br /&gt;
* brauchen A/D-Wandler&lt;br /&gt;
* sind nichtlinear&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;
&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,50&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;
=== 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;
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;
* [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)&lt;br /&gt;
* [http://www.ipetronik.com/pdf/Newsletter/Ipetronik_NL2_2004_d.pdf Warum Thermoelemente Relativtemperaturen messen! oder Was ist eine Kaltstelle?] - Technische Information von www.ipetronik.com (PDF, 272 KB)&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°&lt;br /&gt;
* Auflösung besser 0,01°, 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. Einen Schaltplan findet man [http://www.mcselec.com/index.php?option=com_docman&amp;amp;task=cat_view&amp;amp;gid=83&amp;amp;limit=1&amp;amp;limitstart=35 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°&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur im SMD-Gehäuse erhältlich&lt;br /&gt;
* relativ ungenau (+-2°), kann man jedoch kalibrieren / kompensieren&lt;br /&gt;
&lt;br /&gt;
Kompatible Typen:&lt;br /&gt;
* AD7415ART&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. Die Datenkommunikation erfolgt über ein 1-Wire-Interface, wodurch man am [[Mikrocontroller]] mit nur einen 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.  Der DS18B20 hat 12 Bit Auflösung gegenüber 9 Bit Auflösung beim DS18S20.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* Genauigkeit +-0,5°&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://chaokhun.kmitl.ac.th/~kswichit/avrthermo/avrthermo.html Ein Schaltplan]&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://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.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;
&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;
* [http://www.mikrocontroller.net/topic/45573#347765 Ansatz zum Empfang der Daten]&lt;br /&gt;
* [http://ethersex.de/index.php/Zacwire Fertige Ansteuerung durch AVR in Ethersex]&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)]&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=tsic* Suche in den Foren]&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;rauhe&amp;quot; Umgebung)&lt;br /&gt;
* Spannungsmonitor (&amp;quot;Battery fail&amp;quot;)&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;)&lt;br /&gt;
&lt;br /&gt;
Es gibt jetzt einen Nachfolger SHT2x, der I²C-kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
=== ADT7310 ===&lt;br /&gt;
&lt;br /&gt;
Der ADT7310 von [http://www.analog.com/en/sensors/digital-temperature-sensors/adt7310/products/product.html 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]]&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* hohe [[Auflösung und Genauigkeit]]&lt;br /&gt;
* programmierbarer [[Interrupt]]ausgang für Unter- und Übertemperatur&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* zur Zeit noch schlecht erhältlich (z.B. bei Digikey für 4,39$)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Stan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_RFM12&amp;diff=41211</id>
		<title>AVR RFM12</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_RFM12&amp;diff=41211"/>
		<updated>2009-12-07T15:38:19Z</updated>

		<summary type="html">&lt;p&gt;Stan: /* USB  RFM12 */ linebreak entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schaltungen und Software für AVR und das Funkmodul [[RFM12]].&lt;br /&gt;
&lt;br /&gt;
== SVN ==&lt;br /&gt;
&lt;br /&gt;
svn://mikrocontroller.net/rfm12&lt;br /&gt;
&lt;br /&gt;
Wegen Zugangsdaten bitte bei [http://www.mikrocontroller.net/user/show/andreas Andreas Schwarz] melden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Treiber ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/22473/rfm12_pc.zip Firmware v1.0.0] von Benedikt K.&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/23542/RMxx_Driver.tar.bz2 Firmware v2.0.1] von Jürgen Eckert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+ Funktionalität&lt;br /&gt;
|-&lt;br /&gt;
!  || Beschreibung || Software&lt;br /&gt;
|-&lt;br /&gt;
!1. Stufe:&lt;br /&gt;
| Die Daten von der seriellen Schnittstelle werden über die Funkstrecke auf die serielle Schnittstelle der anderen Seite übertragen. (Wir freuen uns über jedes Byte das ankommt)&lt;br /&gt;
| [http://www.mikrocontroller.net/topic/67273#564945 Claude Schwarz], [http://www.mikrocontroller.net/topic/71682#584915 Benedikt K.] oder [http://www.mikrocontroller.net/attachment/36742/RFM12_V3.zip Manuel Stahl]&lt;br /&gt;
|-&lt;br /&gt;
! 2. Stufe:&lt;br /&gt;
| Es findet eine Fehlererkennung (z.B. mit CRC-Summen) statt. Fehlerhafte Daten werden erneut angefordert. Dadurch gehen auf der Funkstrecke keine Daten verloren und es werden keine Daten verfälscht.&lt;br /&gt;
| [http://www.mikrocontroller.net/topic/71682#585851 Benedikt K.]&lt;br /&gt;
|-&lt;br /&gt;
! 3. Stufe:&lt;br /&gt;
| Die Datenübertragung wird individualisiert. Dadurch können zwei Funkstrecken, die im gleichen Empfangsbereich liegen nebeneinander arbeiten, ohne sich zu beeinträchtigen.&lt;br /&gt;
| [[RFM12_Protokoll_Stack]]&lt;br /&gt;
|-&lt;br /&gt;
! 4. Stufe: &lt;br /&gt;
| Die Datenübertragung wird verschlüsselt und damit abhörsicher.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!5. Stufe:&lt;br /&gt;
| Neben den Daten der seriellen Schnittstelle werden auch Änderungen der Statusleitungen übertragen. Damit erhält man eine &amp;quot;RS232-Verlängerung&amp;quot; über eine Funkstrecke, die fehlerfrei arbeitet und zu einer Drahtverbindung weitestgehend kompatibel ist.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== RS232 &amp;lt;-&amp;gt; RFM12 ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=== USB &amp;lt;-&amp;gt; RFM12 ===&lt;br /&gt;
&lt;br /&gt;
Mit [http://www.obdev.at/vusb/ V-USB] lässt sich ein USB-Slave in Software emulieren.&lt;br /&gt;
&lt;br /&gt;
* [http://www.recursion.jp/avrcdc/ AVR-CDC] läuft mit Anpassung der USB-Pins. &#039;&#039;(Zumindest unter Windows an einem USB2.0-Port)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Adapter für [http://www.embedded-projects.net/?page_id=135 USBprog]:&lt;br /&gt;
&lt;br /&gt;
* Funktionierender Code liegt im oben genannten SVN&lt;br /&gt;
* Implementiert die USB-CDC-Klasse (kein Treiber nötig)&lt;br /&gt;
* Sicherung der Übertragung durch Hamming-Code&lt;br /&gt;
* Work in progress... (Manuel Stahl)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Alternative rfm12lib ===&lt;br /&gt;
rfm12lib von das-labor.org&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
* Ein einfaches Paketformat, bestehend aus:&lt;br /&gt;
** Einem 8-bit (0..255) Pakettyp- oder Adress-feld&lt;br /&gt;
** Paketlänge bis zu 255 Bytes&lt;br /&gt;
** Eine simple Header Checksumme&lt;br /&gt;
* Interrupt oder Polling basierte Datenübertragung&lt;br /&gt;
* Verschiedene Frequenzbänder, abhängig von dem verwendeten Modul (433, 868 und 915 MHz)&lt;br /&gt;
* Collision avoidance (carrier sense)&lt;br /&gt;
* Synchronisierungsfunktion beim Datenempfang&lt;br /&gt;
* Hardware oder software SPI&lt;br /&gt;
* Nur-Sende-Modus, zum verkleinern der binaries&lt;br /&gt;
* Grundlegende ASK (amplitude shift keying) empfangs und sende Funktionalität (Für Funksteckdosen aus dem Baumarkt und ähnlichem)&lt;br /&gt;
* Low-battery detector (funktion des RFM12)&lt;br /&gt;
* Low-power Wakeup timer (funktion des RFM12)&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [http://www.das-labor.org/wiki/RFM12_library Projektseite]&lt;br /&gt;
* [http://www.das-labor.org/LaborLibTrac/browser/rfm12 Code im SVN]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Basismodul V1.0 ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prozessor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ATmega8 TQFP32 (kompatibel ATmega48, ATmega88, ATmega168)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schnittstellen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* RS232&lt;br /&gt;
* I²C:&lt;br /&gt;
* USB&lt;br /&gt;
* GPIO&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Platine&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:AVR RFM12 Schematic.png|200px|ATmega48 + USB]]&lt;br /&gt;
[[Bild:AVR RFM12 Board TOP.png|220px|2-lagig top]]&lt;br /&gt;
[[Bild:AVR RFM12 Board BOTTOM.png|240px|2-lagig bottom]]&lt;br /&gt;
[[Bild:AVR_RFM12_Photo.jpg|240px|Photo]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; border-right:1px solid gray; padding-right:10px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Bauteile:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Größe: SMD 0603&lt;br /&gt;
&lt;br /&gt;
* R1, R2: 68R (nur USB)&lt;br /&gt;
* R3, R4: 10k&lt;br /&gt;
* R5: 1k5 (nur USB)&lt;br /&gt;
* C1, C2: 22pF&lt;br /&gt;
* C3 - C9: 100nF&lt;br /&gt;
* Q1: 12Mhz (nur USB)&lt;br /&gt;
* D1, D2: beliebig, Minimelf&lt;br /&gt;
* IC3: MAX3221CUE&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; border-right:1px solid gray; padding: 0px 0px 10px 10px; width:33%&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Kosten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MiniUSB SMD: &#039;&#039;&#039;1,25€&#039;&#039;&#039;&lt;br /&gt;
* HF-Buchse MMCX: &#039;&#039;&#039;4,25€&#039;&#039;&#039;&lt;br /&gt;
* ATmega48: &#039;&#039;&#039;2,85€&#039;&#039;&#039;&lt;br /&gt;
* MAX3221CUE: &#039;&#039;&#039;1,10€&#039;&#039;&#039;&lt;br /&gt;
* Quarz 12Mhz 30ppm: &#039;&#039;&#039;1,19€&#039;&#039;&#039;&lt;br /&gt;
* Kleinkram: &#039;&#039;&#039;&amp;lt; 1,10€&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* habe ein verbindliches Angebot für 24 Stück von http://mme-pcb.de/: &#039;&#039;&#039;4,00€ pro Platine&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; padding: 0px 0px 10px 10px; width:33%&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; Bugs / Erweiterungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Der 1,5k Widerstand muss direkt an den VCC-Pin angelötet werden (Pad ist nicht verbunden)&lt;br /&gt;
* Beim Fertigen wurde das Polygon, welches das VCC-Signal durch die eine Ecke des ATmega48 leitet, unterbrochen. Hier hilft nur eine Drahtbrücke.&lt;br /&gt;
* Unter den RFM12 und unter das Quarz am Besten Isolierband kleben!&lt;br /&gt;
* Beim Programmieren sollte der SEL des RFM12 (J1 der zweite Pin vom RS232 aus) auf VCC gelegt werden&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/24012/RFM12.brd Board (Eagle)]:&lt;br /&gt;
&lt;br /&gt;
[[Bild:AVR RFM12 Board top bestuecken.png|200px|top]]&lt;br /&gt;
[[Bild:Board bottom bestuecken.png|200px|bottom]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Flashcraft Funkboard ===&lt;br /&gt;
&lt;br /&gt;
[http://flashcraft.de/index.php/funkboard-uebersicht Homepage des Projekts]&lt;br /&gt;
&lt;br /&gt;
Eine andere Funklösung mit dem RFM12 bietet das &#039;&#039;&#039;Open Source&#039;&#039;&#039; Flashcraft Funkboard von Florian Scherb.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Flashcraft_funkboard_pic.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Projekt enthält&#039;&#039;&#039;&lt;br /&gt;
* Funkboard Platine&lt;br /&gt;
* Code für AVR&lt;br /&gt;
* PC Terminalprogramm&lt;br /&gt;
* Dokumentation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Überblick:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Über 60 Seiten starke Dokumentation&lt;br /&gt;
# PC Terminalprogramm zum Testen und Konfigurieren&lt;br /&gt;
# Abmessungen: 32x34mm, Montage durch 2 Stiftleisten im 2,54mm Raster&lt;br /&gt;
# ATmega32 übernimmt komplette Ansteuerung&lt;br /&gt;
# 3 Schnittstellen sind vorgesehen: I2C, SPI, UART (derzeit nur UART)&lt;br /&gt;
# SMA-Antennenanschluss&lt;br /&gt;
# Stromaufnahme: 40mA im normalen Betrieb, 2 Schlafmodi mit Stromverbrauch bis min. 25µA!&lt;br /&gt;
# Betriebsspannungsbereich von 3,2 - 5,4V (mit ATmega32L)&lt;br /&gt;
# 5V oder 3V Spannungsregler onBoard! Direkter Batteriebetrieb möglich; Kann externe Schaltung versorgen! &lt;br /&gt;
# uvm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Außerdem:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Unterstützt Funknetzwerk mit bis zu 125 Modulen!&lt;br /&gt;
# Kontrolle über fast alle Konfigurationen, direkt im Betrieb änderbar, kein Umprogrammieren notwendig!&lt;br /&gt;
# Zahlreiche Sicherheitsfeatures wie Acknowledge, CRCs,...&lt;br /&gt;
# RS232-Treiberbaustein MAX3221 onBoard. Damit TTL- und RS232-UART möglich&lt;br /&gt;
# Clock Takt am Funkboard abgreifbar, z.B. für externen Mikrocontroller&lt;br /&gt;
# Totzeiten ca. 1,5 Millisekunden beim Wechsel zwischen Sende- und Empfangsbetrieb&lt;br /&gt;
# uvm. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltpläne, Board-Layout, Sourcecodes und andere Files sind auf der [http://flashcraft.de/index.php/funkboard-uebersicht Homepage] des Funkboard-Projekts verfügbar. Diskussionen zum Projekt gibt es im [http://www.mikrocontroller.net/topic/115542 Forums-Thread]&#039;&#039;&#039;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== USBprogRFM12 ===&lt;br /&gt;
&lt;br /&gt;
Da der USBprog genau das SPI-Interface des ATmega32 zur Verfügung stellt, eignet er sich perfekt als USB-RFM12-Adapter.&lt;br /&gt;
&lt;br /&gt;
[[Bild:USBprogRFM12_schematic.png|200px|USBprogRFM12]] [[Bild:USBprogRFM12_board.png|200px|USBprogRFM12]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:USBprogRFM12.jpg|400px|USBprogRFM12]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/65984 Allgemeine Diskussion]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/71682  bidirektionale RS232 Funkbrücke mit RFM12]&lt;br /&gt;
* [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Datenfunk mit dem AVR] bei das-labor.org&lt;br /&gt;
* [http://news.jeelabs.org/docs/jn3.html JeeNode (v3)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;/div&gt;</summary>
		<author><name>Stan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Include-Files&amp;diff=33976</id>
		<title>Include-Files</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Include-Files&amp;diff=33976"/>
		<updated>2009-01-26T10:31:06Z</updated>

		<summary type="html">&lt;p&gt;Stan: link added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Allgemein Dateien, die im Rahmen der Verarbeitung einer anderen Datei &#039;&#039;eingeschlossen&#039;&#039; (inkludiert) werden.&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung werden Include-Files häufig eingesetzt, um das wiederholte Hinterlegen ein und derselben Information in mehreren Dateien zu vermeiden (z.B. die Beschreibung häufig verwendeter Datenstrukturen).&lt;br /&gt;
&lt;br /&gt;
Für die bei der Programmierung von Mikrocontrollern oft verwendeten, [[HLL|höheren Programmiersprachen]] [[C]] und [[C-Plusplus|C++]] bietet der [[C-Präprozessor]] entsprechende Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
siehe auch: [[Include-Files (C)]]&lt;/div&gt;</summary>
		<author><name>Stan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eagle_im_Hobbybereich&amp;diff=31874</id>
		<title>Eagle im Hobbybereich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eagle_im_Hobbybereich&amp;diff=31874"/>
		<updated>2008-10-17T10:48:18Z</updated>

		<summary type="html">&lt;p&gt;Stan: /* Schaltplan */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe bis vor kurzem keinerlei Erfahrung mit einem PCB Programm gehabt. Meine ersten Schritte habe ich mit Gschem und PCB versucht. Sie waren auch einigermassen erfolgreich. Mittlerweile bin ich zu Eagle gewechselt. &lt;br /&gt;
Es finden sich einfach mehr Informationen zu Eagle und die Freeware ist für mich vollkommen ausreichend. Desweitern muss ich für das nächste Projekt im Studium Eagle benutzten. Daher will ich erstmal ein System erlernen.&lt;br /&gt;
&lt;br /&gt;
Meine ersten Erfahrungen zu Eagle waren eigentlich grundsätzlich ganz positiv. Was jedoch völlig in die Hose gegangen ist ist die fertige Platine. Nach dem Belichten, Entwickeln, Ätzen, Bohren und Bestücken sind mir meine Fehler erstmal  so wirklich aufgefallen.&lt;br /&gt;
Viele Leiterbahnen und Pads waren einfach nicht Hobbygerecht ausgeführt. Sind die Pads zu klein und man bohrt nicht ganz genau gibt das nur Ärger.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund soll dieser Artikel kein Eagle Tutorial werden, sondern eher eine Anlaufstelle mit welchen optimalen Einstellungen Eagle im Hobbybereich verwendbar ist. &lt;br /&gt;
&lt;br /&gt;
Meine meisten Informationen habe ich aus folgenden Büchern:&lt;br /&gt;
&lt;br /&gt;
* Michael Schramm: &amp;quot;Entwurf und Herstellung gedruckter Schaltungen&amp;quot;, Elektor Verlag, 5.Auflage (recht alt, aber sinnvolle Tips zum Positionieren von Bauteilen, Verlegen von Leitungen und Tips zu Eagle 2.05)&lt;br /&gt;
* Ketler, Neujahr: &amp;quot;Leiterplattendesign mit Eagle&amp;quot;, mitp Verlag&lt;br /&gt;
&lt;br /&gt;
Sehr zu empfehlen ist das erste Buch. Optimale Leiterbahnendicken werden unter Berücksichtigung des Machbaren im Hobbybereich berechnet und definiert. &lt;br /&gt;
&lt;br /&gt;
Ich habe mich entschlossen, Eagle nochmal von Vorne an zu erlernen und die Tips aus beiden Büchern mit einzubeziehen. Deshalb wird diese Seite auch erst langsam wachsen. Natürlich sind die Tips und Tricks von langjährigen Eagle Nutzern nicht durch das Geschwafel aus den Büchern ersetzbar. Also daher auch der Aufruf an jeden: Mitmachen.&lt;br /&gt;
&lt;br /&gt;
== Empfehlungen für Leiterbahnen im Hobbybereich ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Breite&amp;lt;BR&amp;gt;[mil]&lt;br /&gt;
!Breite&amp;lt;BR&amp;gt;[mm]&lt;br /&gt;
!Verwendungszweck&lt;br /&gt;
!Strombelastbarkeit&amp;lt;BR&amp;gt;[A]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |14&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0.35&lt;br /&gt;
|für IC-Durchführungen und als Standardleiterbreite, wenn wenig Platz ist&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0.5&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |36&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0.91&lt;br /&gt;
|Standardleiter bei genügend Platz&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1.5&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |58&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1.47&lt;br /&gt;
|Mittlere Breite&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |86&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2.18&lt;br /&gt;
|Kräftiger Leiter für Versorgungsspannung und Masse&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |136&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3.45&lt;br /&gt;
|Sehr kräftiger Leiter für große Elkos und Leistungsbauteile&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |225&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |5.72&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Warum diese Leiterbahndicken gewählt wurden, ist im [Schramm] zu finden. Grundsätzlich haben sie mit der optimalen Isolation, dem Grid und der optimal erreichbaren Packungsdichte zu tun.&lt;br /&gt;
&lt;br /&gt;
Die benutzten Leiterbreiten und Pads besitzen immer mind. 10 mil Isolationsabstand. Die feinster 14 mil Leiter ist im Grundraster 0.025 anreihbar. Betriebsspannungen sollen mind. ueber 36 mil breiter Leiterbahnen geführt werden, IC-Durchführungen sind hierbei zu vermeiden. Siehe auch [[Leiterbahnbreite]].&lt;br /&gt;
&lt;br /&gt;
== Pad-Innendurchmesser / Bohrlöcher ==&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich: Je weniger Bohrstärken desto weniger Bohrerwechsel und Kosten (z.B. bei professioneller PCB Herstellung)&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!DRILL&amp;lt;BR&amp;gt;[mil]&lt;br /&gt;
!Zurdnung&amp;lt;BR&amp;gt;Werkzeug Nr.&lt;br /&gt;
!Auszuführender&amp;lt;BR&amp;gt;Bohrdurchmesser&amp;lt;BR&amp;gt;[mm]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |22&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |TO 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0.8&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |24&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |TO 2&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1.0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |26&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |TO 3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1.3&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |28&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |TO 4&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1.6&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |30&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |TO 5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2.8&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |32&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |TO 6&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3.5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Padformen und Außendurchmesser ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Form&lt;br /&gt;
!Größe&amp;lt;BR&amp;gt;[mil]&lt;br /&gt;
!Verwendung&lt;br /&gt;
|-&lt;br /&gt;
|Quadrat&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |62&lt;br /&gt;
|nur für Anreihungen in 0.1&amp;quot; wie in IC&#039;s und Stecker nach DIN 41651, DIN 41612&lt;br /&gt;
|-&lt;br /&gt;
|Octagon&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |86&lt;br /&gt;
|Widerstände Bauform 0207, Kleindioden, kleine Kondensatoren, Transistor TO-92&lt;br /&gt;
|-&lt;br /&gt;
|Octagon&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |136&lt;br /&gt;
|größere Bauteile und einzelne Lötstifte&lt;br /&gt;
|-&lt;br /&gt;
|Octagon&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |225&lt;br /&gt;
|größte Bauteile, z.B. axiale Elko, Printtrafo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pads für Befestigungsbohrungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Rund 189 mil außen, 28 mil innen für 2.8 mm Bohrung&lt;br /&gt;
Rund 217 mil außen, 30 mil innen für 3.5 mm Bohrung&lt;br /&gt;
&lt;br /&gt;
== Auswahl des Rasters ==&lt;br /&gt;
&lt;br /&gt;
=== Schaltplan ===&lt;br /&gt;
&lt;br /&gt;
Im Schaltplan ist es &#039;&#039;&#039;dringend&#039;&#039;&#039; empfohlen, die Pins von Bauteilen sowie die Netze nur auf dem voreingestellten Raster von 0.1 Inch (100mil) zu platzieren. Warum? Weil Eagle nur dann Pins und Netzteile automatisch verbinden kann, wenn die Endpunkte &#039;&#039;&#039;exakt&#039;&#039;&#039; die gleichen Koordinaten haben. Siehe Handbuch. Also hier bitte &#039;&#039;&#039;nicht&#039;&#039;&#039; das Raster verändern. Ausnahmen davon sind Names, Values und Bauteilumrandungen. Die können auf einem beliebigen Raster platziert werden und z.B. nach dem Befehl &#039;&#039;&#039;SMASH&#039;&#039;&#039; beliebig verschoben werden (alternatives Raster mit gedrückter &#039;&#039;&#039;ALT&#039;&#039;&#039;-Taste nutzen).&lt;br /&gt;
&lt;br /&gt;
=== Layout ===&lt;br /&gt;
&lt;br /&gt;
Hier sollte man zu Bauteilplatzierung ein eher grobes Raster wählen, z.B. 50mil, um eine saubere Ausrichtung der Bauteile zu erreichen. Zum Layouten dann auf ein feines Raster umschalten, welches aber möglichst ein ganzzahliger Teiler des groben Raster ist. Also z.B. 25mil oder für feinere Sachen 10mil. Es ist auch nicht verkehrt das metrische System einzustellen. Somit hat man viel eher eine Größenvorstellung. Allerdings hat man dann ein paar Probleme Leitungen genau mittig durch die meist immer noch zollmassigen Stecker und Pins zu verlegen. Hier sollte man besser bei einem zollbasiertem Raster bleiben.&lt;br /&gt;
&lt;br /&gt;
=== Leitungen gerade anschliessen ===&lt;br /&gt;
&lt;br /&gt;
Anfäger haben oft das Problem, dass ein IC mit metrischem Pinraster nicht sauber  layoutet werden kann, weil das Raster zum Layouten meist zöllig ist (siehe oben). Das ist aber kein Problem. &#039;&#039;&#039;Man muss mit dem Routen am Pin des betreffenden Bauteils anfangen!&#039;&#039;&#039; Denn dann beginnt Eagle &#039;&#039;&#039;exakt&#039;&#039;&#039; mittig auf dem Pad mit der Leiterbahnverlegung. Es versucht dann halbautomatisch, möglicht kurz auf das aktuelle Raster zu springen. Dabei kann man mit der rechten Maustaste den Verlegemodus umstellen (direkt, 45 Grad Knicke, Bögen etc.). Nach dem ersten Click ist man dann auf dem normalen Raster und kann ganz einfach und sauber layouten.&lt;br /&gt;
&lt;br /&gt;
== Weitere Tips ==&lt;br /&gt;
&lt;br /&gt;
=== Projektbeschreibung ===&lt;br /&gt;
&lt;br /&gt;
Nutze die Projektbeschreibungen. Projektbeschreibungen sollten erfolgen und genutzt werden. Viele Informationen zur Schaltung lassen sich hier noch unterbringen und man weiß später noch was man wie und wieso gemacht hat.&lt;br /&gt;
&lt;br /&gt;
RECHTE MAUSTASTE auf das Projekt -&amp;gt; EDIT DESCRIPTION&lt;br /&gt;
&lt;br /&gt;
Die Formatierung kann im HTML-Format erfolgen,&lt;br /&gt;
z.B.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt; zu digitales Labornetzteil  &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Dieses Verzeichniss enthält das digitale Labornetzteil von tuxgraphics.org&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Die Schaltung sowie das Layout sind von mir für meine Zwecke optimiert worden. &lt;br /&gt;
Für die Zukunft will ich noch ein paar Funktionen hinzufügen und die Schaltung erweitern.&amp;lt;/p&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Voreinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Wer mit COMMAND TEXT arbeitet, dem kann eventuell die Eagle.scr Einstellungsdatei hier weiterhelfen. Bitte auf die ID achten. Ich probiere momentan noch ein wenig mit der Datei herum. Evtl. stellen sich manche Einstellungen als Unsinn heraus. Daher kann es vorkommen, dass ich dies hier ab und zu mal aktualisieren werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Configuration Script&lt;br /&gt;
#&lt;br /&gt;
# This file can be used to configure the editor windows.&lt;br /&gt;
#	$Id: eagle.scr,v 1.6 2006/04/08 14:08:24 sascha Exp $	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Einstellungen für Layoutprogramm&lt;br /&gt;
BRD:&lt;br /&gt;
&lt;br /&gt;
Grid Default On;	# Gitter auf Normalwert (0.5)&lt;br /&gt;
Layer Bottom;   # Erster aktiver Layer ist Solder&lt;br /&gt;
&lt;br /&gt;
# Leiterbahnnen&lt;br /&gt;
Change Width 0.014;  # Erste aktive Linienbreite&lt;br /&gt;
#Set auto_width 0.014; # Linienbreite für Autorouter&lt;br /&gt;
Set Width 0.014 0.036 0.058 0.086 0.136 0.225  # Auswahl Linienbreiten, die angeboten werden&lt;br /&gt;
&lt;br /&gt;
# Menue&lt;br /&gt;
# Menu Add Change Copy Delete \&lt;br /&gt;
#     Display \&lt;br /&gt;
#     Grid Group Move Name \&lt;br /&gt;
#     Quit \&lt;br /&gt;
#     Route Script Show Signal \&lt;br /&gt;
#     Split Text Value Via \&lt;br /&gt;
#     Window &#039;;&#039; \&lt;br /&gt;
#     Wire Write Use Edit; &lt;br /&gt;
&lt;br /&gt;
MENU &#039;Grid {\&lt;br /&gt;
             Metric   {\&lt;br /&gt;
                        Fine   : Grid mm 0.1; |\&lt;br /&gt;
                        Coarse : Grid mm 1;\&lt;br /&gt;
                      } | \&lt;br /&gt;
             Imperial {\&lt;br /&gt;
                        Fine   : Grid inch 0.001; |\&lt;br /&gt;
                        Coarse : Grid inch 0.1;\&lt;br /&gt;
                      } | \&lt;br /&gt;
             On  : Grid On; | \&lt;br /&gt;
             Off : Grid Off;\&lt;br /&gt;
           }&#039;\&lt;br /&gt;
     &#039;Display {\&lt;br /&gt;
                Top       : Display None Top    Pads Vias Dimension; |\&lt;br /&gt;
                Bottom    : Display None Bottom Pads Vias Dimension; |\&lt;br /&gt;
                Placeplan {\&lt;br /&gt;
                            Top    : Display None tPlace Dimension; |\&lt;br /&gt;
                            Bottom : Display None bPlace Dimension;\&lt;br /&gt;
                          }\&lt;br /&gt;
              }&#039;\&lt;br /&gt;
     &#039;---&#039;\&lt;br /&gt;
     &#039;Fit : Window Fit;&#039;\&lt;br /&gt;
     &#039;Add&#039; &#039;Delete&#039; &#039;Move&#039; &#039;;&#039; &#039;Edit&#039; &#039;Quit&#039;\&lt;br /&gt;
     ;&lt;br /&gt;
&lt;br /&gt;
# VIAs&lt;br /&gt;
#set diamaeter 0.063;  # Via Durchmesser&lt;br /&gt;
#set drill 0.020;      # DRILL für VIA&lt;br /&gt;
#change shape oc;      # VIAs 8-Eck Wahl&lt;br /&gt;
&lt;br /&gt;
# Bohrloecher&lt;br /&gt;
#change diameter 0.063;  # Erster aktiver Durchmesser&lt;br /&gt;
#set drill 0.020;    # Ertse aktive Drilleinstellung&lt;br /&gt;
&lt;br /&gt;
# Autorouter&lt;br /&gt;
#set auto_shape oc;	# Autorouter VIA 8-Eck&lt;br /&gt;
#set auto_diameter 0.063;  # Autorouter VIA-Durchmesser&lt;br /&gt;
#set auto_drill 0.020;     # Autorouter VIA DRILL&lt;br /&gt;
&lt;br /&gt;
# Schriftgrö??en&lt;br /&gt;
#set size 0.050 0.070 0.100 0.150   # Schriftgrö??enauswahl&lt;br /&gt;
#change size 0.070;   # Erste aktive Schriftgrö??e&lt;br /&gt;
     &lt;br /&gt;
#Menu Add Change Copy Delete Display Grid Group Move Name Quit Rect \&lt;br /&gt;
#     Route Script Show Signal Split Text Value Via Window &#039;;&#039;  Wire Write Edit;&lt;br /&gt;
&lt;br /&gt;
# --------------------&lt;br /&gt;
# Einstellungen für den Schaltplan&lt;br /&gt;
SCH:&lt;br /&gt;
&lt;br /&gt;
# Grid&lt;br /&gt;
Grid Default;	# Gitter auf Normalwert (100 mil), wird auch von Eagle Empfohlen&lt;br /&gt;
Grid Mil;	# Einheiten auf MIL umstellen&lt;br /&gt;
Grid Alt Mil 50 Mil;     # Alternatives (feineres Gitte) mit 50 mil, Umschalten mit ALT-Taste&lt;br /&gt;
Grid Dots;	# Punkte &lt;br /&gt;
Grid On;	# Grid an&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Change Width 0.006;&lt;br /&gt;
&lt;br /&gt;
MENU &#039;Grid {\&lt;br /&gt;
             Imperial {\&lt;br /&gt;
	     		Finest: Grid Mil 25 Dots on;|\&lt;br /&gt;
                        Fine   : Grid Mil 50 Dots on ; |\&lt;br /&gt;
                        Normale : Grid Mil 100 Dots on;\&lt;br /&gt;
                      } | \&lt;br /&gt;
             On  : Grid On; | \&lt;br /&gt;
             Off : Grid Off;\&lt;br /&gt;
           }&#039;\&lt;br /&gt;
     &#039;Display {\&lt;br /&gt;
                All Important: Display None Nets Busses Symbols Names Values; |\&lt;br /&gt;
                Components  : Display None Symbols Names Values; |\&lt;br /&gt;
                Wires       : Display None Net Busses; |\&lt;br /&gt;
		No Names and Values   : Display None Nets Busses Symbols -Names -Values; \&lt;br /&gt;
              }&#039;\&lt;br /&gt;
     &#039;---&#039;\&lt;br /&gt;
     &#039;Fit : Window Fit;&#039;\&lt;br /&gt;
     &#039;Add&#039; \&lt;br /&gt;
     &#039;---&#039; \&lt;br /&gt;
     &#039;Group&#039; &#039;Move&#039; &#039;Delete&#039; &#039;Edit&#039; \&lt;br /&gt;
     &#039;---&#039; \&lt;br /&gt;
     &#039;Label&#039; &#039;Name&#039; &#039;Value&#039;\&lt;br /&gt;
     &#039;---&#039; \&lt;br /&gt;
     &#039;Net&#039; &#039;Bus&#039; &#039;Wire&#039; &#039;Junction&#039;  \&lt;br /&gt;
     &#039;---&#039; \&lt;br /&gt;
     &#039;;&#039; &#039;Quit&#039;\&lt;br /&gt;
     ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Menu Add Bus Change Copy Delete Display Gateswap Grid Group Invoke Junction \&lt;br /&gt;
#     Label Move Name Net Pinswap Quit Script Show Split Value Window &#039;;&#039; \&lt;br /&gt;
#     Wire Write Edit;&lt;br /&gt;
&lt;br /&gt;
LBR:&lt;br /&gt;
&lt;br /&gt;
#Menu Close Export Open Script Write &#039;;&#039; Edit;&lt;br /&gt;
&lt;br /&gt;
DEV:&lt;br /&gt;
&lt;br /&gt;
Grid Default;&lt;br /&gt;
#Menu Add Change Copy Connect Delete Display Export Grid Move Name Package \&lt;br /&gt;
#     Prefix Quit Script Show Value Window &#039;;&#039; Write Edit;&lt;br /&gt;
&lt;br /&gt;
SYM:&lt;br /&gt;
&lt;br /&gt;
Grid Default On;&lt;br /&gt;
Change Width 0.010;&lt;br /&gt;
#Menu Arc Change Copy Cut Delete Display Export Grid Group Move Name Paste \&lt;br /&gt;
#     Pin Quit Script Show Split Text Value Window &#039;;&#039; Wire Write Edit;&lt;br /&gt;
&lt;br /&gt;
PAC:&lt;br /&gt;
&lt;br /&gt;
Grid Default On;&lt;br /&gt;
Change Width 0.005;&lt;br /&gt;
Change Size 0.050;&lt;br /&gt;
#Menu Add Change Copy Delete Display Grid Group Move Name Pad Quit \&lt;br /&gt;
#     Script Show Smd Split Text Window &#039;;&#039; Wire Write Edit;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Module kopieren ===&lt;br /&gt;
&lt;br /&gt;
Manchmal hat man eine kleine Anordnung von Bauteilen, welche mehrfach verwendet werden soll, z.B. in einer Relaisansteuerung mit mehreren Kanälen. Da ist es sinnvoll, dieses Modul nur einmal im Schaltplan zu erstellen, zu platzieren und zu layouten und dann mehrfach zu kopieren. Leider geht das so direkt nicht mit Eagle. Es gibt aber einen brauchbaren Trick.&lt;br /&gt;
&lt;br /&gt;
* Baugruppe im Schaltplan anlegen&lt;br /&gt;
* &#039;&#039;&#039;Alle&#039;&#039;&#039; Signale mit &#039;&#039;&#039;NAME&#039;&#039;&#039; benennen (die N$xx sind spezielle automatische Netznamen, die funktionieren hier nicht)&lt;br /&gt;
* Die Namen dürfen keine Nummer beinhalten&lt;br /&gt;
* Ins Board wechseln, Bauteile platzieren und layouten&lt;br /&gt;
* Alles &#039;&#039;&#039;speichern&#039;&#039;&#039;, danach eine Sicherheitskopie von Board und Schaltplan erstellen&lt;br /&gt;
* Board schliessen&lt;br /&gt;
* Im Schaltplan die Baugruppe mit &#039;&#039;&#039;GROUP&#039;&#039;&#039; markieren und über &#039;&#039;&#039;CUT/PASTE&#039;&#039;&#039; vervielfältigen (rechte Maustaste bei &#039;&#039;&#039;CUT&#039;&#039;&#039;)&lt;br /&gt;
* Schaltplan speichern und schliessen&lt;br /&gt;
* Schaltplan wieder öffnen, Eagle lädt automatisch auch das Board und meckert wegen der Inkonsistenz&lt;br /&gt;
* Ins Board gehen und auch dort die Baugruppe mit &#039;&#039;&#039;GROUP&#039;&#039;&#039; markieren und mitsammt Layout über &#039;&#039;&#039;CUT/PASTE&#039;&#039;&#039; kopieren (rechte Maustaste bei &#039;&#039;&#039;CUT&#039;&#039;&#039;)&lt;br /&gt;
* Jetzt im Board &#039;&#039;&#039;ERC&#039;&#039;&#039; durchführen, Eagle wird eine Inkonsistenz feststellen, weil einige Signalnamen nicht übereinstimmen. Das gilt vor allem für gemeinsame GND/VCC.&lt;br /&gt;
* Im Board die Namen korrigieren (&#039;&#039;&#039;NAME&#039;&#039;&#039;)&lt;br /&gt;
* Danach sind Board und Schaltplan wieder konsistent.&lt;br /&gt;
* Speichern!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Platinen]]&lt;/div&gt;</summary>
		<author><name>Stan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Touchpad&amp;diff=30216</id>
		<title>Touchpad</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Touchpad&amp;diff=30216"/>
		<updated>2008-08-15T10:27:45Z</updated>

		<summary type="html">&lt;p&gt;Stan: typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Touchpad – do it yourself=&lt;br /&gt;
&lt;br /&gt;
Dieses Platinentouchpad reagiert nicht wie die herkömmlichen Touchs auf Kapazität sondern auf den Hautwiderstand. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Funktionsweise:==&lt;br /&gt;
&lt;br /&gt;
====Der Touch:====&lt;br /&gt;
&lt;br /&gt;
Auf einer Platine ist jeweils eine Minusleitung direkt neben einer Sensorleitung. Beim Berühren wird die Sensorleitung hochohmig mit der Minusleitung verbunden. Bei den Pullupwiderständen gilt desto höher der Wert desto feinfühliger reagiert der Touch. Ich würde hier Werte zwischen 500 Kiloohm und 2000 Kiloohm nehmen je nachdem wie man die Touchplatine aufgebaut hat und wo und wie man sie einsetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Touch.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Touchschaltplan.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Die Auswerteeinheit:====&lt;br /&gt;
&lt;br /&gt;
Die Auswerteeinheit ist extrem einfach:&lt;br /&gt;
Ein 4066 cmos-Ic beinhaltet 4 digitale Schalter. Wenn die Steuerleitung an den Pluspol gelegt wird „schaltet“ der Schalter durch und wenn sie an Masse gelegt wird ist er geöffnet.&lt;br /&gt;
Eine der Seiten der Schalter sind an den Mikrocontroller angeschlossen, die anderen an Minus, die Steuerleitungen an den Touch&lt;br /&gt;
Ein AVR wertet die Signale von dem 4066 aus und sendet wenn der Touch berührt wurde dem Hostcontroller seriell die Daten&lt;br /&gt;
&lt;br /&gt;
==Touchkreis:==&lt;br /&gt;
&lt;br /&gt;
 [[Bild:Touchkreistest.jpg]] &lt;br /&gt;
Eine Möglichkeit ist ein Touchkreis zu bauen. Natürlich kann man auch andere Formen gestalten. Bei dieser Version kann man srollen (im Uhrzeigersinn oder gegen den Uhrzeigersinn über den Kreis fahren) und hat die Möglichkeit 4 Taster (Oben, Unten, Recht, Links) zu benutzen. Durch ein Doppelklick (wie beim Laptop) wird dem Touchcontroller gezeigt das es sich um ein Tasten handelt und nicht um srollen.&lt;br /&gt;
Ich hab hier  ein ATtiny13 eingesetzt, weil er die benötigten Portpins hat, sehr bekannt ist/ oft eingesetzt wird und preiswert ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Der Aufbau===&lt;br /&gt;
====Des Touchs====&lt;br /&gt;
Man muss bei der Platine eigentlich nur zwei Sachen beachten:&lt;br /&gt;
&lt;br /&gt;
1)	Der innere Kreis darf nicht direkt an den vier Sensorflächen anliegen, weil sonst der Touch sehr feuchtigkeitsempfindlich wird und &lt;br /&gt;
2)	Das Gehäuse muss die Sensorleitungen die zu den Sensorflächen führen vollständig abdecken sonst würde man z.B wenn man Rechts berührt die Leitung wo nach Oben führt auch an Masse legen.&lt;br /&gt;
&lt;br /&gt;
====In Standgeräten:====&lt;br /&gt;
Das Problem in Standgeräten ist das man normalerweise waagerecht tippt. Daher berührt nur die Fingerkuppe den Touch.&lt;br /&gt;
Ich würde hier die Sensorflächen ein bisschen näher an den Minuskreis legen, außerdem die Pullupwiderstände vor den 4066er Eingängen erhöhen (nicht zu hoch sonst treten Probleme auf wenn man schwitzt, dagegen Haucht oder sich in stark feuchten Räumen befindet).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====In Handgeräten:====&lt;br /&gt;
Hier hat man den Vorteil das man fast parallel zum Gehäuse den Touch berührt (-&amp;gt; große Auflegefläche daher kann man die Pullups vor den 4066er Eingängen ein bisschen senken)&lt;br /&gt;
In Handgehäusen bietet sich oft nicht viel Platz deswegen würde ich eine kleine doppelseitige Platine verwenden auf der eine Seite der Touch und auf der Rückseite die Auswerteelektronik komplett in SMD.&lt;br /&gt;
&lt;br /&gt;
===Die Funktionsweise der Software des AVRs===&lt;br /&gt;
&lt;br /&gt;
Im Hauptprogramm wird erst kontrolliert ob zu hohe Feuchtigkeit ist dann ob man die Tastensperre aktiviert werden sollte und dann werden noch alle Toucheingänge abgefragt und wenn eine Sensorfläche berührt wurde wird die alte Berührung mit der jetzigen verglichen. Wenn ein danebenliegendes Feld berührt wurde wird mit dem Uhrzeigersinn scrollen oder gegen den Uhrzeigersinn srollen in Register 18 gespeichert danach oder wenn ein anderes Feld berührt wurde wird die jetzige Berührung einfach in das Register wo die alte Berührung ist verschoben. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
;+----------------------------------------------------------------------&lt;br /&gt;
;| Title		: Touchkreiscode&lt;br /&gt;
;+----------------------------------------------------------------------&lt;br /&gt;
;| Funktion		: man mit dem Uhrzeigersinn scrollen und gegen den&lt;br /&gt;
;|		  Uhrzeigersinn&lt;br /&gt;
;| Schaltung	: Die Anschlüsse PB4, PB2, PB1, PB0 sind an die 4&lt;br /&gt;
;|                    4066 IC-Ausgänge angeschlossen. Die anderen an&lt;br /&gt;
;|                    Minus. Die Steuereingänge des 4066 sind an die&lt;br /&gt;
;|                    4 Touchfelder angeschlossen mit hochomigen&lt;br /&gt;
;|                    Wiederständen zu Plus (damit dei eingänge nicht&lt;br /&gt;
;|                    wahllos an und ausschalten)&lt;br /&gt;
;|	           ____    ____&lt;br /&gt;
;|	          /    |__|    |&lt;br /&gt;
;|		--|RST      VCC|-- Plus&lt;br /&gt;
;|		  |            |&lt;br /&gt;
;|   Ausgangssignal --|PB3      PB2|-- Unteres Touchfeld&lt;br /&gt;
;|		  |            |&lt;br /&gt;
;|Rechtes Touchfeld --|PB4      PB1|-- Linkes Touchfeld&lt;br /&gt;
;|	          |            |&lt;br /&gt;
;|	  Minus --|GND      PB0|-- Oberes Touchfeld&lt;br /&gt;
;|		  |____________|&lt;br /&gt;
;|&lt;br /&gt;
;+----------------------------------------------------------------------&lt;br /&gt;
;| Prozessor	: ATtiny13 , ATmega8&lt;br /&gt;
;| Takt		: egal&lt;br /&gt;
;| Sprache       	: Assembler&lt;br /&gt;
;| Datum         	: heute&lt;br /&gt;
;| Version       	: 1.1&lt;br /&gt;
;| Autor         	: Tobias Frintz, 15&lt;br /&gt;
;|		  Tobias-Frintz@web.de&lt;br /&gt;
;+----------------------------------------------------------------------&lt;br /&gt;
.include	&amp;quot;AVR.H&amp;quot;&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
;Reset and Interrupt vector             ;VNr.  Beschreibung&lt;br /&gt;
	rjmp	main	;1   POWER ON RESET&lt;br /&gt;
	reti		;2   Int0-Interrupt&lt;br /&gt;
	reti		;3   Int1-Interrupt&lt;br /&gt;
	reti		;4   TC2 Compare Match&lt;br /&gt;
	reti		;5   TC2 Overflow&lt;br /&gt;
	reti		;6   TC1 Capture&lt;br /&gt;
	reti		;7   TC1 Compare Match A&lt;br /&gt;
	reti		;8   TC1 Compare Match B&lt;br /&gt;
	reti		;9   TC1 Overflow&lt;br /&gt;
	reti		;10  TC0 Overflow&lt;br /&gt;
	reti		;11  SPI, STC Serial Transfer Complete&lt;br /&gt;
	reti		;12  UART Rx Complete&lt;br /&gt;
	reti		;13  UART Data Register Empty&lt;br /&gt;
	reti		;14  UART Tx Complete&lt;br /&gt;
	reti		;15  ADC Conversion Complete&lt;br /&gt;
	reti		;16  EEPROM Ready&lt;br /&gt;
	reti		;17  Analog Comparator&lt;br /&gt;
	reti		;18  TWI (I²C) Serial Interface&lt;br /&gt;
	reti		;19  Store Program Memory Ready&lt;br /&gt;
; r16 ist das Arbeitesregister&lt;br /&gt;
;&lt;br /&gt;
; r17 speichert die alte Berührung:&lt;br /&gt;
;      oben   = 1&lt;br /&gt;
;      rechts = 2&lt;br /&gt;
;      unten  = 3&lt;br /&gt;
;      links  = 4&lt;br /&gt;
;&lt;br /&gt;
; r18 ist das Register in dem das Ausggangssignal steht&lt;br /&gt;
;	Feuchtigkeitsfehler     = 0b00000001&lt;br /&gt;
;	Tastensperre            = 0b00000111&lt;br /&gt;
;	Gegen den Uhrzeigersinn = 0b00000010&lt;br /&gt;
;	Mit dem Uhrzeigersinn   = 0b00000100&lt;br /&gt;
;	Obengetastet            = 0b00000101&lt;br /&gt;
; &lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
;Start, Power ON, Reset&lt;br /&gt;
main:	ldi	r16,lo8(RAMEND)&lt;br /&gt;
	out	SPL,r16&lt;br /&gt;
	ldi	r16,hi8(RAMEND)&lt;br /&gt;
	out	SPH,r16&lt;br /&gt;
	sbi	DDRC,0	;Leds auf Output&lt;br /&gt;
	sbi	DDRC,1&lt;br /&gt;
	sbi	DDRC,2&lt;br /&gt;
	sbi	PORTB,0	; Pullup einschalten für Touch&lt;br /&gt;
	sbi	PORTB,1&lt;br /&gt;
	sbi	PORTB,2&lt;br /&gt;
	sbi	PORTB,4&lt;br /&gt;
	ldi	r18,0b00000000&lt;br /&gt;
	clr	r19&lt;br /&gt;
	clr	r20&lt;br /&gt;
	clr	r21&lt;br /&gt;
	clr	r22&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
mainloop:	wdr&lt;br /&gt;
	rcall	Tastensperre&lt;br /&gt;
	out	PORTC,r18&lt;br /&gt;
	sbis	PINB,0&lt;br /&gt;
	rjmp	Obenberuehrt&lt;br /&gt;
	sbis	PINB,1&lt;br /&gt;
	rjmp	Linksberuehrt&lt;br /&gt;
	sbis	PINB,2&lt;br /&gt;
	rjmp	Untenberuehrt&lt;br /&gt;
	sbis	PINB,4&lt;br /&gt;
	rjmp	Rechtsberuehrt&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Obenberuehrt:&lt;br /&gt;
	ldi	r16,2&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	im_uhrzeigersinn&lt;br /&gt;
	ldi	r16,4&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	geg_uhrzeigersinn&lt;br /&gt;
	ldi	r17,1&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;--------------------------------------------------------------------------&lt;br /&gt;
Rechtsberuehrt:&lt;br /&gt;
	ldi	r16,3&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	im_uhrzeigersinn&lt;br /&gt;
	ldi	r16,1&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	geg_uhrzeigersinn&lt;br /&gt;
	ldi	r17,2&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;-------------------------------------------------------------------------&lt;br /&gt;
Untenberuehrt:&lt;br /&gt;
	ldi	r16,4&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	im_uhrzeigersinn&lt;br /&gt;
	ldi	r16,2&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	geg_uhrzeigersinn&lt;br /&gt;
	ldi	r17,3&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;--------------------------------------------------------------------------&lt;br /&gt;
Linksberuehrt:&lt;br /&gt;
	ldi	r16,1&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	im_uhrzeigersinn&lt;br /&gt;
	ldi	r16,3&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	geg_uhrzeigersinn&lt;br /&gt;
	ldi	r17,4&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;---------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tastensperre:&lt;br /&gt;
	sbic	PINB,0&lt;br /&gt;
	ret&lt;br /&gt;
	sbis	PINB,1&lt;br /&gt;
	ret&lt;br /&gt;
	sbic	PINB,2&lt;br /&gt;
	ret&lt;br /&gt;
	sbis	PINB,4&lt;br /&gt;
	ret&lt;br /&gt;
	;jetzt ist die tasstensperre aktiviert	&lt;br /&gt;
	ldi	r18,0b00000111&lt;br /&gt;
	out	PORTC,r18&lt;br /&gt;
	ldi	r17,100&lt;br /&gt;
&lt;br /&gt;
Aktiviert:	wdr&lt;br /&gt;
	rcall	Feuchtigkeit&lt;br /&gt;
	sbis	PINB,0&lt;br /&gt;
	rjmp	Aktiviert&lt;br /&gt;
	sbic	PINB,1&lt;br /&gt;
	rjmp	Aktiviert&lt;br /&gt;
	sbis	PINB,2&lt;br /&gt;
	rjmp	Aktiviert&lt;br /&gt;
	sbic	PINB,4&lt;br /&gt;
	rjmp	Aktiviert&lt;br /&gt;
	ldi	r18,0b00000000&lt;br /&gt;
	out	PORTC,r18&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
im_uhrzeigersinn:&lt;br /&gt;
	ldi	r18,0b00000100&lt;br /&gt;
	ldi	r17,100&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;---------------------------------------------------------------------------&lt;br /&gt;
geg_uhrzeigersinn:&lt;br /&gt;
	ldi	r18,0b00000010&lt;br /&gt;
	ldi	r17,100&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;---------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Feuchtigkeit:&lt;br /&gt;
	sbic	PINB,0	; Wenn auf dem Touchpad Wasser ist&lt;br /&gt;
	ret		; sind alle Touchfelder &amp;quot;berührt&amp;quot;&lt;br /&gt;
	sbic	PINB,4	; dieses Unterprogramm ist dazu da&lt;br /&gt;
	ret		; diesen Fehler zu erkennen und es&lt;br /&gt;
	sbic	PINB,2	; dem Host mitzuteilen&lt;br /&gt;
	ret		; &amp;quot;Reinigen sie ihr Touchfeld&amp;quot;&lt;br /&gt;
	sbic	PINB,1&lt;br /&gt;
	ret&lt;br /&gt;
	rjmp	Feuchtigkeitsfehler&lt;br /&gt;
;------------------------------------------------------------------------------&lt;br /&gt;
Feuchtigkeitsfehler:&lt;br /&gt;
	ldi	r18,0b00000001&lt;br /&gt;
	out	PORTC,r18&lt;br /&gt;
	ldi	r17,100&lt;br /&gt;
	rjmp	Feuchtigkeitsfehler&lt;br /&gt;
;------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
“[[Kategorie:Wettbewerb]]”&lt;/div&gt;</summary>
		<author><name>Stan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Touchpad&amp;diff=30212</id>
		<title>Touchpad</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Touchpad&amp;diff=30212"/>
		<updated>2008-08-15T10:22:04Z</updated>

		<summary type="html">&lt;p&gt;Stan: /* Des Touchs */ typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Touchpad – do it yourself=&lt;br /&gt;
&lt;br /&gt;
Diese Platinentouchpad reagiert nicht wie die herkömmlichen Touchs auf Kapazität sondern auf den Hautwiderstand &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Funktionsweise:==&lt;br /&gt;
&lt;br /&gt;
====Der Touch:====&lt;br /&gt;
&lt;br /&gt;
Auf einer Platine ist jeweils eine Minusleitung direkt neben einer Sensorleitung. Beim Berühren wird die Sensorleitung hochomig mit der Minusleitung verbunden. Bei den Pullupwiederständen gilt desto höhger der Wert desto feinfühliger reagiert der Touch ích würde hier Werte zwischen 500 Kiloohm und 2000 Kiloohm nehmen je nachdem wie man die Touchplatine aufgebaut hat und wo und wie man sie einsetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Touch.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Touchschaltplan.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Die Auswerteinheit:====&lt;br /&gt;
&lt;br /&gt;
Die Auswerteinheit ist extrem einfach:&lt;br /&gt;
Ein 4066 cmos-Ic beinhaltet 4 digitale Schalter. Wenn die Steuerleitung an den Pluspol gelegt wird „schaltet“ der Schalter durch und wenn sie an Masse gelegt wird ist er geöffnet.&lt;br /&gt;
Eine der Seiten der Schalter sind an den Mikrocontroller angeschlossen, die anderen an Minus, die Steuerleitungen an den Touch&lt;br /&gt;
Ein AVR wertet die signale von dem 4066 aus und sendet wenn der Touch berührt wurde dem Hostcontroller seriell die Daten&lt;br /&gt;
&lt;br /&gt;
==Touchkreis:==&lt;br /&gt;
&lt;br /&gt;
 [[Bild:Touchkreistest.jpg]] &lt;br /&gt;
Eine Möglichkeit ist ein touchkreis zu bauen. Natürlich kann man auch andere Formen gestalten. Bei dieser Version kann man srollen (im Uhrzeigersinn oder gegen den Uhrzeigersinn über den Kreis fahren) und hat die Möglichkeit 4 Taster (Oben, Unten, Recht, Links) zu benutzen. Durch ein Doppelklick (wie beim Laptop) wird dem Touchcontroller gezeigt das es sich um ein Tasten handelt und nicht um srollen.&lt;br /&gt;
Ich hab hier  ein ATtiny13 eingesetzt, weil er die benötigten Portpins hat, sehr bekannt ist/ oft eingesetzt wird und preiswert ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Der Aufbau===&lt;br /&gt;
====Des Touchs====&lt;br /&gt;
Man muss bei der Platine eigentlich nur zwei Sachen beachten:&lt;br /&gt;
&lt;br /&gt;
1)	Der innere Kreis darf nicht direkt an den vier Sensorflächen anliegen, weil sonst der Touch sehr feuchtigkeitsempfindlich wird und &lt;br /&gt;
2)	Das Gehäuse muss die Sensorleitungen die zu den Sensorflächen führen vollständig abdecken sonst würde man z.B wenn man Rechts berührt die Leitung wo nach Oben führt auch an Masse legen.&lt;br /&gt;
In Standgeräten:&lt;br /&gt;
Das Problem in Standgeräten ist das man normalerweise waagerecht tippt. Daher berührt nur die Fingerkuppe den Touch.&lt;br /&gt;
Ich würde hier die Sensorflächen ein bisschen näher an den Minuskreis legen, außerdem die Pullupwiderstände vor den 4066er Eingängen erhöhen (nicht zu hoch sonst treten Probleme auf wenn man schwitzt, dagegen Haucht oder sich in stark feuchten Räumen befindet).&lt;br /&gt;
&lt;br /&gt;
====In Standgeräten:====&lt;br /&gt;
Das Problem in Standgeräten ist das man normalerweise wagerecht tippt. Daher berührt nur die Fingerkuppe den Touch.&lt;br /&gt;
Ich würde hier die Sensorflächen ein bisschen näher an den Minuskreis legen, ausserdem die Pullupwiederstände vor den 4066er Eingängen erhöhen (nicht zu hoch sonst treten Probleme auf wenn man schwitzt, dagegen Haucht oder sich in stark feuchten Räumen befindet).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====In Handgeräten:====&lt;br /&gt;
Hier hat man den Vorteil das man fast paralell zum Gehäuse den Touch berührt (-&amp;gt; große Auflegefläche daher kann man die Pullups vor den 4066er Eingängen ein bisschen senken)&lt;br /&gt;
In Handgehäusen bietet sich oft nicht viel Platz deswegen würde ich eine kleine doppelseitige Platine verwenden auf der eine Seite der Touch und auf der Rückseite die Auswerteelektronik komplett in smd&lt;br /&gt;
&lt;br /&gt;
===Die Funktionsweise der Software des AVRs===&lt;br /&gt;
&lt;br /&gt;
Im Hauptprogramm wird erst kontrolliert ob zu hohe Feuchtigkeit ist dann ob man die Tastensperre aktiviert werden sollte und dann werden noch alle Toucheingänge abgefragt und wenn eine Sensorfläche berührt wurde wird die alte Berührung mit der jetzigen verglichen. Wenn ein danebenliegendes Feld berührt wurde wird mit dem Uhrzeigersinn scrollen oder gegen den Uhrzeigersinn srollen in Register 18 gespeichert dannach oder wenn ein anderes Feld berührt wurde wird die jetztige Berührung einfach in das Register wo die alte Berührung ist verschoben. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
;+----------------------------------------------------------------------&lt;br /&gt;
;| Title		: Touchkreiscode&lt;br /&gt;
;+----------------------------------------------------------------------&lt;br /&gt;
;| Funktion		: man mit dem Uhrzeigersinn scrollen und gegen den&lt;br /&gt;
;|		  Uhrzeigersinn&lt;br /&gt;
;| Schaltung	: Die Anschlüsse PB4, PB2, PB1, PB0 sind an die 4&lt;br /&gt;
;|                    4066 IC-Ausgänge angeschlossen. Die anderen an&lt;br /&gt;
;|                    Minus. Die Steuereingänge des 4066 sind an die&lt;br /&gt;
;|                    4 Touchfelder angeschlossen mit hochomigen&lt;br /&gt;
;|                    Wiederständen zu Plus (damit dei eingänge nicht&lt;br /&gt;
;|                    wahllos an und ausschalten)&lt;br /&gt;
;|	           ____    ____&lt;br /&gt;
;|	          /    |__|    |&lt;br /&gt;
;|		--|RST      VCC|-- Plus&lt;br /&gt;
;|		  |            |&lt;br /&gt;
;|   Ausgangssignal --|PB3      PB2|-- Unteres Touchfeld&lt;br /&gt;
;|		  |            |&lt;br /&gt;
;|Rechtes Touchfeld --|PB4      PB1|-- Linkes Touchfeld&lt;br /&gt;
;|	          |            |&lt;br /&gt;
;|	  Minus --|GND      PB0|-- Oberes Touchfeld&lt;br /&gt;
;|		  |____________|&lt;br /&gt;
;|&lt;br /&gt;
;+----------------------------------------------------------------------&lt;br /&gt;
;| Prozessor	: ATtiny13 , ATmega8&lt;br /&gt;
;| Takt		: egal&lt;br /&gt;
;| Sprache       	: Assembler&lt;br /&gt;
;| Datum         	: heute&lt;br /&gt;
;| Version       	: 1.1&lt;br /&gt;
;| Autor         	: Tobias Frintz, 15&lt;br /&gt;
;|		  Tobias-Frintz@web.de&lt;br /&gt;
;+----------------------------------------------------------------------&lt;br /&gt;
.include	&amp;quot;AVR.H&amp;quot;&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
;Reset and Interrupt vector             ;VNr.  Beschreibung&lt;br /&gt;
	rjmp	main	;1   POWER ON RESET&lt;br /&gt;
	reti		;2   Int0-Interrupt&lt;br /&gt;
	reti		;3   Int1-Interrupt&lt;br /&gt;
	reti		;4   TC2 Compare Match&lt;br /&gt;
	reti		;5   TC2 Overflow&lt;br /&gt;
	reti		;6   TC1 Capture&lt;br /&gt;
	reti		;7   TC1 Compare Match A&lt;br /&gt;
	reti		;8   TC1 Compare Match B&lt;br /&gt;
	reti		;9   TC1 Overflow&lt;br /&gt;
	reti		;10  TC0 Overflow&lt;br /&gt;
	reti		;11  SPI, STC Serial Transfer Complete&lt;br /&gt;
	reti		;12  UART Rx Complete&lt;br /&gt;
	reti		;13  UART Data Register Empty&lt;br /&gt;
	reti		;14  UART Tx Complete&lt;br /&gt;
	reti		;15  ADC Conversion Complete&lt;br /&gt;
	reti		;16  EEPROM Ready&lt;br /&gt;
	reti		;17  Analog Comparator&lt;br /&gt;
	reti		;18  TWI (I²C) Serial Interface&lt;br /&gt;
	reti		;19  Store Program Memory Ready&lt;br /&gt;
; r16 ist das Arbeitesregister&lt;br /&gt;
;&lt;br /&gt;
; r17 speichert die alte Berührung:&lt;br /&gt;
;      oben   = 1&lt;br /&gt;
;      rechts = 2&lt;br /&gt;
;      unten  = 3&lt;br /&gt;
;      links  = 4&lt;br /&gt;
;&lt;br /&gt;
; r18 ist das Register in dem das Ausggangssignal steht&lt;br /&gt;
;	Feuchtigkeitsfehler     = 0b00000001&lt;br /&gt;
;	Tastensperre            = 0b00000111&lt;br /&gt;
;	Gegen den Uhrzeigersinn = 0b00000010&lt;br /&gt;
;	Mit dem Uhrzeigersinn   = 0b00000100&lt;br /&gt;
;	Obengetastet            = 0b00000101&lt;br /&gt;
; &lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
;Start, Power ON, Reset&lt;br /&gt;
main:	ldi	r16,lo8(RAMEND)&lt;br /&gt;
	out	SPL,r16&lt;br /&gt;
	ldi	r16,hi8(RAMEND)&lt;br /&gt;
	out	SPH,r16&lt;br /&gt;
	sbi	DDRC,0	;Leds auf Output&lt;br /&gt;
	sbi	DDRC,1&lt;br /&gt;
	sbi	DDRC,2&lt;br /&gt;
	sbi	PORTB,0	; Pullup einschalten für Touch&lt;br /&gt;
	sbi	PORTB,1&lt;br /&gt;
	sbi	PORTB,2&lt;br /&gt;
	sbi	PORTB,4&lt;br /&gt;
	ldi	r18,0b00000000&lt;br /&gt;
	clr	r19&lt;br /&gt;
	clr	r20&lt;br /&gt;
	clr	r21&lt;br /&gt;
	clr	r22&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
mainloop:	wdr&lt;br /&gt;
	rcall	Tastensperre&lt;br /&gt;
	out	PORTC,r18&lt;br /&gt;
	sbis	PINB,0&lt;br /&gt;
	rjmp	Obenberuehrt&lt;br /&gt;
	sbis	PINB,1&lt;br /&gt;
	rjmp	Linksberuehrt&lt;br /&gt;
	sbis	PINB,2&lt;br /&gt;
	rjmp	Untenberuehrt&lt;br /&gt;
	sbis	PINB,4&lt;br /&gt;
	rjmp	Rechtsberuehrt&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Obenberuehrt:&lt;br /&gt;
	ldi	r16,2&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	im_uhrzeigersinn&lt;br /&gt;
	ldi	r16,4&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	geg_uhrzeigersinn&lt;br /&gt;
	ldi	r17,1&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;--------------------------------------------------------------------------&lt;br /&gt;
Rechtsberuehrt:&lt;br /&gt;
	ldi	r16,3&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	im_uhrzeigersinn&lt;br /&gt;
	ldi	r16,1&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	geg_uhrzeigersinn&lt;br /&gt;
	ldi	r17,2&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;-------------------------------------------------------------------------&lt;br /&gt;
Untenberuehrt:&lt;br /&gt;
	ldi	r16,4&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	im_uhrzeigersinn&lt;br /&gt;
	ldi	r16,2&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	geg_uhrzeigersinn&lt;br /&gt;
	ldi	r17,3&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;--------------------------------------------------------------------------&lt;br /&gt;
Linksberuehrt:&lt;br /&gt;
	ldi	r16,1&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	im_uhrzeigersinn&lt;br /&gt;
	ldi	r16,3&lt;br /&gt;
	cp	r17,r16&lt;br /&gt;
	breq	geg_uhrzeigersinn&lt;br /&gt;
	ldi	r17,4&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;---------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tastensperre:&lt;br /&gt;
	sbic	PINB,0&lt;br /&gt;
	ret&lt;br /&gt;
	sbis	PINB,1&lt;br /&gt;
	ret&lt;br /&gt;
	sbic	PINB,2&lt;br /&gt;
	ret&lt;br /&gt;
	sbis	PINB,4&lt;br /&gt;
	ret&lt;br /&gt;
	;jetzt ist die tasstensperre aktiviert	&lt;br /&gt;
	ldi	r18,0b00000111&lt;br /&gt;
	out	PORTC,r18&lt;br /&gt;
	ldi	r17,100&lt;br /&gt;
&lt;br /&gt;
Aktiviert:	wdr&lt;br /&gt;
	rcall	Feuchtigkeit&lt;br /&gt;
	sbis	PINB,0&lt;br /&gt;
	rjmp	Aktiviert&lt;br /&gt;
	sbic	PINB,1&lt;br /&gt;
	rjmp	Aktiviert&lt;br /&gt;
	sbis	PINB,2&lt;br /&gt;
	rjmp	Aktiviert&lt;br /&gt;
	sbic	PINB,4&lt;br /&gt;
	rjmp	Aktiviert&lt;br /&gt;
	ldi	r18,0b00000000&lt;br /&gt;
	out	PORTC,r18&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
im_uhrzeigersinn:&lt;br /&gt;
	ldi	r18,0b00000100&lt;br /&gt;
	ldi	r17,100&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;---------------------------------------------------------------------------&lt;br /&gt;
geg_uhrzeigersinn:&lt;br /&gt;
	ldi	r18,0b00000010&lt;br /&gt;
	ldi	r17,100&lt;br /&gt;
	rjmp	mainloop&lt;br /&gt;
;---------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Feuchtigkeit:&lt;br /&gt;
	sbic	PINB,0	; Wenn auf dem Touchpad Wasser ist&lt;br /&gt;
	ret		; sind alle Touchfelder &amp;quot;berührt&amp;quot;&lt;br /&gt;
	sbic	PINB,4	; dieses Unterprogramm ist dazu da&lt;br /&gt;
	ret		; diesen Fehler zu erkennen und es&lt;br /&gt;
	sbic	PINB,2	; dem Host mitzuteilen&lt;br /&gt;
	ret		; &amp;quot;Reinigen sie ihr Touchfeld&amp;quot;&lt;br /&gt;
	sbic	PINB,1&lt;br /&gt;
	ret&lt;br /&gt;
	rjmp	Feuchtigkeitsfehler&lt;br /&gt;
;------------------------------------------------------------------------------&lt;br /&gt;
Feuchtigkeitsfehler:&lt;br /&gt;
	ldi	r18,0b00000001&lt;br /&gt;
	out	PORTC,r18&lt;br /&gt;
	ldi	r17,100&lt;br /&gt;
	rjmp	Feuchtigkeitsfehler&lt;br /&gt;
;------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
“[[Kategorie:Wettbewerb]]”&lt;/div&gt;</summary>
		<author><name>Stan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=28417</id>
		<title>Include-Files (C)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=28417"/>
		<updated>2008-06-10T12:33:17Z</updated>

		<summary type="html">&lt;p&gt;Stan: link zu thread hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Include-Files in C/C++ enthalten typischerweise Informationen, die im Rahmen der Kompilierung verschiedener anderer Quelltexte (mehrfach) benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Wer bisher hauptsächlich kleinere (Assembler-) Programme für Mikrocontroller realisiert hat und sich nun langsam an größere Projekte heranwagt und deshalb auf C umsteigt, ist gut beraten, die Möglichkeiten sinnvoll einzusetzen, die Include-Files in C bieten. Dabei gilt es allerdings auch, einige Fallgruben zu vermeiden - mehr dazu in diesem Artikel.&lt;br /&gt;
&lt;br /&gt;
== Verwendung von Include-Files ==&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von Include-Files in [[C]] und [[C-Plusplus|C++]] führt in der Regel zu besser strukturierten und damit besser wartbaren Programmen. Indem bestimmte, zentrale Informationen nur ein einziges Mal hinterlegt werden, fällt insbesondere bei Änderungen weniger Aufwand an.&lt;br /&gt;
&lt;br /&gt;
Der übliche Suffix für Include-Files ist &amp;quot;&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;&amp;quot;, manchmal auch &amp;quot;&amp;lt;tt&amp;gt;.hpp&amp;lt;/tt&amp;gt;&amp;quot; (für C++), und die &#039;&#039;Verwendung&#039;&#039; eines Include-Files ist sehr einfach:&lt;br /&gt;
 #include &amp;quot;xyz.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird der Dateiname in spitze Klammern gesetzt, dann sucht der Präprozessor die Datei nicht im aktuellen Verzeichnis, sondern im Standard-Include-Pfad des Compilers:&lt;br /&gt;
 #include &amp;lt;io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei sind auch relative Verzeichnisangaben erlaubt:&lt;br /&gt;
 #include &amp;lt;avr/timer.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme bei Include-Files ==&lt;br /&gt;
In Include-Files werden mitunter Informationen aus anderen Include-Files benötigt und es ist an der Verwendungsstelle eines Include-Files oft nicht das Wissen über die möglicherweise sehr komplexen Abhängigkeiten vorhanden. Nachfolgend wird ausgehend von einer typischen Problemstellung eine Standardtechnik erläutert, die hilft, das Wissen um Abhängigkeiten an der Verwendungsstelle überflüssig zu machen:&lt;br /&gt;
&lt;br /&gt;
Angenommen, es existieren zwei Datenstrukturen für die es die Typdefinitionen &amp;lt;tt&amp;gt;s1_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; gibt, die jeweils entsprechenden Include-Files hinterlegt sind, also&lt;br /&gt;
&amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Definition der Datenstruktur s1 */&lt;br /&gt;
struct s1 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s1_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt; sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Definition der Datenstruktur s2 */&lt;br /&gt;
struct s2 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
s2_t *bar();&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine bestimmte Applikation benötigt nun beide Struktur- und Funktions-Definitionen und inkludiert entsprechend beide Dateien, es gibt also eine kompilierbare Datei (z.B. &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt;) die wie folgt aussieht:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;s1.h&amp;quot;&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
int main() {&lt;br /&gt;
    s1_t a;&lt;br /&gt;
    s2_t *b;&lt;br /&gt;
    ...&lt;br /&gt;
    foo(a);&lt;br /&gt;
    b = bar();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
So weit, so gut.&lt;br /&gt;
&lt;br /&gt;
Nun kommt es eines Tages zu einer Änderung, die darauf hinausläuft, dass die erste Struktur die zweite als Element enthält. Das heißt die Datei &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; sieht nun wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Daraufhin wird sich &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt;(!) nicht mehr kompilieren lassen, da bei der Verarbeitung von &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; (noch) nicht bekannt ist, worum es sich um bei &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; handelt. (Es könnte ja auch einfach nur ein Tippfehler sein!)&lt;br /&gt;
&lt;br /&gt;
Da es in der Praxis einen immensen Pflegeaufwand auslösen kann, wenn Änderungen in Include-Files Änderungen in vielen weiteren Dateien erfordern (dem Wesen nach soll ja eine Include-Dateien eine Information zentral für viele andere Dateien bereitstellen), muss nach einem Ausweg gesucht werden.&lt;br /&gt;
&lt;br /&gt;
Dieser könnte so aussehen, dass man &amp;quot;vorsorglich&amp;quot; die Beschreibung der verwendeten Datenstruktur in &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; inkludiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inkludiert das Hauptprogramm lediglich &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;, wäre nun alles in Ordnung, wenn aber beide Dateien inkludiert werden, beschwert sich der Compiler über die doppelte Definition der Datentypen. (Die doppelte Deklaration von Funktionen ist kein Fehler, wenn sie übereinstimmend erfolgt.)&lt;br /&gt;
&lt;br /&gt;
== Problemlösung mit Makros ==&lt;br /&gt;
Die übliche und - fast - perfekte Lösung des Problems besteht darin, den eigentlichen Inhalt eines Include-Files vor einer zweiten Verarbeitung durch eine &#039;&#039;bedingte Kompilierung&#039;&#039; zu schützen.&lt;br /&gt;
Bei der bedingten Kompilierung handelt es sich ebenfalls um ein Feature des [[C-Präprozessor]]s und es wird hier wie folgt auf die Datei &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt; angewendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
struct s2 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
s2_t *bar();&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da das beschriebene Problem in größeren Programmsystemen auch in Bezug auf die andere Struktur auftreten könnte, sollte man die Datei &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; vorsorglich mit einem ähnlichen Schutz ausstatten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der nette Nebeneffekt ist, dass es damit auch keine Rolle spielt, in welcher Reihenfolge beide Dateien in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; inkludiert werden.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung der Regeln ==&lt;br /&gt;
Kochrezeptartig kann man beim Schreiben und Verwenden von Include-Files auch einfach die folgenden Regeln anwenden:&lt;br /&gt;
* Wird die externe Schnittstelle (Datenstrukturen, Funktions-Deklarationen) eines Moduls &#039;&#039;XYZ&#039;&#039; in einem Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; beschrieben, so sollte ein bestimmter Makroname (z.B. &amp;lt;tt&amp;gt;XYZ_h&amp;lt;/tt&amp;gt;) für die Steuerung der tatsächlichen Verarbeitung des Include-Files reserviert werden(*1).&lt;br /&gt;
* Der Include-File selbst testet (und definiert anschließend) diesen Makro, um so eine doppelte Verarbeitung zu vermeiden.&lt;br /&gt;
* Wird in einer Kompilierung das Modul &#039;&#039;XYZ&#039;&#039; verwendet (= eine seiner Datenstrukturen oder Funktionen), wird auch der Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; in diese Kompilierung eingeschlossen.&lt;br /&gt;
* Verwendet das Modul &#039;&#039;XYZ&#039;&#039; &#039;&#039;&#039;intern&#039;&#039;&#039; ein weiteres Modul &#039;&#039;UVW&#039;&#039;, so wird &#039;&#039;&#039;dessen&#039;&#039;&#039; Include-File &amp;lt;tt&amp;gt;uvw.h&amp;lt;/tt&amp;gt; im Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; eingeschlossen.&lt;br /&gt;
&lt;br /&gt;
Die beschriebenen Regeln funktionieren zufriedenstellend und entlasten vor allem Programm-Code, welcher Include-Files lediglich einschließt, vom Wissen über komplexe Zusammenhänge zwischen einzelnen Modulen. Ferner spielt die Reihenfolge, in der man Include-Files verwendet, keine Rolle und man kann sie beliebig gruppieren und ordnen, so wie es am übersichtlichsten ist(*2).&lt;br /&gt;
&lt;br /&gt;
== Gegenseitige Bezugnahme ==&lt;br /&gt;
Eine Ausnahme von der allgemeinen Regel liegt vor, wenn sich zwei Datenstrukturen gegenseitig verwenden (was nur über Zeiger der Fall sein kann).&lt;br /&gt;
Alle wie auch immer gearteten Versuche, diese beiden Strukturdefinitionen und Funktionsprototypen in zwei verschiedene Include-Files aufzuteilen, also z.B. &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
s2_t *bar(s1_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
#include &amp;quot;s1.h&amp;quot;&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *yp;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
werden scheitern - mit und ohne dem beschriebenen Schutz vor doppelter Verarbeitung!&lt;br /&gt;
&lt;br /&gt;
Die pragmatische Lösung ist hier, alles in einem &#039;&#039;&#039;gemeinsamen&#039;&#039;&#039; Include-File &amp;lt;tt&amp;gt;s1_s2.h&amp;lt;/tt&amp;gt; zu hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_S2_h&lt;br /&gt;
#define S1_S2_h&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *yp;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
typedef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
s2_t *bar(s1_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das ist insofern sinnvoll, als ein Programm, welches die eine Struktur kennen muss, stets auch die andere benötigt. Die Aufteilung in zwei Include-Files würde also keinen echten Vorteil bringen.&lt;br /&gt;
&lt;br /&gt;
Eine Ausnahme kann lediglich gemacht werden, wenn auf die jeweils andere Struktur ausschließlich über Zeiger(*3) zugegriffen wird, dann sind auch zwei Include-Files möglich, nämlich &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
struct s2; /* Vorausdeklaration */&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typdef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
struct s2 *bar(s1_t);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
struct s1; /* Vorausdeklaration */&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *py;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typdef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
void bar(struct s1 *);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anstatt den jeweils anderen Include-File einzuschließen, sind nun die oben gezeigten Vorausdeklarationen vorzumehmen. (Allerdings sind damit die Typdefinitionen &amp;lt;tt&amp;gt;s1_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; nicht verfügbar, die Bezugnahme auf die jeweils andere Struktur kann nur über &amp;lt;tt&amp;gt;struct s1&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;struct s2&amp;lt;/tt&amp;gt; erfolgen.)&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/80956#676650 sehr ausführliches Forumsthema zur Thematik]&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* 1: Die genaue Beziehung zwischen dem Makro-Namen und dem Modul- (oder Struktur-) Namen ist dabei nicht so bedeutend. Die übliche Konvention, solche &amp;quot;Steuer-Makros&amp;quot; mit &amp;quot;&amp;lt;tt&amp;gt;_h&amp;lt;/tt&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;tt&amp;gt;_H&amp;lt;/tt&amp;gt;&amp;quot; zu beenden, soll nur helfen, &amp;quot;zufällige&amp;quot; Kollissionen mit Makros zu vermeiden, die einen anderen Zweck haben.&lt;br /&gt;
* 2: Eine alphabetische Sortierung ist z.B. hilfreich, um bei einem Kompilierfehler schnell überprüfen zu können, ob vielleicht nur ein bestimmter Include-File vergessen wurde.&lt;br /&gt;
* 3: Bei der Verwendunng von C++ gilt das zusätzlich für die Bezugnahme über Referenzen.&lt;/div&gt;</summary>
		<author><name>Stan</name></author>
	</entry>
</feed>