<?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=80.140.66.5</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=80.140.66.5"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/80.140.66.5"/>
	<updated>2026-04-11T08:14:13Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller.net:Lizenzbestimmungen&amp;diff=2610</id>
		<title>Mikrocontroller.net:Lizenzbestimmungen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller.net:Lizenzbestimmungen&amp;diff=2610"/>
		<updated>2004-06-19T00:10:48Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alle Texte sind unter der [http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License] verfügbar.&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Hilfe:Bearbeitungshilfe&amp;diff=14278</id>
		<title>Hilfe:Bearbeitungshilfe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Hilfe:Bearbeitungshilfe&amp;diff=14278"/>
		<updated>2004-06-19T00:08:23Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Formatierung ==&lt;br /&gt;
Eine ausführliche Beschreibung der Gliederungs- und Formatierungsmöglichkeiten findet sich im Wikipedia Online-Lexikon: http://de.wikipedia.org/wiki/Wikipedia:Seite_bearbeiten&lt;br /&gt;
&lt;br /&gt;
== Richtlinien ==&lt;br /&gt;
&lt;br /&gt;
=== Verwandte Seiten ===&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;interne&#039;&#039;&#039; Links zu verwandten Artikeln legt man einen Bereich nach dem folgenden Muster an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Test]]&lt;br /&gt;
* [[Foobar]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ähnlich bei &#039;&#039;&#039;externen&#039;&#039;&#039; Links:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* http://url1/&lt;br /&gt;
* http://url2/&lt;br /&gt;
* [http://url3/ Seite 3 hat einen Linktext]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C%2B%2B&amp;diff=3980</id>
		<title>C++</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C%2B%2B&amp;diff=3980"/>
		<updated>2004-06-19T00:03:54Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Umfassende Erweiterung der Programmiersprache [[C]]; kompatibel in der Hinsicht, dass C als Teilmenge in C++ enthalten ist. Dadurch ist C++ ebenso wie C zur hardwarenahen Programmierung geeignet.&lt;br /&gt;
&lt;br /&gt;
(Ein detaillierter Vergleich von C und C++ unter besonderer Berücksichtigung der für die Programmierung von Mikrocontrollern relevanten Aspekte findet sich unter [[C vs C-Plusplus]].)&lt;br /&gt;
 &lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/C_Plusplus &amp;quot;C++&amp;quot; bei Wikipedia]&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DsPIC&amp;diff=2678</id>
		<title>DsPIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DsPIC&amp;diff=2678"/>
		<updated>2004-06-19T00:02:59Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Hersteller: Microchip&lt;br /&gt;
* 24 Bit Programm- / 16 Bit Daten-[[Bus]]&lt;br /&gt;
* hat nichts mit dem klassischen 8 Bit-[[PIC]] zu tun&lt;br /&gt;
* [[DSP]]-Funktionen mit 2 getrennten 40 Bit [[Akkumulator|Akkumulatoren]]&lt;br /&gt;
* [[Harvard-Architektur]] (getrennter Befehls- und Datenspeicher)&lt;br /&gt;
* [[RISC]], 84 Basis-Befehle (Hardware-Multiplikation)&lt;br /&gt;
* bis 144 kB [[Flash-ROM]] als Programmspeicher&lt;br /&gt;
* bis 8 kB internes [[RAM]]&lt;br /&gt;
* bis 4 kB internes [[EEPROM]]&lt;br /&gt;
* Versionen mit internem 12 Bit [[AD-Wandler]], [[I2S]], [[AC97]] und [[CAN]]&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LTC1257&amp;diff=2625</id>
		<title>LTC1257</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LTC1257&amp;diff=2625"/>
		<updated>2004-06-19T00:01:18Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der LTC1257 ist ein 12 Bit [[DA-Wandler]] mit serieller Ansteuerung.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-66518.html C-Routinen zur Ansteuerung]&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=WinAVR&amp;diff=2906</id>
		<title>WinAVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=WinAVR&amp;diff=2906"/>
		<updated>2004-06-18T23:59:37Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WinAVR ist die Windows-Distribution des [[C]]-[[Compiler]]s [[AVR-GCC]] für [[AVR]]-[[Mikrocontroller]]. WinAVR enthält neben dem Compiler noch einige andere Pakete, z.B. die C-Standardbibliothek avr-libc (inkl. Dokumentation) und die Programmiersoftware AVRDUDE.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Version: 20040404&lt;br /&gt;
&lt;br /&gt;
http://winavr.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[WinAVR: Code-Größe anzeigen]]&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Editoren/IDEs&amp;diff=2529</id>
		<title>Editoren/IDEs</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Editoren/IDEs&amp;diff=2529"/>
		<updated>2004-06-18T23:56:34Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Texteditoren für Programmierer ==&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.ultraedit.com UltraEdit (Shareware)]&lt;br /&gt;
* [http://www.pnotepad.org/ Programmers Notepad (Freeware, in WinAVR enthalten)]&lt;br /&gt;
* [http://www.atmel.com AVR-Studio (für AVR-Assembler/C)]&lt;br /&gt;
* [http://ftp.gnu.org/gnu/emacs/windows/ Emacs]&lt;br /&gt;
* [http://www.vim.org Vim]&lt;br /&gt;
&lt;br /&gt;
=== Unix/Linux ===&lt;br /&gt;
&lt;br /&gt;
* [http://ftp.gnu.org/gnu/emacs/ Emacs]&lt;br /&gt;
* [http://www.vim.org Vim]&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.codingmonkeys.de/subethaedit/ SubEthaEdit] (frei für nichtkommerzielle Nutzung, erlaubt das gemeinsame Bearbeiten einer Datei von mehreren Personen gleichzeitig)&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Editoren/IDEs&amp;diff=2506</id>
		<title>Editoren/IDEs</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Editoren/IDEs&amp;diff=2506"/>
		<updated>2004-06-18T23:55:26Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Texteditoren für Programmierer ==&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.ultraedit.com UltraEdit (Shareware)]&lt;br /&gt;
* [http://www.pnotepad.org/ Programmers Notepad (Freeware, in WinAVR enthalten)]&lt;br /&gt;
* [http://www.atmel.com AVR-Studio (für AVR-Assembler/C)]&lt;br /&gt;
* [http://ftp.gnu.org/gnu/emacs/windows/ Emacs]&lt;br /&gt;
* [http://www.vim.org Vim]&lt;br /&gt;
&lt;br /&gt;
=== Unix/Linux ===&lt;br /&gt;
&lt;br /&gt;
* [http://ftp.gnu.org/gnu/emacs/ EMACS]&lt;br /&gt;
* [http://www.vim.org VIM]&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Studio&amp;diff=2645</id>
		<title>AVR-Studio</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Studio&amp;diff=2645"/>
		<updated>2004-06-18T23:49:47Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;AVR-Studio&#039;&#039;&#039; ist eine kostenlose Entwicklungsumgebung ([[IDE]]) für die [[AVR]]-[[Mikrocontroller]] von Atmel. Sie besteht aus einer Projektverwaltung, einem [[Texteditor|Editor]] und einem [[Debugger]], der mit dem integrierten [[Simulator]], einem [[JTAG]]-Adapter oder einem [[In Circuit Emulator]] genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Studio Bugs]]&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Studio&amp;diff=2504</id>
		<title>AVR-Studio</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Studio&amp;diff=2504"/>
		<updated>2004-06-18T23:46:19Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;AVR-Studio&#039;&#039;&#039; ist eine kostenlose Entwicklungsumgebung ([[IDE]]) für die [[AVR]]-[[Mikrocontroller]] von Atmel. Sie besteht aus einer Projektverwaltung, einem [[Editor]] und einem [[Debugger]], der mit dem integrierten [[Simulator]], einem [[JTAG]]-Adapter oder einem [[In Circuit Emulator]] genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Studio Bugs]]&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LCD&amp;diff=2999</id>
		<title>LCD</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LCD&amp;diff=2999"/>
		<updated>2004-06-18T23:42:01Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;Liquid Crystal Display&amp;quot;. Große Fläche von Flüssigkristallen, die unter Einwirkung eines elektrischen Feldes die Polarisationsebene des Lichts drehen. Wird ein solches Display von bereits polarisiertem Licht durchleuchtet, dann erscheinen diese Kristalle mehr oder weniger hell oder dunkel.&lt;br /&gt;
Die Angelegte Spannung ist sehr gering, es muss sich aber um eine Wechselspannung handeln, da eine Gleichspannung die Kristalle zersetzt. Zur Ansteuerung gibt es spezielle LCD Controller, fertige Module mit Controller und einige Prozessoren mit integrierter Ansteuerung (z.B. aus der [[MSP430]]-Serie).&lt;br /&gt;
&lt;br /&gt;
LCD-Module mit eingebautem Controller lassen sich meist einfach mit einem [[Mikrocontroller]] ansteuern. Bei LCDs ohne eigenen Controller (Laptop-LCDs z.B.) ist die direkte Ansteuerung sehr schwierig (weil zeitkritisch), allerdings läßt sich in manchen Fällen ein Standard-Controller nachrüsten.&lt;br /&gt;
&lt;br /&gt;
Text-LCDs verwenden meistens den [[HD44780]] oder einen kompatiblen Controller, Grafik-LCDs z.B. den [[T6963]] oder den [[SED1330]].&lt;br /&gt;
&lt;br /&gt;
Eine bei Handybastlern bekannte Spielerei ist das abziehen der Polarisationsfolie vom LCD und dem um 90° gedrehten aufkleben der alten oder einer neuen Folie. Dies führt zu einem hardwaremäßigen Invertieren der LCD Anzeige.&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ISP&amp;diff=3027</id>
		<title>ISP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ISP&amp;diff=3027"/>
		<updated>2004-06-18T23:39:30Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;I&#039;&#039;&#039;n &#039;&#039;&#039;S&#039;&#039;&#039;ystem &#039;&#039;&#039;P&#039;&#039;&#039;rogramming. Ein &amp;quot;In System&amp;quot; programmierbarer [[Mikrocontroller]] kann programmiert werden, ohne dass er dazu aus der Umgebungsschaltung entfernt werden muss. Die Vorraussetzung dafür ist ein als [[Flash-ROM]] ausgeführter [[Programmspeicher]]. Die Kommunikation mit dem ISP-Adapter erfolgt in der Regel über ein serielles Protokoll.&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ISP&amp;diff=2502</id>
		<title>ISP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ISP&amp;diff=2502"/>
		<updated>2004-06-18T23:38:42Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;I&#039;&#039;&#039;n &#039;&#039;&#039;S&#039;&#039;&#039;ystem &#039;&#039;&#039;P&#039;&#039;&#039;rogramming. Ein &amp;quot;In System&amp;quot; programmierbarer [[Mikrocontroller]] kann programmiert werden, ohne dass er dazu aus der Umgebungsschaltung entfernt werden muss. Die Vorraussetzung dafür ist ein als [[Flash-ROM]] ausgeführter [[Programmspeicher]].&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=I%C2%B2C&amp;diff=2521</id>
		<title>I²C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=I%C2%B2C&amp;diff=2521"/>
		<updated>2004-06-18T23:38:02Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;I2C&#039;&#039;&#039; ist ein synchroner serieller Zweidraht-[[Bus]] (eine Daten- und eine Taktleitung), der für die Kommunikation zwischen [[IC]]s über kleine Distanzen geeignet ist. Entwickelt wurde er vor ca. 20 Jahren von Philips.&lt;br /&gt;
Gesprochen &amp;quot;I quadrat C&amp;quot; steht für IIC = Inter [[IC]] Bus. Aus Lizenzgünden heißt der I²C Bus bei manchen Herstellern auch [[TWI]].&lt;br /&gt;
&lt;br /&gt;
In einem I2C-Bus gibt es mindestens einen Master und eine beliebige Anzahl Slaves (max. 128). Ein I2C-Bus mit mehreren Mastern wird als &amp;quot;Multi-Master-Bus&amp;quot; bezeichnet.&lt;br /&gt;
Der (oder die) Master sprechen die Slaves an; ein Slave kann NIE selbstständig Daten senden. Dazu übernimmt der Master, der Daten senden oder empfangen möchte, den Bus und gibt die (7-bit-)Adresse des Slaves aus, mit dem er kommunizieren möchte. Nach der Adresse teilt der Master dem entsprechenden Slave mit, ob er Daten senden oder empfangen möchte. Danach werden die eigentlichen Daten (entweder vom Master oder Slave) auf den Bus gelegt. Hat der Master den Lese- oder Schreibvorgang abgeschlossen, so gibt er den Bus wieder frei.&lt;br /&gt;
Sofern mehrere Master vorhanden sind, stellt ein Protokoll sicher, dass sich diese nicht gegenseitig stören.&lt;br /&gt;
&lt;br /&gt;
[http://www.semiconductors.philips.com/buses/i2c/ Philips Produktseite]&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=2527</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=2527"/>
		<updated>2004-06-18T23:35:51Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: /* Verwendung von Include-Files */&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 eckige 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 Kopilierung handelt es sich ebenfalls um ein Feature des [[C-Präprozessors]] 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;
----&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>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Watchdog&amp;diff=2688</id>
		<title>Watchdog</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Watchdog&amp;diff=2688"/>
		<updated>2004-06-18T23:32:10Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Watchdog ist eine Schaltung (extern oder im [[Mikrocontroller]] integriert), die bei einem Programmabsturz einen [[Reset]] auslöst, damit der Microcontroller seine Aufgabe wieder erledigen kann.&lt;br /&gt;
&lt;br /&gt;
Technisch wird das so realisiert, daß es einen Zeitgeber (z.B. Kondensator oder [[Timer]]) gibt, den man regelmäßig zurücksetzen muß. Ist der Mikrocontroller abgestürzt, dann kann er das nicht mehr tun und der Watchdog löst den Reset aus.&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Testseite&amp;diff=2538</id>
		<title>Testseite</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Testseite&amp;diff=2538"/>
		<updated>2004-06-18T23:30:44Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: /* Kleiner Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;huhuhuhuhuhuhu&lt;br /&gt;
&lt;br /&gt;
[http://www.google.de googletest]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Qfp.jpg]] --[[Benutzer:Andreas|Andreas]] 16:41, 8. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
=ist das jetzt das level oder die fontart oder beides=&lt;br /&gt;
naja. hängt das ding an einem globalen wiki mit dran?&lt;br /&gt;
oder gibts dann hundert wikis zum gleichen thema?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ein kleiner Test mit den Formeln ==&lt;br /&gt;
&lt;br /&gt;
=== Kreisgleichung ===&lt;br /&gt;
&amp;lt;math&amp;gt;r^2=(x-x_0)^2+(y-y_0)^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Formel hier einfügen&amp;lt;/math&amp;gt;--[[Benutzer:62.47.196.18|62.47.196.18]] 20:32, 12. Jun 2004 (CEST)[[Link-Text]]&lt;br /&gt;
&lt;br /&gt;
=== Irgendein Schwachsinn ===&lt;br /&gt;
&amp;lt;math&amp;gt;a=\sqrt{\frac{mc^2}{E}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eigentlich schade, daß die Schriftart gewechselt wird. Dies sieht ja bescheiden aus.&#039;&#039;&#039;&lt;br /&gt;
Hallo??&lt;br /&gt;
=Kleiner Test=&lt;br /&gt;
[[Bild:http://www.google.ch/images/hp0.gif]]&lt;br /&gt;
ach menno...wie macht man denn da ein Bild rein, wenns gar nicht aufm Server ist?...gar nich?&lt;br /&gt;
&lt;br /&gt;
http://www.google.ch/images/hp0.gif&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Hilfe:Bearbeitungshilfe&amp;diff=2511</id>
		<title>Hilfe:Bearbeitungshilfe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Hilfe:Bearbeitungshilfe&amp;diff=2511"/>
		<updated>2004-06-18T16:40:23Z</updated>

		<summary type="html">&lt;p&gt;80.140.66.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine ausführliche Beschreibung der Gliederungs- und Formatierungsmöglichkeiten findet sich im Wikipedia Online-Lexikon: http://de.wikipedia.org/wiki/Wikipedia:Seite_bearbeiten&lt;/div&gt;</summary>
		<author><name>80.140.66.5</name></author>
	</entry>
</feed>