<?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=Prx</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=Prx"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Prx"/>
	<updated>2026-04-11T03:54:14Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Bus-Pirate&amp;diff=105248</id>
		<title>Bus-Pirate</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Bus-Pirate&amp;diff=105248"/>
		<updated>2022-06-06T08:18:41Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Beschreibung =&lt;br /&gt;
&lt;br /&gt;
Der Bus Pirate ist ein Analyzer für etliche serielle Signale und Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
Es handelt sich um ein Open-Source Projekt, welches auf [http://hackaday.com/2009/06/25/how-to-the-bus-pirate-v2-with-usb/ Hackaday] vorgestellt wurde. Entwickelt wurde der Bus Pirate von Ian Lesnet (DangerousPrototypes).&lt;br /&gt;
&lt;br /&gt;
Die stabile Version ist aktuell der BusPirate v3.6. Eine v4 mit deutlich erweiterten Hardware-Ressourcen befindet sich seit mehreren Monaten in der Entwicklung.&lt;br /&gt;
&lt;br /&gt;
Die Homepage des Projektes ist [http://dangerousprototypes.com/docs/Bus_Pirate http://dangerousprototypes.com/docs/Bus_Pirate].&lt;br /&gt;
&lt;br /&gt;
= Unterstützte Protokolle: =&lt;br /&gt;
&lt;br /&gt;
* 1-Wire &lt;br /&gt;
* I²C (ohne Clock Stretching)&lt;br /&gt;
* SPI &lt;br /&gt;
* JTAG &lt;br /&gt;
* Asynchron Seriell &lt;br /&gt;
* MIDI &lt;br /&gt;
* PC Keyboard &lt;br /&gt;
* HD44780 LCD &lt;br /&gt;
* 2- und 3-wire Bibliotheken mit bitweiser Pin-Kontrolle &lt;br /&gt;
* Programmierbare binäre Bitbang, 1-Wire, I²C, SPI und UART-Modi&lt;br /&gt;
&lt;br /&gt;
Hier gibt es noch eine bessere Auflistung: http://dangerousprototypes.com/bus-pirate-manual/bus-pirate-feature-overview/&lt;br /&gt;
&lt;br /&gt;
= Möglichkeiten =&lt;br /&gt;
&lt;br /&gt;
* 0 - 5,5 Volt Pegel &lt;br /&gt;
* 0-6 Volt Spannungsmessung &lt;br /&gt;
* 1Hz-40MHz Frequenzmessung &lt;br /&gt;
* 1kHz - 4MHz Pulsweitengenerator, Frequenzgenerator &lt;br /&gt;
* On-board Mehrfachspannungs Pull-up Widerstände &lt;br /&gt;
* On-board 3,3 Volt und 5 Volt Spannungsversorgung mit Software-Reset &lt;br /&gt;
* Makros für gebräuchliche Funktionen &lt;br /&gt;
* Busverkehr-Sniffer (SPI, I²C) &lt;br /&gt;
* Bootloader für einfache Firmwareupdates &lt;br /&gt;
* Transparenter USB-&amp;gt;serieller Modus &lt;br /&gt;
* 10Hz-1MHz low-speed Logikanalyzer &lt;br /&gt;
* Programmierung vieler AVR-Mikrocontroller &lt;br /&gt;
* Unterstützt von AVRdude &lt;br /&gt;
* Kann AVR STK500 v2 emulieren (Durch Laden der STK500-Clone Firmware) &lt;br /&gt;
* Programmierbar via Perl, Python, usw. &lt;br /&gt;
* Internationalisierung (zur Zeit spanisch und italienisch) &lt;br /&gt;
* Öffentlich zugänglicher (Creative Commons Zero) Source-Code. Prototypen mit dem Bus-Pirate bauen und den verwendeten Code überall im eigenen Projekt benutzen&lt;br /&gt;
&lt;br /&gt;
= Gehäuse =&lt;br /&gt;
&lt;br /&gt;
http://www.seeedstudio.com/depot/plastic-case-for-small-project-bus-pirate-v3-compatible-p-581.html (nicht mehr lieferbar)&lt;br /&gt;
&lt;br /&gt;
Alternativ ein sogenanntes Sick-of-Beige (SoB) &amp;quot;Gehäuse&amp;quot;:&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.seeedstudio.com/depot/bus-pirate-v36-acrylic-case-v1-dp6037-p-1229.html&lt;br /&gt;
&lt;br /&gt;
= Bezugsquellen =&lt;br /&gt;
&lt;br /&gt;
* http://www.seeedstudio.com/depot/bus-pirate-v36-universal-serial-interface-p-609.html&lt;br /&gt;
* http://www.watterott.com/de/Bus-Pirate&lt;br /&gt;
* https://www.sparkfun.com/products/9544&lt;br /&gt;
&lt;br /&gt;
= Kompatible Firmware =&lt;br /&gt;
&lt;br /&gt;
* STM32 https://github.com/hydrabus/hydrafw&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Oszilloskope und Analyzer]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Nachttischlampe&amp;diff=92331</id>
		<title>Nachttischlampe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Nachttischlampe&amp;diff=92331"/>
		<updated>2016-03-13T07:52:53Z</updated>

		<summary type="html">&lt;p&gt;Prx: Änderung 92319 von 184.168.27.152 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [http://www.mikrocontroller.net/user/show/mclausen Martin Clausen]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Ausgehend von den von den Unzulänglichkeiten meiner bisherigen Nachttischlampe und der mich nicht überzeugenden Funktion einer Beleuchtung für den Schlafraum eines niederländischen Herstellers, entstand die Idee zu diesem Projekt.&lt;br /&gt;
Im Ergebnis ergeben sich ein angenehmeres Aufstehen, mehr Komfort und die Möglichkeit bei einem von zwei Personen bewohntem Schlafzimmer einander weniger zu stören.&lt;br /&gt;
=== Features für den Nutzer ===&lt;br /&gt;
* Zwei separate Beleuchtungskanäle&lt;br /&gt;
** Hintergrundbeleuchtung&lt;br /&gt;
** Leselicht&lt;br /&gt;
* Intuitive Bedienung über einen Drehencoder mit Tastfunktion&lt;br /&gt;
** Dynamische Schrittweitenanpassung für die schnelle und genaue Einstellung der Helligkeit und anderer Werte&lt;br /&gt;
* Anzeige mit 16x2 hintergrundbeleuchtetem LCD&lt;br /&gt;
* Anpassung der Helligkeitssteuerung an die Empfindlichkeitskurve des menschlichen Auges&lt;br /&gt;
* Anpassung der Helligkeit an das Umgebungslicht&lt;br /&gt;
* Fernbedienbar&lt;br /&gt;
* Vernetzbar innerhalb eines Raumes&lt;br /&gt;
** Synchronlauf der Helligkeiten von Lampen aktivierbar&lt;br /&gt;
** Alarmfunktion kann andere Lampen aktivieren&lt;br /&gt;
* Weck-Funktion&lt;br /&gt;
** Bis zu 7 wochentagsabhängige oder - unabhängige Alarme&lt;br /&gt;
** Alarme überspringbar&lt;br /&gt;
** Alarmsignal durch&lt;br /&gt;
*** separat in Zeit und Helligkeit einstellbares Eindimmen von Hintergrund- und Leselicht&lt;br /&gt;
*** angenehmes akustisches Signal mit einstellbarer Verzögerung zum Alarmstart und ansteigender Lautstärke&lt;br /&gt;
&lt;br /&gt;
=== Technische Eigenschaften ===&lt;br /&gt;
* LEDs&lt;br /&gt;
** Nichia NS6W183 auf Star-Platine&lt;br /&gt;
** 4 Stück warmweis für die Hintergrundbeleuchtung&lt;br /&gt;
** 2 Stück kaltweiss für das Leselicht&lt;br /&gt;
** andere LED Bestückungen bis 5 LED je Strang bei 24V Eingangsspannung möglich&lt;br /&gt;
* LED-Treiber&lt;br /&gt;
** Zwei unabhängige PWM-gesteuerte Kanäle&lt;br /&gt;
** Nachführung der PWM-Frequenz zur Vergrößerung des dynamischen Bereiches der LED-Treiber ohne Flackern der Beleuchtung&lt;br /&gt;
** Zwei verschiedene Treiber möglich:&lt;br /&gt;
*** Diodes ZXLD1362&lt;br /&gt;
*** Diodes ZXLD1374&lt;br /&gt;
** Hysteric Step-Down-LED-Driver&lt;br /&gt;
** maximal 60V, 1A bzw. 1,5A; 24V, 500mA in diesem Projekt&lt;br /&gt;
* Step-Down Regler für Steuer-Modul&lt;br /&gt;
** Zwei verschieden Schaltregler möglich&lt;br /&gt;
*** LM2674 ADJ auf 3,3V eingestellt, maximale Eingangsspannung 40V&lt;br /&gt;
*** LT1676 auf 3,3V eingestellt, maximale Eingangsspannung 60V&lt;br /&gt;
* MCU &lt;br /&gt;
** NXP 89LPC936, 8051 mit 2-Takt Kern&lt;br /&gt;
** 16k Byte Flash (ca. 10k Byte belegt), 768 Byte RAM, 512 Byte EEPROM, ISP&lt;br /&gt;
** 3,3 Volt, niedriger Stromverbrauch&lt;br /&gt;
** 6 MHz Takt mittels Resonator, 18 MHz maximal&lt;br /&gt;
** 8 Bit DAC und ADC&lt;br /&gt;
** 16 Bit CCU mit PLL und 4 Kanälen&lt;br /&gt;
* LCD&lt;br /&gt;
** Electronic Assembly DOGM162W-A mit amber-farbener Hintergrundbeleuchtung&lt;br /&gt;
** Hintergrundbeleuchtung mit PWM-Ansteuerung&lt;br /&gt;
** Anschluss an MCU via SPI&lt;br /&gt;
* RTC RV 3029-C2 mit integriertem Quarz&lt;br /&gt;
* Erzeugung des akustischen Signals&lt;br /&gt;
** DDS zur Erzeugung eines sauberen und angenehmen Sinussignals&lt;br /&gt;
** Alternativ: Hardware vorbereitet für das Abspielen von unkomprimierten Audiodaten aus 4M Byte Flash&lt;br /&gt;
** Ausgabe über DAC im MCU&lt;br /&gt;
** Tiefpassfilter 3. Ordnung, 8,6kHz Frequenz , mit 3/4 MCP6404&lt;br /&gt;
** Einstellung der Lautstärke in 4 Stufen mit CMOS-Schalter 1/2 74HC4052&lt;br /&gt;
** Lautsprecheransteuerung durch Brückenverstärker LM4861&lt;br /&gt;
* Messung der Umgebungshelligkeit&lt;br /&gt;
** Linearer I-U Wandler mit 1/4 MCP6404&lt;br /&gt;
** Widerstand über CMOS-Schalter 1/2 74HC4052 1:1000 umschaltbar in 4 Stufen&lt;br /&gt;
** 8-Bit ADC der MCU&lt;br /&gt;
** Gesamtdynamikbereich von 1:256000&lt;br /&gt;
** Moving-Average-Filter mit 64 Datenpunkten&lt;br /&gt;
* Kommunikation&lt;br /&gt;
** Empfängt und sendet IR-Signale gemäß RC5-Protokoll&lt;br /&gt;
* Stromversorgung&lt;br /&gt;
** Phihong, PSAA 30R-240 (30W, 24V)&lt;br /&gt;
** Niedrige Standby-Leistung von 300mW&lt;br /&gt;
** Ausreichend für zwei Lampen&lt;br /&gt;
** Messung der Leistungsaufnahme von der 24V Versorgung am Prototypen mit LM2674 und 2x ZXLD1362:&lt;br /&gt;
*** Standby: 170mW&lt;br /&gt;
*** Volllast: 11,5W&lt;br /&gt;
** Messung der Leistungsaufnahme von der 230V Versorgung an einem Netzteil mit zwei Prototypen mit LM2674 und 2x ZXLD1362:&lt;br /&gt;
*** Standby: 0,5W&lt;br /&gt;
*** Volllast: 26W&lt;br /&gt;
** Messung der Leistungsaufnahme von der 24V Versorgung am Prototypen mit LT1676 und 2x ZXLD1374:&lt;br /&gt;
*** Standby: 72mW&lt;br /&gt;
&lt;br /&gt;
* Struktur&lt;br /&gt;
** Steuerplatine 36x100mm², doppelseitig&lt;br /&gt;
** Leistungsplatine 80x100mm², einseitig&lt;br /&gt;
** Verbindung über einzelnes 10 pol. Flachbandkabel&lt;br /&gt;
** Stromversorgung über Steckernetzteil&lt;br /&gt;
&lt;br /&gt;
* Mechanik&lt;br /&gt;
** Konstruktion aus eloxierten Aluminium Profilen von Item&lt;br /&gt;
&lt;br /&gt;
* Software&lt;br /&gt;
** Open Source C für SDCC 3.2&lt;br /&gt;
** Verwendet Stromsparmodi der MCU&lt;br /&gt;
** State-Machines für Drehencoder und RC5-Dekodierung&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
* Symmetrisches Pärchen, Vorder- und Rückseite&lt;br /&gt;
[[Bild:Symmetrisches Pärchen.jpg|200px]]&lt;br /&gt;
[[Bild:Symmetrisches Pärchen Rückseite.jpg|200px]]&lt;br /&gt;
* Detail Ansteuerung, Vorder- und Rückseite&lt;br /&gt;
[[Bild:Detail Ansteuerung.jpg|200px]]&lt;br /&gt;
[[Bild:Detail Ansteuerung Rückseite.jpg|200px]]&lt;br /&gt;
* Detail Leselicht&lt;br /&gt;
[[Bild:Detail Leselicht.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Lichtwirkung ===&lt;br /&gt;
* Leselicht allein mit 10% Helligkeit&lt;br /&gt;
[[Bild:Leselicht 10%.jpg|300px]]&lt;br /&gt;
* Leselicht allein mit 100% Helligkeit&lt;br /&gt;
[[Bild:Leselicht 100%.jpg|300px]]&lt;br /&gt;
* Hintergrundlicht allein mit 10% Helligkeit&lt;br /&gt;
[[Bild:Hintergrundlicht 10%.jpg|300px]]&lt;br /&gt;
* Lese- und Hintergrundlicht zusammen mit 100% Helligkeit&lt;br /&gt;
[[Bild:Lese- und Hintergrundlicht 100%.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Die Bilder wurden alle bei den gleichen fixen Kamera-Einstellungen aufgenommen. Der effektive dimmbare Bereich liegt zwischen 3 und 100%. Zur PWM-Ansteuerung der LEDs wird der quadrierte Wert verwendet.&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
&lt;br /&gt;
Die Software besteht aus folgenden Teilen:&lt;br /&gt;
* Hauptschleife&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Routinen&lt;br /&gt;
** RC5 Decoder, ausgelöst durch Timer 0&lt;br /&gt;
** Update der Zeit, jede Minute durch RTC ausgelöst&lt;br /&gt;
** Drehencoder, ausgelöst durch Timer 1 bei 366Hz&lt;br /&gt;
** Update PWM-Werte und einlesen der Tasten, ausgelöst durch Timer aus RTC der MCU bei 25Hz&lt;br /&gt;
&lt;br /&gt;
* Ansteuerung des Display via SPI&lt;br /&gt;
&lt;br /&gt;
* Initialisierung der MCU&lt;br /&gt;
** Core Funktionen, hauptsächliche Stromsparfunktionen&lt;br /&gt;
** I/O Pins&lt;br /&gt;
** SPI auf Master mit 1,5MHz Takt, MSB first&lt;br /&gt;
** I2C auf 375kHz&lt;br /&gt;
** ADC fixed channel, single conversion mode für ADC0 bei 3MHz&lt;br /&gt;
** DAC&lt;br /&gt;
** Interne RTC als 25Hz Taktgeber: 6*10^6/128/25=1875 reload&lt;br /&gt;
** Watchdog wird abgeschaltet&lt;br /&gt;
** CCU output compare: non-inverted PWM, PLL: auf Lock-in abwarten&lt;br /&gt;
** Interrupts freischalten&lt;br /&gt;
&lt;br /&gt;
* Auswertung Drehencoder&lt;br /&gt;
&lt;br /&gt;
* Helligkeitsmessung&lt;br /&gt;
&lt;br /&gt;
* I2C und RTC&lt;br /&gt;
Die Funktionen stellen einerseits die Kommunikation via I2C sicher und sind anderseits in der Lage, die RTC nach einem Batteriewechsel automatisch zu konfigurieren, die Zeit zu lesen und zu schreiben.&lt;br /&gt;
Die Kommunikation via I2C nutzt bisher nicht den zugehörigen Interrupt und ist nicht fehlertolerant.&lt;br /&gt;
&lt;br /&gt;
* RC5 Decoder und Sender&lt;br /&gt;
Der RC5 Decoder beruht auf einer State-Machine, die schrittweise die einzelnen Bits erkennt und dann in Adresse und Daten zerlegt. Nach der Erkennung eines kompletten Komandos wird steht rCounter auf dem Wert 12 und das Hauptprogramm beginnt mit der Decodierung (Aufruf &amp;quot;DecodeRemote()&amp;quot;).&lt;br /&gt;
Der Sender ist mittels Bit-Banging realisiert. Aufgrund des strikten Timings werden alle Interrupts abgeschaltet. Die Adresse für die Fernbedienung kann vom Benutzer eingestellt werden oder angelernt werden. Die Adressen für die Kommunikation der Lampen untereinander lauten 27, 28, 29.&lt;br /&gt;
&lt;br /&gt;
* Optionsmenü&lt;br /&gt;
&lt;br /&gt;
* Setzen der Helligkeit&lt;br /&gt;
&lt;br /&gt;
* Auswertung Tasten&lt;br /&gt;
Es werden die Tasten entprellt und die Dauer des Tastendrucks wird festgestellt.&lt;br /&gt;
&lt;br /&gt;
* Erzeugung des akustischen Signals in &amp;quot;AcusticDDSAlarm()&amp;quot;&lt;br /&gt;
Das Sinussignal wird mittels direkter digitaler Signalsynthese erzeugt. Dazu erzeugt ein in einer Schleife laufender Akkumulator mit Hilfe einer Tabelle von Sinuswerten einen Datenstrom der dem DAC zugeführt wird. Frequenz und Dauer der einzelnen Töne wird in einem zweidimensionalen Array in Code abgelegt.&lt;br /&gt;
Aufgrund des strikten Timings werden alle Interrupts abgeschaltet. Die Helligkeitsmessung wird auch unterbrochen, da die gleichen Pins die Lautstärke steuern.&lt;br /&gt;
Parallel werden nur die Tasten überwacht.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Menüstruktur V2.svg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== Elektronik ===&lt;br /&gt;
Die Elektronik gliedert sich in zwei Teile:&lt;br /&gt;
* Leistungsteil&lt;br /&gt;
* Steuerung&lt;br /&gt;
&lt;br /&gt;
Der Leistungsteil entspricht im wesentlichen den Applikationsvorschlägen der Hersteller. Um Wechselwirkungen zwischen den Schaltreglern zu reduzieren wurden in den Stromzuführungen PI-Filter mit Feriten und Keramikkondensatoren eingesetzt und die gemeinsame Versorgung über einen größeren schaltfesten Elko abgeblockt.&lt;br /&gt;
Zur Erhöhung der Betriebssicherheit sind ferner eine Suppressor-Diode und ein Verpolschutz vorgesehen.&lt;br /&gt;
&lt;br /&gt;
Variante für ZXLD1362&lt;br /&gt;
Die einseitige Leiterplatte kann weitestgehend in SMD aufgebaut werden. Wo möglich wurde die Bauform 1206 verwendet, damit auch selbst gefertigte Platinen verwendbar sind. Große Masseflächen dienen auch zur Verteilung der Wärme. Die Anschlussklemmen und der Elko sind so platziert, dass sie im Inneren des Aluminium-Profils Platz finden.&lt;br /&gt;
&lt;br /&gt;
Variante für ZXLD1374&lt;br /&gt;
Gegenüber dem Entwurf mit ZXLD1362 wurde ein sparsamer Schaltregler (LT1676) für die Versorgung der Steuerung verwendet. Mit diesem Chip erhöht sich, wenn Kondensatoren und Suppressordiode angepasst werden auch die maximale zulässige Eingangsspannung.&lt;br /&gt;
Der LED-Treiber lässt sich deutlich besser kühlen und bietet eine bessere Dynamik in der PWM-Ansteuerung bei gleichzeitig höherer Wiederhohlrate. Letzteres reduziert den Stroboskop-Effekt beim Dimmen. Das Gehäuse erfordert jedoch eine doppelseitige Platine mit Durchkontaktierung.&lt;br /&gt;
&lt;br /&gt;
Die Steuerung gruppiert sich um eine MCU von NXP der 8051 Serie. Praktisch ist die 4-kanalige 16-bit CCU mit PLL, die sowohl die beiden LED-Stränge als auch die Hintergrundbeleuchtung des LCD steuern. Das kärgliche On-Chip der klassischen 8051 hat NXP um 512 Byte aufgebessert, was die Programmierung mit dem SDCC erleichtert. Die Einstellungen vom Benutzers werden im internen EEPROM abgelegt. Ein Resonator sorgt für einen genaueren Takt als der interne RC-Oszilator und eine &amp;quot;bequeme, glatte&amp;quot; Frequenz von 6MHz.&lt;br /&gt;
Als RTC kommt ein externer Baustein mit integriertem Quarz, Temperaturkompensation und Batterieumschaltung zum Einsatz. Damit lässt sich eine sehr gute Frequenzkonstanz erreichen. Die Lithiumbatterie sollte eine Zeit von 220mAh/1µA = 220kh = 25a erreichen. Die Stützbatterie wird durch einen Reihenwiderstand vor Defekten in der Schaltung die zu einem Stromfluss in die Batterie führen könnten geschützt. Der Anschluss der RTC zum Datenaustausch erfolgt über die I2C-Hardware des MCU. Die interne RTC des MCU wird als Timer verwendet.&lt;br /&gt;
Als Display kommt eine moderne Variante des klassischen 16x2 Zeichen LCD zum Einsatz. Die Modernisierungen betreffen die digitale Kontrast-Einstellung, 3,3V-Betrieb und das SPI mit passend zur MCU geringer Pin-Anzahl.&lt;br /&gt;
Die Kommunikation per IR erfordert nur das entsprechende Empfangsmodul und einen kleinen MOSFET zur Ansteuerung der Sendediode. Es sind zwei positionen auf der Platine vorgesehen, damit die Richtung der Abstrahlung gewählt werden kann. Falls beide Sendedioden bestückt werden, sollten die Vorwiderstände auf je 10 Ohm verdoppelt werden. Um das den 3,3V Schaltregler und den MOSFET nicht zu überfordern wird die Sendediode nur mit 300mA bei 25% Duty-Cycle betrieben. Ferner sind großzügige keramische Stützkondensatoren vorgesehen. Die Empfänger können parallel betrieben werden, um der Schaltung eine Rund-um-Sicht zu ermöglichen.&lt;br /&gt;
Recht aufwändig sind dagegen die Messung der Umgebungshelligkeit und die Erzeugung des akustischen Signales geraten. Zu nächst zur Helligkeitsmessung: Für diese Aufgabenstellung gibt es spezialisierte IC, die jedoch schwer erhältlich sind. Deshalb wurde ein Transimpedanzverstärker mit umschaltbarem Rückkoppelwiderstand aufgebaut. Die MCU ist zwar mit einem ADC ausgestattet, jedoch ist deren Dynamikbereich allein nicht ausreichend. Zusammen wird jedoch ein Bereich von 1:255000 entsprechend 108dB abgedeckt. In Software wird das Signal noch gefiltert und die Messwerte, zu die von der Hintergrundbeleuchtung des LCDs oder der IR-Sendediode beeinflusst worden sein könnten, übersprungen.&lt;br /&gt;
Die das akustische Signal sollte einen möglichst angenehmen Klang haben. Daher läuft auf der MCU eine DDS mit ca. 20kHz zur Erzeugung eines Sinussignals, welches über den ADC ausgegeben wird. Dann folgt zu nächst ein Buffer und eine Pegelanpassung, die ein Übersteuern der OPVs im folgenden Tiefpass mit ca. 7kHz verhindern. Über einen CMOS Schalter lässt sich das Signal in drei 10dB Stufen abgeschwächt dem ausgangsseitigen Brückenverstärker zuführen. Dieser wird zur Reduktion des Stromverbrauches von der MCU nur bei Bedarf aktiviert. Er ist auch auf eine Bandbreite von 8kHz begrenzt, um die Oberwellen weiter zu reduzieren.&lt;br /&gt;
Die beiden letztgenannten Schaltungsteile profitieren besonders von einem PI-Filter mit einer 4,7µH Drossel und größeren keramischen Kondensatoren. So werden Störungen aus Schaltreglern und der PWM-Ansteuerung der Hintergrundbeleuchtung ferngehalten.&lt;br /&gt;
RC-Glieder schützen die MCu vor Störeinstrahlung- und leitung durch die Kabel zu Drehencoder und Leistungsteil.&lt;br /&gt;
Die recht hohe Packungsdichte, der enge Pin-Abstand von MCU, OPV und RTC und die notwendigen Masseflächen erfordern eine professionelle doppelseitige Platine. Die Masseflächen wurden durch eine Vielzahl von vergrößerten und verteilten Vias verbunden. Die Entstörkondensatoren an den Halbleitern sind mit 1µF recht groß gewählt. Ob die Störfestigkeit unter der gegenüber 100nF reduzierten Resonanzfrequenz der Kondensatoren geringer ist, wurde nicht untersucht. (Es funktioniert.) Ein keramischer 1nF Kondensator hält Störungen vom Reset-Pin der MCU fern.&lt;br /&gt;
&lt;br /&gt;
Die Steuerplatine trägt zwei 5*2 polige Pfostenleisten. Die äußere dient primär zur Programmierung der MCU, kann aber auch für Erweiterungen mit I2C-Anschluss verwendet werden. Die innere stellt die Anschlüsse für Drehencoder und Leistungsteil zur Verfügung. Dazu muss somit ein Flachbandkabel mit drei Enden gepresst werden: 5*2 polig (Steuerung), offen (Drehencoder), 3*2 polig (Leistungsteil)&lt;br /&gt;
&lt;br /&gt;
Die MCU wird mit der kostenlosen Software [http://www.flashmagictool.com/ FlashMagic] und einer [http://www.keil.com/mcb900/mcb900-schematics.pdf Schaltung von Keil] über RS232 geflasht. Bei der Inbetriebnahme müssen folgende Punkte beachtet werden:&lt;br /&gt;
* Die Kondensatoren auf der Steuerungsplatine müssen schnell genug entladen werden können, damit die MCU beim Start in den Programmiermodus gebracht werden kann. Eine zusätzliche Last von z.B. 100 Ohm über die Betriebsspannung hilft.&lt;br /&gt;
* Es muss keine &amp;quot;echte&amp;quot; RS232 Schnittstelle sein. Ein USB-RS232 Adapter mit FTDI-Chip funktioniert bei mir auch.&lt;br /&gt;
* Einstellungen Flash Magic:&lt;br /&gt;
** Select: 89LPC936&lt;br /&gt;
** Baud Rate: 7200&lt;br /&gt;
** Interface: None (ISP)&lt;br /&gt;
** Oscillator (MHz): 7,373&lt;br /&gt;
** Erase block used by Hex File&lt;br /&gt;
* Unter ISP, Device Configuration wird die MCU konfiguriert:&lt;br /&gt;
** Statt des internen Oszillators muss ein externer High-Speed Oszillator gewählt werden. Die in FlashMagic einzustellende Frequenz ändert sich dann von 7.373 MHz auf 6 MHz&lt;br /&gt;
** Der Reset-Pin muss ausgeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Das Netzteil ist so ausgelegt, dass zwei Lampen mittels eines Y-Kabels versorgt werden können. Dadurch entfallen die Leerlaufverluste, Kosten und Platzbedarf des zweiten Netzteils.&lt;br /&gt;
&lt;br /&gt;
Kosten der Steuerplatine (Teile: Reichelt, MCU: Ebay, 5 Platinen von PCB-Pool): ca. 56€ je Stück&lt;br /&gt;
&lt;br /&gt;
=== Optoelektronik ===&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der LEDs wird primär von den Wünschen nach der Lichtwirkung bestimmt. Hier ist nur ein Vorschlag angegeben. Daneben gibt es noch die Schnittstellen zur Mechanik und zur Elektronik.&lt;br /&gt;
Die Ansteuerung kann bei Versorgung mit 24V 1 bis 5 LEDs je Strang bedienen. Der Strom ist auf 500mA eingestellt, auch wenn der ZXLD1362 auch größere Ströme verkraften sollte. Beim SOT23-5 Gehäuse hatte ich jedoch dann in einem anderen Projekt insbesondere bei höheren Spannungen Probleme mit der Wärmeabführung. Mittlerweile können auch andere Gehäuseformen mit geringerem Wärmewiderstand bzw. leistungsfähigere Chips wie der ZXLD1374 eingesetzt werden. Der ZXLD1374 kann auch kürzere PWM-Impulse noch sauber in Stromimpulse für die LEDs umsetzen, womit ein größerer dimbarer Bereich erzielt wird. Jedoch muss der PWM-Pin von einem Push-Pull- statt einem Open-Drain-Ausgang angesteuert werden, da der interne Pull-Up des LED-Treibers sehr schwach ist und der Chip dann nur bei relativ langen Pulsen aus dem Standby aufwacht. Zum ZXLD1374 ist ein zusätzlicher Schaltplan mit Layout im Repository abgelegt. Der LM267X musste bei diesem Entwurf einem sparsameren und spannungsfesteren LT1676 weichen.&lt;br /&gt;
Sollen mehr als 5 LEDs je Strang angesteuert werden, muss die Supressor-Diode am Stromversorgungseingang angepasst und der LT1676 zur Versorgung der Steuerplatine verwendet werden. Die ZXLD1362 vertragen bis zu 60V, sollten jedoch mit mindestens 17V versorgt werden, damit der Schalt-MOSFET voll durchschaltet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Teile von Leds.de&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl || Artikel-Nr. || Bezeichnung || Kommentar&lt;br /&gt;
|-&lt;br /&gt;
| 4  || 65659 || Nichia NS6L183BT, warmweiß, CRI 80, mit Platine (Star) || bessere Farbwiedergabe bei schlechterer Effizienz: austauschbar gegen NS6L183AT-H3 (CRI 85) oder NS6L183AT-H1 (CRI 90+)&lt;br /&gt;
|-&lt;br /&gt;
| 2  || 65656 || Nichia NS6W183BT, weiß, CRI 80, mit Platine (Star) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2  || 60354 || Carclo Linse für Luxon Rebel, frosted wide || passt auch für Nichia NS6_183T&lt;br /&gt;
|-&lt;br /&gt;
| 2  || 60456 || Linsenhalter rund für Luxon Rebel, transparent || muss deutlich mit Säge und Feile angepasst werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kosten ca. 27€&lt;br /&gt;
&lt;br /&gt;
=== Mechanik ===&lt;br /&gt;
Bei einer Nachttischlampe ist natürlich auch das Design eine wichtiges Merkmal. Ich bevorzuge ein klares einfaches Design und Materialien wie Glas und eloxiertes Aluminium. Die verwendeten Profile (Item, Profil X 8, leicht) ermöglichen es die Kabel und die Leistungselektronik im Inneren zu verstecken.&lt;br /&gt;
Es haben aber auch einige Kunststoffteile Verwendung gefunden, da sie mir den Verschluss der Aluminiumprofile ohne sichtbare Schrauben ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Der sichere Stand wird durch die Füllung des Profil X 8 80x80 mit kleinen Kieseln für Aquarien gewährleistet. Die Oberen 1 bis 2cm bleiben frei und dienen dem Lautsprecher als Resonanzraum.&lt;br /&gt;
&lt;br /&gt;
Die Frontplatte wird laut Zeichnung von der Schaeffer AG (Datei bei Downloads) gefertigt. Sie &amp;quot;schwebt&amp;quot; auf vier Distanzhülsen über der Steuerungselektronik. Dadurch bleibt umlaufend ein Spalt von 12mm Höhe, durch den die Steuerung per RC5 kommuniziert, die Umgebungshelligkeit gemessen wird und der Schall vom Lautsprecher abgestrahlt wird.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Teile von Item&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl || Länge || Art.-Nr. || Bezeichnung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 160mm || 0.0.493.04 || Profil X 8 80x80 8N leicht&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 160mm || 0.0.492.88 || Profil X 8 40x40 4N leicht&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 480mm || 0.0.492.88 || Profil X 8 40x40 4N leicht&lt;br /&gt;
|-&lt;br /&gt;
| 1 || - || 0.0.601.13 || Gelenk X 8 40x40 mit Klemmhebel&lt;br /&gt;
|-&lt;br /&gt;
| 4 || - || 0.0.026.07 || Standard-Verbindungssatz 8&lt;br /&gt;
|-&lt;br /&gt;
| 1 || - || 0.0.489.98 || Abdeckkappe X 8 80x80 grau&lt;br /&gt;
|-&lt;br /&gt;
| 1 || - || 0.0.489.61 || Abdeckkappe X 8 80x40 grau&lt;br /&gt;
|-&lt;br /&gt;
| 1 || - || 0.0.489.60 || Abdeckkappe X 8 40x40 grau&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kosten: Item ca. 90€, Schaeffer AG ca. 25€&lt;br /&gt;
&lt;br /&gt;
Der Klemmhebel kann bei ästhetischen Bedenken auch gegen eine Schraube getauscht werden. Von zwei Standard-Verbindungssätzen wird nur die Schraube zur Befestigung des Gelenks verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Bohr- und Fräsarbeiten habe ich durch [http://dw-metall.de/ Daniel Wulfänger] durchführen lassen.&lt;br /&gt;
&lt;br /&gt;
Ein 3D-Model für FreeCAD befindet sich im SVN-Repository (s.u.).&lt;br /&gt;
&lt;br /&gt;
2D-Zeichnungen auf Anfrage per PM bei [http://www.mikrocontroller.net/user/show/mclausen Martin Clausen]&lt;br /&gt;
&lt;br /&gt;
== Montage ==&lt;br /&gt;
&lt;br /&gt;
Wenn alle Teile laut Zeichnung bearbeitet worden sind, werden zunächst die Standard-Verbinder für die Verbindung von Arm und Fuß eingeschraubt. Da aus optischen Gründen kein Loch zum Festziehen der Schrauben vorhanden ist, werden die Standardverbinder vorsichtig angezogen, so dass der Arm beim Aufschieben beginnt zu klemmen. Dann wir die Fläche zwischen Arm und Fuß mit Alkohol geschmiert und der Arm mit einigen Hammerschlägen montiert. Dabei sollte eine Unterlage (z.B. ein Stück Holz) verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Nun wird der Drehencoder verdrahtet und in die große Abdeckkappe geschraubt und mit Heißkleber versiegelt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Drehencoder mit Kabel.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Im folgenden wird die Stromversorgungsbuchse in die 80x40 Abdeckkappe geschraubt und diese in den Fuß gepresst.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Durchführung Kabel.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Dann werden die LEDs mit etwas Wärmeleitpaste und einer Isolierscheibe unter jeder Schraube montiert. Kabel werden in das Profil gefädelt und an gelötet. Ein fester Draht kann dabei nützlich sein. Dann wird die Leistungselektronik im Fuß platziert. Für die Positionierung sorgen 10 und 12 mm Distanzbuchsen jeweils mit und ohne Außengewinde.&lt;br /&gt;
Jetzt bietet sich ein kurzer Funktionstest an.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Montage LEDs.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Für die Front-LEDs werden nun die Halter modifiziert und aufgeklemmt. Dann werden die Linsen eingerastet.&lt;br /&gt;
&lt;br /&gt;
Nun wird grober Aquarien-Kies gewaschen, gründlich getrocknet und in den Fuß gefüllt. Dabei muss ausreichend Raum für die Halter der großen Abdeckkappe gelassen werden. Diese wird nun aufgepresst. Dann wird der Fuß weiter verfüllt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Verfüllung Fuß.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Jetzt werden noch Steuerelektronik mit 5mm Distanzbuchsen und M3x10 Schrauben montiert. Zum Schluss wird die Frontplatte mit M3x20 Edelstahl Senk-Inbusschrauben und 12mm Distanzbuchsen befestigt.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/martinclausen2/Nachttischlampe.git Link zum Repository für Software, Schaltpläne, Platinen und Mechanik]&lt;br /&gt;
* [[Datei:Hex-File Nachttischlampe.zip|Hex-File jeweils für ZXLD1374 ZXLD1362 V5]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Wake-Up Light]]&lt;br /&gt;
* [[LED-Pendellampe]]&lt;br /&gt;
* [[LED]]&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/297859#3182303&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:8051]]&lt;br /&gt;
[[Kategorie:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Pulsdichtemodulation&amp;diff=92329</id>
		<title>Pulsdichtemodulation</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Pulsdichtemodulation&amp;diff=92329"/>
		<updated>2016-03-13T07:51:46Z</updated>

		<summary type="html">&lt;p&gt;Prx: Änderung 92321 von 184.168.27.152 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Pulsedichtemodulation ist eine Methode, einen zunächst digitalen Wert über einen einzelnen Port-Pin eines PLDs auszugeben und in der Folge mittels einer analogen Filterung einen Analogwert zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
== Funktion ==&lt;br /&gt;
Sie beruht auf der Methode der s.g. Delta-Sigma-Modulation, bei der das Verhalten des Ausgangs (meist ein idealer Integrator) vorrausgerechnet und permanent die Differenz zu dem steuernden Eingangssignal, der Sollgröße, gebildet wird. Ist der vorausberechnete Wert grösser, als der Eingang, wird das 1-Bit-Signal auf low geschaltet, im umgekehrten Fall auf high. Das so erzeugte 1-Bit-Signal ist der Eingang für diesen virtuellen Integrator.&lt;br /&gt;
&lt;br /&gt;
Hierdurch entsteht eine Art Blindregelung, die das Tastverhältnis des Ausgangssignals so einstellt, dass der spätere gefilterte Wert dem Eingangssignal theoretisch exakt folgt. Im Idealfall (siehe erstes Bild) bewegt die Regelung den Istwert somit permanent um den Sollwert herum und zeichnet das eingeprägte Signal (hier ein Sinus) nach.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:PDM-image1-ideal-case.gif|thumb|right|350px|Theoretisch ideales PDM-Signal]]&lt;br /&gt;
Praktisch gibt es aber einige Probleme: Infolge der Verluste der Schaltung und des teilweise nichtlinearen Verhaltens der Bauelemente (speziell des nachgeschalteten Filters) sowie des prinzipiellen Verschluckens des DC-Anteils bei typischen Filtern, driftet der reale Analogwert vom erzeugten virtuellen Wert mehr oder weniger weit weg. Zudem gibt es durch die Filterdämpfung nachfolgender RC-Glieder (grüne Kurve) wie auch bei aktiven Verstärkern (rail-to-rail-Problem) eine Amplitudenverzerrung und eine Phasenverschiebung. Diese lassen sich schätzen und in die Steuerung der PDM mit einbeziehen, indem die Amplitude linear (bzw.  wie bei der &amp;quot;non-linear-predistortion&amp;quot; auch durchaus nichtlinear) vorkorrigiert wird. Ferner lassen sich die Ungenaugigkeiten aktiv wegregeln, indem das erzeugte Signal gemessen- und digital rückgeführt wird, wobei es relevant ist, *wo* das Signal abgegriffen wird.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:PDM-image2-real-case.gif|thumb|right|350px|Verlustbehaftetes PDM-Signal]]&lt;br /&gt;
Im zweiten Bild wird deutlich, dass die Phasen, in welchen extreme duty cycle Werte vorliegen, eigentlich überproportional steigen müssten, um vor allem die zeitabhängigen Verluste auszugleichen, d.h. kurze An-Phasen wären noch kürzer, lange An-Phasen noch länger. Auch das prinzipielle stark nichtlineare Verhalten eines einfachen RC-Dämpungsgliedes erfordert ein Aufdehnen der Phasen. Dies alles kann man beim virtuellen Integrator modellieren und auf diese Weise mit in die Regelung einfließen lassen. Damit wird dann auch der BIAS passend korrigiert, sofern das Modell genau genug ist. Zusätzlich wird in diesem Beispiel im Vergleich zum vorherigen Bild auch die Dämpfung des nachgeschalteten Filters erhöht, wodurch sich die Kurve besser glättet und ein noch besserer Sinus entsteht, bei den nur die Phase dem Ideal noch hinterher läuft.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:PDM-image3-feedback-control-case.gif|thumb|right|350px|Geregeltes PDM-Signal]]&lt;br /&gt;
Um die phasenverzögernde Filterwirkung zu kompensieren, muss das Signal hinter dem Filter abgegriffen und von dort in die Regelung rückgeführt werden. tut man dies, folgt die Kurve (hier grün) viel genauer dem blau dargestellten Sollwert. Wenn man bei bestimmten Anwendungen einen exakten Gleichanteil bzw. eine präzise Phase ausgeben will, muss demnach so oder ähnlich kompensiert und geregelt werden. Dies hat dann aber leider den Nachteil von mehr niederfrequenten Regelanteilen im Signal mit dem Ergebnis des insgesamt grösseren Rauschens. Die Verbesserung des DC-Aspekts führt also zu einer verschlechterten AC-Qualität.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Einsatzoptionen ==&lt;br /&gt;
Für Audio-Applikationen habe ich gefunden, dass es besser ist, das System im Wesentlichen zu steuern, also mehr oder weniger &amp;quot;stur&amp;quot; die ideale PDM auszugeben und dabei die Verluste zu schätzen und in den Integrator miteinzuberechnen. Konkret muss dabei das nichtlineare Kondensatorladeverhalten in Delta-Sigma-Regler abgebildet werden. Den DC-Anteil kann man dann langsam und träge regeln, indem die angenommenen Verluste angepasst werden. Damit ist es möglich, auch mit einem sehr simplen Filter eine erstaunliche Audio-Qualität zu erhalten.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[PWM]]&lt;br /&gt;
* [[Diskussion:Soft-PWM|Diskussionseite zu Soft-PWM]] - Diskussion über PDM&lt;br /&gt;
&lt;br /&gt;
== Weblinks==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Messtechnik]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=92328</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=92328"/>
		<updated>2016-03-13T07:50:44Z</updated>

		<summary type="html">&lt;p&gt;Prx: Änderung 92322 von 184.168.27.152 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:ESP8266.jpg|thumb|300px|ESP8266, Funkmodul]]&lt;br /&gt;
Das [[ESP8266]] von dem Hersteller Espressif ist ein programmierbarer WLAN-SoC mit [[UART]]- und [[SPI]]-Schnittstelle. &#039;&#039;&#039;WLAN&#039;&#039;&#039;-Funkmodule mit ESP8266 sind ab 3€ verfügbar. Die UART-Schnitttstelle ermöglicht eine einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
Laut Hersteller &amp;lt;ref&amp;gt;[http://espressif.com/en/products/esp8266 &#039;&#039;Herstellerseite -  unter Details&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;. :&lt;br /&gt;
* 802.11 b/g/n&lt;br /&gt;
* Wi-Fi Direct (P2P), soft-AP&lt;br /&gt;
* Integrated TCP/IP protocol stack&lt;br /&gt;
* Integrated TR switch, balun, LNA, power amplifier and matching network&lt;br /&gt;
* Integrated PLLs, regulators, DCXO and power management units&lt;br /&gt;
* +19.5dBm output power in 802.11b mode&lt;br /&gt;
* Power down leakage current of &amp;lt;10uA&lt;br /&gt;
* Integrated low power 32-bit CPU could be used as application processor&lt;br /&gt;
* SDIO 1.1/2.0, SPI, UART&lt;br /&gt;
* STBC, 1×1 MIMO, 2×1 MIMO&lt;br /&gt;
* A-MPDU &amp;amp; A-MSDU aggregation &amp;amp; 0.4ms guard interval&lt;br /&gt;
* Wake up and transmit packets in &amp;lt; 2ms&lt;br /&gt;
* Standby power consumption of &amp;lt; 1.0mW (DTIM3)&lt;br /&gt;
* VCC: 3,3V (Achtung: Eingänge sind &#039;&#039;&#039;NICHT 5V TOLERANT&#039;&#039;&#039;!)&lt;br /&gt;
Weiterhin:&lt;br /&gt;
* GPIOs, ADC&lt;br /&gt;
&lt;br /&gt;
=== Datendurchsatz/Performanz ===&lt;br /&gt;
[https://www.mikrocontroller.net/topic/342240?page=single#3857630 Beitrag im Forum mit Tests: TCP: bis zu 7 MBit/s]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=7&amp;amp;t=24 Beitrag Espressif-Form: UART loopback: 4.5 Mbps]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Bei den chinesischen Modulen mit Firmware 0.9.1 werden Ping Befehle unabhängig von der Paketgröße typischerweise in 30-150ms beantwortet. Datenpakete, die man vom PC aus an das Modul sendet werden unabhängig von der Paketgröße typischerweise nach 100-200ms quittiert.&lt;br /&gt;
&lt;br /&gt;
=== Power-/Sleep-Modes ===&lt;br /&gt;
Der Stromverbrauch des ESP8266 ist abhängig von vielen Faktoren, er läßt sich aber durch geschickte Programmierung durchaus deutlich senken.&amp;lt;br/&amp;gt;&lt;br /&gt;
So ist es nicht notwendig, dass das WIFI-Modem oder der Mikrocontroller ständig läuft um z.B. eine WLAN-Türklingel zu realisieren. Im &amp;quot;Deep-Sleep&amp;quot; würde der ESP8266 dann nur 10uA verbrauchen, bis er über einen GPI-Interrupt geweckt wird und die Meldung absetzt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu beachten ist, dass in diesem Moment die WLAN und Netzwerkanmeldung neu startet und hierfür eine gewisse Zeit benötigt wird.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=6&amp;amp;t=133 detailierte Übersicht der verschieden Modi und deren Stromverbrauch von Espressif]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WLAN-Module mit ESP8266 ==&lt;br /&gt;
Es existieren ca. 11 Varianten von chinesischen Herstellern. Beispielsweise mit PCB- oder Keramik-Antenne oder mit u.fl.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die Firmware 0.9.1 unterstützt bis zu vier gleichzeitige TCP oder UDP Verbindungen. Sie kann sich in vorhandene WLAN Netze einbuchen, aber auch selbst Access-Point mit DHCP Server sein. Der Access-Point ist zu Android kompatibel (mit 4.1.2 getestet).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Firmware enthält jedoch keinen Router. Mehrere Computer, die mit dem Modul als Access-Point verbunden sind, können keine Verbindung zueinander aufbauen.&lt;br /&gt;
Das Feature nennt sich AP Isolation.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#Produktbeschreibung: [[http://playground.boxtec.ch/doku.php/wireless/esp8266]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung einiger ESP8266-Module ===&lt;br /&gt;
====ESP8266-01====&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:ESP8266-PinBelegung1.jpg|Pinbelegung - Groß mit PCB-Antenne&lt;br /&gt;
Datei:ESP8266-PinBelegung2.jpg|Pinbelegung - Klein mit Keramik-Antenne&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Quelle &amp;lt;ref&amp;gt;[http://pan.baidu.com/share/link?shareid=727869034&amp;amp;uk=1900861665 &#039;&#039;Seller Information&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
====ESP8266-07====&lt;br /&gt;
Achtung, beim ESP8266-07 Modul sind einige mit vertauschten Beschriftungen von GPIO4 und GPIO5 unterwegs!!.&lt;br /&gt;
&lt;br /&gt;
== Möglichkeiten der Nutzung und Programmierung ==&lt;br /&gt;
===== Benutzung einer Firmware =====&lt;br /&gt;
Verschiedene Projekte betreiben die Entwicklung einer Firmware. Man kann die Firmware &amp;quot;einfach nur&amp;quot; flashen und benutzen oder sich auch aktiv an der Entwicklung beteiligen. Es gibt unter anderem folgende Projekte:&lt;br /&gt;
* AT-Befehle: Firmware, mit welcher das Modul über UART angesprochen wird.&lt;br /&gt;
* Micropython: Firmware, die das Ablaufen von Python Scripts ermöglicht&lt;br /&gt;
* NodeMCU: Firmware, die das Ablaufen von Lua-Scripts ermöglicht ([https://github.com/nodemcu/nodemcu-firmware Github])&lt;br /&gt;
* smartJS: Firmware, die das Ausführen von JavaScript erlaubt ([https://github.com/cesanta/smart.js Github])&lt;br /&gt;
* Arduino core for ESP8266 WiFi chip: Programmierumgebung &amp;amp; Firmware, die das Ausführen von C Programmen ermöglicht, im Stil der bekannten Arduino Plattform. [https://github.com/esp8266/Arduino Github - ink. Anleitung]&lt;br /&gt;
* ESP8266 Basic: Firmware, die das Ausführen von Basic Programmen und das Editieren über WLAN erlaubt [http://www.esp8266basic.com/]&lt;br /&gt;
&lt;br /&gt;
===== Erstellen (Kompilieren) einer Firmware =====&lt;br /&gt;
Für die Erstellung einer individuellen Firmware gibt es zwei Möglichkeiten:&lt;br /&gt;
* Software Development Kit (SDK): Erstellen einer Firmware mit einer GCC-Toolchain&lt;br /&gt;
* Arduino IDE: Erstellen einer Firmware mit einer Arduino IDE&lt;br /&gt;
Projekte, die eine Firmware für das ESP8266 entwickeln (siehe vorheriger Abschnitt), benutzen eine dieser beiden Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== Firmware flashen/updaten ===&lt;br /&gt;
Typischerweise wird eine kompilierte Firmware per UART-Bootloader des ESP8266-SoC auf einen Flash-Chip eines ESP8266-Moduls geladen. Von dort startet der ESP8266-SoC anschließend die Firmware.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433 Flash Download Tool vom Hersteller] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/themadinventor/esptool Python Tool zum Flashen (von Fredrik Ahlberg)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/3s1d/esp_prog Extension zum Tool von Fredrik Ahlberg] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=2#3857075 Tool zum Flashen (von Christian Klippel)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://defcon-cc.dyndns.org/wiki/ESP8266#Update Anleitung, extern] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=3#3810559 Anleitung, Forum]&lt;br /&gt;
&lt;br /&gt;
Der Hersteller veröffentlich regelmässig [http://bbs.espressif.com/viewforum.php?f=5 Firmwareupdates] als Bestandteil des esp_iot_sdk. Die Firmware-Dateien befinden sich im Verzeichnis bin. Das Update wird beispielweise für Firmware 0.9.5 folgendermaßen durchgeführt: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python esptool.py --baud 9600 --port com6 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Flashgröße muß man die Firmware ab Version 1.0.1 selbst compilieren. Siehe Diskussion [http://www.esp8266.com/viewtopic.php?p=16515 hier] und [http://bbs.espressif.com/viewtopic.php?f=16&amp;amp;t=400 hier].&lt;br /&gt;
&lt;br /&gt;
== AT-Befehle für eine Firmware auf Basis des SDK-Beispiels &amp;quot;AT&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als AP&lt;br /&gt;
&lt;br /&gt;
Da wir nicht wissen, in welchem Modus sich das Modul gerade befindet, fragen wir diesen ab mit dem &lt;br /&gt;
Befehl AT+CWMODE?  Das Modul antwortet mit &lt;br /&gt;
&lt;br /&gt;
    AT+CWMODE?&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;+CWMODE:1&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
In diesem Fall ist das Modul aktuell im Modus 1 ( Station) eingestellt. Also ändern wir den Modus auf 2 ( AP)&lt;br /&gt;
mit dem Befehl AT+CWMODE=2. Nach diesem Befehl ist ein Reset des Moduls erforderlich, damit die Änderung &lt;br /&gt;
sichtbar wird. Mit dem Befehl AT+RST führen wir diesen durch. Das Modul startet neu und die Stromaufnahme&lt;br /&gt;
steigt auf ca 80 mA. Das Modul ist jetzt als WLAN AP im Wireless Lan sichtbar. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir noch einstellen, dass wir mehrere Verbindungen gleichzeitig haben wollen und den TCP Server starten und einstellen. Mit dem Befehl AT+CIPMUX=1 sagen wir dem Modul, dass wir mehrere Verbindungen haben wollen. Und mit dem Befehl AT+CIPSERVER=1,2526 starten wir den TCP Server und lassen ihn auf Port 2526 laufen. Sobald sich ein Client verbindet, sendet das Modul &#039;Link&#039; + LF + CR. Beim Trennen einer Verbindung vom Client kommt &#039;Unlink&#039; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir uns über einen TCP Socket auf Port 2526 mit dem Modul verbinden und Daten austauschen. Empfangene Daten werden folgendermaßen angezeigt. Gesendet wurde  &amp;quot;Hallo Leute&amp;quot; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     +IPD,0,11:Hallo Leute&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+IPD kommt immer, 0 ist die erste Verbindung. Wenn 2 Geräte gleichzeitig eine Verbindung aufgebaut haben, steht dort eine 1. 11 Zeichen wurden empfangen, dann kommen die Daten.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten vom Modul zum Client geht man folgenderweise vor. Erstmal sagen wir dem Modul, wieviele Daten wir an welche Verbindung schicken wollen. Mit dem Befehl AT+CIPSEND=0,5 z. B. sagen wir dem Modul wir möchten 5 Bytes an Verbindung 0 senden. Nach diesem Befehl werden die nächsten 5 Zeichen direkt an die Verbindung weitergereicht.&lt;br /&gt;
Sollte keine aktive Verbindung bestehen, sendet das Modul &lt;br /&gt;
     AT+CIPSEND=0,5&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;link is not&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
ansonsten kommt &lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt; &amp;gt;&lt;br /&gt;
und man kann Daten senden. Nach dem absenden der Daten &#039;Leute&#039; + LF + CR sendet das Modul &lt;br /&gt;
    Leute&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    SEND OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als Station&lt;br /&gt;
&lt;br /&gt;
== Software Development Kit (SDK) ==&lt;br /&gt;
Mit dem SDK können eigene Applikationen programmiert und die im SDK vorhandenen Beispiele &amp;quot;AT&amp;quot; und &amp;quot;IoT&amp;quot; verändert werden. Das SDK wird vom Hersteller zur Verfügung gestellt (Stand 25.10.2014). Passend zum SDK existiert eine virtuelle Maschine mit eingerichtetem gcc zum Kompilieren. Insbesondere der nun verfügbare gcc basiert auf einer Community-Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine + Anleitung/HOWTO für das Setup sowie für das Kompilieren]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Mit dem SDK wird der Mikrocontroller progammiert, der sich direkt auf dem ESP8266-SoC-Chip befindet. Dies ist nicht zu verwechseln mit Programmieranleitungen zur UART-Ansteuerung des ESP8266-SoC (meist mit AT-Firmware) mit einem anderen Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
==Checkliste bei Problemen mit dem Modul/Compiler/SDK==&lt;br /&gt;
Bitte berücksichtige bei der Frage nach Hilfestellung zu Deinem Problem die folgende Checkliste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit der AT-Firmware/UART-Ansteuerung mit Mikrocontroller&#039;&#039;&#039;&lt;br /&gt;
# Was nutzt Du für die Stromversorgung?&amp;lt;br/&amp;gt;(Ganz knapp benennen, so dass Rückschlüsse auf Spannung und Stromstärke möglich sind)&lt;br /&gt;
# Welche Firmware-Version verwendest Du und von woher hast Du sie?&lt;br /&gt;
# Welchen Mikrocontroller verwendest Du?&lt;br /&gt;
# Welche Baudrate verwendest Du?&lt;br /&gt;
# &amp;quot;Sieht&amp;quot; das Modul den AP, &amp;quot;sieht&amp;quot; der PC das Modul?&lt;br /&gt;
# Funktioniert ein Connect?&lt;br /&gt;
# Welche AT-Befehlssequenz verwendest Du und was antwortet das Modul?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit dem SDK/Compiler&#039;&#039;&#039;&lt;br /&gt;
# Benutzt Du die neuste, offizielle VM?&amp;lt;br/&amp;gt;(Diese ist ausgelegt für das neueste SDK)&lt;br /&gt;
# Benutzt Du das neueste, offizielle SDK? Welche Version benutzt Du?&amp;lt;br/&amp;gt;(Es werden regelmäßig Bugfixes und Erweiterungen eingepflegt)&lt;br /&gt;
# Kannst Du die SDK-Beispiele (IoT,AT) entsprechend der offiziellen Anleitung kompilieren, flashen und läuft es?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://en.wikipedia.org/wiki/ESP8266 ESP8266-Eintrag auf en.wikipedia.org]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.esp8266.com/ ESP8266 Community Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://github.com/esp8266 ESP8266 Github mit Wiki und Source-Code Samples]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://hackaday.com/tag/esp8266/ Hackaday Posts zu ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://espressif.com/en/products/esp8266/ ESP8266-Seite des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/ ESP8266-Forum des Herstellers]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/348772 Topic neu im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240 Topic alt im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342878 Sammelbestellungen im mikrocontroller.net-Forum]&lt;br /&gt;
&lt;br /&gt;
[http://blog.thomasheldt.de/ Viele Projekte und Informationen zum ESP8266]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://stefanfrings.de/wlan_io/ Projekt I/O Schnittstellen Modul mit WLAN]&lt;br /&gt;
&lt;br /&gt;
=== Dokumente === &lt;br /&gt;
[http://neilkolban.com/tech/esp8266/ Kolban’s book on the ESP8266] Sehr empfehlenswert!&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Anleitung/HOWTO für das Setup der virtuellen Maschine (SDK) sowie für das Kompilieren]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://nurdspace.nl/ESP8266 Übersetztes Datenblatt]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/w/Wi07c AT Instructions Set (English)] und [http://www.electrodragon.com/w/Wi07c#First_time_use_guide Anleitung zum Betrieb an einem Arduino (inkl. Code)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://thomaspfeifer.net/esp8266_wlan_seriell_modul_at_kommandos.htm Beschreibung der AT-Kommandos mit Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/229016/Espressif_IoT_AT____v0.1.5.906.pdf Espressif AT Instruction Set(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/document/pdf/ESP8266%20Specifications(Chinese).pdf ESP8266 Specifications(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://nodemcu.readthedocs.org/en/dev/ NodeMCU Documentation]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://cknodemcu.wordpress.com/2015/11/24/building-an-iot-node-for-less-than-15/ Building an IoT Node for less than 15$] (Paper, Kindle via Amazon)&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://onedrive.live.com/#cid=C4DDF72E6EEA3826&amp;amp;id=C4DDF72E6EEA3826%21631 Dateien (Xplorer+SDK+PDF+etc.)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/230185/esp8266_config_v050.exe Config-Tool] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen ===&lt;br /&gt;
[http://espressif.com/en/espressif-systems/contact-us/ Offizieller Espressif Vertriebskanal] (Sample Purchase)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?SearchText=ESP8266 aliexpress.com] ~ 2€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.banggood.com/?zf=283997 banggood.com] ~ 3.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ebay.de/ Ebay]&lt;br /&gt;
ab 3€ inkl. Versand, Einzelstückpreis: ESP-01/02/03/04/05&amp;lt;br/&amp;gt;&lt;br /&gt;
(Suchbegriff: ESP8266, Option Artikelstandort: &amp;quot;Weltweit&amp;quot;)&amp;lt;br/&amp;gt;&lt;br /&gt;
(10 Stück ab 27 EUR inkl. Versand; Suchbegriff: 10pcs ESP8266)&amp;lt;br/&amp;gt;&lt;br /&gt;
ab 3.20€ inkl. Versand, Einzelstückpreis: ESP-07/08/09/11&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/?s=esp8266&amp;amp;post_type=product electrodragon.com] ~ 3.50€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://ex-store.de/advanced_search_result.php?keywords=esp8266&amp;amp;x=0&amp;amp;y=0 eX-store.de] (ESP-01/02/03/05/07/12/13) ab 3.35€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.it-wns.de/themes/suche/index.php?suchekategorie=&amp;amp;sucheallgemein=esp8266 IT-WNS.de] (ESP-01/02/03/06/07/12E) je 3.99€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/depot/WiFi-Serial-Transceiver-Module-w-ESP8266-p-1994.html seeedstudio.com] ~ 5.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://shop.in-circuit.de/index.php?cPath=21 In-Circuit.de] ESP-ADC DIL Modul mit ESP8266EX 9.90€ Einzelpreis&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.watterott.com/index.php?page=search&amp;amp;desc=off&amp;amp;sdesc=off&amp;amp;keywords=ESP8266 watterott.com] ab ~ 4€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anderes==&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/ESP8266-CPCB PCB für Community-Modul (Vorschlag)]&lt;br /&gt;
*[http://fkainka.de/esp8266-in-der-arduino-ide/ ESP8266 mit Arduino IDE programmieren]&lt;br /&gt;
*[http://www.arduinesp.com Arduino IDE Integration (ab 1.6.x)]&lt;br /&gt;
*[https://cknodemcu.wordpress.com/ NodeMCU (Lua) Anwendungen]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--von [[axhieb]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;br /&gt;
[[Kategorie:Wlan]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entprellung&amp;diff=92327</id>
		<title>Entprellung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entprellung&amp;diff=92327"/>
		<updated>2016-03-13T07:48:44Z</updated>

		<summary type="html">&lt;p&gt;Prx: Änderung 92324 von 184.168.27.152 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problembeschreibung ==&lt;br /&gt;
Mechanische stromführende Komponenten wie [[Schalter]] und [[Taster]] neigen beim Ein- und Ausschalten zum sogenannten &#039;&#039;&#039;Prellen&#039;&#039;&#039;, d.h sie schalten schnell mehrfach aus und ein, was durch mechanische Vibrationen des Schaltkontaktes verursacht wird, sofern sie nicht mit aufwändigen mechanischen Maßnahmen dagegen geschützt sind. Besonders die [[Drehgeber]] sind aufgrund der Raststellungen und der Bewegung des Bedieners dafür empfindlich. Auch optoelektronische Bauelemente und chemische Kontaktschalter, sowie Flüssigkeitsschalter haben das Problem.&lt;br /&gt;
&lt;br /&gt;
Vereinfacht dargestellt, sieht eine von einem prellenden Schalter oder Taster geschaltete Spannung wie folgt aus:&lt;br /&gt;
[[Bild:Entprellen.png]]&lt;br /&gt;
&lt;br /&gt;
Es existieren also mehrere kurze Einschaltimpules, welche bei Tastern als Mehrfachbefehl und bei Drehgebern als falsche Winkelbewegung interpretiert werden kann. Bei Schaltern wiederum, kommt es in der elektronischen Baugruppe zu mehreren Resets und Einschaltvorgängen, die unnötig Strom ziehen oder im schlechtesten Fall die Schaltung stressen oder beschädigen können. Wichtige Schalter und solche, die hohe Ströme führen sollen, werden dazu mit geeigneten Maßnahmen wie Redundanz, Stufenschaltkonzepten oder bei Gas- und Flüssigkeitschaltern durch elektrochemische Maßnahmen abgesichert. Bei einfachen Schaltern spart man sich dies jedoch.&lt;br /&gt;
&lt;br /&gt;
Da es bei diesen einfachen, ungeschützten Schaltern keine sichere Möglichkeit gibt, diese Effekte zu vermeiden, muss das falsche Signal durch die Elektronik sinnvoll ausgewertet werden. Dafür gibt es verschiedene Ansätze:&lt;br /&gt;
&lt;br /&gt;
== Hardwareentprellung ==&lt;br /&gt;
&lt;br /&gt;
===Prellfreie Schalter===&lt;br /&gt;
&lt;br /&gt;
Wie bereits angedeutet, hält die elektromechanische Industrie für Spezialanwendungen verschiedene Sonderkonstruktionen bereit, die saubere Schaltzustände nach Aussen generieren, indem sie entweder eine mechanische Dämpfung in Form eines selbsthemmenden Federmechanismus oder eine integrierte elektronische Signalverzögerung benutzen. Solche Systeme sind jedoch teuer und werden meist nur im Leistungsbereich eingesetzt. Zudem sind sie nicht 100% sicher und fallen alterungsbedingt aus. Wo immer es geht, werden daher weitere Maßnahmen getroffen, ein Prellen zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
===Wechselschalter===&lt;br /&gt;
&lt;br /&gt;
Für die Entprellung von Wechselschaltern (engl. Double Throw Switch) kann ein klassisches RS-[[Flipflop]] genutzt werden. Bei dieser Variante werden neben zwei NAND-Gattern nur noch zwei Pull-Up Widerstände benötigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NAND_debouncer.png|thumb|left|350px|&#039;&#039;&#039;Taster entprellen mit NAND-RS-Flipflop&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der gezeigten Schalterstellung liegt an der Position /S der Pegel 0 an. Damit ist das Flipflop gesetzt und der Ausgang auf dem Pegel 1. Schließt der Schalter zwischen den Kontakten 2 und 3, liegt an der Postion /R der Pegel 0 an. Dies bedeutet, dass der Ausgang des Flipflops auf den Pegel 0 geht. Sobald der Schalter von einem zum anderen Kontakt wechselt, beginnt er in der Regel zu prellen. Während des Prellens wechselt der Schalter zwischen den beiden Zuständen &amp;quot;Schalter berührt Kontakt&amp;quot; und &amp;quot;Schalter ist frei in der Luft&amp;quot;. Der Ausgang des Flipflops bleibt in dieser Prellzeit aber stabil, da der Schalter während des Prellens nie den gegenüberliegenden Kontakt berührt und das RS-Flipflop seinen Zustand allein halten kann. Die Prellzeit ist stark vom Schaltertyp abhängig und liegt zwischen 0,1 und 10ms. Die Dimensionierung der Widerstände ist relativ unkritisch. Als Richtwert können hier 100kOhm verwendet werden.&lt;br /&gt;
&lt;br /&gt;
====Wechselschalter ohne Flip-Flop====&lt;br /&gt;
&lt;br /&gt;
Wenn man mal gerade kein Flip-Flop zur Hand hat, kann man sich auch mit dieser Schaltung behelfen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:WechselEntprellC.PNG|thumb|left|350px|&#039;&#039;&#039;Wechsler entprellen mit Kondensator&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Funktionsweise:&lt;br /&gt;
Beim Umschalten wird der Kondensator immer sofort umgeladen.&lt;br /&gt;
Während der Kontakt prellt, befindet er sich in der Luft und hat keinerlei Verbindung. Während dieser Zeit übernimmt der Kondensator das halten des Pegels.&lt;br /&gt;
&lt;br /&gt;
Dimensionierung:&lt;br /&gt;
Ist der entprellte Taster an ein IC Angeschlossen, ist der &#039;&#039;Input Leakage Current&#039;&#039; der ausschlaggebende Strom. Falls weitere Ströme fließen sind diese mit zu berücksichtigen. Bei einem Mikrocontroller von Atmel sind 1µA typisch.&lt;br /&gt;
Es gilt:&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{dU}{dt} = \frac{I}{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
Da eine Prellung ca. 10ms dauert und die Spannung in dieser Zeit beispielsweise um maximal 0,5V fallen soll kommt man auf folgende Kapazität:&lt;br /&gt;
:&amp;lt;math&amp;gt; C = \frac{I \cdot dt}{dU} = \frac{1\mu A \cdot 10ms}{0,5V} = 20nF &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Stromspitzen zu verringern kann ein Widerstand mit eingefügt werden. Eine Zeitkonstante von 1µs bis 1ms scheint sinnvoll. Also 500 Ohm bis 500kOhm sind nutzbar, wobei bei niedrigem Widerstand die Stromspitzen höher sind, und bei 500kOhm der Pinstrom störend wird.&lt;br /&gt;
&lt;br /&gt;
===Einfacher Taster===&lt;br /&gt;
&lt;br /&gt;
Auch wenn das RS-Flipflop sehr effektiv ist, wird diese Variante der Entprellung nur selten angewendet. Grund dafür ist, dass in Schaltungen häufiger einfache Taster eingesetzt werden. Diese sind oft kleiner und preisgünstiger. Um einfache Taster (engl. Single Throw Switch) zu entprellen, kann ein einfacher RC-Tiefpass eingesetzt werden. Hierbei wird ein Kondensator über einen Widerstand je nach Schalterstellung auf- oder entladen. Das RC-Glied bildet einen Tiefpass, sodass die Spannung über den Kondensator nicht von einen Pegel auf den anderen springen kann.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RC_debouncer.png|thumb|left|300px|Taster entprellen mit RC-Entpreller]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Entprellen1a.png|thumb|350px| Entstehender Spannungsverlauf]]&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Wenn der Schalter geöffnet ist, lädt sich der Kondensator langsam über die beiden Widerstände R&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; auf V&amp;lt;sub&amp;gt;cc&amp;lt;/sub&amp;gt; auf. Beim Erreichen der Umschaltschwelle springt der Ausgang auf den Pegel 0. Wird der Schalter geschlossen, entlädt sich der Kondensator langsam über den Widerstand R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. Demnach ändert sich der Ausgang des Inverters auf den Pegel 1. Während der Taster prellt, kann sich die Spannung über dem Kondensator nicht sprunghaft ändern, da das Auf- und Entladen eher langsam über die Widerstände erfolgt. Außerdem sind die Schaltschwellen für den Übergang LOW-&amp;gt;HIGH und HIGH-&amp;gt;LOW stark verschieden (Hysterese, siehe Artikel [[Schmitt-Trigger]]). Bei richtiger Dimensionierung der Bauelemente wird somit der Ausgang des Inverters prellfrei.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Inverter &#039;&#039;&#039;unbedingt&#039;&#039;&#039; einer mit [[Schmitt-Trigger]]-Eingängen sein muss, weil bei Standard-Logikeingängen im Bereich von üblicherweise 0,8V - 2,0V der Ausgang nicht definiert ist. Als Inverter kann zum Beispiel der 74HC14 oder der CD40106 (pinkompatibel) eingesetzt werden. Alternativ kann auch ein CD4093 eingesetzt werden. Bei dem CD4093 handelt es sich um NAND-Gatter mit Schmitt-Trigger-Eingängen. Um aus einem NAND-Gatter einen Inverter zu machen, müssen einfach nur die beiden Eingänge verbunden werden oder ein Eingang fest auf HIGH gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für eine geeignete Dimensionierung muss man etwas mit den Standardformeln für einen Kondensator jonglieren. Die Spannung über den Kondensator beim Entladen berechnet sich nach:&lt;br /&gt;
:&amp;lt;math&amp;gt;U_C(t) = U_0 \cdot e^{\frac{-t}{R_2 C_1}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit der Ausgang des Inverters stabil ist, muss die Spannung über den Kondensator und damit die Spannung am Eingang des Inverters über der Spannung bleiben, bei welcher der Inverter umschaltet. Diese Schwellwertspannung ist genau die zeitabhängige Spannung über den Kondensator.&lt;br /&gt;
:&amp;lt;math&amp;gt;U_C(t)\!\ = U_{th}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch Umstellen der Formel ergibt sich nun:&lt;br /&gt;
:&amp;lt;math&amp;gt;R_2=\frac{-t}{C_1 \cdot ln\left(\frac{U_{th}}{U_0} \right)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Taster prellt üblicherweise etwa 10ms. Zur Sicherheit kann bei der Berechnung des Widerstandes eine Prellzeit von 20ms angenommen werden. U_0 ist die Betriebsspannung also Vcc. Die Schwellwertspannung muss aus dem Datenblatt des eingesetzten Schmitt-Triggers abgelesen werden. Beim 74HC14 beträgt der gesuchte Wert 2,0V. Nimmt man für den Kondensator 1µF und beträgt die  Betriebsspannung 5V, ergibt sich für den Widerstand ein Wert von etwa 22kOhm.&lt;br /&gt;
&lt;br /&gt;
Wird der Schalter geöffnet, lädt sich der Kondensator nach folgender Formel auf:&lt;br /&gt;
:&amp;lt;math&amp;gt;U_C(t) = U_0 \cdot \left( 1-e^{\frac{-t}{(R_1+R_2)\cdot C_1}} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit U_th=U_C ergibt das Umstellen nach (R_1+R_2):&lt;br /&gt;
:&amp;lt;math&amp;gt;R_1+R_2 = \frac{-t}{C_1 \cdot ln\left(1-\frac{U_{th}}{U_0} \right)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die Schwellspannung lässt sich aus dem Datenblatt ein Wert von 2,3V ablesen. Mit diesem Wert und den Annahmen von oben ergibt sich für R_1+R_2 ein Wert von 32kOhm. Somit ergibt sich für R_1 ein Wert von etwa 10kOhm.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Beim 74LS14 von Hitachi z.&amp;amp;nbsp;B. sind die oberen und unteren Schaltschwellwerte unterschiedlich. Es muss darauf geachtet werden, dass U_{th} beim Entladen die untere Schwelle und U_{th} beim Laden die obere Schwelle einnimmt.&lt;br /&gt;
&lt;br /&gt;
== Softwareentprellung ==&lt;br /&gt;
&lt;br /&gt;
In den Zeiten der elektronischen Auswertung von Tastern und Schaltern ist das softwaretechnische Entprellen oft billiger, als die Benutzung eines teuren Schalters. Daher werden heute z.B. auch Computertastaturen nicht mehr mit prellarmen Tasten oder Entprellkondensatoren ausgestattet.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des in den meisten Geräten ohnehin vorhandenen Mikrocontrollers z.B., kann man sich die zusätzliche Hardware sparen, da die Entprellung in Software praktisch genauso gut funktioniert. Dabei ist nur zu beachten, dass zusätzliche Rechenleistung und je nach Umsetzung auch einige Hardwareressourcen (z.B. Timer) benötigt werden. Dafür hat man aber den Vorteil, kurze Pulse, die offensichtlich keine Tastenbetätigung sein können sondern z. B. durch Einstreuungen hervorgerufen werden, einfach ausfiltern zu können.&lt;br /&gt;
&lt;br /&gt;
=== Flankenerkennung ===&lt;br /&gt;
Bei einem Taster gibt es insgesamt 4 theoretische Zustände:&lt;br /&gt;
&lt;br /&gt;
* 1. war nicht gedrückt und ist nicht gedrückt&lt;br /&gt;
* 2. war nicht gedrückt und ist gedrückt (steigende Flanke)&lt;br /&gt;
* 3. war gedrückt und ist immer noch gedrückt&lt;br /&gt;
* 4. war gedrückt und ist nicht mehr gedrückt (fallende Flanke)&lt;br /&gt;
&lt;br /&gt;
Diese einzelnen Zustände lassen sich jetzt bequem abfragen/durchlaufen. Die Entprellung geschieht dabei durch die ganze Laufzeit des Programms. Die Taster werden hierbei als Active-Low angeschlossen, um die internen Pull-Ups zu nutzen.&lt;br /&gt;
&lt;br /&gt;
Diese Routine gibt für den Zustand &amp;quot;steigende Flanke&amp;quot; den Wert &amp;quot;1&amp;quot; zurück, sonst &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define TASTERPORT PINC&lt;br /&gt;
#define TASTERBIT PINC1&lt;br /&gt;
&lt;br /&gt;
char taster(void)&lt;br /&gt;
{&lt;br /&gt;
    static unsigned char zustand;&lt;br /&gt;
    char rw = 0;&lt;br /&gt;
&lt;br /&gt;
    if(zustand == 0 &amp;amp;&amp;amp; !(TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster wird gedrueckt (steigende Flanke)&lt;br /&gt;
    {&lt;br /&gt;
        zustand = 1;&lt;br /&gt;
        rw = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else if (zustand == 1 &amp;amp;&amp;amp; !(TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster wird gehalten&lt;br /&gt;
    {&lt;br /&gt;
         zustand = 2;&lt;br /&gt;
         rw = 0;&lt;br /&gt;
    }&lt;br /&gt;
    else if (zustand == 2 &amp;amp;&amp;amp; (TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster wird losgelassen (fallende Flanke)&lt;br /&gt;
    {&lt;br /&gt;
        zustand = 3;&lt;br /&gt;
        rw = 0;&lt;br /&gt;
    }&lt;br /&gt;
    else if (zustand == 3 &amp;amp;&amp;amp; (TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster losgelassen&lt;br /&gt;
    {&lt;br /&gt;
        zustand = 0;&lt;br /&gt;
        rw = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return rw;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Erweiterung, damit beliebig lange das Halten einer Taste erkannt wird kann man ganz einfach so implementieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    // zustand kann entweder zum ersten mal als gehalten detektiert werden oder aber jedes weitere mal&lt;br /&gt;
    else if (((zustand == 1) || (zustand == 2)) &amp;amp;&amp;amp; !(TASTERPORT &amp;amp; (1&amp;lt;&amp;lt;TASTERBIT)))   //Taster wird gehalten&lt;br /&gt;
    {&lt;br /&gt;
         zustand = 2;&lt;br /&gt;
         rw = 0;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Warteschleifen-Verfahren ===&lt;br /&gt;
&lt;br /&gt;
Soll nun mit einem Mikrocontroller gezählt werden, wie oft ein Kontakt oder ein Relais geschaltet wird, muss das Prellen des Kontaktes exakt berücksichtigt - und von einem gewollten Mehrfachschalten abgegrenzt werden, da sonst  möglicherweise Fehlimpulse gezählt- oder andererseits echte Schaltvorgänge übersprungen werden. Dies muss beim Schreiben des Programms hinsichtlich des Abtastens des Kontaktes unbedingt Rechnung getragen werden.&lt;br /&gt;
&lt;br /&gt;
Beim folgenden einfachen Beispiel für eine Entprellung ist zu beachten, dass der AVR im Falle eines Tastendrucks 200ms wartet, also brach liegt. Bei zeitkritischen Anwendungen sollte man ein anderes Verfahren nutzen (z.&amp;amp;nbsp;B. Abfrage der Tastenzustände in einer Timer-Interrupt-Service-Routine).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 3686400 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;     /* bei alter avr-libc: #include &amp;lt;avr/delay.h&amp;gt; */      &lt;br /&gt;
&lt;br /&gt;
/* Einfache Funktion zum Entprellen eines Tasters */&lt;br /&gt;
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)&lt;br /&gt;
{&lt;br /&gt;
    if ( !(*port &amp;amp; (1 &amp;lt;&amp;lt; pin)) )&lt;br /&gt;
    {&lt;br /&gt;
        /* Pin wurde auf Masse gezogen, 100ms warten   */&lt;br /&gt;
        _delay_ms(50);   // Maximalwert des Parameters an _delay_ms &lt;br /&gt;
        _delay_ms(50);   // beachten, vgl. Dokumentation der avr-libc&lt;br /&gt;
        if ( *port &amp;amp; (1 &amp;lt;&amp;lt; pin) )&lt;br /&gt;
        {&lt;br /&gt;
            /* Anwender Zeit zum Loslassen des Tasters geben */&lt;br /&gt;
            _delay_ms(50);&lt;br /&gt;
            _delay_ms(50); &lt;br /&gt;
            return 1;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRB &amp;amp;= ~( 1 &amp;lt;&amp;lt; PB0 );        /* PIN PB0 auf Eingang Taster)  */&lt;br /&gt;
    PORTB |= ( 1 &amp;lt;&amp;lt; PB0 );        /* Pullup-Widerstand aktivieren */&lt;br /&gt;
    ...&lt;br /&gt;
    if (debounce(&amp;amp;PINB, PB0))&lt;br /&gt;
    {&lt;br /&gt;
        /* Falls Taster an PIN PB0 gedrueckt     */&lt;br /&gt;
        /* LED an Port PD7 an- bzw. ausschalten: */&lt;br /&gt;
        PORTD = PORTD ^ ( 1 &amp;lt;&amp;lt; PD7 );&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die obige Routine hat leider mehrere Nachteile:&lt;br /&gt;
* sie detektiert nur das Loslassen (unergonomisch)&lt;br /&gt;
* sie verzögert die Mainloop immer um 100ms bei gedrückter Taste&lt;br /&gt;
* sie verliert Tastendrücke, je mehr die Mainloop zu tun hat.&lt;br /&gt;
&lt;br /&gt;
Eine ähnlich einfach zu benutzende Routine, aber ohne all diese Nachteile findet sich im Forenthread&lt;br /&gt;
[http://www.mikrocontroller.net/topic/164194#new Entprellung für Anfänger]&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;DEBOUNCE&#039;&#039; Befehl in dem BASIC-Dialekt BASCOM für AVR ist ebenfalls nach dem Warteschleifen-Verfahren programmiert. Die Wartezeit beträgt standardmäßig 25 ms, kann aber vom Anwender überschrieben werden. Vgl.  [http://avrhelp.mcselec.com/bascom-avr.html?DEBOUNCE BASCOM Online-Manual zu DEBOUNCE].&lt;br /&gt;
&lt;br /&gt;
Eine C-Implementierung für eine Tastenabfrage mit Warteschleife ist im Artikel [[AVR-GCC-Tutorial#IO-Register_als_Parameter_und_Variablen|AVR-GCC-Tutorial: IO-Register als Parameter und Variablen]] angeben.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil dieses Verfahrens ist, dass der Controller durch die Warteschleife blockiert wird. Günstiger ist die Implementierung mit einem Timer-Interrupt.&lt;br /&gt;
&lt;br /&gt;
==== Warteschleifenvariante mit Maske und Pointer (nach Christian Riggenbach) ====&lt;br /&gt;
&lt;br /&gt;
Hier eine weitere Funktion, um Taster zu entprellen: Durch den zusätzlichen Code kann eine Entprellzeit von durchschnittlich 1-3ms (mindestens 8*150µs = 1ms) erreicht werden. Grundsätzlich prüft die Funktion den Pegel der Pins auf einem bestimmten Port. Wenn die/der Pegel 8 Mal konstant war, wird die Schleife verlassen. Diese Funktion kann sehr gut eingesetzt werden, um in einer Endlosschleife Taster anzufragen, da sie, wie erwähnt, eine kurze Wartezeit hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void entprellung( volatile uint8_t *port, uint8_t maske ) {&lt;br /&gt;
  uint8_t   port_puffer;&lt;br /&gt;
  uint8_t   entprellungs_puffer;&lt;br /&gt;
&lt;br /&gt;
  for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) {&lt;br /&gt;
    entprellungs_puffer&amp;lt;&amp;lt;=1;&lt;br /&gt;
    port_puffer = *port;&lt;br /&gt;
    _delay_us(150);&lt;br /&gt;
    if( (*port &amp;amp; maske) == (port_puffer &amp;amp; maske) )&lt;br /&gt;
      entprellungs_puffer |= 0x01;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion wird wie folgt aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  // Bugfix 20100414&lt;br /&gt;
  // http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass&lt;br /&gt;
  entprellung( &amp;amp;PINB, (1&amp;lt;&amp;lt;PINB2) ); // ggf. Prellen abwarten &lt;br /&gt;
  if( PINB &amp;amp; (1&amp;lt;&amp;lt;PINB2) )           // dann stabilen Wert einlesen&lt;br /&gt;
  {&lt;br /&gt;
    // mach was&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    // mach was anderes&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als Maske kann ein beliebiger Wert übergeben werden. Sie verhindert, dass nichtverwendete Taster die Entprellzeit negativ beeinflussen.&lt;br /&gt;
&lt;br /&gt;
==== Debounce-Makro von Peter Dannegger ====&lt;br /&gt;
&lt;br /&gt;
Peter Dannegger hat in [http://www.mikrocontroller.net/topic/164194#1566921 &amp;quot;Entprellen für Anfänger&amp;quot;] folgende vereinfachtes Entprellverfahren beschrieben. Das Makro arbeitet in der Originalversion mit &#039;&#039;active low&#039;&#039; geschalteten Tastern, kann aber einfach für  &#039;&#039;active high&#039;&#039; geschaltete Taster angepasst werden ([[Pollin Funk-AVR-Evaluationsboard#Tasty Reloaded|Tasty Reloaded]]). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*                      Not so powerful Debouncing Example              */&lt;br /&gt;
/*                      No Interrupt needed                             */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*              Author: Peter Dannegger                                 */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
// Target: ATtiny13&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#define F_CPU 9.6e6&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define debounce( port, pin )                                         \&lt;br /&gt;
({                                                                    \&lt;br /&gt;
  static uint8_t flag = 0;     /* new variable on every macro usage */  \&lt;br /&gt;
  uint8_t i = 0;                                                      \&lt;br /&gt;
                                                                      \&lt;br /&gt;
  if( flag ){                  /* check for key release: */           \&lt;br /&gt;
    for(;;){                   /* loop ... */                         \&lt;br /&gt;
      if( !(port &amp;amp; 1&amp;lt;&amp;lt;pin) ){  /* ... until key pressed or ... */     \&lt;br /&gt;
        i = 0;                 /* 0 = bounce */                       \&lt;br /&gt;
        break;                                                        \&lt;br /&gt;
      }                                                               \&lt;br /&gt;
      _delay_us( 98 );         /* * 256 = 25ms */                     \&lt;br /&gt;
      if( --i == 0 ){          /* ... until key &amp;gt;25ms released */     \&lt;br /&gt;
        flag = 0;              /* clear press flag */                 \&lt;br /&gt;
        i = 0;                 /* 0 = key release debounced */        \&lt;br /&gt;
        break;                                                        \&lt;br /&gt;
      }                                                               \&lt;br /&gt;
    }                                                                 \&lt;br /&gt;
  }else{                       /* else check for key press: */        \&lt;br /&gt;
    for(;;){                   /* loop ... */                         \&lt;br /&gt;
      if( (port &amp;amp; 1&amp;lt;&amp;lt;pin) ){   /* ... until key released or ... */    \&lt;br /&gt;
        i = 0;                 /* 0 = bounce */                       \&lt;br /&gt;
        break;                                                        \&lt;br /&gt;
      }                                                               \&lt;br /&gt;
      _delay_us( 98 );         /* * 256 = 25ms */                     \&lt;br /&gt;
      if( --i == 0 ){          /* ... until key &amp;gt;25ms pressed */      \&lt;br /&gt;
        flag = 1;              /* set press flag */                   \&lt;br /&gt;
        i = 1;                 /* 1 = key press debounced */          \&lt;br /&gt;
        break;                                                        \&lt;br /&gt;
      }                                                               \&lt;br /&gt;
    }                                                                 \&lt;br /&gt;
  }                                                                   \&lt;br /&gt;
  i;                           /* return value of Macro */            \&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
   Testapplication&lt;br /&gt;
 */&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB  &amp;amp;= ~(1&amp;lt;&amp;lt;PB0);&lt;br /&gt;
  PORTB |=   1&amp;lt;&amp;lt;PB0;&lt;br /&gt;
  DDRB  |=   1&amp;lt;&amp;lt;PB2;&lt;br /&gt;
  DDRB  &amp;amp;= ~(1&amp;lt;&amp;lt;PB1);&lt;br /&gt;
  PORTB |=   1&amp;lt;&amp;lt;PB1;&lt;br /&gt;
  DDRB  |=   1&amp;lt;&amp;lt;PB3;&lt;br /&gt;
  for(;;){&lt;br /&gt;
    if( debounce( PINB, PB1 ) )&lt;br /&gt;
      PORTB ^= 1&amp;lt;&amp;lt;PB2;&lt;br /&gt;
    if( debounce( PINB, PB0 ) )&lt;br /&gt;
      PORTB ^= 1&amp;lt;&amp;lt;PB3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Makro für die gleiche Taste (Pin) an mehreren Stellen aufgerufen werden soll, muss eine Funktion angelegt werden, damit beide Aufrufe an die gleiche Zustandsvariable &#039;&#039;flag&#039;&#039; auswerten [http://www.mikrocontroller.net/topic/195914#1918727]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Hilfsfunktion&lt;br /&gt;
uint8_t debounce_C1( void )&lt;br /&gt;
{&lt;br /&gt;
  return debounce(PINC, PC1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Beispielanwendung&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB  |=   1&amp;lt;&amp;lt;PB2;&lt;br /&gt;
  DDRB  |=   1&amp;lt;&amp;lt;PB3;&lt;br /&gt;
  DDRC  &amp;amp;= ~(1&amp;lt;&amp;lt;PC1);&lt;br /&gt;
  PORTC |=   1&amp;lt;&amp;lt;PC1; // Pullup für Taster&lt;br /&gt;
&lt;br /&gt;
  for(;;){&lt;br /&gt;
    if( debounce_C1() )  // nicht: debounce(PINC, PC1)&lt;br /&gt;
      PORTB ^= 1&amp;lt;&amp;lt;PB2;&lt;br /&gt;
    if( debounce_C1() )  // nicht: debounce(PINC, PC1)&lt;br /&gt;
      PORTB ^= 1&amp;lt;&amp;lt;PB3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer-Verfahren (nach Peter Dannegger) ===&lt;br /&gt;
&lt;br /&gt;
==== Grundroutine (AVR Assembler) ====&lt;br /&gt;
&lt;br /&gt;
Siehe dazu: [http://www.mikrocontroller.net/forum/read-4-20435.html#new Forum] &lt;br /&gt;
&lt;br /&gt;
Vorteile&lt;br /&gt;
* besonders kurzer Code&lt;br /&gt;
* schnell&lt;br /&gt;
&lt;br /&gt;
Außerdem können 8 Tasten (aktiv low) gleichzeitig bearbeitet werden, es dürfen also&lt;br /&gt;
alle exakt zur selben Zeit gedrückt werden. Andere Routinen können z.&amp;amp;nbsp;B. nur eine Taste verarbeiten, d.h. die zuerst oder zuletzt gedrückte gewinnt, oder es kommt Unsinn heraus.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Einlese- und Entprellroutine ist nur 8 Instruktionen&lt;br /&gt;
kurz. Der entprellte Tastenzustand ist im Register &#039;&#039;key_state&#039;&#039;. Mit nur 2 weiteren Instruktionen wird dann der Wechsel von &#039;&#039;Taste offen&#039;&#039; zu&lt;br /&gt;
&#039;&#039;Taste gedrückt&#039;&#039; erkannt und im Register &#039;&#039;key_press&#039;&#039; abgelegt. Im Beispielcode werden dann damit 8 LEDs ein- und ausgeschaltet. Jede Taste entspricht einem Bit in den Registern, d.h. die Verarbeitung erfolgt bitweise mit logischen Operationen. Zum Verständnis empfiehlt es sich daher, die Logikgleichungen mit Gattern für ein Bit = eine Taste aufzumalen. Die Register kann man sich als Flipflops denken, die mit der Entprellzeit als Takt arbeiten. D.h. man kann das auch so z.&amp;amp;nbsp;B. in einem GAL22V10 realisieren.&lt;br /&gt;
&lt;br /&gt;
Als Kommentar sind neben den einzelnen Instruktionen alle 8 möglichen&lt;br /&gt;
Kombinationen der 3 Signale dargestellt.&lt;br /&gt;
&lt;br /&gt;
Beispielcode für AVR (Assembler):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.nolist&lt;br /&gt;
.include &amp;quot;c:\avr\inc\1200def.inc&amp;quot;&lt;br /&gt;
.list&lt;br /&gt;
.def  save_sreg         = r0&lt;br /&gt;
.def  iwr0              = r1&lt;br /&gt;
.def  iwr1              = r2&lt;br /&gt;
&lt;br /&gt;
.def  key_old           = r3&lt;br /&gt;
.def  key_state         = r4&lt;br /&gt;
.def  key_press         = r5&lt;br /&gt;
&lt;br /&gt;
.def  leds              = r16&lt;br /&gt;
.def  wr0               = r17&lt;br /&gt;
&lt;br /&gt;
.equ  key_port          = pind&lt;br /&gt;
.equ  led_port          = portb&lt;br /&gt;
&lt;br /&gt;
      rjmp   init&lt;br /&gt;
.org OVF0addr		;timer interrupt 24ms&lt;br /&gt;
      in     save_sreg, SREG&lt;br /&gt;
get8key:                               ;/old      state     iwr1      iwr0&lt;br /&gt;
      mov    iwr0, key_old             ;00110011  10101010            00110011&lt;br /&gt;
      in     key_old, key_port         ;11110000&lt;br /&gt;
      eor    iwr0, key_old             ;                              11000011&lt;br /&gt;
      com    key_old                   ;00001111&lt;br /&gt;
      mov    iwr1, key_state           ;                    10101010&lt;br /&gt;
      or     key_state, iwr0           ;          11101011&lt;br /&gt;
      and    iwr0, key_old             ;                              00000011&lt;br /&gt;
      eor    key_state, iwr0           ;          11101000&lt;br /&gt;
      and    iwr1, iwr0                ;                    00000010&lt;br /&gt;
      or     key_press, iwr1           ;store key press detect&lt;br /&gt;
;&lt;br /&gt;
;			insert other timer functions here&lt;br /&gt;
;&lt;br /&gt;
      out    SREG, save_sreg&lt;br /&gt;
      reti&lt;br /&gt;
;-------------------------------------------------------------------------&lt;br /&gt;
init:&lt;br /&gt;
      ldi    wr0, 0xFF&lt;br /&gt;
      out    ddrb, wr0&lt;br /&gt;
      ldi    wr0, 1&amp;lt;&amp;lt;CS02 | 1&amp;lt;&amp;lt;CS00    ;divide by 1024 * 256&lt;br /&gt;
      out    TCCR0, wr0&lt;br /&gt;
      ldi    wr0, 1&amp;lt;&amp;lt;TOIE0             ;enable timer interrupt&lt;br /&gt;
      out    TIMSK, wr0&lt;br /&gt;
&lt;br /&gt;
      clr    key_old&lt;br /&gt;
      clr    key_state&lt;br /&gt;
      clr    key_press&lt;br /&gt;
      ldi    leds, 0xFF&lt;br /&gt;
main: cli&lt;br /&gt;
      eor    leds, key_press           ;toggle LEDs&lt;br /&gt;
      clr    key_press                 ;clear, if key press action done&lt;br /&gt;
      sei&lt;br /&gt;
      out    led_port, leds&lt;br /&gt;
      rjmp   main&lt;br /&gt;
;-------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Komfortroutine (C für AVR) ====&lt;br /&gt;
&lt;br /&gt;
Siehe dazu: [http://www.mikrocontroller.net/forum/read-4-310276.html Forum]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung&#039;&#039;&#039; Wenn statt active-low (Ruhezustand High) active-high (Ruhezustand Low) verwendet wird muss eine Zeile geändert werden siehe:&lt;br /&gt;
[http://www.mikrocontroller.net/forum/read-4-310276.html gesamter Beitrag im Forum], &lt;br /&gt;
[http://www.mikrocontroller.net/topic/48465#606555 Stelle 1 im Beitrag], ([http://www.mikrocontroller.net/topic/48465#2306398 Stelle 2 im Beitrag] muss *nicht* geändert werden, da hier die Polarität gar keinen Einfluß hat).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 2&#039;&#039;&#039; Zur Initialisierung siehe [http://www.mikrocontroller.net/topic/48465#3572793 Forum]&lt;br /&gt;
&lt;br /&gt;
Funktionsprinzip wie oben plus zusätzliche Features:  &lt;br /&gt;
* Kann Tasten sparen durch unterschiedliche Aktionen bei kurzem oder langem Drücken&lt;br /&gt;
* Wiederholfunktion, z.&amp;amp;nbsp;B. für die Eingabe von Werten&lt;br /&gt;
&lt;br /&gt;
Das Programm ist für avr-gcc/avr-libc geschrieben, kann aber mit ein paar Anpassungen auch mit anderen Compilern und Mikrocontrollern verwendet werden. Eine Portierung für den AT91SAM7 findet man [http://www.google.com/codesearch?q=show:ac2viP-2E2Y:pzkOO5QRsoc:RPICuprYy-A&amp;amp;sa=N&amp;amp;cd=1&amp;amp;ct=rc&amp;amp;cs_p=svn://mikrocontroller.net/mp3dec/trunk&amp;amp;cs_f=keys.c#a0 hier] (aus dem Projekt [[ARM MP3/AAC Player]]).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*                      Debouncing 8 Keys                               */&lt;br /&gt;
/*                      Sampling 4 Times                                */&lt;br /&gt;
/*                      With Repeat Function                            */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*              Author: Peter Dannegger                                 */&lt;br /&gt;
/*                      danni@specs.de                                  */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU           1000000                   // processor clock frequency&lt;br /&gt;
#warning kein F_CPU definiert&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
#define KEY_DDR         DDRB&lt;br /&gt;
#define KEY_PORT        PORTB&lt;br /&gt;
#define KEY_PIN         PINB&lt;br /&gt;
#define KEY0            0&lt;br /&gt;
#define KEY1            1&lt;br /&gt;
#define KEY2            2&lt;br /&gt;
#define ALL_KEYS        (1&amp;lt;&amp;lt;KEY0 | 1&amp;lt;&amp;lt;KEY1 | 1&amp;lt;&amp;lt;KEY2)&lt;br /&gt;
 &lt;br /&gt;
#define REPEAT_MASK     (1&amp;lt;&amp;lt;KEY1 | 1&amp;lt;&amp;lt;KEY2)       // repeat: key1, key2&lt;br /&gt;
#define REPEAT_START    50                        // after 500ms&lt;br /&gt;
#define REPEAT_NEXT     20                        // every 200ms&lt;br /&gt;
&lt;br /&gt;
#define LED_DDR         DDRA&lt;br /&gt;
#define LED_PORT        PORTA&lt;br /&gt;
#define LED0            0&lt;br /&gt;
#define LED1            1&lt;br /&gt;
#define LED2            2&lt;br /&gt;
 &lt;br /&gt;
volatile uint8_t key_state;                                // debounced and inverted key state:&lt;br /&gt;
                                                  // bit = 1: key pressed&lt;br /&gt;
volatile uint8_t key_press;                                // key press detect&lt;br /&gt;
 &lt;br /&gt;
volatile uint8_t key_rpt;                                  // key long press and repeat&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
ISR( TIMER0_OVF_vect )                            // every 10ms&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t ct0, ct1, rpt;&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
 &lt;br /&gt;
  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms&lt;br /&gt;
 &lt;br /&gt;
  i = key_state ^ ~KEY_PIN;                       // key changed ?&lt;br /&gt;
  ct0 = ~( ct0 &amp;amp; i );                             // reset or count ct0&lt;br /&gt;
  ct1 = ct0 ^ (ct1 &amp;amp; i);                          // reset or count ct1&lt;br /&gt;
  i &amp;amp;= ct0 &amp;amp; ct1;                                 // count until roll over ?&lt;br /&gt;
  key_state ^= i;                                 // then toggle debounced state&lt;br /&gt;
  key_press |= key_state &amp;amp; i;                     // 0-&amp;gt;1: key press detect&lt;br /&gt;
 &lt;br /&gt;
  if( (key_state &amp;amp; REPEAT_MASK) == 0 )            // check repeat function&lt;br /&gt;
     rpt = REPEAT_START;                          // start delay&lt;br /&gt;
  if( --rpt == 0 ){&lt;br /&gt;
    rpt = REPEAT_NEXT;                            // repeat delay&lt;br /&gt;
    key_rpt |= key_state &amp;amp; REPEAT_MASK;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
// check if a key has been pressed. Each pressed key is reported&lt;br /&gt;
// only once&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_press( uint8_t key_mask )&lt;br /&gt;
{&lt;br /&gt;
  cli();                                          // read and clear atomic !&lt;br /&gt;
  key_mask &amp;amp;= key_press;                          // read key(s)&lt;br /&gt;
  key_press ^= key_mask;                          // clear key(s)&lt;br /&gt;
  sei();&lt;br /&gt;
  return key_mask;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
// check if a key has been pressed long enough such that the&lt;br /&gt;
// key repeat functionality kicks in. After a small setup delay&lt;br /&gt;
// the key is reported being pressed in subsequent calls&lt;br /&gt;
// to this function. This simulates the user repeatedly&lt;br /&gt;
// pressing and releasing the key.&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_rpt( uint8_t key_mask )&lt;br /&gt;
{&lt;br /&gt;
  cli();                                          // read and clear atomic !&lt;br /&gt;
  key_mask &amp;amp;= key_rpt;                            // read key(s)&lt;br /&gt;
  key_rpt ^= key_mask;                            // clear key(s)&lt;br /&gt;
  sei();&lt;br /&gt;
  return key_mask;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
// check if a key is pressed right now&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_state( uint8_t key_mask )&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  key_mask &amp;amp;= key_state;&lt;br /&gt;
  return key_mask;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_short( uint8_t key_mask )&lt;br /&gt;
{&lt;br /&gt;
  cli();                                          // read key state and key press atomic !&lt;br /&gt;
  return get_key_press( ~key_state &amp;amp; key_mask );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
///////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
uint8_t get_key_long( uint8_t key_mask )&lt;br /&gt;
{&lt;br /&gt;
  return get_key_press( get_key_rpt( key_mask ));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
  LED_PORT = 0xFF;&lt;br /&gt;
  LED_DDR = 0xFF;                     &lt;br /&gt;
&lt;br /&gt;
  // Configure debouncing routines&lt;br /&gt;
  KEY_DDR &amp;amp;= ~ALL_KEYS;                // configure key port for input&lt;br /&gt;
  KEY_PORT |= ALL_KEYS;                // and turn on pull up resistors&lt;br /&gt;
&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;CS02)|(1&amp;lt;&amp;lt;CS00);         // divide by 1024&lt;br /&gt;
  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms&lt;br /&gt;
  TIMSK |= 1&amp;lt;&amp;lt;TOIE0;                   // enable timer interrupt&lt;br /&gt;
&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
    if( get_key_short( 1&amp;lt;&amp;lt;KEY1 ))&lt;br /&gt;
      LED_PORT ^= 1&amp;lt;&amp;lt;LED1;&lt;br /&gt;
 &lt;br /&gt;
    if( get_key_long( 1&amp;lt;&amp;lt;KEY1 ))&lt;br /&gt;
      LED_PORT ^= 1&amp;lt;&amp;lt;LED2;&lt;br /&gt;
 &lt;br /&gt;
    // single press and repeat&lt;br /&gt;
 &lt;br /&gt;
    if( get_key_press( 1&amp;lt;&amp;lt;KEY2 ) || get_key_rpt( 1&amp;lt;&amp;lt;KEY2 )){&lt;br /&gt;
      uint8_t i = LED_PORT;&lt;br /&gt;
 &lt;br /&gt;
      i = (i &amp;amp; 0x07) | ((i &amp;lt;&amp;lt; 1) &amp;amp; 0xF0);&lt;br /&gt;
      if( i &amp;lt; 0xF0 )&lt;br /&gt;
        i |= 0x08;&lt;br /&gt;
      LED_PORT = i;      &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das single-press-und-repeat-Beispiel geht nicht in jeder Beschaltung; folgendes Beispiel sollte universeller sein (einzelne LED an/aus):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// single press and repeat&lt;br /&gt;
if( get_key_press( 1&amp;lt;&amp;lt;KEY2 ) || get_key_rpt( 1&amp;lt;&amp;lt;KEY2 ))&lt;br /&gt;
    LED_PORT ^=0x08;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neuere Variante, die einer Taste folgende Funktionen erlaubt:&lt;br /&gt;
https://www.mikrocontroller.net/topic/48465?goto=1753367#1753367&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
- get_key_press()&lt;br /&gt;
- get_key_rpt()&lt;br /&gt;
- get_key_press() mit get_key_rpt()&lt;br /&gt;
- get_key_short() mit get_key_long()&lt;br /&gt;
- get_key_short() mit get_key_long_r() und get_key_rpt_l()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erweiterung für die Erkennung von zwei gleichzeitig gedrückten Tasten:&lt;br /&gt;
https://www.mikrocontroller.net/topic/48465?goto=1753367#1753367&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
- get_key_common()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Funktionsweise =====&lt;br /&gt;
Der Code basiert auf 8 parallelen vertikalen Zählern, die über die Variablen ct0 und ct1 aufgebaut werden&lt;br /&gt;
&lt;br /&gt;
[[Bild:VertCount.png|framed|center|&#039;&#039;&#039;8 vertikale Zähler in 2 8-Bit Variablen&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
wobei jeweils ein Bit in ct0 mit dem gleichwertigen Bit in ct1 zusammengenommen einen 2-Bit-Zähler bildet.&lt;br /&gt;
Der Code der sich um die 8 Zähler kümmert, ist so geschrieben, daß er alle 8 Zähler gemeinsam parallel behandelt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = key_state ^ ~KEY_PIN;                       // key changed ?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
i enthält an dieser Stelle für jede Taste, die sich im Vergleich mit dem vorhergehenden entprellten Zustand (keystate) verändert hat, ein 1 Bit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  ct0 = ~( ct0 &amp;amp; i );                             // reset or count ct0&lt;br /&gt;
  ct1 = ct0 ^ (ct1 &amp;amp; i);                          // reset or count ct1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese beiden Anweisungen erniedrigen den 2-Bit Zähler ct0/ct1 für jedes Bit um 1, welches in i gesetzt ist. Liegt an der entsprechenden Stelle in i ein 0 Bit vor (keine Änderung des Zustands), so wird der Zähler ct0/ct1 für dieses Bit auf 1 gesetzt.&lt;br /&gt;
Der Grundzustand des Zählers ist als ct0 == 1 und ct1 == 1 (Wert 3). Der Zähler zählt daher mit jedem ISR Aufruf, bei dem die Taste im Vergleich zu keystate als verändert erkannt wurde&lt;br /&gt;
&lt;br /&gt;
   ct1   ct0&lt;br /&gt;
     1    1   // 3&lt;br /&gt;
     1    0   // 2&lt;br /&gt;
     0    1   // 1&lt;br /&gt;
     0    0   // 0&lt;br /&gt;
     1    1   // 3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i &amp;amp;= ct0 &amp;amp; ct1;                                 // count until roll over ?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
in i bleibt nur dort ein 1-Bit erhalten, wo sowohl in ct1 als auch in ct0 ein 1 Bit vorgefunden wird, der betreffende Zähler also bis 3 zählen konnte. Durch die zusätzliche Verundung mit i wird der Fall abgefangen, dass ein konstanter Zählerwert von 3 in i ein 1 Bit hinterlässt. Im Endergebnis bedeutet dass, dass nur ein Zählerwechsel von 0 auf 3 zu einem 1 Bit an der betreffenden Stelle in i führt, aber auch nur dann, wenn in i an dieser Bitposition ebenfalls ein 1 Bit war (welches wiederrum deswegen auf 1 war, weil an diesem Eingabeport eine Veränderung zum letzten bekannten entprellten Zustand festgestellt wurde). Alles zusammengenommen heißt das, dass ein Tastendruck dann erkannt wird, wenn die Taste 4 mal hintereinander in einem anderen Zustand vorgefunden wurde als dem zuletzt bekannten entprellten Tastenzustand.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle ist i daher ein Vektor von 8 Bits, von denen jedes einzelne der Bits darüber Auskunft gibt, ob die entsprechende Taste mehrmals hintereinander im selben Zustand angetroffen wurde, der nicht mit dem zuletzt bekannten Tastenzustand übereinstimmt. Ist das der Fall, dann wird eine entsprechende Veränderung des Tastenzustands in key_state registriert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  key_state ^= i;                                 // then toggle debounced state&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und wenn sich in key_state das entsprechende Bit von 0 auf 1 verändert hat, wird dieses Ereignis als &#039;Taste wurde niedergedrückt&#039; gewertet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  key_press |= key_state &amp;amp; i;                     // 0-&amp;gt;1: key press detect&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist der Tasteneingang entprellt. Und zwar sowohl beim Drücken einer Taste als auch beim Loslassen (damit Tastenpreller beim Loslassen nicht mit dem Niederdrücken einer Taste verwechselt werden). Der weitere Code beschäftigt sich dann nur noch damit, diesen entprellten Tastenzustand weiter zu verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Codeteil sieht durch die Verwendung der vielen bitweisen Operationen relativ komplex aus. Behält man aber im Hinterkopf, dass einige der bitweisen wie ein &#039;paralles If&#039; gleichzeitig auf allen 8 Bits eingesetzt werden, dann vereinfacht sich vieles. Ein&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    key_press |= key_state &amp;amp; i;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist nichts anderes als ein&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    // teste ob Bit 0 sowohl in key_state als auch in i gesetzt ist&lt;br /&gt;
    // und setze Bit 0 in key_press, wenn das der Fall ist&lt;br /&gt;
    if( ( key_state &amp;amp; ( 1 &amp;lt;&amp;lt; 0 ) ) &amp;amp;&amp;amp;&lt;br /&gt;
        ( i &amp;amp; ( 1 &amp;lt;&amp;lt; 0 ) )&lt;br /&gt;
       key_press |= ( 1 &amp;lt;&amp;lt; 0 );&lt;br /&gt;
&lt;br /&gt;
    // Bit 1&lt;br /&gt;
    if( ( key_state &amp;amp; ( 1 &amp;lt;&amp;lt; 1 ) ) &amp;amp;&amp;amp;&lt;br /&gt;
        ( i &amp;amp; ( 1 &amp;lt;&amp;lt; 1 ) )&lt;br /&gt;
       key_press |= ( 1 &amp;lt;&amp;lt; 1 );&lt;br /&gt;
&lt;br /&gt;
    // Bit 2&lt;br /&gt;
    if( ( key_state &amp;amp; ( 1 &amp;lt;&amp;lt; 2 ) ) &amp;amp;&amp;amp;&lt;br /&gt;
        ( i &amp;amp; ( 1 &amp;lt;&amp;lt; 2 ) )&lt;br /&gt;
       key_press |= ( 1 &amp;lt;&amp;lt; 2 );&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
nur als wesentlich kompaktere Operation ausgeführt und für alle 8 Bits gleichzeitig.&lt;br /&gt;
Die Kürze und Effizienz dieser paar Codezeilen ergibt sich aus dem Umstand, dass jedes Bit in den Variablen für eine Taste steht und alle 8 (maximal möglichen) Tasten gleichzeitig die Operationen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Funktionsweisen der verschienden Modi anhand von Zeitstrahlen erklärt:&lt;br /&gt;
https://www.mikrocontroller.net/topic/48465?goto=1753367#1844458&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Walkthrough&amp;quot; der verschiedenen Zuständer der Einzelnen Variablen anhand eines Tastendrucks (avrfreaks.net)&lt;br /&gt;
http://www.avrfreaks.net/comment/726676#comment-726676&lt;br /&gt;
&lt;br /&gt;
===== Reduziert auf lediglich 1 Taste =====&lt;br /&gt;
Diskussionen im Forum zeigen immer wieder, dass viele eine Abneigung gegen diesen Code haben, weil er ihnen sehr kompliziert vorkommt.&lt;br /&gt;
&lt;br /&gt;
Der Code ist nicht leicht zu analysieren und er zieht alle Register dessen, was möglich ist, um sowohl Laufzeit als auch Speicherverbrauch einzusparen. Oft hört man auch das Argument: Ich benötige ja nur eine Entprellung für 1 Taste, gibt es da nichts Einfacheres?&lt;br /&gt;
&lt;br /&gt;
Hier ist die &#039;Langform&#039; des Codes, so wie man das für lediglich 1 Taste schreiben würde, wenn man exakt dasselbe Entprellverfahren einsetzen würde. Man sieht: Da ist keine Hexerei dabei: In key_state wird der letzte bekannte entprellte Zustand der Taste gehalten. Der Pin-Eingang wird mit diesem Zustand verglichen und wenn sich die beiden unterscheiden, dann wird ein Zähler heruntergezählt. Produziert dieses herunterzählen einen Unterlauf des Zählers, dann gilt die Taste als entprellt und wenn dann auch noch die Taste gerade gedrückt ist, dann wird dieses in key_press entsprechend vermerkt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t key_state;&lt;br /&gt;
uint8_t key_counter;&lt;br /&gt;
volatile uint8_t key_press;&lt;br /&gt;
&lt;br /&gt;
ISR( ... Overflow ... )&lt;br /&gt;
{&lt;br /&gt;
  uint8_t input = KEY_PIN &amp;amp; ( 1 &amp;lt;&amp;lt; KEY0 );&lt;br /&gt;
&lt;br /&gt;
  if( input != key_state ) {&lt;br /&gt;
    key_counter--;&lt;br /&gt;
    if( key_counter == 0xFF ) {&lt;br /&gt;
      key_counter = 3;&lt;br /&gt;
      key_state = input;&lt;br /&gt;
      if( input )&lt;br /&gt;
        key_press = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
    key_counter = 3;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t get_key_press()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t result;&lt;br /&gt;
&lt;br /&gt;
  cli();&lt;br /&gt;
  result = key_press;&lt;br /&gt;
  key_press = FALSE;&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der vollständige Entprellcode, wie weiter oben gelistet, besticht jetzt aber darin, dass er compiliert kleiner ist als diese anschaulichere Variante für lediglich 1 Taste. Und das bei gleichzeitig erhöhter Funktionalität. Denn zb. ein Autorepeat ist in diesem Code noch gar nicht eingebaut. Und spätestens wenn man dann eine 2.te Taste entprellen möchte, dann ist auch der SRAM-Speicherverbrauch dieser Langform höher als der des Originals für 8 Tasten. Daraus folgt: Selbst für lediglich 1 Taste ist die Originalroutine die bessere Wahl.&lt;br /&gt;
&lt;br /&gt;
Und wegen der Komplexität mal eine Frage: Sind Sie selbst in der Lage eine entsprechend effiziente sqrt() Funktion zu schreiben, wie die, die sie in der Standard-C-Bibliothek vorfinden? Nein? Dann dürften Sie eigentlich Ihrer Argumentation nach die Bibliotheksfunktion sqrt() nicht verwenden, sondern müssten sich statt dessen selbst eine Wurzel-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Selbstsättigender Filter (nach Jürgen Schuhmacher) ===&lt;br /&gt;
Durch die Nutzung der diskreten Signalanalyse in Software kann die Funktionalität einer einfachen Entprellung mit einem Widerstand, einem Kondensator und einem Schmitttrigger wie in Hardware nachgebildet werden, indem ein abstrakter IIR-Filter benutzt wird, der eine Kondensatorladekurve emuliert. Mit der Vorschrift Y(t) = k Y(t-1) + Input wird ein einfaches Filter erzeugt, dass dem Eingangswert träge folgt. Bei Überschreiten eines bestimmten Wertes erfolgt mit einer einfachen Abfrage das Schalten des Ausgangssignals.&lt;br /&gt;
&lt;br /&gt;
Für Assembler und VHDL bei FPGAs eignet sich aufgrund der leicht zu implementierenden binären Operationen folgende Darstellung mit einer Auflösung des Filterwertspeichers von nur 8 bit: Wert_Neu = Wert_Alt - Wert_Alt/16 + 16*(Taste = True). Der Filterwert bildet dann den gedämpften Verlauf des Eingangs (flankenverschliffen) ab und kann Prellen bis nahe an den Grenzbereich zum schnellen Tasten unterdrücken. Der Ausgangswert ist dann einfach das höchstwertige Bit des Filterwertes.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Entprellung mit IIR-Filter.gif]]&lt;br /&gt;
&lt;br /&gt;
Dazu muss das Signal des Tasters idealerweise um den Faktor 10-20 schneller abgetastet werden, als die höchste gewünschte Tippgeschwindigkeit vorgibt. Noch schneller abzutasten ist möglich, führt aber zu mehr Bedarf an Bits beim Filter. Die Schmittriggerfunktion kann dadurch gebildet werden, dass eine 1 am Ausgang bei z.B. Überschreiten einer 55% Grenze und eine 0 bei Unterschreitung der 45%-Grenze ausgeben wird. Im Zwischenbereich wird der alte Wert gehalten. Die realen Grenzen dieser [[Hysterese]] müssen an die Applikation angepasst werden, da zu enge Grenzen sonst zu empfindlich gegenüber Störungen wären.&lt;br /&gt;
&lt;br /&gt;
=== Einfacher Mittelwertfilter (nach Lothar Miller) ===&lt;br /&gt;
Für digitale Schaltungen oder PLDs empfiehlt sich ein FIR-Filter mit aneinandergereihten FlipFlops. Man schiebt das Eingangssignal in eine FlipFlop-Kette und schaltet oberhalb der Mitte um:&lt;br /&gt;
&lt;br /&gt;
SignalInput -&amp;gt; FF1 -&amp;gt; FF2 -&amp;gt; FF3 -&amp;gt; FF4 -&amp;gt; FF5 -&amp;gt; FF6 -&amp;gt; FF7 -&amp;gt; FF8&lt;br /&gt;
&lt;br /&gt;
Wenn alle FFs = 1 (Summe der FFs=8) dann SignalOutput = 1&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn alle FFs = 0 (Summe der FFs=0) dann SignalOutput = 0&lt;br /&gt;
&lt;br /&gt;
Dieses Verfahren kann sehr einfach in Logik abgebildet werden, weil für die Berechnung des Ausgangs nur ein NOR bz. ein AND Gatter nötig ist.&lt;br /&gt;
&lt;br /&gt;
Das reale Signal muss dazu aber genügend langsam abgetastet werden, sodaß die Filterperiode die Prelldauer übersteigt, um zu verhindern, daß nicht inmitten einer passiven Phase eines Prellvorgangs ein 8fach 1 gesehen wird. Damit wird die Interetation vergleichsweise langsam.&lt;br /&gt;
&lt;br /&gt;
== Gegenüberstellung der Verfahren ==&lt;br /&gt;
* HW - &amp;quot;entprellte Schalter&amp;quot;: Sehr teuer, grosse Bauform, verschleissbelastet, geringe Haltbarkeit&lt;br /&gt;
* HW - &amp;quot;Umschalter&amp;quot; : benötigt aufwändigeren Schalter, benötigt Elektronik&lt;br /&gt;
* HW - &amp;quot;Umschalter ohne FF&amp;quot; : benötigt aufwändigeren Schalter und kleinen Kondensator&lt;br /&gt;
* HW - &amp;quot;Kondensatorentprellung&amp;quot; : benötigt etwas mehr Platz, kommt mit schlechten Schaltern zurecht&lt;br /&gt;
&lt;br /&gt;
* SW - Flankenverfahren:&lt;br /&gt;
* SW - Warteschleife: Durch die Warteschleifen eine nicht zu vernachlässigende Verzögerung im Code. Speziell wenn mehrere Tasten zu überwachen sind, nicht unproblematisch&lt;br /&gt;
* SW - Timer: Universalfunktionalität, die durch geringen Speicherverbrauch, geringen Rechenzeitverbrauch und gute Funktion besticht. Der &#039;Verbrauch&#039; eines Timers sieht auf den ersten Blick schlimmer aus, als er ist, denn in den meisten Programmen hat man sowieso einen Basistimer für die Zeitsteuerung des Programms im Einsatz, der für die Tastenentprellung mitbenutzt werden kann.&lt;br /&gt;
* SW - Filter: sehr geringer Platzbedarf in FPGAs, relativ gute Wirkung&lt;br /&gt;
* SW - Filter 2: sehr geringer Platzbedarf, gute Wirkung&lt;br /&gt;
&lt;br /&gt;
== Links zum Thema ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.edn.com/design/analog/4324067/Contact-debouncing-algorithm-emulates-Schmitt-trigger Contact-debouncing algorithm (Artikel)],  [http://www.edn.com/Pdf/ViewPdf?contentItemId=4324067 als PDF]&lt;br /&gt;
* [[AVR-Tutorial: Tasten]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#.28Tasten-.29Entprellung|AVR-GCC-Tutorial Tastenentprellung]]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-20435.html Beitrag im Forum, AVR Assembler]&lt;br /&gt;
* [http://www.ganssle.com/debouncing.pdf A guide to debouncing (engl.), praktische Erläuterungen zum Entprellen in Soft- und Hardware]&lt;br /&gt;
* [http://www.pololu.com/docs/0J16/all Understanding Destructive LC Voltage Spikes]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multimeter&amp;diff=91109</id>
		<title>Multimeter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multimeter&amp;diff=91109"/>
		<updated>2016-01-10T23:58:15Z</updated>

		<summary type="html">&lt;p&gt;Prx: Bluetooth&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Multimeter dient zur Messung verschiedener elektrischer Größen. Die Grundfunktionen sind Messung von Spannung, Strom, Widerstand. Darüber hinaus bieten viele Geräte noch weitere Funktionen wie Diodentest, Durchgangsprüfer, Kapazitätsmessung, Temperaturmessung, Frequenz und noch mehr.&lt;br /&gt;
&lt;br /&gt;
== Wichtige Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
Bei der Auswahl eines Multimeters sollte man sich zuerst einmal überlegen, was man damit machen möchte und welche Eigenschaften/Funktionen dafür benötigt werden.  Neben der Funktionalität ist Sicherheit ein wichtiges Thema. Je nach Anwendungszweck sollte das Multimeter auch bestimmten Sicherheitsanforderungen genügen.&lt;br /&gt;
&lt;br /&gt;
=== Sicherheit ===&lt;br /&gt;
&lt;br /&gt;
=== Spannungsfestigkeit ===&lt;br /&gt;
&lt;br /&gt;
Eine wesentliche Eigenschaft ist die Spannungfestigkeit des Geräts. Dazu gibt es üblicherweise eine Angabe der Nennspannung zusammen mit der [[Leiterbahnabstände#Überspannungskategorien|Überspannungskategorie]]. Diese Angabe bezieht sich nicht auf den Messbereich intern im Gerät, sondern auf die Stärke der Isolation nach außen.&lt;br /&gt;
&lt;br /&gt;
Solange man nur mit Kleinspannung (&amp;lt; 50V AC bzw 120V DC) und kleinen Strömen arbeitet, sind die Sicherheitsanforderungen an das Multimeter nicht groß; da kann man eigentlich jedes Gerät einsetzen. So ziemlich alle Messgeräte sind für mindestens 300V Cat II spezifiziert, was auch für Messungen an Geräten, die über eine Steckdose am Niederspannungsnetz (230V) betrieben werden, ausreichend ist.&lt;br /&gt;
&lt;br /&gt;
Für Messungen an Geräten, die fest mit dem Niederspannungsnetz verbunden sind, ist die Überspannungskategorie III notwendig. Kategorie IV braucht man für Messungen direkt an oder in der Nähe der Einspeisung in die elektrische Installation von Gebäuden, z.B. im bzw. vor dem Hauptverteiler.&lt;br /&gt;
&lt;br /&gt;
Die Nennspannung bezieht sich dabei auf die Spannung Leiter gegen Erde. Einen guten Sicherheitsstandard bieten üblicherweise Geräte mit 600V Cat III/1000V Cat II; noch bessere Geräte haben 600V Cat IV/1000V Cat III oder sogar 1000V Cat IV.&lt;br /&gt;
&lt;br /&gt;
=== Sicherung ===&lt;br /&gt;
&lt;br /&gt;
Weiterhin ist die Sicherung bei der Strommessung ein sicherheitsrelevantes Bauteil. Viele preiswerte Multimeter haben eine einfache Glasrohrsicherung (5 x 20 mm) mit einer Nennspannung von 250V. &lt;br /&gt;
&lt;br /&gt;
Diese Sicherungen haben nur eine begrenzte Abschaltfähigkeit, vor allem bei Messungen mit Gleichstrom und hoher Spannung bildet sich in so einer Sicherung ein Lichtbogen und die Sicherung trennt nicht. Das kann zur Zerstörung des Multimeters (Brand, Explosion) und ernsthaften Verletzungen führen.&lt;br /&gt;
&lt;br /&gt;
Vor allem bei Strommessungen bei hoher Gleichspannung sollte darauf geachtet werden, dass im Multimeter eine Sicherung eingebaut ist, die ein Trennvermögen von 1000V und 20 kA hat. Diese Sicherungen haben meistens die Abmessungen 10 x 38 mm.&lt;br /&gt;
&lt;br /&gt;
=== Analog oder Digital ===&lt;br /&gt;
&lt;br /&gt;
Die große Masse an Multimetern heute ist digital, daher auch die weit verbreitete Abkürzung DMM (&#039;&#039;&#039;D&#039;&#039;&#039;igital&#039;&#039;&#039;m&#039;&#039;&#039;ulti&#039;&#039;&#039;m&#039;&#039;&#039;eter). Dennoch gibt es noch ein paar wenige, neue Analoggeräte. Wo liegen nun die Vor- und Nachteile?&lt;br /&gt;
&lt;br /&gt;
==== Analoges Multimeter ====&lt;br /&gt;
&lt;br /&gt;
Diese Geräte sind rein passiv aufgebaut und bestehen nur aus einem Drehspulmesswerk und vielen Widerständen zur Messbereichsumschaltung.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* keine Stromversorgung nötig&lt;br /&gt;
* Intuitive Anzeige von Schwankungen des Messwerts, Trendanzeige&lt;br /&gt;
* unempfindlich gegen elektromagnetische Störungen&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* deutlich niedrigerer Innenwiderstand bei Spannungsmessungen&lt;br /&gt;
* Ablesefehler&lt;br /&gt;
* geringere Auflösung des Messwerts beim Ablesen&lt;br /&gt;
* keine automatische Bereichswahl möglich&lt;br /&gt;
* bedingt durch die Ablesefehler und mechanische Probleme nur eine begrenzte Genauigkeit erreichbar&lt;br /&gt;
&lt;br /&gt;
==== Digitales Multimeter ====&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Kein Ablesefehler&lt;br /&gt;
* Deutlich bessere Auflösung, dadurch mehr Genauigkeit möglich&lt;br /&gt;
* durch geeignete [[AD-Wandler]] sehr hohe [[Auflösung und Genauigkeit]] möglich&lt;br /&gt;
* sehr hoher Eingangswiderstand bei Spannungsmessungen&lt;br /&gt;
* hohe Empfindlichkeit durch Eingangsverstärker&lt;br /&gt;
* automatische Bereichswahl möglich&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt eine Stromversorgung&lt;br /&gt;
* keine intuitive Anzeige von Messwertschwankungen&lt;br /&gt;
* empfindlicher bezüglich Störeinkopplungen&lt;br /&gt;
* kann selber Störquelle bei extrem empfindlichen Messungen sein&lt;br /&gt;
&lt;br /&gt;
Teilweise hat man heute erfolgreich einige Vorteile der analogen Anzeige in die digitalen Multimeter übernehmen können. So bieten einge Messgeräte eine quasianaloge Bandanzeige des Messwerts, welcher das Verhalten eines Zeigerinstruments brauchbar nachbildet.&lt;br /&gt;
&lt;br /&gt;
==== Analoges Multimeter mit Messverstärker ====&lt;br /&gt;
&lt;br /&gt;
Bei diesen Geräten wird versucht, einige Vorteile des DMM mit der Analoganzeige zu kombinieren.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Intuitive Anzeige von Schwankungen des Messwerts, Trendanzeige&lt;br /&gt;
* etwas unempfindlicher gegen elektromagnetische Störungen als digitale Multimeter&lt;br /&gt;
* sehr hoher Eingangswiderstand bei Spannungsmessungen&lt;br /&gt;
* hohe Empfindlichkeit durch Eingangsverstärker&lt;br /&gt;
* automatische Bereichswahl möglich&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* Ablesefehler&lt;br /&gt;
* geringere Auflösung des Messwerts beim Ablesen&lt;br /&gt;
* benötig eine Stromversorgung&lt;br /&gt;
* bedingt durch die Ablesefehler und mechanische Probleme nur eine begrenzte Genauigkeit erreichbar&lt;br /&gt;
&lt;br /&gt;
Die meisten Anwender kaufen sich ein Digitalmultimeter mit einer guten Genauigkeit und nur für einfache Messungen, bei denen nicht die Genauigekeit sondern die intuitive Anzeige im Vordergrund steht, ein Analoggerät.&lt;br /&gt;
&lt;br /&gt;
== Auflösung und Genauigkeit ==&lt;br /&gt;
&lt;br /&gt;
Zur wichtigen Unterscheidung von [[Auflösung und Genauigkeit]] gibt es einen eigenen Artikel.&lt;br /&gt;
&lt;br /&gt;
=== Auflösung ===&lt;br /&gt;
&lt;br /&gt;
Beim Digitalmultimeter wird ein digitaler Wert angezeigt; der Zusammenhang zwischen Auflösung und Messbereich wird durch die Anzahl der Stellen bzw. die Anzahl der darstellbaren Zahlenwerte bestimmt. Ein 3-1/2-stelliges Display hat einen Bereich von 0 - 1999, der Dezimalpunkt kann dabei an jeder beliebigen Stelle sein. Man spricht hier auch von 2000 Schritten (engl. counts). Geräte mit 4 1/2 Stellen haben 20.000 Counts, das ist ein Anzeigeumfang von 0 - 19.999. Anzeigen mit 4.000 Counts werden manchmal auch als 3 3/4 Stellen bezeichnet, Geräte mit 6.000 Counts als 3 5/6 Stellen usw.&amp;lt;br&amp;gt;&lt;br /&gt;
(Die &#039;&#039;1/2&#039;&#039;, &#039;&#039;3/4&#039;&#039; usw. sind dabei nicht als Brüche o.ä. zu verstehen, sondern als Angabe, welche Werte die linke, höchstwertigste Stelle des Geräts annehmen kann. So ist bei einer &#039;&#039;1/2&#039;&#039;-Angabe für die linke Stelle eine 0 oder 1 möglich, bei &#039;&#039;3/4&#039;&#039; ein 0, 1, 2 oder 3, und bei &#039;&#039;5/6&#039;&#039; entsprechend 0, 1, …, 5)&lt;br /&gt;
&lt;br /&gt;
Die Auflösung des Multimeters ist die kleinste Änderung im Messwert, die dargestellt werden kann. Ein Gerät mit z.B. 20.000 Counts hat im 2V-Messbereich eine Auflösung von 2V / 20000 = 0,1 mV.&lt;br /&gt;
&lt;br /&gt;
=== Grundgenauigkeit ===&lt;br /&gt;
&lt;br /&gt;
In den Datenblättern wird in der Regel die Grundgenauigkeit eines Multimeters angegeben. Damit wird die Genauigkeit der internen Referenz und des A/D-Wandler spezifiziert; meistens ist dieser Wert gleich der Genauigkeit bei DC-Spannungsmessung.&lt;br /&gt;
&lt;br /&gt;
Oft wird der zu erwartende Meßfehler auch in der Form &amp;quot;% Reading + % Range&amp;quot; angegeben. &lt;br /&gt;
&amp;quot;% Reading&amp;quot; entspricht dem Meßfehler bezogen auf den aktuellen Meßwert, &amp;quot;% Range&amp;quot; entspricht dem Meßfehler bezogen auf den eingestellten Meßbereich. Die Abweichung. Beide Werte müssen addiert werden, um den Gesamtmeßfehler zu ergeben.&lt;br /&gt;
&lt;br /&gt;
=== Toleranz ===&lt;br /&gt;
&lt;br /&gt;
Wichtiger als die Grundgenauigkeit ist aber die Toleranz in den einzelnen Messbereichen. Üblich sind dabei Angaben in der Form +/- (0,2% + 3 Digits). Das bedeutet, dass die maximale Abweichung 0,2% vom angezeigten Messwert und zusätzlich 3 Digits beträgt. Ein Digit ist dabei die niedrigste Einheit in der Anzeige des Messwertes in dem aktuellen Messbereich. Bei einer angezeigten Spannung von z.B. 2,000V und einem Fehler von 3 Digits würde die tatsächliche Spannung daher in einem Bereich von 1,997V bis 2,003V liegen.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise hat ein Multimeter bei der DC-Spannungsmessung die höchste Genauigkeit. Bei der DC-Strommessung wird ein Shunt-Widerstand verwendet, dieser muss eine hohe Belastbarkeit und gleichzeitig einen niedrigen Temperaturkoeffizienten haben, was relativ teuer ist. Deshalb ist die Genauigkeit hier meistens deutlich schlechter als bei der Spannungsmessung.&lt;br /&gt;
&lt;br /&gt;
Bei Wechselspannung bzw. -strom hängt die Genauigkeit vom verwendeten Messverfahren ab. Hier wird der Effektivwert angezeigt. Viele Multimeter messen die Signalamplitude oder einen Mittelwert und berechnen daraus den Effektivwert. Damit liefern diese Geräte nur bei einer exakten Sinusform einen genauen Messwert.&lt;br /&gt;
&lt;br /&gt;
=== True-RMS, Crest-Faktor ===&lt;br /&gt;
&lt;br /&gt;
Um bei anderen Kurvenformen einen genauen Effektivwert zu messen braucht man ein True-RMS Multimeter. Hier wird das Signal entweder analog quadriert oder digital mit einer hohen Frequenz abgetastet und ein quadratischer Mittelwert berechnet. Damit erhält man theoretisch für beliebige Signalformen einen genauen Messwert, allerdings gilt das nur in einem bestimmten Frequenzbereich. Im Datenblatt wird meistens auch ein maximaler Crest-Faktor angegeben, das ist das maximale Verhältnis zwischen dem Spitzenwert und dem Effektivwert, beim dem die Genauigkeit innerhalb der spezifizierten Toleranz liegt.&lt;br /&gt;
&lt;br /&gt;
== Weitere Funktionen ==&lt;br /&gt;
&lt;br /&gt;
=== Durchgangsprüfer ===&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird in der Elektronikpraxis sehr oft benötigt, demzufolge sollte das Multimeter sie haben. Wichtig ist, daß ein Pieper zur Signalisierung verfügbar ist und dieser ohne nennenswerte Verzögerung reagiert. Einige Multimeter sind da recht langsam, eine &amp;quot;Denkpause&amp;quot; von einer Sekunde ist da sehr störend wenn man viele Verbindungen durchmessen will.&lt;br /&gt;
&lt;br /&gt;
=== Diodentest ===&lt;br /&gt;
&lt;br /&gt;
Auch eine sehr nützliche Funktion, auf die man nicht verzichten sollte.&lt;br /&gt;
 &lt;br /&gt;
=== Widerstandsmessung ===&lt;br /&gt;
&lt;br /&gt;
Diese ist in vielen Multimetern vorhanden und für den Hobbybastler auch sehr wichtig.&lt;br /&gt;
&lt;br /&gt;
=== Temperatursensor ===&lt;br /&gt;
&lt;br /&gt;
Viele Multimeter werden mit einem [[Temperatursensor]] geliefert, dabei handelt es sich fast immer um ein Thermoelement. Damit kann man relativ einfach Temperaturen zwischen -50°C bis 350°C messen.&lt;br /&gt;
&lt;br /&gt;
=== Schnittstelle ===&lt;br /&gt;
&lt;br /&gt;
Einige Multimeter bieten eine Schnittstelle zum PC, damit können sie als per Software steuerbares Multimeter bzw. Datenschreiber verwendet werden. Diese Schnittstelle ist per [[Optokoppler]] [[Galvanische Trennung|galvanisch getrennt]], damit kann man gefahrlos messen. Will man das Multimeter per Mikrocontroller steuern, so sind Typen mit [[RS232]] Anschluß den Typen mit [[USB]] vorzuziehen.&lt;br /&gt;
&lt;br /&gt;
Ebenso gibt es Geräte, die per Bluetooth mit einem Smartphone kommunizieren können.&lt;br /&gt;
&lt;br /&gt;
Ältere Tischmultimeter, wie sie in der Industrie benutzt werden, besitzen hingegen stattdessen meist ein GPIB-Interface.  Dabei handelt es sich um einen Messgerätebus von Hewlet Packard (heute Agilent), der zwar eine eigene Interfacekarte im PC benötigt (billig als ISA zu bekommen, relativ teuer als PCI; auch USB-GPIB ist möglich), aber recht universell für verschiedenste Messgeräte genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Transistortester ===&lt;br /&gt;
&lt;br /&gt;
Damit kann man die Stromverstärkung eines Transistors bei kleinen Strömen messen. Bisweilen ganz nett, praktisch wird sie aber eher wenig gebraucht.&lt;br /&gt;
&lt;br /&gt;
=== Messung von Induktivität, Kapazität und Frequenz ===&lt;br /&gt;
&lt;br /&gt;
Diese Messmöglichkeiten sind in verschiedenster Kombination verfügbar, aber eher als nette Zugabe anzusehen. Sie erreicht meist keine sonderlich hohe Genauigkeit. Vor allem die Frequenzmessung ist eher eine Schätzung und hat mit einem echten Frequenzmesser wenig gemeinsam. Wer ernsthaft diese Größen messen will, kauft sich besser ein speziell dafür gebautes Messgerät. Zur groben Messung der Parameter sind die Funktionen ausreichend.&lt;br /&gt;
&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
&lt;br /&gt;
In bestimmten Situationen kann eine Beleuchtung der Anzeige recht nützlich sein, da aus Stromspargründen die Anzeige immer ein LCD ist. Die große Masse der Anwender braucht sie jedoch nicht. &lt;br /&gt;
&lt;br /&gt;
=== Messwertspeicher ===&lt;br /&gt;
&lt;br /&gt;
Viele Multimeter können auf Knopfdruck den Messwert einfrieren. Das ist dann hilfreich, wenn man an einem schwer zugänglichen Ort eine Messung machen muss und dabei das Display nicht ablesen kann, typisch an großen Maschinen und Anlagen.&lt;br /&gt;
&lt;br /&gt;
=== Auto Range ===&lt;br /&gt;
&lt;br /&gt;
Die meisten besseren Multimeter verfügen über eine automatische Messbereichswahl, d.h. das Multimeter stellt automatisch den optimalen Messbereich ein. Das hat Vor- und Nachteile.&lt;br /&gt;
&lt;br /&gt;
Vorteile&lt;br /&gt;
* einfache Messung unbekannter Größen&lt;br /&gt;
&lt;br /&gt;
Nachteile&lt;br /&gt;
* Durch die meist nötige Umschaltung des Messbereichs und Mehrfachmessung durch das Multimeter verlängert sich die Messzeit, welche man bei bestimmten Messungen nicht gebrauchen kann. Ausserdem schwankt dadurch die Anzeige zusätzlich, was das Ablesen bei sich ändernden Messwerten erschwert.&lt;br /&gt;
&lt;br /&gt;
Ein Multimeter sollte auf jeden Fall die Möglichkeit bieten, die Auto Range Funktion abzuschalten.&lt;br /&gt;
&lt;br /&gt;
== Vergleichstabelle Multimeter ==&lt;br /&gt;
&lt;br /&gt;
In den folgende Tabellen werden wichtige technischen Daten einiger aktueller Multimeter zusammengestellt. Um die Übersichtlichkeit zu erhöhen, werden die Geräte in drei Kategorien eingeteilt.&lt;br /&gt;
&lt;br /&gt;
Bei den Sicherungen ist entweder die Baugröße oder die Nennspannung und Abschaltstrom angegeben; wenn das Gerät mehrere Sicherungen enthält, dann kommt zuerst der Wert für den mA Messbereich und danach die Sicherung für den A Messbereich.&lt;br /&gt;
&lt;br /&gt;
=== Einsteigergeräte ===&lt;br /&gt;
&lt;br /&gt;
Das sind preiswerte Geräte, mit denen viele Messaufgaben durchgeführt werden können, wenn keine sehr hohen Anforderungen an Genauigkeit gestellt werden. Für Einsteiger und Fortgeschrittene findet sich im Bereich unter 50 Euro immer ein Gerät, das den Ansprüchen gerecht wird. &#039;&#039;&#039;Will man Messungen am 230V-Netz durchführen, sollte man auf keinen Fall Billigstgeräte aus der Ramschkiste verwenden sondern auf qualitativ hochwertige Ware zurückgreifen und.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;multimeter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller || Bezeichnung ||Preis &amp;lt;BR&amp;gt; [EUR] || Counts || Grundgenauigkeit [%] || Messbereich DC V || Spannungsklasse ||Sicherung&lt;br /&gt;
|-&lt;br /&gt;
|Keysight (vorm. Agilent)&lt;br /&gt;
|U1231A (1)&lt;br /&gt;
|122&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|30XR-A&lt;br /&gt;
|70&lt;br /&gt;
|2.000&lt;br /&gt;
|1&lt;br /&gt;
|600V&lt;br /&gt;
|300V Cat III, 600V Cat II&lt;br /&gt;
|10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|33XR-A&lt;br /&gt;
|95&lt;br /&gt;
|4.000&lt;br /&gt;
|0,7&lt;br /&gt;
|1000V&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 1&lt;br /&gt;
|70&lt;br /&gt;
|3.200&lt;br /&gt;
|0,5&lt;br /&gt;
|600V&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 2&lt;br /&gt;
|85&lt;br /&gt;
|2.000&lt;br /&gt;
|0,5&lt;br /&gt;
|1000V&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|6,35x32 mm / 6,35x32 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 3&lt;br /&gt;
|105&lt;br /&gt;
|2.000&lt;br /&gt;
|0,5&lt;br /&gt;
|600V&lt;br /&gt;
|300V Cat III&lt;br /&gt;
|6,35x32 mm / 6,35x32 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 4&lt;br /&gt;
|120&lt;br /&gt;
|4.200&lt;br /&gt;
|0,5&lt;br /&gt;
|600V&lt;br /&gt;
|300V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|1070&lt;br /&gt;
|10&lt;br /&gt;
|2.000&lt;br /&gt;
|0,5&lt;br /&gt;
|250V&lt;br /&gt;
|250V Cat II&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|2010&lt;br /&gt;
|25&lt;br /&gt;
|2.000&lt;br /&gt;
|0,5&lt;br /&gt;
|1000V&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|UNI-T&lt;br /&gt;
|UT61E&lt;br /&gt;
|62&lt;br /&gt;
|22.000&lt;br /&gt;
|0,1&lt;br /&gt;
|600V&lt;br /&gt;
|300V Cat III, 600V Cat II&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|}&lt;br /&gt;
1) keine Strommessung&lt;br /&gt;
&lt;br /&gt;
=== Mittelklasse-Geräte===&lt;br /&gt;
&lt;br /&gt;
Diese Geräte haben alle eine Grundgenauigkeit besser als 0,5 und sind besser ausgestattet als die Einsteigerklasse. Die Spannungsfestigkeit ist mindestens 600V Cat III.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;multimeter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller&lt;br /&gt;
!Bezeichnung&lt;br /&gt;
!Preis [EUR]&lt;br /&gt;
!Counts&lt;br /&gt;
!Grundgenauigkeit [%]&lt;br /&gt;
!TRMS&lt;br /&gt;
!Spannungsklasse&lt;br /&gt;
!Sicherung&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|34XR-A&lt;br /&gt;
|125&lt;br /&gt;
|4.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|37XR-A&lt;br /&gt;
|140&lt;br /&gt;
|10.000&lt;br /&gt;
|0,1&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Amprobe&lt;br /&gt;
|38XR-A&lt;br /&gt;
|165&lt;br /&gt;
|10.000&lt;br /&gt;
|0,25&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Keysight (vorm. Agilent)&lt;br /&gt;
|U1241B&lt;br /&gt;
|215&lt;br /&gt;
|10.000&lt;br /&gt;
|0,09&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|10x35 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Keysight (vorm. Agilent)&lt;br /&gt;
|U1232A&lt;br /&gt;
|166&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 7-1&lt;br /&gt;
|220&lt;br /&gt;
|6.000&lt;br /&gt;
|0,08&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|10x35 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 10&lt;br /&gt;
|165&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|6,35x32 mm&lt;br /&gt;
|-&lt;br /&gt;
|Benning&lt;br /&gt;
|MM 11&lt;br /&gt;
|350&lt;br /&gt;
|20.000&lt;br /&gt;
|0,08&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|10x35 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|114&lt;br /&gt;
|145&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|115&lt;br /&gt;
|170&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|1000V / 15kA&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|117&lt;br /&gt;
|200&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III&lt;br /&gt;
|1000V / 15kA&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|77 IV&lt;br /&gt;
|400&lt;br /&gt;
|6000&lt;br /&gt;
|0,3&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|175&lt;br /&gt;
|225&lt;br /&gt;
|6000&lt;br /&gt;
|0,15&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|177&lt;br /&gt;
|270&lt;br /&gt;
|6000&lt;br /&gt;
|0,09&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|179&lt;br /&gt;
|300&lt;br /&gt;
|6000&lt;br /&gt;
|0,09&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|P3320&lt;br /&gt;
|55&lt;br /&gt;
|6.000&lt;br /&gt;
|0,5&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat III, 1000V Cat II&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|P3360&lt;br /&gt;
|85&lt;br /&gt;
|40.000&lt;br /&gt;
|0,06&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|6,3x32 mm / 10x38 mm&lt;br /&gt;
|-&lt;br /&gt;
|Peaktech&lt;br /&gt;
|P3380&lt;br /&gt;
|190&lt;br /&gt;
|22.000&lt;br /&gt;
|0,12&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|k. A.&lt;br /&gt;
|-&lt;br /&gt;
|UNI-T&lt;br /&gt;
|UT71B&lt;br /&gt;
|97&lt;br /&gt;
|20.000&lt;br /&gt;
|0,08&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|5x20 mm&lt;br /&gt;
|-&lt;br /&gt;
|UNI-T&lt;br /&gt;
|UT71C&lt;br /&gt;
|120&lt;br /&gt;
|40.000&lt;br /&gt;
|0,05&lt;br /&gt;
|Ja&lt;br /&gt;
|600V Cat IV, 1000V Cat III&lt;br /&gt;
|5x20 mm&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Oberklasse-Geräte ===&lt;br /&gt;
&lt;br /&gt;
Diese Geräte haben eine Grundgenauigkeit von mindestens 0,1 und bieten einen sehr hohen Sicherheitsstandard. Die Spannungsfestigkeit ist mindestens 1000V Cat III. Diese Geräte haben Zusatzfunktionen wie z.B. parametrierbare Tiefpassfilter, Messung der Grundfrequenz an Wechselrichtern, etc. Sie sind meist nur für Profis interessant und bezahlbar.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;multimeter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller&lt;br /&gt;
!Bezeichnung&lt;br /&gt;
!Preis [EUR]&lt;br /&gt;
!Counts&lt;br /&gt;
!Grundgenauigkeit [%]&lt;br /&gt;
!Bandbreite (TRMS)/kHz&lt;br /&gt;
!Zusatzfunktionen&lt;br /&gt;
|-&lt;br /&gt;
|Keysight&lt;br /&gt;
|U1251A/B&lt;br /&gt;
|350&lt;br /&gt;
|50.000&lt;br /&gt;
|0,025&lt;br /&gt;
|30&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|83 V&lt;br /&gt;
|380&lt;br /&gt;
|6.000&lt;br /&gt;
|0,1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Fluke&lt;br /&gt;
|87 V&lt;br /&gt;
|450&lt;br /&gt;
|20.000&lt;br /&gt;
|0,05&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT PRO&lt;br /&gt;
|360&lt;br /&gt;
|10.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT Tech&lt;br /&gt;
|360&lt;br /&gt;
|12.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT ENERGY&lt;br /&gt;
|810&lt;br /&gt;
|60.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT 30M&lt;br /&gt;
|1046&lt;br /&gt;
|1.200.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT X-TRA&lt;br /&gt;
|360&lt;br /&gt;
|12.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Gossen Metrawatt&lt;br /&gt;
|METRAHIT OUTDOOR&lt;br /&gt;
|549&lt;br /&gt;
|12.000&lt;br /&gt;
|0,05&lt;br /&gt;
|10&lt;br /&gt;
| IP65&lt;br /&gt;
|-&lt;br /&gt;
|Metrix&lt;br /&gt;
|MTX 3281&lt;br /&gt;
|ab 375,-&lt;br /&gt;
|100.000&lt;br /&gt;
|0,1%&lt;br /&gt;
|50&lt;br /&gt;
|versch. Ausführungen: Com, BT, Temp ect.&lt;br /&gt;
|-&lt;br /&gt;
|Metrix&lt;br /&gt;
|MTX 3282&lt;br /&gt;
|ab 500,-&lt;br /&gt;
|100.000&lt;br /&gt;
|0,03%&lt;br /&gt;
|100&lt;br /&gt;
|versch. Ausführungen: Com, BT, Temp ect.&lt;br /&gt;
|-&lt;br /&gt;
|Metrix&lt;br /&gt;
|MTX 3283&lt;br /&gt;
|ab 560,-&lt;br /&gt;
|100.000&lt;br /&gt;
|0,02%&lt;br /&gt;
|200&lt;br /&gt;
|versch. Ausführungen: Com, BT, Temp ect.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Tischmultimeter ===&lt;br /&gt;
&lt;br /&gt;
Tischmultimeter bieten eine sehr hohe Genauigkeit und eine hohe Geschwindigkeit. Für genaue Widerstandsmessung gibt es eine [http://de.wikipedia.org/wiki/Vierdrahtmessung Vierdrahtmessung],  &lt;br /&gt;
wodurch sich der Widerstand der Messleitungen nicht auf das Ergebnis auswirkt. Auf Grund ihrer sehr hohen Genauigkeit wird diese nicht in Prozent sondern ppm angegeben, u.a. weil niemand die vielen Nullen nach dem Komma zählen will.&lt;br /&gt;
&lt;br /&gt;
1ppm = 0,0001% (engl. one part per million, der millionste Teil) &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;multimeter&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Hersteller&lt;br /&gt;
!Bezeichnung&lt;br /&gt;
!Preis [EUR]&lt;br /&gt;
!Counts&lt;br /&gt;
!Grundgenauigkeit [ppm]&lt;br /&gt;
!TRMS&lt;br /&gt;
|-&lt;br /&gt;
|Keysight&lt;br /&gt;
|34461A&lt;br /&gt;
|1050&lt;br /&gt;
|1.200.000&lt;br /&gt;
|19 (über 24 h)&lt;br /&gt;
|Ja&lt;br /&gt;
|-&lt;br /&gt;
|Keysight&lt;br /&gt;
|34401A&lt;br /&gt;
|985&lt;br /&gt;
|1.000.000&lt;br /&gt;
|15&lt;br /&gt;
|Ja&lt;br /&gt;
|-&lt;br /&gt;
|Keithley&lt;br /&gt;
|2000&lt;br /&gt;
|1050&lt;br /&gt;
|1.000.000&lt;br /&gt;
|20&lt;br /&gt;
|Ja&lt;br /&gt;
|-&lt;br /&gt;
|Picotest&lt;br /&gt;
|M3500A&lt;br /&gt;
|885&lt;br /&gt;
|1.000.000&lt;br /&gt;
|35&lt;br /&gt;
|Ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/204156#new Forumsbeitrag]: Welches Multimeter?&lt;br /&gt;
*[http://www.sprut.de/electronic/mess/spannung.htm Spannungsnormal - Betrachtungen zur Messgenauigkeit]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_Einf%C3%BChrung&amp;diff=87034</id>
		<title>Raspberry Pi Einführung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_Einf%C3%BChrung&amp;diff=87034"/>
		<updated>2015-02-02T15:10:41Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Errata */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Robert Knauer&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig&#039;&#039;&#039;: &#039;&#039;Alle Informationen und Anleitungen in diesem Artikel beziehen sich auf das Model B mit erweitertem Arbeitsspeicher.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Raspberry_Pi.jpg|thumb|Der Raspberry Pi]]&lt;br /&gt;
Der &#039;&#039;&#039;Raspberry Pi&#039;&#039;&#039; ist ein Einplatinen-Computer im Kreditkarten-Format mit einem SoC (System-on-a-Chip) von Broadcom. Dieser verfügt über folgende Eigenschaften:&lt;br /&gt;
* eine 700MHz ARMv6-CPU&lt;br /&gt;
* eine Broadcom VideoCore IV GPU&lt;br /&gt;
* 512 MB Arbeitsspeicher&lt;br /&gt;
Außerdem kann der Raspberry Pi über folgende Schnittstellen mit der Außenwelt kommunizieren:&lt;br /&gt;
* 2 USB 2.0 Host-Anschlüsse&lt;br /&gt;
* einen Composite Video-Ausgang&lt;br /&gt;
* einen HDMI-Ausgang (Video+Audio)&lt;br /&gt;
* einen 3,5mm Klinke-Audio-Ausgang&lt;br /&gt;
* einen SD-/MMC-Karten-Slot (Unterstützung für SDIO und SDHC)&lt;br /&gt;
* einen Ethernet-Port (10/100 MBit)&lt;br /&gt;
* 21 GPIO-Pins, teilweise gedacht als [[UART]], [[SPI]] und [[I2C]]&lt;br /&gt;
Die Energieversorgung wird über einen microUSB-Anschluss gewährleistet. Man sollte jedoch darauf achten, dass der USB-Anschluss, über den man den Raspberry Pi mit Energie versorgt mindestens 700 mA liefern kann, da in der USB 2.0 Spezifikation nur 500 mA vorgesehen sind. In diesem Artikel wird noch darauf eingegangen, wie man sich selbst ein entsprechendes Netzteil bauen kann, alternativ funktioniert auch ein entsprechend starkes USB-Ladegerät in Verbindung mit einem USB-A auf microUSB-B Kabel. (siehe [[#Stromversorgung]])&lt;br /&gt;
&lt;br /&gt;
Um diese umfangreichen Möglichkeiten zu nutzen muss man mit einem anderen Computer ein Betriebssystem auf die SD-Karte laden, das dann vom Raspberry Pi gebootet wird. Am naheliegendsten ist hier natürlich Linux (Raspbian, Fedora, Debian und Arch Linux sind offiziell unterstützt), aber auch Plan 9 wurde schon auf dem kleinen Computer [http://www.heise.de/open/meldung/Plan-9-laeuft-auf-dem-Raspberry-1761392.html zum Laufen gebracht].&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll Schritt für Schritt der Weg vom Anschließen des Computers über das Einrichten von Arch Linux ARM bis zum Verwenden der verschiedenen Schnittstellen des Raspberry Pi beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen &amp;amp; Zubehör ==&lt;br /&gt;
Der Raspberry Pi kann über verschiedene Quellen bezogen werden. Wichtig ist darauf zu achten, dass man das Model B mit 512 MB Arbeitsspeicher bestellt, da alle Anleitungen in diesem Artikel nur damit getestet sind und unter anderen Modellen eventuell nicht funktionieren. Ein in Deutschland ziemlich bekannter Elektronik-Versand, bei dem man den Raspberry Pi bestellen kann, ist Pollin, dort ist er zur Zeit für 38,95 € erhältlich. (Bestell-Nr.: 701 697, Stand: 17.06.2013)&lt;br /&gt;
&lt;br /&gt;
Doch neben dem eigentlichen Computer braucht man natürlich noch etwas Zubehör, wenn man es nicht eh schon zu Hause rumliegen hat:&lt;br /&gt;
* ein Netzteil, das 5V bei mindestens 700 mA auf einem microUSB-Stecker liefert (siehe [[Raspberry Pi#Stromversorgung]])&lt;br /&gt;
* eine SD(HC)-Speicherkarte&lt;br /&gt;
* einen SD(HC)-Cardreader an einem anderen Computer&lt;br /&gt;
* ein RJ45-Netzwerkkabel&lt;br /&gt;
* ein Ethernet-Netzwerk mit Zugang zum Internet&lt;br /&gt;
Mit diesem Zubehör kann man nur über SSH zugreifen, wenn man direkt am Raspberry Pi arbeiten will und später evtl. auch eine grafische Oberfläche einrichten will braucht man noch folgendes:&lt;br /&gt;
* ein HDMI-Kabel und einen Fernseher bzw. Monitor mit HDMI-Eingang &#039;&#039;&#039;oder&#039;&#039;&#039;&lt;br /&gt;
* ein Composite-Kabel und einen Fernseher mit entsprechendem Video-Eingang&lt;br /&gt;
* eine USB-Tastatur&lt;br /&gt;
* eine USB-Maus (für eine grafische Oberfläche)&lt;br /&gt;
* evtl. einen aktiven USB-Hub, wenn die Ports des Raspberry Pi nicht genug Leistung für Maus und Tastatur liefern können&lt;br /&gt;
&lt;br /&gt;
== Das Betriebssystem ==&lt;br /&gt;
Als Betriebssystem für die Anleitungen in diesem Artikel wird [http://archlinuxarm.org/ Arch Linux ARM] verwendet, das Meiste funktioniert jedoch auch unter anderen Linux-Distributionen und alles andere zumindest mit kleinen Anpassungen.&lt;br /&gt;
Es basiert auf den Prinzipien und teilweise auch der Software von [https://www.archlinux.org/ Arch Linux], hat aber vollständig unabhängige Paketquellen, in denen nur für ARM kompilierte Software verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Arch Linux ist ein gutes Betriebssystem für einen Computer wie den Raspberry Pi, da es am Anfang sehr leichtgewichtig ist und vorerst keine grafische Oberfläche installiert hat (was gut ist wenn man den Raspberry Pi als Server verwenden will). Andererseits kann aber auch problemlos eine grafische Oberfläche nachinstalliert werden, wenn man den Raspberry Pi als Desktop-Computer, HTPC oder ähnliches verwenden will.&lt;br /&gt;
&lt;br /&gt;
Man muss jedoch auch sagen, dass Arch Linux kein Betriebssystem für jemanden ist, der Linux noch nie verwendet hat. Man sollte schon etwas Erfahrung mit dem Arbeiten auf der Konsole haben, da grundlegende Dinge über Linux hier nicht erklärt werden.&lt;br /&gt;
Außerdem ist es teilweise notwendig, sich selbst weiterführende Informationen zu Arch Linux anzusehen, die in diesem Artikel verlinkt werden.&lt;br /&gt;
&lt;br /&gt;
== Anschluss &amp;amp; Installation ==&lt;br /&gt;
Nun muss man zuerst alles anschließen. Die Netzwerk-Buchse wird über das Netzwerk-Kabel mit dem Ethernet-Netzwerk verbunden. Hier ist wichtig, dass in dem Netzwerk ein DHCP-Server läuft (also IP-Adressen automatisch bezogen werden können) und Zugriff zum Internet möglich ist. Wenn man sich für die Variante mit eigenem Bildschirm entschieden hat muss man außerdem die HDMI-Buchse mit dem Fernseher oder Monitor bzw. den Composite-Ausgang mit dem Fernseher verbinden und Tastatur und Maus über USB anschließen.&lt;br /&gt;
Dann folgt die Installation von Arch Linux ARM auf die SD-Karte.&lt;br /&gt;
&lt;br /&gt;
Arch Linux ARM für Raspberry Pi kann man über folgende Links downloaden:&lt;br /&gt;
* [http://downloads.raspberrypi.org/images/archlinuxarm/archlinux-hf-2013-06-06/archlinux-hf-2013-06-06.zip.torrent Torrent-Download von Arch Linux ARM 2013-02-11]&lt;br /&gt;
* [http://downloads.raspberrypi.org/download.php?file=/images/archlinuxarm/archlinux-hf-2013-06-06/archlinux-hf-2013-06-06.zip HTTP-Download von Arch Linux ARM 2013-06-06]&lt;br /&gt;
Wenn der etwa 185 MB große Download abgeschlossen ist und man über HTTP gedownloadet hat sollte man zuerst die Checksum überprüfen.&lt;br /&gt;
Eine Anleitung dazu findet befindet sich auf der Downloadseite.&lt;br /&gt;
* SHA-1: 706037373bbb33ab6fb0af147a6e795bd04f1503&lt;br /&gt;
Nachdem man das getan oder falls man über Torrent gedownloadet hat (dann passiert das automatisch) kann man das zip-Archiv entpacken.&lt;br /&gt;
&lt;br /&gt;
Man erhält eine etwa 2,0 GB große Datei namens archlinux-hf-2013-06-06.img. Diese muss man nun auf die SD-Karte bringen. Unter Linux funktioniert das mit dem kleinen Programm dd, das in den GNU coreutils enthalten ist und damit auf fast jedem System vorinstalliert sein sollte. Dazu gibt man folgendes in die Konsole ein (als root, /dev/sdX durch den Pfad zur Gerätedatei der SD-Karte ersetzen, Pfad der img-Datei anpassen):&lt;br /&gt;
* dd if=/pfad/zur/archlinux-hf-2013-02-11.img bs=1M of=/dev/sdX&lt;br /&gt;
Unter Windows kann man dafür [https://launchpad.net/win32-image-writer Image Writer for Windows] benutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach entfernt man die Karte aus dem Cardreader des Computers und setzt sie in den Raspberry Pi ein. Dann verbindet man die Stromversorgung, indem man den microUSB-Stecker des Netzteils in die entsprechende Buchse auf der Platine steckt.&lt;br /&gt;
&lt;br /&gt;
== Der erste Start ==&lt;br /&gt;
Wenn man ein Display angeschlossen hat, erscheint nach ein paar Sekunden ein Login-Prompt auf dem Bildschirm. Als Username gibt man &#039;&#039;root&#039;&#039; ein, wenn man dann nach dem Passwort gefragt wird gibt man wieder &#039;&#039;root&#039;&#039; ein.&lt;br /&gt;
&lt;br /&gt;
Wenn man kein Display angeschlossen hat, muss man die IP-Adresse, die der Raspberry Pi sich vom DHCP-Server geholt hat, herausfinden. Wenn der DSL-Router diesen Dienst bereitstellt, kann man meistens auf der Web-Oberfläche eine Liste der verteilten IP-Adressen sehen. Alternativ kann man auch mit &#039;&#039;nmap&#039;&#039; einen Netzwerk-Scan machen, der die IP-Adressen von allen Computern im Netzwerk anzeigt. Das funktioniert unter Linux, indem man &#039;&#039;&#039;nmap -sn SUBNETZ&#039;&#039;&#039; im Terminal eingibt. Davor ersetzt man SUBNETZ durch das Subnetz, in dem auch der Raspberry Pi ist, in [https://de.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR-Notation]. Wenn man z.B. in einem Netz ist, in dem IP-Adressen von &#039;&#039;192.168.1.0&#039;&#039; bis &#039;&#039;192.168.1.255&#039;&#039; verteilt werden, muss man &lt;br /&gt;
&#039;&#039;192.168.1.0/24&#039;&#039; verwenden.&lt;br /&gt;
&lt;br /&gt;
Nachdem man die IP-Adresse herausgefunden hat, verbindet man sich per SSH zu ihr und loggt sich als root, Passwort root ein. Unter Linux funktioniert das mit&lt;br /&gt;
* ssh root@IP-ADRESSE&lt;br /&gt;
Unter Windows verwendet man am besten [http://www.putty.org/ PuTTY].&lt;br /&gt;
&lt;br /&gt;
Egal für welche Möglichkeit man sich entschieden hat, sitzt man jetzt vor einer root-Shell des Raspberry Pi, erkennbar am Shell-Prompt &#039;&#039;&#039;[root@alarmpi ~]#&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Nun geht es an die Konfiguration von Arch Linux ARM, diese erfolgt vollständig über das Editieren von Dateien auf der Konsole.&lt;br /&gt;
&lt;br /&gt;
=== Lokalisierung ===&lt;br /&gt;
Man editiert die Datei /etc/locale.gen:&lt;br /&gt;
* nano /etc/locale.gen&lt;br /&gt;
und entfernt die Raute vor der Zeile mit der entsprechenden Sprache-Land-Kodierungs-Kombination, also z.B. vor &#039;&#039;&#039;de_DE.UTF-8 UTF-8&#039;&#039;&#039; für Deutschland.&lt;br /&gt;
Danach speichert man mit Strg+O -&amp;gt; Enter und Strg+X und erstellt die Lokalisierung neu:&lt;br /&gt;
* locale-gen&lt;br /&gt;
Danach editiert man die Datei /etc/locale.conf:&lt;br /&gt;
* nano /etc/locale.conf&lt;br /&gt;
Man ändert &#039;&#039;&#039;LANG=en_US.UTF-8&#039;&#039;&#039; zur entsprechenden Sprache, also z.B. &#039;&#039;&#039;LANG=de_DE.utf8&#039;&#039;&#039; und speichert mit Strg+O -&amp;gt; Enter und Strg+X.&lt;br /&gt;
&lt;br /&gt;
=== Tastatur-Layout ===&lt;br /&gt;
Um das Tastatur-Layout auf der Konsole anzupassen, muss man die Datei /etc/vconsole.conf ändern:&lt;br /&gt;
* nano /etc/vconsole.conf&lt;br /&gt;
Man ändert &#039;&#039;&#039;KEYMAP=us&#039;&#039;&#039; zu z.B. &#039;&#039;&#039;KEYMAP=de-latin1&#039;&#039;&#039; für QWERTZ  und speichert wieder mit Strg+O -&amp;gt; Enter und Strg+X.&lt;br /&gt;
&lt;br /&gt;
=== Zeitzone ===&lt;br /&gt;
Um die Zeitzone zu ändern muss man einen Symlink zu /etc/localtime erstellen:&lt;br /&gt;
* ln -sf /usr/share/zoneinfo/ZEITZONE /etc/localtime&lt;br /&gt;
Also für Deutschland (Europe/Berlin):&lt;br /&gt;
* ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime&lt;br /&gt;
&lt;br /&gt;
Um alle Änderungen zu übernehmen startet man den Raspberry Pi am besten neu:&lt;br /&gt;
* reboot&lt;br /&gt;
Wenn man per SSH verbunden war, wird die Verbindung geschlossen und man muss sich neu verbinden.&lt;br /&gt;
&lt;br /&gt;
== Aktualisierung ==&lt;br /&gt;
Da das Image, das man auf die SD-Karte geschrieben hat, schon etwas veraltet sein kann, sollte man das System über die Paketverwaltung aktualisieren:&lt;br /&gt;
* pacman -Syu&lt;br /&gt;
Dieses Kommando downloadet die Datenbanken und alle neuen Pakete und installiert diese anschließend.&lt;br /&gt;
&lt;br /&gt;
Dieses Kommando sollte man jede Woche mindestens einmal ausführen, um das System aktuell zu halten. Arch Linux ARM muss nie neu installiert werden, allein durch dieses Kommando wird es immer aktuell gehalten.&lt;br /&gt;
&lt;br /&gt;
== Dateisystem vergrößern ==&lt;br /&gt;
Da das Image darauf ausgelegt ist, dass es auch auf nur 2GB großen SD-Karten geschrieben werden kann, ist auch das Haupt-Dateisystem etwa 2GB groß, selbst wenn man Arch Linux ARM auf eine größere SD-Karte geschrieben hat.&lt;br /&gt;
&lt;br /&gt;
Doch das ist kein großes Problem. Um das Haupt-Dateisystem so zu vergrößern, dass es die gesamte SD-Karte ausfüllt, muss man den Raspberry Pi ausschalten und die SD-Karte in einen Cardreader an einem Linux-PC einsetzen.&lt;br /&gt;
&lt;br /&gt;
In der folgenden Anleitung wird angenommen, dass die SD-Karte unter /dev/sdb und das Haupt-Dateisystem der SD-Karte unter /dev/sdb2 ist. Wenn das nicht zutrifft muss man die Pfade entsprechend ändern.&lt;br /&gt;
&lt;br /&gt;
Zuerst muss man sicherstellen, dass keines der Dateisysteme gemountet ist:&lt;br /&gt;
* umount /dev/sdb1&lt;br /&gt;
* umount /dev/sdb2&lt;br /&gt;
Danach muss man einen Dateisystem-Test durchführen:&lt;br /&gt;
* fsck -n /dev/sdb2&lt;br /&gt;
... und das Journal entfernen:&lt;br /&gt;
* tune2fs -O &amp;quot;^has_journal&amp;quot; /dev/sdb2&lt;br /&gt;
Dann bearbeitet man die Partitionstabelle mit fdisk:&lt;br /&gt;
* fdisk /dev/sdb&lt;br /&gt;
Man kommt in eine Kommandozeile, in der man folgendes nacheinander eingibt:&lt;br /&gt;
* d&lt;br /&gt;
* 2&lt;br /&gt;
* n&lt;br /&gt;
* p&lt;br /&gt;
* 2&lt;br /&gt;
* &amp;lt;ohne Eingabe Enter&amp;gt;&lt;br /&gt;
* &amp;lt;ohne Eingabe Enter&amp;gt;&lt;br /&gt;
* w&lt;br /&gt;
Dadurch wird die zweite Partition gelöscht und neu angelegt, und zwar über den gesamten freien Bereich der SD-Karte.&lt;br /&gt;
Dann muss man wieder einen Dateisystem-Test durchführen:&lt;br /&gt;
* e2fsck -f /dev/sdb2&lt;br /&gt;
... und das Dateisystem vergrößern:&lt;br /&gt;
* resize2fs /dev/sdb2&lt;br /&gt;
Jetzt erfolgt erneut ein Dateisystem-Test:&lt;br /&gt;
* fsck -n /dev/sdb2&lt;br /&gt;
... und die Wiederherstellung des Journals:&lt;br /&gt;
* tune2fs -j /dev/sdb2&lt;br /&gt;
Jetzt kann man die SD-Karte aus dem Cardreader nehmen, in den Raspberry Pi einsetzen und ihn starten.&lt;br /&gt;
&lt;br /&gt;
Wenn alles glatt gelaufen ist bootet der Raspberry Pi ganz normal und man hat plötzlich mehr Speicherplatz zur Verfügung. Aus&lt;br /&gt;
&amp;lt;pre&amp;gt;# df -h /    &lt;br /&gt;
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf&lt;br /&gt;
/dev/root       1,8G    805M  869M   49% /&amp;lt;/pre&amp;gt;&lt;br /&gt;
wird bei einer 16GB SD-Karte zum Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;# df -h /    &lt;br /&gt;
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf&lt;br /&gt;
/dev/root        15G    905M   14G    7% /&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Dieser Abschnitt basiert auf einer [http://www.howtoforge.de/anleitung/wie-man-die-grose-von-ext3-partitionen-anpasst-ohne-daten-zu-verlieren/ Anleitung zum Verändern der Größe von ext3-Partitionen von HowtoForge].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Paketverwaltung ==&lt;br /&gt;
Arch Linux ARM setzt pacman als Paket-Manager ein. Das erste Kommando, das zur System-Aktualisierung, wurde schon in einem anderen Kapitel genannt:&lt;br /&gt;
* pacman -Syu&lt;br /&gt;
Dieses setzt sich aus zwei Teil-Kommandos zusammen:&lt;br /&gt;
* pacman -Sy&lt;br /&gt;
zum Downloaden der Paket-Datenbanken und&lt;br /&gt;
* pacman -Su&lt;br /&gt;
zum Downloaden und Installieren der neuen Pakete.&lt;br /&gt;
&lt;br /&gt;
Um ein neues Paket zu installieren verwendet man folgendes Kommando:&lt;br /&gt;
* pacman -S PAKETNAME&lt;br /&gt;
oder um davor noch die Datenbanken zu aktualisieren:&lt;br /&gt;
* pacman -Sy PAKETNAME&lt;br /&gt;
&lt;br /&gt;
Um ein Paket zu löschen verwendet man:&lt;br /&gt;
* pacman -R PAKETNAME&lt;br /&gt;
oder um alle danach nicht mehr benötigten Abhängigkeiten mit zu löschen:&lt;br /&gt;
* pacman -Rs PAKETNAME&lt;br /&gt;
&lt;br /&gt;
Es gibt noch viele weitere Kommandos, z.B. zum Suchen von Paketen, Anzeigen von Informationen, Auflisten von Dateien. Einen Überblick findet man im [https://wiki.archlinux.de/title/Pacman Arch Linux Wiki] oder eine Auflistung aller Optionen in der Manpage:&lt;br /&gt;
* man pacman&lt;br /&gt;
Nach der Installation sind standardmäßig alle fünf Paketquellen von Arch Linux ARM aktiviert, eine Liste aller enthaltenen Pakete findet man [http://archlinuxarm.org/packages auf der Website].&lt;br /&gt;
&lt;br /&gt;
== Datensicherung ==&lt;br /&gt;
Um neue Betriebssysteme auf dem Raspberry Pi auszuprobieren braucht man nicht zehn verschiedene SD-Karten, die man immer wechselt. Es reicht eine SD-Karte, von der man ein Backup macht, bevor man ein neues Betriebssystem aufspielt. Aber auch wenn man das nicht vorhat macht sich eine Datensicherung immer gut.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es unter Linux verschiedene Möglichkeiten, einmal natürlich das Tool dd, mit dem man den gesamten Inhalt der SD-Karte Byte für Byte auf ein anderes Medium, z.B. die Festplatte, kopieren kann. Hier werden aber auch eigentlich leere Teile der SD-Karte mit gesichert, wodurch bei einer 16GB SD-Karte auch (unkomprimiert) ein 16GB-Backup entsteht, egal wie viel Daten man nun eigentlich auf der Karte gespeichert hat. Abhilfe schafft partclone, das die einzelnen Partitionen sichert, und zwar auch nur die wirklich verwendeten Teile. Die Handhabung ist etwas komplexer als bei dd, eine gute Anleitung und ein ausführlicherer Vergleich der beiden Tools ist auf [http://www.bitblokes.de/2013/03/sd-karte-des-raspberry-pi-sichern-dd-oder-partclone/ bitblokes.de] zu finden.&lt;br /&gt;
&lt;br /&gt;
Unter Windows gibt es das Tool [http://sourceforge.net/projects/win32diskimager/ Win32DiskImager] welches komplette bitweise Images (von SD-Karten und USB-Medien) lesen und schreiben kann.&lt;br /&gt;
&lt;br /&gt;
== SoC-Konfiguration ==&lt;br /&gt;
Generelle Einstellungen für den SoC, die noch vor dem Starten des Betriebssystems geladen werden, kann man in der Datei &#039;&#039;&#039;/boot/config.txt&#039;&#039;&#039; ändern.&lt;br /&gt;
&lt;br /&gt;
Hier ist es z.B. möglich, Parameter für die Video-Ausgabe zu setzen, die Speicher-Aufteilung zwischen CPU und GPU zu ändern oder die CPU zu übertakten. Generell sollte man eher vorsichtig mit diesen Optionen umgehen, da sie bei falscher Verwendung auch mal dazu führen können, dass das Betriebssystem nicht mehr bootet oder das System instabil wird.&lt;br /&gt;
&lt;br /&gt;
Eine genaue Auflistung der möglichen Konfigurations-Optionen findet man auf [http://elinux.org/RPiconfig eLinux.org].&lt;br /&gt;
&lt;br /&gt;
== Die GPIO-Schnittstelle ==&lt;br /&gt;
[[Datei:Raspberry_Pi_GPIO.jpg|thumb|Die GPIO-Schnittstelle (P1-Anschluss)]]&lt;br /&gt;
Für Bastler besonders interessant ist die GPIO-Schnittstelle, diese kann man über verschiedene Wege ansteuern.&lt;br /&gt;
=== Belegung der Schnittstelle ===&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Alle GPIO-Pins haben einen Pegel von 3,3V und sind &#039;&#039;&#039;nicht&#039;&#039;&#039; kompatibel zu 5V! Wenn man versucht, 5V anzuschließen, kann das zur Zerstörung des Raspberry Pi führen! Für Informationen zum Anschließen von 5V-Chips, siehe [[Pegelwandler]] oder [[Raspberry Pi#Erweiterungs-Boards]].&lt;br /&gt;
&amp;lt;gallery heights=&amp;quot;300&amp;quot; widths=&amp;quot;300&amp;quot;&amp;gt;&lt;br /&gt;
Datei:Raspberry_Pi_GPIO.svg|Der P1-Anschluss&lt;br /&gt;
Datei:Raspberry_Pi_GPIO_P2.svg|Der P2-Anschluss (eigentlich das JTAG-Interface der GPU, aber trotzdem mit ein paar nützlichen Pins)&lt;br /&gt;
Datei:Raspberry_Pi_GPIO_P5.svg|Der P5-Anschluss auf der Rückseite der Platine&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im oberen Bild ist die Belegung der Anschlüsse zu sehen, die man als GPIO oder zur Stromversorgung nutzen kann. Die Beschriftungen sind genau so wie auf der Platine angebracht und sollen eine Orientierung ermöglichen.&lt;br /&gt;
Die 3,3V Anschlüsse (P1-1, P1-17, P2-1 und P5-2) dürfen maximal mit 50 mA belastet werden. Bei den 5V Anschlüssen (P1-2, P1-4 und P5-1) gibt es keine feste Grenze, hier kommt es auf den aktuellen Stromverbrauch des restlichen Boards und der Leistung des Netzteils an. Die Pins GPIO2 (P1-3) und GPIO3 (P1-5) sind jeweils mit einem 1,8 kΩ Pull-Up-Widerstand ausgestattet.&lt;br /&gt;
&lt;br /&gt;
Der Anschluss P3 ist noch ein JTAG-Interface, der Anschluss P6 kann mit einem Reset-Knopf ausgestattet werden. Wenn man die beiden Pins verbindet verursacht das einen Soft Reset der CPU.&lt;br /&gt;
&lt;br /&gt;
Hier eine Übersicht der Alternativ-Funktionen der Pins:&lt;br /&gt;
* P1-03 (GPIO2): I2C SDA (siehe [[Raspberry Pi#Der_I2C-Bus]])&lt;br /&gt;
* P1-05 (GPIO3): I2C SCL (siehe [[Raspberry Pi#Der_I2C-Bus]])&lt;br /&gt;
&lt;br /&gt;
* P1-07 (GPIO4): GPCLK0 (General Purpose Clock)&lt;br /&gt;
&lt;br /&gt;
* P1-08 (GPIO14): UART TXD (siehe [[Raspberry Pi#Der_UART]])&lt;br /&gt;
* P1-10 (GPIO15): UART RXD (siehe [[Raspberry Pi#Der_UART]])&lt;br /&gt;
* P1-11 (GPIO17): UART RTS (siehe [[Raspberry Pi#Der_UART]])&lt;br /&gt;
&lt;br /&gt;
* P1-12 (GPIO18): PWM ([[Pulsweitenmodulation]])&lt;br /&gt;
* P1-13 (GPIO27): PCM (Puls-Code-Modulation) oder GPCLK1 (General Purpose Clock)&lt;br /&gt;
&lt;br /&gt;
* P1-19 (GPIO10): SPI MOSI (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
* P1-21 (GPIO9): SPI MISO (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
* P1-23 (GPIO11): SPI SCLK (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
* P1-24 (GPIO8): SPI Chip Select 0 (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
* P1-26 (GPIO7): SPI Chip Select 1 (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung per sysfs ===&lt;br /&gt;
Ganz nach den UNIX-Prinzipien gibt es die Möglichkeit, auf die Schnittstelle über Dateien im sysfs zuzugreifen. Dafür existiert das Verzeichnis &#039;&#039;/sys/class/gpio/&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um einen GPIO-Pin zu verwenden muss man ihn zuerst aktivieren, indem man die Pin-Nummer in &#039;&#039;/sys/class/gpio/export&#039;&#039; schreibt. Wenn man über die Kommandozeile z.B. Pin 4 aktivieren will benutzt man folgendes Kommando:&lt;br /&gt;
* echo 4 &amp;gt; /sys/class/gpio/export&lt;br /&gt;
Dadurch wird automatisch ein Verzeichnis &#039;&#039;/sys/class/gpio/gpio4/&#039;&#039; erstellt. Nun kann man über die darin enthaltene Datei &#039;&#039;direction&#039;&#039; den Pin als Out- bzw. Input festlegen (standardmäßig sind alle Inputs):&lt;br /&gt;
* echo in &amp;gt; /sys/class/gpio/gpio4/direction&lt;br /&gt;
für einen Input und&lt;br /&gt;
* echo out &amp;gt; /sys/class/gpio/gpio4/direction&lt;br /&gt;
für einen Output. Jetzt kann man den Wert des Pins auslesen:&lt;br /&gt;
* cat /sys/class/gpio/gpio4/value&lt;br /&gt;
oder ihn setzen, wenn es ein Output-Pin ist:&lt;br /&gt;
* echo 1 &amp;gt; /sys/class/gpio/gpio4/value&lt;br /&gt;
* echo 0 &amp;gt; /sys/class/gpio/gpio4/value&lt;br /&gt;
Wenn man den Pin nicht mehr benutzen will sollte man ihn wieder deaktivieren:&lt;br /&gt;
* echo 4 &amp;gt; /sys/class/gpio/unexport&lt;br /&gt;
Dadurch verschwindet das Verzeichnis &#039;&#039;/sys/class/gpio/gpio4/&#039;&#039; wieder. All das kann man natürlich nicht nur auf der Shell verwenden, sondern auch in jeder Programmiersprache, indem man einfach in die entsprechenden Dateien schreibt bzw. aus ihnen liest.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: Shell-Blinklicht ===&lt;br /&gt;
Dieses kleine Shellscript aktiviert den GPIO-Pin, den man als Argument übergeben hat, setzt ihn als Output und schaltet ihn alle 500ms um:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
## Check arguments:&lt;br /&gt;
if [[ ! $# -eq 1 ]]; then&lt;br /&gt;
        echo &amp;quot;Usage: $0 GPIO&amp;quot; &amp;gt; /dev/stderr&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
## Activate GPIO:&lt;br /&gt;
echo &amp;quot;Activating GPIO$1&amp;quot;&lt;br /&gt;
echo $1 &amp;gt; /sys/class/gpio/export || exit 1&lt;br /&gt;
## Create trap:&lt;br /&gt;
trap &amp;quot;echo &#039;Deactivating GPIO$1&#039; &amp;amp;&amp;amp; echo in &amp;gt; /sys/class/gpio/gpio$1/direction &amp;amp;&amp;amp; echo $1 &amp;gt; /sys/class/gpio/unexport&amp;quot; EXIT&lt;br /&gt;
## Set as output:&lt;br /&gt;
echo &amp;quot;out&amp;quot; &amp;gt; /sys/class/gpio/gpio$1/direction || exit 1&lt;br /&gt;
## Reset value:&lt;br /&gt;
echo 0 &amp;gt; /sys/class/gpio/gpio$1/value || exit 1&lt;br /&gt;
## Blink loop:&lt;br /&gt;
while true; do&lt;br /&gt;
        echo &amp;quot;Switching GPIO$1 on&amp;quot;&lt;br /&gt;
        echo 1 &amp;gt; /sys/class/gpio/gpio$1/value || exit 1&lt;br /&gt;
        sleep 0.5&lt;br /&gt;
        echo &amp;quot;Switching GPIO$1 off&amp;quot;&lt;br /&gt;
        echo 0 &amp;gt; /sys/class/gpio/gpio$1/value || exit 1&lt;br /&gt;
        sleep 0.5&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn man an dem entsprechenden Pin eine LED anschließt eignet sich das Script gut zum Testen der GPIO-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung per Python-Modul ===&lt;br /&gt;
Mit dem Modul [https://pypi.python.org/pypi/RPi.GPIO RPi.GPIO] kann man unter Python die GPIO-Pins steuern und auslesen. Auf der Projekt-Website gibt es auch ein Beispiel, mit dem man die Handhabung schnell lernt.&lt;br /&gt;
&lt;br /&gt;
Jedes Python-Script, das dieses Modul nutzen will, muss als root laufen.&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung mit Java ===&lt;br /&gt;
Das [http://pi4j.com/ Pi4J-Projekt] ermöglicht unter Java die Verwendung der GPIO-Pins, dem UART, des I2C-Bus und der SPI-Schnittstelle. Eine ausführliche Anleitung gibt es auf der Website.&lt;br /&gt;
&lt;br /&gt;
Jedes Java-Programm, dass dieses Modul nutzen will, muss als root laufen.&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung mit WiringPi ===&lt;br /&gt;
[https://projects.drogon.net/raspberry-pi/wiringpi/ WiringPi] bietet ein Kommandozeilen-Tool (&#039;&#039;&#039;gpio&#039;&#039;&#039;, Details siehe &#039;&#039;&#039;man gpio&#039;&#039;&#039;), das man auch als normaler Nutzer (ohne root-Rechte) verwenden kann und eine C-Bibliothek (Header-Datei &#039;&#039;wiringPi.h&#039;&#039; und Linker-Option &#039;&#039;-lwiringPi&#039;&#039;), mit der man die GPIO-Pins in C-Programmen verwenden kann.&lt;br /&gt;
&lt;br /&gt;
Auf der Website gibt es Beispiele und eine Installationsanleitung. Bei Arch Linux ARM ist es auch in den Paketquellen und kann per Paketverwaltung installiert werden:&lt;br /&gt;
* pacman -S wiringpi&lt;br /&gt;
&lt;br /&gt;
== Der I2C-Bus ==&lt;br /&gt;
Auch auf den I2C-Bus des Raspberry Pi kann man zugreifen. Die Pins dafür liegen an P1-03 (GPIO2, SDA) und P1-05 (GPIO3, SCL).&lt;br /&gt;
=== Ansteuerung per devfs ===&lt;br /&gt;
Den I2C-Bus kann man direkt über die Datei &#039;&#039;&#039;/dev/i2c-0&#039;&#039;&#039; oder &#039;&#039;&#039;/dev/i2c-1&#039;&#039;&#039; erreichen, je nach Version des Boards und gewünschter Schnittstelle.&lt;br /&gt;
=== Ansteuerung per i2c-tools ===&lt;br /&gt;
Komfortabler geht das aber über die i2c-tools. Dazu muss man erst einmal das Paket aus den Arch Linux ARM Paketquellen installieren:&lt;br /&gt;
* pacman -S i2c-tools&lt;br /&gt;
Nun muss man die nötigen Kernel-Module laden:&lt;br /&gt;
* modprobe i2c-bcm2708&lt;br /&gt;
* modprobe i2c-dev&lt;br /&gt;
Soll das beim Systemstart automatisch passieren, legt man eine *.conf-Datei im Verzeichnis &#039;&#039;&#039;/etc/modules-load.d/&#039;&#039;&#039; mit folgendem Inhalt an:&lt;br /&gt;
&amp;lt;pre&amp;gt;i2c-bcm2708&lt;br /&gt;
i2c-dev&amp;lt;/pre&amp;gt;&lt;br /&gt;
Jetzt sollten folgende Kommandozeilen-Tools funktionieren:&lt;br /&gt;
* &#039;&#039;&#039;i2cdetect&#039;&#039;&#039; zum Auflisten der I2C-Busse und zum Anzeigen der Eigenschaften und Geräte&lt;br /&gt;
* &#039;&#039;&#039;i2cdump&#039;&#039;&#039; zum Herausfinden von I2C-Registern&lt;br /&gt;
* &#039;&#039;&#039;i2cget&#039;&#039;&#039; zum Lesen von I2C-Registern&lt;br /&gt;
* &#039;&#039;&#039;i2cset&#039;&#039;&#039; zum Setzen von I2C-Registern&lt;br /&gt;
Die Manpages und Hilfe-Meldungen der einzelnen Tools geben Auskunft über die genaue Verwendung. Wichtig ist, dass man den I2C-Bus 0, &#039;&#039;&#039;nicht&#039;&#039;&#039; den I2C-Bus 1 verwendet. Ein kleines Beispiel gibt es auch in der Ausgabe 5 des MagPi im Artikel „Temperature Sensor“. Dort wird ein Temperatursensor per I2C ausgelesen.&lt;br /&gt;
=== Errata ===&lt;br /&gt;
Der I2C Controller kann aufgrund eines Implementierungsfehlers des Chips nicht zuverlässig mit clock stretching genutzt werden. Insbesondere bei Mikrocontrollern als I2C Slave ist dies jedoch nur schwer zu vermeiden, weshalb die Kopplung eines Mikrocontrollers per I2C problematisch ist. Siehe http://www.advamation.de/technik/raspberrypi/rpi-i2c-bug.html.&lt;br /&gt;
&lt;br /&gt;
== Der UART ==&lt;br /&gt;
Die Pins für den UART liegen auch an P1. TXD an Pin 08 (GPIO14), RXD an Pin 10 (GPIO15) und RTS an Pin 11 (GPIO17).&lt;br /&gt;
&lt;br /&gt;
Zugreifen kann man über das devfs, genauer gesagt über die Datei &#039;&#039;&#039;/dev/ttyAMA0&#039;&#039;&#039;. Um zu testen, ob das funktioniert, kann man minicom benutzen:&lt;br /&gt;
* pacman -S minicom&lt;br /&gt;
* minicom -b 115200 -o -D /dev/ttyAMA0&lt;br /&gt;
&lt;br /&gt;
== Die SPI-Schnittstelle ==&lt;br /&gt;
Die Pins für die SPI-Schnittstelle liegen genau wie I2C und UART an P1. MOSI an Pin 19 (GPIO10), MISO an Pin 21 (GPIO9), SCLK an Pin 23 (GPIO11), CS0 an Pin 24 (GPIO8) und CS1 an Pin 26 (GPIO7).&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über die Dateien &#039;&#039;&#039;/dev/spidev0.0&#039;&#039;&#039; (Gerät an CS0) und &#039;&#039;&#039;/dev/spidev0.1&#039;&#039;&#039; (Gerät an CS1), in die man direkt schreiben und aus denen man auch direkt lesen kann.&lt;br /&gt;
&lt;br /&gt;
== Audio-Ausgabe ==&lt;br /&gt;
[[Datei:Raspberry_Pi_Audio.jpg|thumb|Der 3,5mm Klinke-Anschluss]]&lt;br /&gt;
Der Raspberry Pi verfügt über zwei Möglichkeiten der Audio-Ausgabe, einmal digital per HDMI und wenn kein Display angeschlossen ist wird automatisch auf die analoge Ausgabe per 3,5mm-Klinken-Anschluss umgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Nach der Installation von Arch Linux ARM funktioniert jedoch vorerst keine der beiden Möglichkeiten, da das nötige Kernel-Modul nicht automatisch geladen wird.&lt;br /&gt;
&lt;br /&gt;
Manuell lässt es sich mit &#039;&#039;&#039;modprobe&#039;&#039;&#039; laden, beim nächsten Neustart ist das Problem dann jedoch wieder da:&lt;br /&gt;
* modprobe snd_bcm2835&lt;br /&gt;
Wenn man will, dass das Modul bei jedem Start automatisch geladen wird, muss man eine *.conf Datei im Verzeichnis /etc/modules-load.d/ erstellen und dort den Namen des Moduls hineinschreiben. Es bietet sich z.B. der Name sound.conf an, über die Kommandozeile ist die Datei schnell erstellt:&lt;br /&gt;
* echo &amp;quot;snd_bcm2835&amp;quot; &amp;gt; /etc/modules-load.d/sound.conf&lt;br /&gt;
Jetzt sollte die Audio-Ausgabe problemlos funktionieren. Testen kann man das beispielsweise per &#039;&#039;&#039;aplay&#039;&#039;&#039;, das im Paket &#039;&#039;&#039;alsa-utils&#039;&#039;&#039; enthalten ist:&lt;br /&gt;
* pacman -S alsa-utils&lt;br /&gt;
* aplay name_der_datei.wav&lt;br /&gt;
In diesem Paket ist auch &#039;&#039;&#039;alsamixer&#039;&#039;&#039; enthalten, ein Programm mit dem man über eine ncurses-Oberfläche die Ausgabe-Lautstärke regeln kann.&lt;br /&gt;
&lt;br /&gt;
Man muss beachten, dass nur &#039;&#039;&#039;root&#039;&#039;&#039; und Nutzer in der Gruppe &#039;&#039;&#039;audio&#039;&#039;&#039; auf die Soundkarte zugreifen können. Wenn man nicht als &#039;&#039;&#039;root&#039;&#039;&#039; arbeiten will sollte man seinen Benutzer der Gruppe hinzufügen:&lt;br /&gt;
* gpasswd -a USERNAME audio&lt;br /&gt;
&lt;br /&gt;
=== Standard-Ausgabegerät ===&lt;br /&gt;
Normalerweise wird der Sound automatisch über HDMI ausgegeben, wenn das angeschlossene Gerät das unterstützt, andernfalls über den Klinke-Anschluss. Will man das ändern, z.B. weil man einen Monitor per HDMI angeschlossen hat, den Sound aber trotzdem über die Anlage hören will, geht das ganz schnell über die Kommandozeile:&lt;br /&gt;
* amixer -c 0 cset numid=3 &amp;lt;nummer&amp;gt;&lt;br /&gt;
Dabei muss man &#039;&#039;&amp;lt;nummer&amp;gt;&#039;&#039; durch eine 0 für automatisches Wechseln, eine 1 für den Klinke-Anschluss oder eine 2 für den HDMI-Anschluss ersetzen. Soll das bei jedem Systemstart automatisch ausgeführt werden, erstellt man bei Arch Linux eine Service-Datei für systemd, z.B. so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Set Default Audio Output&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/amixer -c 0 cset numid=3 &amp;lt;nummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier ersetzt man wieder &#039;&#039;&amp;lt;nummer&amp;gt;&#039;&#039; durch das gewünschte Ziel, speichert die Datei unter &#039;&#039;/etc/systemd/system/default-audio.service&#039;&#039; ab und aktiviert den soeben erstellten Service noch:&lt;br /&gt;
* systemctl enable default-audio.service&lt;br /&gt;
Ab dem nächsten Systemstart wird dadurch das Ausgabegerät automatisch eingestellt.&lt;br /&gt;
&lt;br /&gt;
== Erweiterungs-Boards ==&lt;br /&gt;
Für die GPIO-Schnittstelle des Raspberry Pi gibt es verschiedene Erweiterungs-Boards, die zusätzliche Schnittstellen bereitstellen und 3,3V zu 5V Pegelwandler besitzen. Durch diese kann man den Raspberry Pi in bestehende, 5V-basierte Schaltungen und Projekte einbinden.&lt;br /&gt;
&lt;br /&gt;
=== Prototyping-Board für den Raspberry Pi ===&lt;br /&gt;
In der Ausgabe 16 des embedded projects journal wurde auf Seite 13 ein Prototyping-Board für den Raspberry Pi vorgestellt.&lt;br /&gt;
&lt;br /&gt;
Das Board besitzt eine Spannungsversorgung, an die man 7 bis 15V anschließen kann und die auch den Raspberry Pi mitversorgt. Dadurch wird ein per microUSB angeschlossenes Netzteil überflüssig. Außerdem gibt es einen Pegelwandler, der acht GPIO-Pins des Raspberry Pi als 5V-GPIO-Pins zur Verfügung stellt und einen I2C-Pegelwandler, durch den auch hier der Anschluss von 5V-Chips möglich wird.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen gibt es im embedded projects journal und auf der [http://bastelstube.rocci.net/projects/MBS19_RasPi-GPIO/RasPi-GPIO.html Website des Projekts].&lt;br /&gt;
&lt;br /&gt;
=== Berrybush Pi ===&lt;br /&gt;
Ebenfalls in der Ausgabe 16 des embedded projects journal wurde auf Seite 28 der „Berrybush Pi“ vorgestellt, der ein paar mehr Schnittstellen als das Prototyping-Board bietet.&lt;br /&gt;
&lt;br /&gt;
Auch dieses Board bietet eine Spannungsversorgung für den Raspberry Pi und acht 5V-GPIO-Pins, diese sind jedoch mit Darlington-Transistoren und LEDs zur Status-Anzeige ausgestattet. Außerdem gibt es eine 3,3V (sic) SPI-Schnittstelle, die einfach zum Raspberry Pi durchgeschleift wird, einen 5V-I2C-Bus (mit Pegelwandler zum Raspberry Pi), einen RS485-Bus und eine RS232-Schnittstelle, die jedoch in den RS485-Bus gespeist wird.&lt;br /&gt;
&lt;br /&gt;
Als kleines Highlight gibt es noch die Möglichkeit, ein LCD anzuschließen. Dafür sind Portexpander und Potentiometer für Helligkeit und Kontrast vorhanden.&lt;br /&gt;
&lt;br /&gt;
Genauere Informationen, Schaltpläne und Bilder gibt es im embedded projects journal.&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/epj-16-seite-28 Weitere Informationen]&lt;br /&gt;
&lt;br /&gt;
=== Arduino Shield Bridge ===&lt;br /&gt;
Mit diesem Board aus Spanien kann man Arduino-Aufsteckplatinen mit dem Raspberry Pi verwenden.&lt;br /&gt;
[http://www.cooking-hacks.com/index.php/raspberry-pi-to-arduino-shield-connection-bridge.html Cooking-hacks.com]&lt;br /&gt;
&lt;br /&gt;
Dazu existiert eine Library &amp;quot;arduPi&amp;quot;:&lt;br /&gt;
&amp;quot;In order to make complete the compatibility we have created the arduPi library which allows to use Raspberry with the same code used in Arduino. To do so, we have implemented conversion functions so that you can control in the same way as in Arduino all the I/O interfaces: i2C, SPI, UART, analog, digital, in Raspberry Pi.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== I/O Module seriell/USB ===&lt;br /&gt;
&lt;br /&gt;
Alternativ bieten sich Schnittstellen-Erweiterungen über seriellen Port oder USB an, zum Beispiel mit einem handelsüblichen AVR Mikrocontroller-Modul und der Firmware von Stefan Frings&lt;br /&gt;
[http://stefanfrings.de/avr_io/].&lt;br /&gt;
&lt;br /&gt;
=== Gertboard ===&lt;br /&gt;
Webseite: http://www.raspberrypi.org/archives/tag/gertboard&lt;br /&gt;
Eine I/O-Aufsteckplatine mit zusätzlichem Mikrocontroller (bisher PIC, jetzt ATMega)&lt;br /&gt;
&lt;br /&gt;
=== I2C-Repeater-Board für Raspberry PI ===&lt;br /&gt;
Die kleine Platine von &amp;quot;Horter &amp;amp; Kalb&amp;quot; wird direkt auf die GPIO-Schnittstelle des Raspberry PI gesteckt.&lt;br /&gt;
Es macht die Pegelanpassung von 3,3 auf 5V für den SDA- und den SCL-Pin.&lt;br /&gt;
&lt;br /&gt;
Außerdem kann auch das INT-Signal, welches von digitalen Eingabebaugruppen verwendet wird, über den GPIO 17 abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Das Board ist hier ausführlich beschrieben: http://www.horter.de/blog/i2c-repeater-pegelanpassung-fuer-raspberry-pi/&lt;br /&gt;
&lt;br /&gt;
Im Onlineshop unter www.horter.de ist der Bausatz für 9,90€ zu haben.&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
Um den Raspberry Pi hat sich inzwischen eine große Community gebildet, von der immer wieder neue Projekte mit und Erweiterungen für den Raspberry Pi entwickelt werden. Eine Quelle, über die man von den Projekten erfährt ist z.B. der offizielle [http://www.raspberrypi.org/ Raspberry Pi Blog], aber es gibt auch noch viele andere Möglichkeiten, sich zu informieren.&lt;br /&gt;
&lt;br /&gt;
Einige dieser Möglichkeiten und einige ausgewählte Projekte werden in diesem Artikel vorgestellt.&lt;br /&gt;
&lt;br /&gt;
=== The MagPi ===&lt;br /&gt;
[http://www.themagpi.com/ The MagPi] ist ein freies Online-Magazin, das (normalerweise) monatlich erscheint und in dem interessante Projekte genauer vorgestellt werden. Außerdem gibt es Programmier-Tutorials, Anleitungen für Linux-Software und Interviews.&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 1 ====&lt;br /&gt;
Die Ausgabe 1 vom Mai 2012 behandelt folgende Themen:&lt;br /&gt;
* „The Pioneers“ - eine kleine Übersicht, wie es zur Entwicklung des Raspberry Pi kam&lt;br /&gt;
* „Skutter“ - ein Roboterarm für den Raspberry Pi&lt;br /&gt;
* „RacyPy“ - eine Linux Live-CD, basierend auf Puppy Linux und speziell angepasst für einen leichten Einstieg in die Programmierung&lt;br /&gt;
* eine Anleitung zum Installieren von Debian in einer virtuellen Maschine&lt;br /&gt;
* „Scratch“ - eine Programmiersprache und Entwicklungsumgebung zum kinderleichten Einstieg in die Programmierung&lt;br /&gt;
* „the python pit“ - ein Einstieg in die Programmierung mit Python&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 2 ====&lt;br /&gt;
Die Ausgabe 2 vom Juni 2012 behandelt folgende Themen:&lt;br /&gt;
* „PiSetup“ - eine Anleitung zum Einrichten des Raspberry Pi&lt;br /&gt;
* „In Control“ - ein Einstieg in die GPIO-Programmierung mit dem Raspberry Pi und Python&lt;br /&gt;
* „Pi Dissection“ - ein genauerer Blick auf die Einzelteile des Raspberry Pi&lt;br /&gt;
* Fortsetzung von „Skutter“ aus Ausgabe 1&lt;br /&gt;
* „Command Line Clinic“ - eine Einführung in die Benutzung der Linux-Shell&lt;br /&gt;
* „Computer Music“ - eine Anleitung zur Installation von „Schism Tracker“, einem Sequencer-Programm&lt;br /&gt;
* Fortsetzung der Debian-Anleitung aus Ausgabe 1, diesmal mit einer Anleitung zum Einrichten und Verwenden von Python&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 3 ====&lt;br /&gt;
Die Ausgabe 3 vom Juli 2012 behandelt folgende Themen:&lt;br /&gt;
* eine Anleitung zum automatischen Starten der grafischen Oberfläche von Debian&lt;br /&gt;
* Fortsetzung von „In Control“ aus Ausgabe 2&lt;br /&gt;
* Fortsetzung von „Command Line Clinic“ aus Ausgabe 2&lt;br /&gt;
* Fortsetzung von „Skutter“ aus Ausgabe 1 und 2&lt;br /&gt;
* „To Protect and Serve your Raspberry Pi“ - eine einfache Anleitung, um die GPIO-Pins des Raspberry Pi vor Kurzschlüssen zu schützen&lt;br /&gt;
* „Meeting Pi“ - Vorschäge, wie man Kinder an den Raspberry Pi heranführen kann&lt;br /&gt;
* „The C Cave“ - ein C-Tutorial&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1 und 2&lt;br /&gt;
* „Programming Fundamentals“ - ein Artikel, der die Grundlagen (fast) aller Programmiersprachen auf einfachem Weg zeigen will&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 4 ====&lt;br /&gt;
Die Ausgabe 4 vom August 2012 behandelt folgende Themen:&lt;br /&gt;
* Fortsetzung von „In Control“ aus Ausgabe 2 und 3&lt;br /&gt;
* „3-Axis Accelerometer“ - eine Anleitung für einen Beschleunigungs-Sensor am Raspberry Pi&lt;br /&gt;
* „Kernow Pi Launch“ - ein Artikel darüber, wie der Raspberry Pi an Schulen gebracht wurde&lt;br /&gt;
* „MagPi Exclusive Interview“ - ein Interview mit Eben und Liz von der Raspberry Pi Foundation&lt;br /&gt;
* „How to customise your LXDE menu“ - eine Anleitung zum Anpassen von LXDE&lt;br /&gt;
* Fortsetzung von „Command Line Clinic“ aus Ausgabe 2 und 3&lt;br /&gt;
* Fortsetzung von „The C Cave“ aus Ausgabe 3&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1 und 3&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2 und 3&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 5 ====&lt;br /&gt;
Die Ausgabe 5 vom September 2012 behandelt folgende Themen:&lt;br /&gt;
* „Steady Hands“ - eine Anleitung zum Bau eines „Heißer Draht“-Spiels mit dem Raspberry Pi&lt;br /&gt;
* „Temperature Sensor“ - eine Anleitung zum Anschluss eines I2C-Temperatursensors an den Raspberry Pi&lt;br /&gt;
* „XBMC Media Center“ - eine Einführung in Rasbbmc, einer HTPC-Distribution für den Raspberry Pi&lt;br /&gt;
* „Squeezy or Wheezy?“ - ein Vergleich von Debian 6 „Squeeze“ und Debian 7 „Wheezy“&lt;br /&gt;
* Fortsetzung von „Command Line Clinic“ aus Ausgabe 2, 3 und 4&lt;br /&gt;
* Fortsetzung von „The C Cave“ aus Ausgabe 3 und 4&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3 und 4&lt;br /&gt;
* „RasPiThon 2012“ - ein Bericht über den Rasbperry Pi Programmier-Marathon&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3 und 4&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 6 ====&lt;br /&gt;
Die Ausgabe 6 vom Oktober 2012 behandelt folgende Themen:&lt;br /&gt;
* „Skutter Returns“ - Fortsetzung von „Skutter“ aus Ausgabe 1, 2 und 3&lt;br /&gt;
* „Portable Power for your Pi“ - eine Anleitung für eine mobile Stromversorgung&lt;br /&gt;
* „Star Letter: An FET Buffer Stage for GPIO Access“ - eine Möglichkeit, wie man die GPIO-Pins des Raspberry Pi belastbarer machen kann&lt;br /&gt;
* „Pumpkin Pi“ - ein Kürbis mit Bewegungs-Sensor und RGB-LEDs&lt;br /&gt;
* „Camera Pi“ - ein Interview mit David Hunt, einem Bastler, der seine Kamera mit einem Raspberry Pi ausgestattet hat&lt;br /&gt;
* „Our Raspberry Pi Summer“ - ein Beispiel für ein kleines Spiel, das mit Scratch programmiert wurde&lt;br /&gt;
* „Baby steps in a Big World“ - ein Ada-Tutorial&lt;br /&gt;
* Fortsetzung von „The C Cave“ aus Ausgabe 3, 4 und 5&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4 und 5&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4 und 5&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 7 ====&lt;br /&gt;
Die Ausgabe 7 vom November 2012 behandelt folgende Themen:&lt;br /&gt;
* „Raspberry Pi &amp;amp; Arduino“ - ein Artikel über die Kommunikation zwischen Arduino und Raspberry Pi mithilfe von Python&lt;br /&gt;
* „A little Ray of Sunshine“ - eine Solar-Stromversorgung für den Raspberry Pi und andere USB-Geräte&lt;br /&gt;
* „The Raspberry Ladder Board“ - ein Board zum Einstieg in die GPIO-Programmierung mit dem Raspberry Pi&lt;br /&gt;
* „Interrupts and Other Activities with GPIO Pins” - eine Anleitung für Interrupts und GPIO-Pins im Allgemeinen auf dem Raspberry Pi&lt;br /&gt;
* „Raspbian“ - ein Interview mit Mike Thompson, dem Erfinder von Raspbian&lt;br /&gt;
* „Turbopi“ - eine Anleitung zum Übertakten des Raspberry Pi&lt;br /&gt;
* „Pi-Evolution“ - eine Übersicht über die Entwicklung des Raspberry Pi&lt;br /&gt;
* „Make“ - eine Einführung in GNU Make und Makefiles&lt;br /&gt;
* „Welcome to the C++ Cache!“ - eine Einführung in C++&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4, 5 und 6&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4, 5 und 6&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 8 ====&lt;br /&gt;
Die Ausgabe 8 vom Dezember 2012 behandelt folgende Themen:&lt;br /&gt;
* „Skutter Returns“ - Fortsetzung von „Skutter“ aus Ausgabe 1, 2 und 3 bzw. „Skutter Returns“ aus Ausgabe 6&lt;br /&gt;
* „The Santa Trap“ - Heimautomation mit dem Raspberry Pi&lt;br /&gt;
* „Control your Arduino board with Raspberry Pi and Python“ - ein Python-Modul zum Steuern eines Arduino&lt;br /&gt;
* „PiGauge“ - eine Anleitung, wie man Servo-Motoren übers Internet mithilfe des Raspberry Pi steuern kann&lt;br /&gt;
* „Quick2Wire“ - Erweiterungs-Board für den Raspberry Pi&lt;br /&gt;
* „Kickstarter“ - eine Vorstellung der Kickstarter-Kampagne, um The MagPi auf Papier zu bannen&lt;br /&gt;
* „Programming the Raspberry Pi: Getting Started with Python“ - eine kurze Vorstellung des gleichnamigen Buches von Simon Monk&lt;br /&gt;
* „pibow interview“ - ein Interview mit den Erfindern des PiBow, einem Gehäuse für den Raspberry Pi&lt;br /&gt;
* „CESIL Pi“ - ein CESIL Programmier-Tutorial für den Raspberry Pi&lt;br /&gt;
* Fortsetzung von „Welcome to the C++ Cache!“ aus Ausgabe 7&lt;br /&gt;
* Fortsetzung von „Baby steps in a Big World“ aus Ausgabe 6&lt;br /&gt;
* „MySQL Database Bootcamp“ - eine Einführung in MySQL&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4, 5, 6 und 7&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 9 ====&lt;br /&gt;
Die Ausgabe 9 vom Februar 2013 (Januar wurde ausgelassen) behandelt folgende Themen:&lt;br /&gt;
* „adafruit Interview“ - Interview mit der Gründerin von adafruit, einem Shop für DIY Elektronik&lt;br /&gt;
* „WebIOPi“ - eine REST-Schnittstelle, um die GPIO-Pins des Raspberry Pi per Javascript zu steuern&lt;br /&gt;
* „Backup your Raspberry Pi“ - eine Anleitung für die Datensicherung der SD-Karte&lt;br /&gt;
* „Pi Interface Board Review Quick2Wire“ - ein genauerer Blick auf das Erweiterungs-Board „Quick2Wire“, das in Ausgabe 8 schon kurz gezeigt wurde&lt;br /&gt;
* „RISC OS Pi“ - eine Anleitung zur Installation von RISC OS auf dem Raspberry Pi&lt;br /&gt;
* „Installing &amp;amp; Configuring ArchLinux“ - eine Anleitung zur Installation von Arch Linux auf dem Raspberry Pi, die auch die Installation von XFCE umfasst&lt;br /&gt;
* „Introducing Vala“ - ein kleines Vala Programmier-Tutorial für den Raspberry Pi und das LedBorg Erweiterungs-Board&lt;br /&gt;
* Fortsetzung von „The C Cave“ aus Ausgabe 3, 4, 5 und 6&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4, 5, 6 und 7&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4, 5, 6, 7 und 8&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 10 ====&lt;br /&gt;
Die Ausgabe 10 vom März 2013 behandelt folgende Themen:&lt;br /&gt;
* Fortsetzung von „WebIOPi“ aus Ausgabe 9&lt;br /&gt;
* „Try a Cocktail of Projects“ - ein Artikel, der verschiedene Erweiterungs-Möglichkeiten für den Raspberry Pi zeigt&lt;br /&gt;
* „Backing up - part 2“ - Fortsetzung von „Backup your Raspberry Pi“ aus Ausgabe 9&lt;br /&gt;
* „Bash Gaffer Tape“ - ein Bash-Tutorial&lt;br /&gt;
* „Charm on the Raspberry Pi“ - ein Charm Programmier-Tutorial für den Raspberry Pi&lt;br /&gt;
* „C++ Cache”: Fortsetzung von „Welcome to the C++ Cache!“ aus Ausgabe 7 und 8&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4, 5, 6, 7 und 9&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4, 5, 6, 7, 8 und 9&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 11 ====&lt;br /&gt;
Die Ausgabe 11 vom April 2013 behandelt folgende Themen:&lt;br /&gt;
* Heizungssteuerung mithilfe des Raspberry Pi über ein Smartphone&lt;br /&gt;
* eine Vorstellung vom „Power and I/O Expansion Board“&lt;br /&gt;
* eine Anleitung zum Einrichten eines WLAN-Access-Points auf dem Raspberry Pi (per USB-WLAN-Dongle)&lt;br /&gt;
* Vorstellung von der Minecraft Pi-Edition&lt;br /&gt;
* „Printing with Cups“: Configuring Cups&lt;br /&gt;
* „Setting up a simple intranet“ mit einer Anleitung zum Einrichten vom Apache HTTPD&lt;br /&gt;
* eine Einführung in die Assembler-Programmierung auf dem Raspberry Pi&lt;br /&gt;
* Fortsetzung von „Charm on the Raspberry Pi“ aus Ausgabe 10&lt;br /&gt;
* kurze Anleitung zum Verwenden von Farben auf der Kommandozeile&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4, 5, 6, 7, 9 und 10&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi multi-effects ===&lt;br /&gt;
Ein Musiker hat mit einem Raspberry Pi, einem Arduino Uno und einer USB-Soundkarte ein Gitarren-Effektboard gebaut und das Ganze in seinem Blog [https://guitarextended.wordpress.com/2013/01/31/raspberry-pi-multi-effects-overview-of-the-setup/ beschrieben]. Das alles sieht im [https://www.youtube.com/watch?v=NwJNeouLqgQ Video] noch etwas sperrig aus, es sollte aber kein Problem sein, die Soundkarte und den Raspberry Pi auch noch mit ins Effektboard zu integrieren.&lt;br /&gt;
&lt;br /&gt;
Als Software verwendet er Raspbian, also das Standard-Betriebssystem des Raspberry Pi, und [http://puredata.info/ Pure Data], eine Echtzeit-Umgebung für Audio-, Video- und Grafik-Verarbeitung. Diese ist jedoch auch in den Arch Linux ARM Paketquellen verfügbar, einem Versuch, das ganze auch mit Arch Linux auszuprobieren, steht also theoretisch nichts im Wege.&lt;br /&gt;
&lt;br /&gt;
Die Installation und Konfiguration von Pure Data hat er ebenfalls in seinem Blog [https://guitarextended.wordpress.com/2013/01/28/rpi-as-guitar-effects-processor-installing-and-configuring-pd/ beschrieben].&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi guitar tuner ===&lt;br /&gt;
Ein anderer Nutzer hat ein Gitarren-Stimmgerät gebaut. Dazu hat er einen Raspberry Pi, eine USB-Webcam zur Ton-Aufnahme, eine 7-Segment-Anzeige zur Anzeige des Tons und 15 LEDs zur Anzeige der Abweichung vom Ton verwendet.&lt;br /&gt;
&lt;br /&gt;
Ausgewertet und angesteuert wird das Ganze über ein selbstgeschriebenes Java-Programm, ein Video und ein paar zusätzliche Informationen gibt es auf [https://www.youtube.com/watch?v=oB4F5VhzQf8 YouTube].&lt;br /&gt;
&lt;br /&gt;
=== Circadian Lighting ===&lt;br /&gt;
Auch für Menschen, die sich mit dem Morgen manchmal schwer tun, gibt es ein Projekt mit dem Raspberry Pi, das im Blog [http://www.raspberrypi.org/archives/3267 vorgestellt wurde]. In Verbindung mit ein paar RGB-LEDs kann man den Raspbrry Pi zu einem Wecker machen, der einen nicht mit lautem, nervigen Piepsen aus dem Schlaf reißt, sondern langsam in Verbindung mit einem künstlichen Sonnenaufgang weckt. Fehlt nur noch ein Relais, über das die Kaffeemaschine angeschaltet wird, und der Morgen ist perfekt.&lt;br /&gt;
&lt;br /&gt;
Bei diesem Projekt gibt es sogar den [https://github.com/rasathus/circadianLighting Quellcode], eine [http://rasathus.blogspot.co.uk/2013/01/circadian-lighting-part-one.html Hardware-Liste] und ein [https://www.youtube.com/watch?v=Q9_tqoOkmCU Video], das einige der Funktionen zeigt. Und mit ein paar Python-Kenntnissen kann man alles seinen Bedürfnissen anpassen und erweitern.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Leaf ===&lt;br /&gt;
Die einfachsten Ideen sind doch manchmal die Besten. „Dr. Monk” hat in seinem Blog eine Pinbelegung des Raspberry Pi [http://www.doctormonk.com/2013/02/raspberry-pi-and-breadboard-raspberry.html veröffentlicht], die (in der richtigen Größe ausgedruckt) genau auf den P1-GPIO-Anschluss des Raspberry Pi passt. So vergisst man nie die Pinbelegung, wenn man gerade mal wieder mit dem Raspberry Pi bastelt und auch ein falsches Anschließen, das zur Zerstörung des Mini-Computers oder der angeschlossenen Teile führen kann, passiert nicht mehr so leicht.&lt;br /&gt;
&lt;br /&gt;
=== raspberry-tools ===&lt;br /&gt;
Eine Tool-Sammlung für den Raspberry Pi, veröffentlicht unter der GNU General Public License Version 2 und gehostet auf [https://github.com/rookies/raspberry-tools github]. Momentan enthält diese Sammlung nur ein Programm, es folgen aber noch weitere nützliche Tools.&lt;br /&gt;
&lt;br /&gt;
==== scope ====&lt;br /&gt;
Scope ist Teil von raspberry-tools. Es zeichnet digitale Signale von einem oder mehreren GPIO-Pins auf und bereitet die Daten für eine Auswertung mit [http://xoscope.sourceforge.net/ xoscope] auf.&lt;br /&gt;
&lt;br /&gt;
Wenn man sich den Quellcode geholt hat, muss man erst einmal das Hauptprogramm für den Raspberry Pi kompilieren. Das geht entweder direkt auf dem Raspberry Pi oder per Cross-Compiler.&lt;br /&gt;
* g++ -o RasPi_logGPIO RasPi_logGPIO.cpp&lt;br /&gt;
Nachdem sowohl die entstandene Datei &#039;&#039;RasPi_logGPIO&#039;&#039; als auch das Script &#039;&#039;RasPi_logGPIO.sh&#039;&#039; im gleichen Ordner auf dem Raspberry Pi sind, kann man die Aufzeichnung starten:&lt;br /&gt;
* ./RasPi_logGPIO.sh [Liste mit GPIO-Pins] &amp;gt; ausgabedatei.txt&lt;br /&gt;
Für die Pins 14, 31 und 23 sieht das Kommando z.B. so aus:&lt;br /&gt;
* ./RasPi_logGPIO.sh 14 31 23 &amp;gt; ausgabedatei.txt&lt;br /&gt;
Die Aufzeichnung kann mit Strg+C gestoppt werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man die entstandene Datei (z.B. hier ausgabedatei.txt) normalisieren und ins xoscope-Format umwandeln, das funktioniert auch problemlos auf einem anderen Computer:&lt;br /&gt;
* ./RasPi_normalizeGPIO.py ausgabedatei.txt &amp;gt; ausgabedatei.dat&lt;br /&gt;
Nun entsteht die Datei &#039;&#039;ausgabedatei.dat&#039;&#039;, die man mit xoscope ansehen kann:&lt;br /&gt;
&amp;lt;gallery heights=&amp;quot;300&amp;quot; widths=&amp;quot;300&amp;quot;&amp;gt;&lt;br /&gt;
Datei:RasPiTools_scope_sample1.png|eine Beispiel-Aufnahme&lt;br /&gt;
Datei:RasPiTools_scope_sample2.png|die gleiche Aufnahme, vergrößert&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Dazu muss man nur die Datei laden und die entsprechenden Memory-Einträge anzeigen lassen. In diesem Beispiel ist Pin 14 in Mem A, Pin 31 in Mem B und Pin 23 in Mem C, also genau in der Reihenfolge, in der man die Pin-Nummern dem Programm übergeben hat.&lt;br /&gt;
&lt;br /&gt;
== Anhang ==&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
[[Datei:Raspberry_Pi_Power.jpg|thumb|Der microUSB-Anschluss zur Stromversorgung]]&lt;br /&gt;
Um den Raspberry Pi mit Strom zu versorgen gibt es verschiedene Möglichkeiten. Entscheidend ist nur, dass möglichst konstante 5V bei bis zu 700 mA auf einem microUSB-Stecker geliefert werden.&lt;br /&gt;
==== mit USB-Netzteil ====&lt;br /&gt;
Wenn man ein genügend starkes USB-Netzteil mit einem microUSB-Kabel verbindet hat man eine passende Stromversorgung für den Raspberry Pi.&lt;br /&gt;
Gut funktioniert zum Beispiel das iPhone-Ladegerät, aber auch andere, günstigere Netzteile sollten keine Probleme machen.&lt;br /&gt;
==== Netzteil selbst bauen ====&lt;br /&gt;
Wenn man kein USB-Netzteil zur Hand hat kann man auch selbst ein Steckernetzteil, das 5V Gleichspannung liefert, mit einem microUSB-Kabel zusammenlöten.&lt;br /&gt;
&lt;br /&gt;
Dafür braucht man erst einmal ein microUSB-Kabel und ein passendes Steckernetzteil. (siehe Abb. 1)&lt;br /&gt;
Man entfernt den USB-A-Stecker und befreit das Kabelende ein Stück von seinem Mantel, es kommen vier Adern zum Vorschein. (siehe Abb. 2)&lt;br /&gt;
Uns interessiert die grüne und die weiße Ader nicht, da wir keine Daten übertragen wollen.&lt;br /&gt;
Jetzt muss auch noch der Stecker vom Netzteil entfernt und die Adern abisoliert werden. (siehe Abb. 3)&lt;br /&gt;
Bei manchen Netzteilen ist eine Markierung für Plus- oder Minus-Pol angebracht. Wenn das nicht der Fall ist, muss man mit einem Multimeter nachmessen. (siehe Abb. 4)&lt;br /&gt;
Nun isoliert man auch noch die schwarze und rote Ader des USB-Kabels ab und verlötet die schwarze Ader mit dem Minus-Pol des Netzteils und die rote Ader mit dem Plus-Pol des Netzteils. Danach packt man um die Adern jeweils einen Schrumpfschlauch zur Isolation. Wenn man um die ganze Verbindung noch einen großen Schrumpfschlauch packt wird die Verbindung nochmal um einiges stabiler. &lt;br /&gt;
(siehe Abb. 5)&lt;br /&gt;
Es ist auch möglich den Raspberry Pi über jedes alte PC Netzteil zu betreiben, bei einem alten 300 Watt Netzteil hat man einen Verlust im Leerlauf von ca. 8 Watt.&lt;br /&gt;
Dafür kann man aber einige andere Komponenten (LEDs, usw.) mitbetreiben.&lt;br /&gt;
Hier ein Link zu einem deutschen Youtube Video:&lt;br /&gt;
http://www.youtube.com/watch?v=hqevlVn1Osk&lt;br /&gt;
&lt;br /&gt;
Wer kein Micro-USB Kabel opfern möchte, kann zwar den GPIO-Pinheader verwenden, dabei umgeht man aber die interne Eingangssicherung sowie die TVS-Diode (Überspannungsschutz). Siehe Schema, Seite 1: http://www.raspberrypi.org/wp-content/uploads/2012/04/Raspberry-Pi-Schematics-R1.0.pdf&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau1.jpg|Abb. 1: Die Ausgangsmaterialien&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau2.jpg|Abb. 2: Das USB-Kabel ohne Mantel mit der roten (+5V), schwarzen (GND), grünen (Data+) und weißen (Data-) Ader&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau3.jpg|Abb. 3: Das Netzteil mit abisolierten Kabelenden&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau4.jpg|Abb. 4: Das Multimeter zeigt eine positive Zahl an, daher ist das Kabel mit der roten Klemme der Plus-Pol, das Kabel mit der schwarzen Klemme der Minus-Pol.&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau5.jpg|Abb. 5: Das fertige Netzteil, die Verbindung ist mit einem Schrumpfschlauch geschützt.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB-Geräte ===&lt;br /&gt;
[[Datei:Raspberry_Pi_USB.jpg|thumb|Die beiden USB Host-Anschlüsse]]&lt;br /&gt;
Generell kann man am Raspberry Pi alle USB-Geräte verwenden, die vom Linux-Kernel unterstützt werden und somit auch an anderen Linux-PCs funktionieren.&lt;br /&gt;
&lt;br /&gt;
Es ist allerdings zu beachten, dass die USB-Ports nur vergleichsweise wenig Strom liefern können (nicht die vollen 500 mA, die laut USB2.0 Standard maximal möglich sind), für größere Verbraucher wie z.B. 2,5-Zoll-Festplatten ohne externe Stromversorgung muss man daher einen externen USB-Hub mit Stromversorgung verwenden.&lt;br /&gt;
==== Maus &amp;amp; Tastatur ====&lt;br /&gt;
Da es für Mäuse und Tastaturen Standard-Profile gibt, die auch von allen (bis auf extrem wenige Ausnahmefälle) Geräten eingehalten werden, sollte es hier keine Probleme geben. Die Eingabegeräte sollten sofort verwendbar sein und auch Hot-Plugging stellt im Normalfall kein Problem dar.&lt;br /&gt;
==== USB-Sticks &amp;amp; USB-Festplatten ====&lt;br /&gt;
Wenn man seinem Raspberry Pi zusätzlichen Speicherplatz verpassen will bietet es sich an, USB-Sticks bzw. -Festplatten anzuschließen. Da es auch hier Standard-Profile gibt sollten diese sofort vom Linux-Kernel erkannt werden. Einhängen ([https://de.wikipedia.org/wiki/Mounten mounten]) muss man sie jedoch unter Arch Linux ARM generell selbst, wenn man nicht einen [https://de.wikipedia.org/wiki/Fstab fstab-Eintrag] erstellt hat oder eine Desktop-Oberfläche installiert hat, die das automatisch erledigt.&lt;br /&gt;
==== WLAN-Sticks ====&lt;br /&gt;
Wird der WLAN-Stick vom Kernel erkannt (erkennbar daran, dass ein entsprechendes Interface von &#039;&#039;&#039;ifconfig -a&#039;&#039;&#039; aufgelistet wird), kann man ein Netzwerk-Profil mit [https://wiki.archlinux.org/index.php/Netcfg netcfg] (Quasi-Standard unter ArchLinux, bei dem die Profile über Konfigurationsdateien erstellt werden), dem [https://wiki.archlinux.org/index.php/NetworkManager NetworkManager] oder [https://wiki.archlinux.org/index.php/Wicd Wicd] erstellen. Sollte die Karte nicht erkannt werden, hilft eventuell ein Blick auf die [https://wiki.archlinux.org/index.php/Wireless_Setup Wireless Setup] Seite im ArchLinux Wiki.&lt;br /&gt;
==== TV-Karten ====&lt;br /&gt;
Will man den Raspberry Pi als HTPC verwenden, kann es sinnvoll sein, eine TV-Karte per USB anzuschließen.&lt;br /&gt;
Hier gibt es generell 4 Möglichkeiten:&lt;br /&gt;
* &#039;&#039;&#039;DVB-T&#039;&#039;&#039;, also digitales Fernsehen, das per Funk ausgestrahlt wird - kostenlos, jedoch nicht überall verfügbar&lt;br /&gt;
* &#039;&#039;&#039;DVB-S&#039;&#039;&#039;, also digitales Fernsehen, das per Satellit ausgestrahlt wird - kostenlos und generell überall verfügbar, jedoch wird eine Satelliten-Schüssel benötigt&lt;br /&gt;
* &#039;&#039;&#039;DVB-C&#039;&#039;&#039;, also digitales Fernsehen, das über das Kabelnetz ausgestrahlt wird - Kosten für den Kabelanschluss fallen an, Sender-Angebot vom Kabelanbieter abhängig&lt;br /&gt;
* &#039;&#039;&#039;Analog-TV&#039;&#039;&#039;, also analoges Fernsehen, das über das Kabelnetz ausgestrahlt wird - Kosten für den Kabelanschluss fallen an, kein HD, Sender-Angebot vom Kabelanbieter abhängig&lt;br /&gt;
&lt;br /&gt;
Nicht alle Geräte werden von Linux unterstützt, eine Übersicht, die nach Übertragungstechnik (DVB-T/-S/-C oder Analog) und Anschluss-Art (beim Raspberry Pi immer USB) geordnet ist, findet man im [http://linuxtv.org/wiki/index.php/Hardware_Device_Information LinuxTVWiki], zu dem man natürlich auch selbst beitragen kann, wenn man ein Gerät getestet hat.&lt;br /&gt;
==== Soundkarten ====&lt;br /&gt;
Da der Klinke-Ausgang des Raspberry Pi nicht mit einem D/A-Wandler, sondern nur per PWM funktioniert, ist die Sound-Qualität nicht gerade überragend. Wenn man das verbessern will, oder wenn man Sound per Line-Eingang oder per Mikrofon aufnehmen will, bietet es sich an, eine USB-Soundkarte anzuschließen.&lt;br /&gt;
&lt;br /&gt;
Ist man unsicher, ob die Soundkarte unterstützt wird, hilft ein Blick ins [http://www.alsa-project.org/main/index.php/Matrix:Main Wiki vom ALSA-Projekt].&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [http://downloads.raspberrypi.org/images/archlinuxarm/archlinux-hf-2013-02-11/archlinux-hf-2013-02-11.zip.torrent Torrent-Download von Arch Linux ARM 2013-02-11]&lt;br /&gt;
* [http://downloads.raspberrypi.org/images/archlinuxarm/archlinux-hf-2013-02-11/archlinux-hf-2013-02-11.zip HTTP-Download von Arch Linux ARM 2013-02-11] (SHA-1: 1d2508908e7d8c899f4a5284e855cb27c17645dc)&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.raspberrypi.org/ offizielle Website des Raspberry Pi] (englisch)&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Raspberry_Pi Wikipedia: Raspberry Pi] (deutsch)&lt;br /&gt;
* [http://www.themagpi.com/ The MagPi] (englisch)&lt;br /&gt;
* [http://archlinuxarm.org/ Arch Linux ARM] (englisch)&lt;br /&gt;
* [https://www.archlinux.org/ Arch Linux] (englisch)&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Arch_Linux Wikipedia: Arch Linux] (deutsch)&lt;br /&gt;
* [http://www.kammerath.net/asterisk-virtuelle-telefonanlage.html Asterisk auf dem Raspberry Pi] (deutsch)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_Einf%C3%BChrung&amp;diff=86951</id>
		<title>Raspberry Pi Einführung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_Einf%C3%BChrung&amp;diff=86951"/>
		<updated>2015-01-31T08:00:41Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Der I2C-Bus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Robert Knauer&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig&#039;&#039;&#039;: &#039;&#039;Alle Informationen und Anleitungen in diesem Artikel beziehen sich auf das Model B mit erweitertem Arbeitsspeicher.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Raspberry_Pi.jpg|thumb|Der Raspberry Pi]]&lt;br /&gt;
Der &#039;&#039;&#039;Raspberry Pi&#039;&#039;&#039; ist ein Einplatinen-Computer im Kreditkarten-Format mit einem SoC (System-on-a-Chip) von Broadcom. Dieser verfügt über folgende Eigenschaften:&lt;br /&gt;
* eine 700MHz ARMv6-CPU&lt;br /&gt;
* eine Broadcom VideoCore IV GPU&lt;br /&gt;
* 512 MB Arbeitsspeicher&lt;br /&gt;
Außerdem kann der Raspberry Pi über folgende Schnittstellen mit der Außenwelt kommunizieren:&lt;br /&gt;
* 2 USB 2.0 Host-Anschlüsse&lt;br /&gt;
* einen Composite Video-Ausgang&lt;br /&gt;
* einen HDMI-Ausgang (Video+Audio)&lt;br /&gt;
* einen 3,5mm Klinke-Audio-Ausgang&lt;br /&gt;
* einen SD-/MMC-Karten-Slot (Unterstützung für SDIO und SDHC)&lt;br /&gt;
* einen Ethernet-Port (10/100 MBit)&lt;br /&gt;
* 21 GPIO-Pins, teilweise gedacht als [[UART]], [[SPI]] und [[I2C]]&lt;br /&gt;
Die Energieversorgung wird über einen microUSB-Anschluss gewährleistet. Man sollte jedoch darauf achten, dass der USB-Anschluss, über den man den Raspberry Pi mit Energie versorgt mindestens 700 mA liefern kann, da in der USB 2.0 Spezifikation nur 500 mA vorgesehen sind. In diesem Artikel wird noch darauf eingegangen, wie man sich selbst ein entsprechendes Netzteil bauen kann, alternativ funktioniert auch ein entsprechend starkes USB-Ladegerät in Verbindung mit einem USB-A auf microUSB-B Kabel. (siehe [[Raspberry Pi#Stromversorgung]])&lt;br /&gt;
&lt;br /&gt;
Um diese umfangreichen Möglichkeiten zu nutzen muss man mit einem anderen Computer ein Betriebssystem auf die SD-Karte laden, das dann vom Raspberry Pi gebootet wird. Am naheliegendsten ist hier natürlich Linux (Raspbian, Fedora, Debian und Arch Linux sind offiziell unterstützt), aber auch Plan 9 wurde schon auf dem kleinen Computer [http://www.heise.de/open/meldung/Plan-9-laeuft-auf-dem-Raspberry-1761392.html zum Laufen gebracht].&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll Schritt für Schritt der Weg vom Anschließen des Computers über das Einrichten von Arch Linux ARM bis zum Verwenden der verschiedenen Schnittstellen des Raspberry Pi beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen &amp;amp; Zubehör ==&lt;br /&gt;
Der Raspberry Pi kann über verschiedene Quellen bezogen werden. Wichtig ist darauf zu achten, dass man das Model B mit 512 MB Arbeitsspeicher bestellt, da alle Anleitungen in diesem Artikel nur damit getestet sind und unter anderen Modellen eventuell nicht funktionieren. Ein in Deutschland ziemlich bekannter Elektronik-Versand, bei dem man den Raspberry Pi bestellen kann, ist Pollin, dort ist er zur Zeit für 38,95 € erhältlich. (Bestell-Nr.: 701 697, Stand: 17.06.2013)&lt;br /&gt;
&lt;br /&gt;
Doch neben dem eigentlichen Computer braucht man natürlich noch etwas Zubehör, wenn man es nicht eh schon zu Hause rumliegen hat:&lt;br /&gt;
* ein Netzteil, das 5V bei mindestens 700 mA auf einem microUSB-Stecker liefert (siehe [[Raspberry Pi#Stromversorgung]])&lt;br /&gt;
* eine SD(HC)-Speicherkarte&lt;br /&gt;
* einen SD(HC)-Cardreader an einem anderen Computer&lt;br /&gt;
* ein RJ45-Netzwerkkabel&lt;br /&gt;
* ein Ethernet-Netzwerk mit Zugang zum Internet&lt;br /&gt;
Mit diesem Zubehör kann man nur über SSH zugreifen, wenn man direkt am Raspberry Pi arbeiten will und später evtl. auch eine grafische Oberfläche einrichten will braucht man noch folgendes:&lt;br /&gt;
* ein HDMI-Kabel und einen Fernseher bzw. Monitor mit HDMI-Eingang &#039;&#039;&#039;oder&#039;&#039;&#039;&lt;br /&gt;
* ein Composite-Kabel und einen Fernseher mit entsprechendem Video-Eingang&lt;br /&gt;
* eine USB-Tastatur&lt;br /&gt;
* eine USB-Maus (für eine grafische Oberfläche)&lt;br /&gt;
* evtl. einen aktiven USB-Hub, wenn die Ports des Raspberry Pi nicht genug Leistung für Maus und Tastatur liefern können&lt;br /&gt;
&lt;br /&gt;
== Das Betriebssystem ==&lt;br /&gt;
Als Betriebssystem für die Anleitungen in diesem Artikel wird [http://archlinuxarm.org/ Arch Linux ARM] verwendet, das Meiste funktioniert jedoch auch unter anderen Linux-Distributionen und alles andere zumindest mit kleinen Anpassungen.&lt;br /&gt;
Es basiert auf den Prinzipien und teilweise auch der Software von [https://www.archlinux.org/ Arch Linux], hat aber vollständig unabhängige Paketquellen, in denen nur für ARM kompilierte Software verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Arch Linux ist ein gutes Betriebssystem für einen Computer wie den Raspberry Pi, da es am Anfang sehr leichtgewichtig ist und vorerst keine grafische Oberfläche installiert hat (was gut ist wenn man den Raspberry Pi als Server verwenden will). Andererseits kann aber auch problemlos eine grafische Oberfläche nachinstalliert werden, wenn man den Raspberry Pi als Desktop-Computer, HTPC oder ähnliches verwenden will.&lt;br /&gt;
&lt;br /&gt;
Man muss jedoch auch sagen, dass Arch Linux kein Betriebssystem für jemanden ist, der Linux noch nie verwendet hat. Man sollte schon etwas Erfahrung mit dem Arbeiten auf der Konsole haben, da grundlegende Dinge über Linux hier nicht erklärt werden.&lt;br /&gt;
Außerdem ist es teilweise notwendig, sich selbst weiterführende Informationen zu Arch Linux anzusehen, die in diesem Artikel verlinkt werden.&lt;br /&gt;
&lt;br /&gt;
== Anschluss &amp;amp; Installation ==&lt;br /&gt;
Nun muss man zuerst alles anschließen. Die Netzwerk-Buchse wird über das Netzwerk-Kabel mit dem Ethernet-Netzwerk verbunden. Hier ist wichtig, dass in dem Netzwerk ein DHCP-Server läuft (also IP-Adressen automatisch bezogen werden können) und Zugriff zum Internet möglich ist. Wenn man sich für die Variante mit eigenem Bildschirm entschieden hat muss man außerdem die HDMI-Buchse mit dem Fernseher oder Monitor bzw. den Composite-Ausgang mit dem Fernseher verbinden und Tastatur und Maus über USB anschließen.&lt;br /&gt;
Dann folgt die Installation von Arch Linux ARM auf die SD-Karte.&lt;br /&gt;
&lt;br /&gt;
Arch Linux ARM für Raspberry Pi kann man über folgende Links downloaden:&lt;br /&gt;
* [http://downloads.raspberrypi.org/images/archlinuxarm/archlinux-hf-2013-06-06/archlinux-hf-2013-06-06.zip.torrent Torrent-Download von Arch Linux ARM 2013-02-11]&lt;br /&gt;
* [http://downloads.raspberrypi.org/download.php?file=/images/archlinuxarm/archlinux-hf-2013-06-06/archlinux-hf-2013-06-06.zip HTTP-Download von Arch Linux ARM 2013-06-06]&lt;br /&gt;
Wenn der etwa 185 MB große Download abgeschlossen ist und man über HTTP gedownloadet hat sollte man zuerst die Checksum überprüfen.&lt;br /&gt;
Eine Anleitung dazu findet befindet sich auf der Downloadseite.&lt;br /&gt;
* SHA-1: 706037373bbb33ab6fb0af147a6e795bd04f1503&lt;br /&gt;
Nachdem man das getan oder falls man über Torrent gedownloadet hat (dann passiert das automatisch) kann man das zip-Archiv entpacken.&lt;br /&gt;
&lt;br /&gt;
Man erhält eine etwa 2,0 GB große Datei namens archlinux-hf-2013-06-06.img. Diese muss man nun auf die SD-Karte bringen. Unter Linux funktioniert das mit dem kleinen Programm dd, das in den GNU coreutils enthalten ist und damit auf fast jedem System vorinstalliert sein sollte. Dazu gibt man folgendes in die Konsole ein (als root, /dev/sdX durch den Pfad zur Gerätedatei der SD-Karte ersetzen, Pfad der img-Datei anpassen):&lt;br /&gt;
* dd if=/pfad/zur/archlinux-hf-2013-02-11.img bs=1M of=/dev/sdX&lt;br /&gt;
Unter Windows kann man dafür [https://launchpad.net/win32-image-writer Image Writer for Windows] benutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach entfernt man die Karte aus dem Cardreader des Computers und setzt sie in den Raspberry Pi ein. Dann verbindet man die Stromversorgung, indem man den microUSB-Stecker des Netzteils in die entsprechende Buchse auf der Platine steckt.&lt;br /&gt;
&lt;br /&gt;
== Der erste Start ==&lt;br /&gt;
Wenn man ein Display angeschlossen hat, erscheint nach ein paar Sekunden ein Login-Prompt auf dem Bildschirm. Als Username gibt man &#039;&#039;root&#039;&#039; ein, wenn man dann nach dem Passwort gefragt wird gibt man wieder &#039;&#039;root&#039;&#039; ein.&lt;br /&gt;
&lt;br /&gt;
Wenn man kein Display angeschlossen hat, muss man die IP-Adresse, die der Raspberry Pi sich vom DHCP-Server geholt hat, herausfinden. Wenn der DSL-Router diesen Dienst bereitstellt, kann man meistens auf der Web-Oberfläche eine Liste der verteilten IP-Adressen sehen. Alternativ kann man auch mit &#039;&#039;nmap&#039;&#039; einen Netzwerk-Scan machen, der die IP-Adressen von allen Computern im Netzwerk anzeigt. Das funktioniert unter Linux, indem man &#039;&#039;&#039;nmap -sn SUBNETZ&#039;&#039;&#039; im Terminal eingibt. Davor ersetzt man SUBNETZ durch das Subnetz, in dem auch der Raspberry Pi ist, in [https://de.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR-Notation]. Wenn man z.B. in einem Netz ist, in dem IP-Adressen von &#039;&#039;192.168.1.0&#039;&#039; bis &#039;&#039;192.168.1.255&#039;&#039; verteilt werden, muss man &lt;br /&gt;
&#039;&#039;192.168.1.0/24&#039;&#039; verwenden.&lt;br /&gt;
&lt;br /&gt;
Nachdem man die IP-Adresse herausgefunden hat, verbindet man sich per SSH zu ihr und loggt sich als root, Passwort root ein. Unter Linux funktioniert das mit&lt;br /&gt;
* ssh root@IP-ADRESSE&lt;br /&gt;
Unter Windows verwendet man am besten [http://www.putty.org/ PuTTY].&lt;br /&gt;
&lt;br /&gt;
Egal für welche Möglichkeit man sich entschieden hat, sitzt man jetzt vor einer root-Shell des Raspberry Pi, erkennbar am Shell-Prompt &#039;&#039;&#039;[root@alarmpi ~]#&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Nun geht es an die Konfiguration von Arch Linux ARM, diese erfolgt vollständig über das Editieren von Dateien auf der Konsole.&lt;br /&gt;
&lt;br /&gt;
=== Lokalisierung ===&lt;br /&gt;
Man editiert die Datei /etc/locale.gen:&lt;br /&gt;
* nano /etc/locale.gen&lt;br /&gt;
und entfernt die Raute vor der Zeile mit der entsprechenden Sprache-Land-Kodierungs-Kombination, also z.B. vor &#039;&#039;&#039;de_DE.UTF-8 UTF-8&#039;&#039;&#039; für Deutschland.&lt;br /&gt;
Danach speichert man mit Strg+O -&amp;gt; Enter und Strg+X und erstellt die Lokalisierung neu:&lt;br /&gt;
* locale-gen&lt;br /&gt;
Danach editiert man die Datei /etc/locale.conf:&lt;br /&gt;
* nano /etc/locale.conf&lt;br /&gt;
Man ändert &#039;&#039;&#039;LANG=en_US.UTF-8&#039;&#039;&#039; zur entsprechenden Sprache, also z.B. &#039;&#039;&#039;LANG=de_DE.utf8&#039;&#039;&#039; und speichert mit Strg+O -&amp;gt; Enter und Strg+X.&lt;br /&gt;
&lt;br /&gt;
=== Tastatur-Layout ===&lt;br /&gt;
Um das Tastatur-Layout auf der Konsole anzupassen, muss man die Datei /etc/vconsole.conf ändern:&lt;br /&gt;
* nano /etc/vconsole.conf&lt;br /&gt;
Man ändert &#039;&#039;&#039;KEYMAP=us&#039;&#039;&#039; zu z.B. &#039;&#039;&#039;KEYMAP=de-latin1&#039;&#039;&#039; für QWERTZ  und speichert wieder mit Strg+O -&amp;gt; Enter und Strg+X.&lt;br /&gt;
&lt;br /&gt;
=== Zeitzone ===&lt;br /&gt;
Um die Zeitzone zu ändern muss man einen Symlink zu /etc/localtime erstellen:&lt;br /&gt;
* ln -sf /usr/share/zoneinfo/ZEITZONE /etc/localtime&lt;br /&gt;
Also für Deutschland (Europe/Berlin):&lt;br /&gt;
* ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime&lt;br /&gt;
&lt;br /&gt;
Um alle Änderungen zu übernehmen startet man den Raspberry Pi am besten neu:&lt;br /&gt;
* reboot&lt;br /&gt;
Wenn man per SSH verbunden war, wird die Verbindung geschlossen und man muss sich neu verbinden.&lt;br /&gt;
&lt;br /&gt;
== Aktualisierung ==&lt;br /&gt;
Da das Image, das man auf die SD-Karte geschrieben hat, schon etwas veraltet sein kann, sollte man das System über die Paketverwaltung aktualisieren:&lt;br /&gt;
* pacman -Syu&lt;br /&gt;
Dieses Kommando downloadet die Datenbanken und alle neuen Pakete und installiert diese anschließend.&lt;br /&gt;
&lt;br /&gt;
Dieses Kommando sollte man jede Woche mindestens einmal ausführen, um das System aktuell zu halten. Arch Linux ARM muss nie neu installiert werden, allein durch dieses Kommando wird es immer aktuell gehalten.&lt;br /&gt;
&lt;br /&gt;
== Dateisystem vergrößern ==&lt;br /&gt;
Da das Image darauf ausgelegt ist, dass es auch auf nur 2GB großen SD-Karten geschrieben werden kann, ist auch das Haupt-Dateisystem etwa 2GB groß, selbst wenn man Arch Linux ARM auf eine größere SD-Karte geschrieben hat.&lt;br /&gt;
&lt;br /&gt;
Doch das ist kein großes Problem. Um das Haupt-Dateisystem so zu vergrößern, dass es die gesamte SD-Karte ausfüllt, muss man den Raspberry Pi ausschalten und die SD-Karte in einen Cardreader an einem Linux-PC einsetzen.&lt;br /&gt;
&lt;br /&gt;
In der folgenden Anleitung wird angenommen, dass die SD-Karte unter /dev/sdb und das Haupt-Dateisystem der SD-Karte unter /dev/sdb2 ist. Wenn das nicht zutrifft muss man die Pfade entsprechend ändern.&lt;br /&gt;
&lt;br /&gt;
Zuerst muss man sicherstellen, dass keines der Dateisysteme gemountet ist:&lt;br /&gt;
* umount /dev/sdb1&lt;br /&gt;
* umount /dev/sdb2&lt;br /&gt;
Danach muss man einen Dateisystem-Test durchführen:&lt;br /&gt;
* fsck -n /dev/sdb2&lt;br /&gt;
... und das Journal entfernen:&lt;br /&gt;
* tune2fs -O &amp;quot;^has_journal&amp;quot; /dev/sdb2&lt;br /&gt;
Dann bearbeitet man die Partitionstabelle mit fdisk:&lt;br /&gt;
* fdisk /dev/sdb&lt;br /&gt;
Man kommt in eine Kommandozeile, in der man folgendes nacheinander eingibt:&lt;br /&gt;
* d&lt;br /&gt;
* 2&lt;br /&gt;
* n&lt;br /&gt;
* p&lt;br /&gt;
* 2&lt;br /&gt;
* &amp;lt;ohne Eingabe Enter&amp;gt;&lt;br /&gt;
* &amp;lt;ohne Eingabe Enter&amp;gt;&lt;br /&gt;
* w&lt;br /&gt;
Dadurch wird die zweite Partition gelöscht und neu angelegt, und zwar über den gesamten freien Bereich der SD-Karte.&lt;br /&gt;
Dann muss man wieder einen Dateisystem-Test durchführen:&lt;br /&gt;
* e2fsck -f /dev/sdb2&lt;br /&gt;
... und das Dateisystem vergrößern:&lt;br /&gt;
* resize2fs /dev/sdb2&lt;br /&gt;
Jetzt erfolgt erneut ein Dateisystem-Test:&lt;br /&gt;
* fsck -n /dev/sdb2&lt;br /&gt;
... und die Wiederherstellung des Journals:&lt;br /&gt;
* tune2fs -j /dev/sdb2&lt;br /&gt;
Jetzt kann man die SD-Karte aus dem Cardreader nehmen, in den Raspberry Pi einsetzen und ihn starten.&lt;br /&gt;
&lt;br /&gt;
Wenn alles glatt gelaufen ist bootet der Raspberry Pi ganz normal und man hat plötzlich mehr Speicherplatz zur Verfügung. Aus&lt;br /&gt;
&amp;lt;pre&amp;gt;# df -h /    &lt;br /&gt;
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf&lt;br /&gt;
/dev/root       1,8G    805M  869M   49% /&amp;lt;/pre&amp;gt;&lt;br /&gt;
wird bei einer 16GB SD-Karte zum Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;# df -h /    &lt;br /&gt;
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf&lt;br /&gt;
/dev/root        15G    905M   14G    7% /&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Dieser Abschnitt basiert auf einer [http://www.howtoforge.de/anleitung/wie-man-die-grose-von-ext3-partitionen-anpasst-ohne-daten-zu-verlieren/ Anleitung zum Verändern der Größe von ext3-Partitionen von HowtoForge].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Paketverwaltung ==&lt;br /&gt;
Arch Linux ARM setzt pacman als Paket-Manager ein. Das erste Kommando, das zur System-Aktualisierung, wurde schon in einem anderen Kapitel genannt:&lt;br /&gt;
* pacman -Syu&lt;br /&gt;
Dieses setzt sich aus zwei Teil-Kommandos zusammen:&lt;br /&gt;
* pacman -Sy&lt;br /&gt;
zum Downloaden der Paket-Datenbanken und&lt;br /&gt;
* pacman -Su&lt;br /&gt;
zum Downloaden und Installieren der neuen Pakete.&lt;br /&gt;
&lt;br /&gt;
Um ein neues Paket zu installieren verwendet man folgendes Kommando:&lt;br /&gt;
* pacman -S PAKETNAME&lt;br /&gt;
oder um davor noch die Datenbanken zu aktualisieren:&lt;br /&gt;
* pacman -Sy PAKETNAME&lt;br /&gt;
&lt;br /&gt;
Um ein Paket zu löschen verwendet man:&lt;br /&gt;
* pacman -R PAKETNAME&lt;br /&gt;
oder um alle danach nicht mehr benötigten Abhängigkeiten mit zu löschen:&lt;br /&gt;
* pacman -Rs PAKETNAME&lt;br /&gt;
&lt;br /&gt;
Es gibt noch viele weitere Kommandos, z.B. zum Suchen von Paketen, Anzeigen von Informationen, Auflisten von Dateien. Einen Überblick findet man im [https://wiki.archlinux.de/title/Pacman Arch Linux Wiki] oder eine Auflistung aller Optionen in der Manpage:&lt;br /&gt;
* man pacman&lt;br /&gt;
Nach der Installation sind standardmäßig alle fünf Paketquellen von Arch Linux ARM aktiviert, eine Liste aller enthaltenen Pakete findet man [http://archlinuxarm.org/packages auf der Website].&lt;br /&gt;
&lt;br /&gt;
== Datensicherung ==&lt;br /&gt;
Um neue Betriebssysteme auf dem Raspberry Pi auszuprobieren braucht man nicht zehn verschiedene SD-Karten, die man immer wechselt. Es reicht eine SD-Karte, von der man ein Backup macht, bevor man ein neues Betriebssystem aufspielt. Aber auch wenn man das nicht vorhat macht sich eine Datensicherung immer gut.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es unter Linux verschiedene Möglichkeiten, einmal natürlich das Tool dd, mit dem man den gesamten Inhalt der SD-Karte Byte für Byte auf ein anderes Medium, z.B. die Festplatte, kopieren kann. Hier werden aber auch eigentlich leere Teile der SD-Karte mit gesichert, wodurch bei einer 16GB SD-Karte auch (unkomprimiert) ein 16GB-Backup entsteht, egal wie viel Daten man nun eigentlich auf der Karte gespeichert hat. Abhilfe schafft partclone, das die einzelnen Partitionen sichert, und zwar auch nur die wirklich verwendeten Teile. Die Handhabung ist etwas komplexer als bei dd, eine gute Anleitung und ein ausführlicherer Vergleich der beiden Tools ist auf [http://www.bitblokes.de/2013/03/sd-karte-des-raspberry-pi-sichern-dd-oder-partclone/ bitblokes.de] zu finden.&lt;br /&gt;
&lt;br /&gt;
Unter Windows gibt es das Tool [http://sourceforge.net/projects/win32diskimager/ Win32DiskImager] welches komplette bitweise Images (von SD-Karten und USB-Medien) lesen und schreiben kann.&lt;br /&gt;
&lt;br /&gt;
== SoC-Konfiguration ==&lt;br /&gt;
Generelle Einstellungen für den SoC, die noch vor dem Starten des Betriebssystems geladen werden, kann man in der Datei &#039;&#039;&#039;/boot/config.txt&#039;&#039;&#039; ändern.&lt;br /&gt;
&lt;br /&gt;
Hier ist es z.B. möglich, Parameter für die Video-Ausgabe zu setzen, die Speicher-Aufteilung zwischen CPU und GPU zu ändern oder die CPU zu übertakten. Generell sollte man eher vorsichtig mit diesen Optionen umgehen, da sie bei falscher Verwendung auch mal dazu führen können, dass das Betriebssystem nicht mehr bootet oder das System instabil wird.&lt;br /&gt;
&lt;br /&gt;
Eine genaue Auflistung der möglichen Konfigurations-Optionen findet man auf [http://elinux.org/RPiconfig eLinux.org].&lt;br /&gt;
&lt;br /&gt;
== Die GPIO-Schnittstelle ==&lt;br /&gt;
[[Datei:Raspberry_Pi_GPIO.jpg|thumb|Die GPIO-Schnittstelle (P1-Anschluss)]]&lt;br /&gt;
Für Bastler besonders interessant ist die GPIO-Schnittstelle, diese kann man über verschiedene Wege ansteuern.&lt;br /&gt;
=== Belegung der Schnittstelle ===&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Alle GPIO-Pins haben einen Pegel von 3,3V und sind &#039;&#039;&#039;nicht&#039;&#039;&#039; kompatibel zu 5V! Wenn man versucht, 5V anzuschließen, kann das zur Zerstörung des Raspberry Pi führen! Für Informationen zum Anschließen von 5V-Chips, siehe [[Pegelwandler]] oder [[Raspberry Pi#Erweiterungs-Boards]].&lt;br /&gt;
&amp;lt;gallery heights=&amp;quot;300&amp;quot; widths=&amp;quot;300&amp;quot;&amp;gt;&lt;br /&gt;
Datei:Raspberry_Pi_GPIO.svg|Der P1-Anschluss&lt;br /&gt;
Datei:Raspberry_Pi_GPIO_P2.svg|Der P2-Anschluss (eigentlich das JTAG-Interface der GPU, aber trotzdem mit ein paar nützlichen Pins)&lt;br /&gt;
Datei:Raspberry_Pi_GPIO_P5.svg|Der P5-Anschluss auf der Rückseite der Platine&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im oberen Bild ist die Belegung der Anschlüsse zu sehen, die man als GPIO oder zur Stromversorgung nutzen kann. Die Beschriftungen sind genau so wie auf der Platine angebracht und sollen eine Orientierung ermöglichen.&lt;br /&gt;
Die 3,3V Anschlüsse (P1-1, P1-17, P2-1 und P5-2) dürfen maximal mit 50 mA belastet werden. Bei den 5V Anschlüssen (P1-2, P1-4 und P5-1) gibt es keine feste Grenze, hier kommt es auf den aktuellen Stromverbrauch des restlichen Boards und der Leistung des Netzteils an. Die Pins GPIO2 (P1-3) und GPIO3 (P1-5) sind jeweils mit einem 1,8 kΩ Pull-Up-Widerstand ausgestattet.&lt;br /&gt;
&lt;br /&gt;
Der Anschluss P3 ist noch ein JTAG-Interface, der Anschluss P6 kann mit einem Reset-Knopf ausgestattet werden. Wenn man die beiden Pins verbindet verursacht das einen Soft Reset der CPU.&lt;br /&gt;
&lt;br /&gt;
Hier eine Übersicht der Alternativ-Funktionen der Pins:&lt;br /&gt;
* P1-03 (GPIO2): I2C SDA (siehe [[Raspberry Pi#Der_I2C-Bus]])&lt;br /&gt;
* P1-05 (GPIO3): I2C SCL (siehe [[Raspberry Pi#Der_I2C-Bus]])&lt;br /&gt;
&lt;br /&gt;
* P1-07 (GPIO4): GPCLK0 (General Purpose Clock)&lt;br /&gt;
&lt;br /&gt;
* P1-08 (GPIO14): UART TXD (siehe [[Raspberry Pi#Der_UART]])&lt;br /&gt;
* P1-10 (GPIO15): UART RXD (siehe [[Raspberry Pi#Der_UART]])&lt;br /&gt;
* P1-11 (GPIO17): UART RTS (siehe [[Raspberry Pi#Der_UART]])&lt;br /&gt;
&lt;br /&gt;
* P1-12 (GPIO18): PWM ([[Pulsweitenmodulation]])&lt;br /&gt;
* P1-13 (GPIO27): PCM (Puls-Code-Modulation) oder GPCLK1 (General Purpose Clock)&lt;br /&gt;
&lt;br /&gt;
* P1-19 (GPIO10): SPI MOSI (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
* P1-21 (GPIO9): SPI MISO (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
* P1-23 (GPIO11): SPI SCLK (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
* P1-24 (GPIO8): SPI Chip Select 0 (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
* P1-26 (GPIO7): SPI Chip Select 1 (siehe [[Raspberry Pi#Die_SPI-Schnittstelle]])&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung per sysfs ===&lt;br /&gt;
Ganz nach den UNIX-Prinzipien gibt es die Möglichkeit, auf die Schnittstelle über Dateien im sysfs zuzugreifen. Dafür existiert das Verzeichnis &#039;&#039;/sys/class/gpio/&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um einen GPIO-Pin zu verwenden muss man ihn zuerst aktivieren, indem man die Pin-Nummer in &#039;&#039;/sys/class/gpio/export&#039;&#039; schreibt. Wenn man über die Kommandozeile z.B. Pin 4 aktivieren will benutzt man folgendes Kommando:&lt;br /&gt;
* echo 4 &amp;gt; /sys/class/gpio/export&lt;br /&gt;
Dadurch wird automatisch ein Verzeichnis &#039;&#039;/sys/class/gpio/gpio4/&#039;&#039; erstellt. Nun kann man über die darin enthaltene Datei &#039;&#039;direction&#039;&#039; den Pin als Out- bzw. Input festlegen (standardmäßig sind alle Inputs):&lt;br /&gt;
* echo in &amp;gt; /sys/class/gpio/gpio4/direction&lt;br /&gt;
für einen Input und&lt;br /&gt;
* echo out &amp;gt; /sys/class/gpio/gpio4/direction&lt;br /&gt;
für einen Output. Jetzt kann man den Wert des Pins auslesen:&lt;br /&gt;
* cat /sys/class/gpio/gpio4/value&lt;br /&gt;
oder ihn setzen, wenn es ein Output-Pin ist:&lt;br /&gt;
* echo 1 &amp;gt; /sys/class/gpio/gpio4/value&lt;br /&gt;
* echo 0 &amp;gt; /sys/class/gpio/gpio4/value&lt;br /&gt;
Wenn man den Pin nicht mehr benutzen will sollte man ihn wieder deaktivieren:&lt;br /&gt;
* echo 4 &amp;gt; /sys/class/gpio/unexport&lt;br /&gt;
Dadurch verschwindet das Verzeichnis &#039;&#039;/sys/class/gpio/gpio4/&#039;&#039; wieder. All das kann man natürlich nicht nur auf der Shell verwenden, sondern auch in jeder Programmiersprache, indem man einfach in die entsprechenden Dateien schreibt bzw. aus ihnen liest.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: Shell-Blinklicht ===&lt;br /&gt;
Dieses kleine Shellscript aktiviert den GPIO-Pin, den man als Argument übergeben hat, setzt ihn als Output und schaltet ihn alle 500ms um:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
## Check arguments:&lt;br /&gt;
if [[ ! $# -eq 1 ]]; then&lt;br /&gt;
        echo &amp;quot;Usage: $0 GPIO&amp;quot; &amp;gt; /dev/stderr&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
## Activate GPIO:&lt;br /&gt;
echo &amp;quot;Activating GPIO$1&amp;quot;&lt;br /&gt;
echo $1 &amp;gt; /sys/class/gpio/export || exit 1&lt;br /&gt;
## Create trap:&lt;br /&gt;
trap &amp;quot;echo &#039;Deactivating GPIO$1&#039; &amp;amp;&amp;amp; echo in &amp;gt; /sys/class/gpio/gpio$1/direction &amp;amp;&amp;amp; echo $1 &amp;gt; /sys/class/gpio/unexport&amp;quot; EXIT&lt;br /&gt;
## Set as output:&lt;br /&gt;
echo &amp;quot;out&amp;quot; &amp;gt; /sys/class/gpio/gpio$1/direction || exit 1&lt;br /&gt;
## Reset value:&lt;br /&gt;
echo 0 &amp;gt; /sys/class/gpio/gpio$1/value || exit 1&lt;br /&gt;
## Blink loop:&lt;br /&gt;
while true; do&lt;br /&gt;
        echo &amp;quot;Switching GPIO$1 on&amp;quot;&lt;br /&gt;
        echo 1 &amp;gt; /sys/class/gpio/gpio$1/value || exit 1&lt;br /&gt;
        sleep 0.5&lt;br /&gt;
        echo &amp;quot;Switching GPIO$1 off&amp;quot;&lt;br /&gt;
        echo 0 &amp;gt; /sys/class/gpio/gpio$1/value || exit 1&lt;br /&gt;
        sleep 0.5&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn man an dem entsprechenden Pin eine LED anschließt eignet sich das Script gut zum Testen der GPIO-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung per Python-Modul ===&lt;br /&gt;
Mit dem Modul [https://pypi.python.org/pypi/RPi.GPIO RPi.GPIO] kann man unter Python die GPIO-Pins steuern und auslesen. Auf der Projekt-Website gibt es auch ein Beispiel, mit dem man die Handhabung schnell lernt.&lt;br /&gt;
&lt;br /&gt;
Jedes Python-Script, das dieses Modul nutzen will, muss als root laufen.&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung mit Java ===&lt;br /&gt;
Das [http://pi4j.com/ Pi4J-Projekt] ermöglicht unter Java die Verwendung der GPIO-Pins, dem UART, des I2C-Bus und der SPI-Schnittstelle. Eine ausführliche Anleitung gibt es auf der Website.&lt;br /&gt;
&lt;br /&gt;
Jedes Java-Programm, dass dieses Modul nutzen will, muss als root laufen.&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung mit WiringPi ===&lt;br /&gt;
[https://projects.drogon.net/raspberry-pi/wiringpi/ WiringPi] bietet ein Kommandozeilen-Tool (&#039;&#039;&#039;gpio&#039;&#039;&#039;, Details siehe &#039;&#039;&#039;man gpio&#039;&#039;&#039;), das man auch als normaler Nutzer (ohne root-Rechte) verwenden kann und eine C-Bibliothek (Header-Datei &#039;&#039;wiringPi.h&#039;&#039; und Linker-Option &#039;&#039;-lwiringPi&#039;&#039;), mit der man die GPIO-Pins in C-Programmen verwenden kann.&lt;br /&gt;
&lt;br /&gt;
Auf der Website gibt es Beispiele und eine Installationsanleitung. Bei Arch Linux ARM ist es auch in den Paketquellen und kann per Paketverwaltung installiert werden:&lt;br /&gt;
* pacman -S wiringpi&lt;br /&gt;
&lt;br /&gt;
== Der I2C-Bus ==&lt;br /&gt;
Auch auf den I2C-Bus des Raspberry Pi kann man zugreifen. Die Pins dafür liegen an P1-03 (GPIO2, SDA) und P1-05 (GPIO3, SCL).&lt;br /&gt;
=== Ansteuerung per devfs ===&lt;br /&gt;
Den I2C-Bus kann man direkt über die Datei &#039;&#039;&#039;/dev/i2c-0&#039;&#039;&#039; oder &#039;&#039;&#039;/dev/i2c-1&#039;&#039;&#039; erreichen, je nach Version des Boards und gewünschter Schnittstelle.&lt;br /&gt;
=== Ansteuerung per i2c-tools ===&lt;br /&gt;
Komfortabler geht das aber über die i2c-tools. Dazu muss man erst einmal das Paket aus den Arch Linux ARM Paketquellen installieren:&lt;br /&gt;
* pacman -S i2c-tools&lt;br /&gt;
Nun muss man die nötigen Kernel-Module laden:&lt;br /&gt;
* modprobe i2c-bcm2708&lt;br /&gt;
* modprobe i2c-dev&lt;br /&gt;
Soll das beim Systemstart automatisch passieren, legt man eine *.conf-Datei im Verzeichnis &#039;&#039;&#039;/etc/modules-load.d/&#039;&#039;&#039; mit folgendem Inhalt an:&lt;br /&gt;
&amp;lt;pre&amp;gt;i2c-bcm2708&lt;br /&gt;
i2c-dev&amp;lt;/pre&amp;gt;&lt;br /&gt;
Jetzt sollten folgende Kommandozeilen-Tools funktionieren:&lt;br /&gt;
* &#039;&#039;&#039;i2cdetect&#039;&#039;&#039; zum Auflisten der I2C-Busse und zum Anzeigen der Eigenschaften und Geräte&lt;br /&gt;
* &#039;&#039;&#039;i2cdump&#039;&#039;&#039; zum Herausfinden von I2C-Registern&lt;br /&gt;
* &#039;&#039;&#039;i2cget&#039;&#039;&#039; zum Lesen von I2C-Registern&lt;br /&gt;
* &#039;&#039;&#039;i2cset&#039;&#039;&#039; zum Setzen von I2C-Registern&lt;br /&gt;
Die Manpages und Hilfe-Meldungen der einzelnen Tools geben Auskunft über die genaue Verwendung. Wichtig ist, dass man den I2C-Bus 0, &#039;&#039;&#039;nicht&#039;&#039;&#039; den I2C-Bus 1 verwendet. Ein kleines Beispiel gibt es auch in der Ausgabe 5 des MagPi im Artikel „Temperature Sensor“. Dort wird ein Temperatursensor per I2C ausgelesen.&lt;br /&gt;
=== Errata ===&lt;br /&gt;
Der I2C Controller kann aufgrund eines Implementierungsfehlers des Chips nicht zuverlässig mit clock stretching genutzt werden. Insbesondere bei Mikrocontrollern als I2C Slave ist dies jedoch nur schwer zu vermeiden, weshalb die Kopplung eines Mikrocontrollers per I2C problematisch ist.&lt;br /&gt;
&lt;br /&gt;
== Der UART ==&lt;br /&gt;
Die Pins für den UART liegen auch an P1. TXD an Pin 08 (GPIO14), RXD an Pin 10 (GPIO15) und RTS an Pin 11 (GPIO17).&lt;br /&gt;
&lt;br /&gt;
Zugreifen kann man über das devfs, genauer gesagt über die Datei &#039;&#039;&#039;/dev/ttyAMA0&#039;&#039;&#039;. Um zu testen, ob das funktioniert, kann man minicom benutzen:&lt;br /&gt;
* pacman -S minicom&lt;br /&gt;
* minicom -b 115200 -o -D /dev/ttyAMA0&lt;br /&gt;
&lt;br /&gt;
== Die SPI-Schnittstelle ==&lt;br /&gt;
Die Pins für die SPI-Schnittstelle liegen genau wie I2C und UART an P1. MOSI an Pin 19 (GPIO10), MISO an Pin 21 (GPIO9), SCLK an Pin 23 (GPIO11), CS0 an Pin 24 (GPIO8) und CS1 an Pin 26 (GPIO7).&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über die Dateien &#039;&#039;&#039;/dev/spidev0.0&#039;&#039;&#039; (Gerät an CS0) und &#039;&#039;&#039;/dev/spidev0.1&#039;&#039;&#039; (Gerät an CS1), in die man direkt schreiben und aus denen man auch direkt lesen kann.&lt;br /&gt;
&lt;br /&gt;
== Audio-Ausgabe ==&lt;br /&gt;
[[Datei:Raspberry_Pi_Audio.jpg|thumb|Der 3,5mm Klinke-Anschluss]]&lt;br /&gt;
Der Raspberry Pi verfügt über zwei Möglichkeiten der Audio-Ausgabe, einmal digital per HDMI und wenn kein Display angeschlossen ist wird automatisch auf die analoge Ausgabe per 3,5mm-Klinken-Anschluss umgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Nach der Installation von Arch Linux ARM funktioniert jedoch vorerst keine der beiden Möglichkeiten, da das nötige Kernel-Modul nicht automatisch geladen wird.&lt;br /&gt;
&lt;br /&gt;
Manuell lässt es sich mit &#039;&#039;&#039;modprobe&#039;&#039;&#039; laden, beim nächsten Neustart ist das Problem dann jedoch wieder da:&lt;br /&gt;
* modprobe snd_bcm2835&lt;br /&gt;
Wenn man will, dass das Modul bei jedem Start automatisch geladen wird, muss man eine *.conf Datei im Verzeichnis /etc/modules-load.d/ erstellen und dort den Namen des Moduls hineinschreiben. Es bietet sich z.B. der Name sound.conf an, über die Kommandozeile ist die Datei schnell erstellt:&lt;br /&gt;
* echo &amp;quot;snd_bcm2835&amp;quot; &amp;gt; /etc/modules-load.d/sound.conf&lt;br /&gt;
Jetzt sollte die Audio-Ausgabe problemlos funktionieren. Testen kann man das beispielsweise per &#039;&#039;&#039;aplay&#039;&#039;&#039;, das im Paket &#039;&#039;&#039;alsa-utils&#039;&#039;&#039; enthalten ist:&lt;br /&gt;
* pacman -S alsa-utils&lt;br /&gt;
* aplay name_der_datei.wav&lt;br /&gt;
In diesem Paket ist auch &#039;&#039;&#039;alsamixer&#039;&#039;&#039; enthalten, ein Programm mit dem man über eine ncurses-Oberfläche die Ausgabe-Lautstärke regeln kann.&lt;br /&gt;
&lt;br /&gt;
Man muss beachten, dass nur &#039;&#039;&#039;root&#039;&#039;&#039; und Nutzer in der Gruppe &#039;&#039;&#039;audio&#039;&#039;&#039; auf die Soundkarte zugreifen können. Wenn man nicht als &#039;&#039;&#039;root&#039;&#039;&#039; arbeiten will sollte man seinen Benutzer der Gruppe hinzufügen:&lt;br /&gt;
* gpasswd -a USERNAME audio&lt;br /&gt;
&lt;br /&gt;
=== Standard-Ausgabegerät ===&lt;br /&gt;
Normalerweise wird der Sound automatisch über HDMI ausgegeben, wenn das angeschlossene Gerät das unterstützt, andernfalls über den Klinke-Anschluss. Will man das ändern, z.B. weil man einen Monitor per HDMI angeschlossen hat, den Sound aber trotzdem über die Anlage hören will, geht das ganz schnell über die Kommandozeile:&lt;br /&gt;
* amixer -c 0 cset numid=3 &amp;lt;nummer&amp;gt;&lt;br /&gt;
Dabei muss man &#039;&#039;&amp;lt;nummer&amp;gt;&#039;&#039; durch eine 0 für automatisches Wechseln, eine 1 für den Klinke-Anschluss oder eine 2 für den HDMI-Anschluss ersetzen. Soll das bei jedem Systemstart automatisch ausgeführt werden, erstellt man bei Arch Linux eine Service-Datei für systemd, z.B. so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Set Default Audio Output&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/amixer -c 0 cset numid=3 &amp;lt;nummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier ersetzt man wieder &#039;&#039;&amp;lt;nummer&amp;gt;&#039;&#039; durch das gewünschte Ziel, speichert die Datei unter &#039;&#039;/etc/systemd/system/default-audio.service&#039;&#039; ab und aktiviert den soeben erstellten Service noch:&lt;br /&gt;
* systemctl enable default-audio.service&lt;br /&gt;
Ab dem nächsten Systemstart wird dadurch das Ausgabegerät automatisch eingestellt.&lt;br /&gt;
&lt;br /&gt;
== Erweiterungs-Boards ==&lt;br /&gt;
Für die GPIO-Schnittstelle des Raspberry Pi gibt es verschiedene Erweiterungs-Boards, die zusätzliche Schnittstellen bereitstellen und 3,3V zu 5V Pegelwandler besitzen. Durch diese kann man den Raspberry Pi in bestehende, 5V-basierte Schaltungen und Projekte einbinden.&lt;br /&gt;
&lt;br /&gt;
=== Prototyping-Board für den Raspberry Pi ===&lt;br /&gt;
In der Ausgabe 16 des embedded projects journal wurde auf Seite 13 ein Prototyping-Board für den Raspberry Pi vorgestellt.&lt;br /&gt;
&lt;br /&gt;
Das Board besitzt eine Spannungsversorgung, an die man 7 bis 15V anschließen kann und die auch den Raspberry Pi mitversorgt. Dadurch wird ein per microUSB angeschlossenes Netzteil überflüssig. Außerdem gibt es einen Pegelwandler, der acht GPIO-Pins des Raspberry Pi als 5V-GPIO-Pins zur Verfügung stellt und einen I2C-Pegelwandler, durch den auch hier der Anschluss von 5V-Chips möglich wird.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen gibt es im embedded projects journal und auf der [http://bastelstube.rocci.net/projects/MBS19_RasPi-GPIO/RasPi-GPIO.html Website des Projekts].&lt;br /&gt;
&lt;br /&gt;
=== Berrybush Pi ===&lt;br /&gt;
Ebenfalls in der Ausgabe 16 des embedded projects journal wurde auf Seite 28 der „Berrybush Pi“ vorgestellt, der ein paar mehr Schnittstellen als das Prototyping-Board bietet.&lt;br /&gt;
&lt;br /&gt;
Auch dieses Board bietet eine Spannungsversorgung für den Raspberry Pi und acht 5V-GPIO-Pins, diese sind jedoch mit Darlington-Transistoren und LEDs zur Status-Anzeige ausgestattet. Außerdem gibt es eine 3,3V (sic) SPI-Schnittstelle, die einfach zum Raspberry Pi durchgeschleift wird, einen 5V-I2C-Bus (mit Pegelwandler zum Raspberry Pi), einen RS485-Bus und eine RS232-Schnittstelle, die jedoch in den RS485-Bus gespeist wird.&lt;br /&gt;
&lt;br /&gt;
Als kleines Highlight gibt es noch die Möglichkeit, ein LCD anzuschließen. Dafür sind Portexpander und Potentiometer für Helligkeit und Kontrast vorhanden.&lt;br /&gt;
&lt;br /&gt;
Genauere Informationen, Schaltpläne und Bilder gibt es im embedded projects journal.&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/epj-16-seite-28 Weitere Informationen]&lt;br /&gt;
&lt;br /&gt;
=== Arduino Shield Bridge ===&lt;br /&gt;
Mit diesem Board aus Spanien kann man Arduino-Aufsteckplatinen mit dem Raspberry Pi verwenden.&lt;br /&gt;
[http://www.cooking-hacks.com/index.php/raspberry-pi-to-arduino-shield-connection-bridge.html Cooking-hacks.com]&lt;br /&gt;
&lt;br /&gt;
Dazu existiert eine Library &amp;quot;arduPi&amp;quot;:&lt;br /&gt;
&amp;quot;In order to make complete the compatibility we have created the arduPi library which allows to use Raspberry with the same code used in Arduino. To do so, we have implemented conversion functions so that you can control in the same way as in Arduino all the I/O interfaces: i2C, SPI, UART, analog, digital, in Raspberry Pi.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== I/O Module seriell/USB ===&lt;br /&gt;
&lt;br /&gt;
Alternativ bieten sich Schnittstellen-Erweiterungen über seriellen Port oder USB an, zum Beispiel mit einem handelsüblichen AVR Mikrocontroller-Modul und der Firmware von Stefan Frings&lt;br /&gt;
[http://stefanfrings.de/avr_io/].&lt;br /&gt;
&lt;br /&gt;
=== Gertboard ===&lt;br /&gt;
Webseite: http://www.raspberrypi.org/archives/tag/gertboard&lt;br /&gt;
Eine I/O-Aufsteckplatine mit zusätzlichem Mikrocontroller (bisher PIC, jetzt ATMega)&lt;br /&gt;
&lt;br /&gt;
=== I2C-Repeater-Board für Raspberry PI ===&lt;br /&gt;
Die kleine Platine von &amp;quot;Horter &amp;amp; Kalb&amp;quot; wird direkt auf die GPIO-Schnittstelle des Raspberry PI gesteckt.&lt;br /&gt;
Es macht die Pegelanpassung von 3,3 auf 5V für den SDA- und den SCL-Pin.&lt;br /&gt;
&lt;br /&gt;
Außerdem kann auch das INT-Signal, welches von digitalen Eingabebaugruppen verwendet wird, über den GPIO 17 abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Das Board ist hier ausführlich beschrieben: http://www.horter.de/blog/i2c-repeater-pegelanpassung-fuer-raspberry-pi/&lt;br /&gt;
&lt;br /&gt;
Im Onlineshop unter www.horter.de ist der Bausatz für 9,90€ zu haben.&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
Um den Raspberry Pi hat sich inzwischen eine große Community gebildet, von der immer wieder neue Projekte mit und Erweiterungen für den Raspberry Pi entwickelt werden. Eine Quelle, über die man von den Projekten erfährt ist z.B. der offizielle [http://www.raspberrypi.org/ Raspberry Pi Blog], aber es gibt auch noch viele andere Möglichkeiten, sich zu informieren.&lt;br /&gt;
&lt;br /&gt;
Einige dieser Möglichkeiten und einige ausgewählte Projekte werden in diesem Artikel vorgestellt.&lt;br /&gt;
&lt;br /&gt;
=== The MagPi ===&lt;br /&gt;
[http://www.themagpi.com/ The MagPi] ist ein freies Online-Magazin, das (normalerweise) monatlich erscheint und in dem interessante Projekte genauer vorgestellt werden. Außerdem gibt es Programmier-Tutorials, Anleitungen für Linux-Software und Interviews.&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 1 ====&lt;br /&gt;
Die Ausgabe 1 vom Mai 2012 behandelt folgende Themen:&lt;br /&gt;
* „The Pioneers“ - eine kleine Übersicht, wie es zur Entwicklung des Raspberry Pi kam&lt;br /&gt;
* „Skutter“ - ein Roboterarm für den Raspberry Pi&lt;br /&gt;
* „RacyPy“ - eine Linux Live-CD, basierend auf Puppy Linux und speziell angepasst für einen leichten Einstieg in die Programmierung&lt;br /&gt;
* eine Anleitung zum Installieren von Debian in einer virtuellen Maschine&lt;br /&gt;
* „Scratch“ - eine Programmiersprache und Entwicklungsumgebung zum kinderleichten Einstieg in die Programmierung&lt;br /&gt;
* „the python pit“ - ein Einstieg in die Programmierung mit Python&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 2 ====&lt;br /&gt;
Die Ausgabe 2 vom Juni 2012 behandelt folgende Themen:&lt;br /&gt;
* „PiSetup“ - eine Anleitung zum Einrichten des Raspberry Pi&lt;br /&gt;
* „In Control“ - ein Einstieg in die GPIO-Programmierung mit dem Raspberry Pi und Python&lt;br /&gt;
* „Pi Dissection“ - ein genauerer Blick auf die Einzelteile des Raspberry Pi&lt;br /&gt;
* Fortsetzung von „Skutter“ aus Ausgabe 1&lt;br /&gt;
* „Command Line Clinic“ - eine Einführung in die Benutzung der Linux-Shell&lt;br /&gt;
* „Computer Music“ - eine Anleitung zur Installation von „Schism Tracker“, einem Sequencer-Programm&lt;br /&gt;
* Fortsetzung der Debian-Anleitung aus Ausgabe 1, diesmal mit einer Anleitung zum Einrichten und Verwenden von Python&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 3 ====&lt;br /&gt;
Die Ausgabe 3 vom Juli 2012 behandelt folgende Themen:&lt;br /&gt;
* eine Anleitung zum automatischen Starten der grafischen Oberfläche von Debian&lt;br /&gt;
* Fortsetzung von „In Control“ aus Ausgabe 2&lt;br /&gt;
* Fortsetzung von „Command Line Clinic“ aus Ausgabe 2&lt;br /&gt;
* Fortsetzung von „Skutter“ aus Ausgabe 1 und 2&lt;br /&gt;
* „To Protect and Serve your Raspberry Pi“ - eine einfache Anleitung, um die GPIO-Pins des Raspberry Pi vor Kurzschlüssen zu schützen&lt;br /&gt;
* „Meeting Pi“ - Vorschäge, wie man Kinder an den Raspberry Pi heranführen kann&lt;br /&gt;
* „The C Cave“ - ein C-Tutorial&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1 und 2&lt;br /&gt;
* „Programming Fundamentals“ - ein Artikel, der die Grundlagen (fast) aller Programmiersprachen auf einfachem Weg zeigen will&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 4 ====&lt;br /&gt;
Die Ausgabe 4 vom August 2012 behandelt folgende Themen:&lt;br /&gt;
* Fortsetzung von „In Control“ aus Ausgabe 2 und 3&lt;br /&gt;
* „3-Axis Accelerometer“ - eine Anleitung für einen Beschleunigungs-Sensor am Raspberry Pi&lt;br /&gt;
* „Kernow Pi Launch“ - ein Artikel darüber, wie der Raspberry Pi an Schulen gebracht wurde&lt;br /&gt;
* „MagPi Exclusive Interview“ - ein Interview mit Eben und Liz von der Raspberry Pi Foundation&lt;br /&gt;
* „How to customise your LXDE menu“ - eine Anleitung zum Anpassen von LXDE&lt;br /&gt;
* Fortsetzung von „Command Line Clinic“ aus Ausgabe 2 und 3&lt;br /&gt;
* Fortsetzung von „The C Cave“ aus Ausgabe 3&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1 und 3&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2 und 3&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 5 ====&lt;br /&gt;
Die Ausgabe 5 vom September 2012 behandelt folgende Themen:&lt;br /&gt;
* „Steady Hands“ - eine Anleitung zum Bau eines „Heißer Draht“-Spiels mit dem Raspberry Pi&lt;br /&gt;
* „Temperature Sensor“ - eine Anleitung zum Anschluss eines I2C-Temperatursensors an den Raspberry Pi&lt;br /&gt;
* „XBMC Media Center“ - eine Einführung in Rasbbmc, einer HTPC-Distribution für den Raspberry Pi&lt;br /&gt;
* „Squeezy or Wheezy?“ - ein Vergleich von Debian 6 „Squeeze“ und Debian 7 „Wheezy“&lt;br /&gt;
* Fortsetzung von „Command Line Clinic“ aus Ausgabe 2, 3 und 4&lt;br /&gt;
* Fortsetzung von „The C Cave“ aus Ausgabe 3 und 4&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3 und 4&lt;br /&gt;
* „RasPiThon 2012“ - ein Bericht über den Rasbperry Pi Programmier-Marathon&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3 und 4&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 6 ====&lt;br /&gt;
Die Ausgabe 6 vom Oktober 2012 behandelt folgende Themen:&lt;br /&gt;
* „Skutter Returns“ - Fortsetzung von „Skutter“ aus Ausgabe 1, 2 und 3&lt;br /&gt;
* „Portable Power for your Pi“ - eine Anleitung für eine mobile Stromversorgung&lt;br /&gt;
* „Star Letter: An FET Buffer Stage for GPIO Access“ - eine Möglichkeit, wie man die GPIO-Pins des Raspberry Pi belastbarer machen kann&lt;br /&gt;
* „Pumpkin Pi“ - ein Kürbis mit Bewegungs-Sensor und RGB-LEDs&lt;br /&gt;
* „Camera Pi“ - ein Interview mit David Hunt, einem Bastler, der seine Kamera mit einem Raspberry Pi ausgestattet hat&lt;br /&gt;
* „Our Raspberry Pi Summer“ - ein Beispiel für ein kleines Spiel, das mit Scratch programmiert wurde&lt;br /&gt;
* „Baby steps in a Big World“ - ein Ada-Tutorial&lt;br /&gt;
* Fortsetzung von „The C Cave“ aus Ausgabe 3, 4 und 5&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4 und 5&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4 und 5&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 7 ====&lt;br /&gt;
Die Ausgabe 7 vom November 2012 behandelt folgende Themen:&lt;br /&gt;
* „Raspberry Pi &amp;amp; Arduino“ - ein Artikel über die Kommunikation zwischen Arduino und Raspberry Pi mithilfe von Python&lt;br /&gt;
* „A little Ray of Sunshine“ - eine Solar-Stromversorgung für den Raspberry Pi und andere USB-Geräte&lt;br /&gt;
* „The Raspberry Ladder Board“ - ein Board zum Einstieg in die GPIO-Programmierung mit dem Raspberry Pi&lt;br /&gt;
* „Interrupts and Other Activities with GPIO Pins” - eine Anleitung für Interrupts und GPIO-Pins im Allgemeinen auf dem Raspberry Pi&lt;br /&gt;
* „Raspbian“ - ein Interview mit Mike Thompson, dem Erfinder von Raspbian&lt;br /&gt;
* „Turbopi“ - eine Anleitung zum Übertakten des Raspberry Pi&lt;br /&gt;
* „Pi-Evolution“ - eine Übersicht über die Entwicklung des Raspberry Pi&lt;br /&gt;
* „Make“ - eine Einführung in GNU Make und Makefiles&lt;br /&gt;
* „Welcome to the C++ Cache!“ - eine Einführung in C++&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4, 5 und 6&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4, 5 und 6&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 8 ====&lt;br /&gt;
Die Ausgabe 8 vom Dezember 2012 behandelt folgende Themen:&lt;br /&gt;
* „Skutter Returns“ - Fortsetzung von „Skutter“ aus Ausgabe 1, 2 und 3 bzw. „Skutter Returns“ aus Ausgabe 6&lt;br /&gt;
* „The Santa Trap“ - Heimautomation mit dem Raspberry Pi&lt;br /&gt;
* „Control your Arduino board with Raspberry Pi and Python“ - ein Python-Modul zum Steuern eines Arduino&lt;br /&gt;
* „PiGauge“ - eine Anleitung, wie man Servo-Motoren übers Internet mithilfe des Raspberry Pi steuern kann&lt;br /&gt;
* „Quick2Wire“ - Erweiterungs-Board für den Raspberry Pi&lt;br /&gt;
* „Kickstarter“ - eine Vorstellung der Kickstarter-Kampagne, um The MagPi auf Papier zu bannen&lt;br /&gt;
* „Programming the Raspberry Pi: Getting Started with Python“ - eine kurze Vorstellung des gleichnamigen Buches von Simon Monk&lt;br /&gt;
* „pibow interview“ - ein Interview mit den Erfindern des PiBow, einem Gehäuse für den Raspberry Pi&lt;br /&gt;
* „CESIL Pi“ - ein CESIL Programmier-Tutorial für den Raspberry Pi&lt;br /&gt;
* Fortsetzung von „Welcome to the C++ Cache!“ aus Ausgabe 7&lt;br /&gt;
* Fortsetzung von „Baby steps in a Big World“ aus Ausgabe 6&lt;br /&gt;
* „MySQL Database Bootcamp“ - eine Einführung in MySQL&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4, 5, 6 und 7&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 9 ====&lt;br /&gt;
Die Ausgabe 9 vom Februar 2013 (Januar wurde ausgelassen) behandelt folgende Themen:&lt;br /&gt;
* „adafruit Interview“ - Interview mit der Gründerin von adafruit, einem Shop für DIY Elektronik&lt;br /&gt;
* „WebIOPi“ - eine REST-Schnittstelle, um die GPIO-Pins des Raspberry Pi per Javascript zu steuern&lt;br /&gt;
* „Backup your Raspberry Pi“ - eine Anleitung für die Datensicherung der SD-Karte&lt;br /&gt;
* „Pi Interface Board Review Quick2Wire“ - ein genauerer Blick auf das Erweiterungs-Board „Quick2Wire“, das in Ausgabe 8 schon kurz gezeigt wurde&lt;br /&gt;
* „RISC OS Pi“ - eine Anleitung zur Installation von RISC OS auf dem Raspberry Pi&lt;br /&gt;
* „Installing &amp;amp; Configuring ArchLinux“ - eine Anleitung zur Installation von Arch Linux auf dem Raspberry Pi, die auch die Installation von XFCE umfasst&lt;br /&gt;
* „Introducing Vala“ - ein kleines Vala Programmier-Tutorial für den Raspberry Pi und das LedBorg Erweiterungs-Board&lt;br /&gt;
* Fortsetzung von „The C Cave“ aus Ausgabe 3, 4, 5 und 6&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4, 5, 6 und 7&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4, 5, 6, 7 und 8&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 10 ====&lt;br /&gt;
Die Ausgabe 10 vom März 2013 behandelt folgende Themen:&lt;br /&gt;
* Fortsetzung von „WebIOPi“ aus Ausgabe 9&lt;br /&gt;
* „Try a Cocktail of Projects“ - ein Artikel, der verschiedene Erweiterungs-Möglichkeiten für den Raspberry Pi zeigt&lt;br /&gt;
* „Backing up - part 2“ - Fortsetzung von „Backup your Raspberry Pi“ aus Ausgabe 9&lt;br /&gt;
* „Bash Gaffer Tape“ - ein Bash-Tutorial&lt;br /&gt;
* „Charm on the Raspberry Pi“ - ein Charm Programmier-Tutorial für den Raspberry Pi&lt;br /&gt;
* „C++ Cache”: Fortsetzung von „Welcome to the C++ Cache!“ aus Ausgabe 7 und 8&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4, 5, 6, 7 und 9&lt;br /&gt;
* Fortsetzung von „the python pit“ aus Ausgabe 1, 2, 3, 4, 5, 6, 7, 8 und 9&lt;br /&gt;
&lt;br /&gt;
==== Ausgabe 11 ====&lt;br /&gt;
Die Ausgabe 11 vom April 2013 behandelt folgende Themen:&lt;br /&gt;
* Heizungssteuerung mithilfe des Raspberry Pi über ein Smartphone&lt;br /&gt;
* eine Vorstellung vom „Power and I/O Expansion Board“&lt;br /&gt;
* eine Anleitung zum Einrichten eines WLAN-Access-Points auf dem Raspberry Pi (per USB-WLAN-Dongle)&lt;br /&gt;
* Vorstellung von der Minecraft Pi-Edition&lt;br /&gt;
* „Printing with Cups“: Configuring Cups&lt;br /&gt;
* „Setting up a simple intranet“ mit einer Anleitung zum Einrichten vom Apache HTTPD&lt;br /&gt;
* eine Einführung in die Assembler-Programmierung auf dem Raspberry Pi&lt;br /&gt;
* Fortsetzung von „Charm on the Raspberry Pi“ aus Ausgabe 10&lt;br /&gt;
* kurze Anleitung zum Verwenden von Farben auf der Kommandozeile&lt;br /&gt;
* Fortsetzung von „Scratch“ aus Ausgabe 1, 3, 4, 5, 6, 7, 9 und 10&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi multi-effects ===&lt;br /&gt;
Ein Musiker hat mit einem Raspberry Pi, einem Arduino Uno und einer USB-Soundkarte ein Gitarren-Effektboard gebaut und das Ganze in seinem Blog [https://guitarextended.wordpress.com/2013/01/31/raspberry-pi-multi-effects-overview-of-the-setup/ beschrieben]. Das alles sieht im [https://www.youtube.com/watch?v=NwJNeouLqgQ Video] noch etwas sperrig aus, es sollte aber kein Problem sein, die Soundkarte und den Raspberry Pi auch noch mit ins Effektboard zu integrieren.&lt;br /&gt;
&lt;br /&gt;
Als Software verwendet er Raspbian, also das Standard-Betriebssystem des Raspberry Pi, und [http://puredata.info/ Pure Data], eine Echtzeit-Umgebung für Audio-, Video- und Grafik-Verarbeitung. Diese ist jedoch auch in den Arch Linux ARM Paketquellen verfügbar, einem Versuch, das ganze auch mit Arch Linux auszuprobieren, steht also theoretisch nichts im Wege.&lt;br /&gt;
&lt;br /&gt;
Die Installation und Konfiguration von Pure Data hat er ebenfalls in seinem Blog [https://guitarextended.wordpress.com/2013/01/28/rpi-as-guitar-effects-processor-installing-and-configuring-pd/ beschrieben].&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi guitar tuner ===&lt;br /&gt;
Ein anderer Nutzer hat ein Gitarren-Stimmgerät gebaut. Dazu hat er einen Raspberry Pi, eine USB-Webcam zur Ton-Aufnahme, eine 7-Segment-Anzeige zur Anzeige des Tons und 15 LEDs zur Anzeige der Abweichung vom Ton verwendet.&lt;br /&gt;
&lt;br /&gt;
Ausgewertet und angesteuert wird das Ganze über ein selbstgeschriebenes Java-Programm, ein Video und ein paar zusätzliche Informationen gibt es auf [https://www.youtube.com/watch?v=oB4F5VhzQf8 YouTube].&lt;br /&gt;
&lt;br /&gt;
=== Circadian Lighting ===&lt;br /&gt;
Auch für Menschen, die sich mit dem Morgen manchmal schwer tun, gibt es ein Projekt mit dem Raspberry Pi, das im Blog [http://www.raspberrypi.org/archives/3267 vorgestellt wurde]. In Verbindung mit ein paar RGB-LEDs kann man den Raspbrry Pi zu einem Wecker machen, der einen nicht mit lautem, nervigen Piepsen aus dem Schlaf reißt, sondern langsam in Verbindung mit einem künstlichen Sonnenaufgang weckt. Fehlt nur noch ein Relais, über das die Kaffeemaschine angeschaltet wird, und der Morgen ist perfekt.&lt;br /&gt;
&lt;br /&gt;
Bei diesem Projekt gibt es sogar den [https://github.com/rasathus/circadianLighting Quellcode], eine [http://rasathus.blogspot.co.uk/2013/01/circadian-lighting-part-one.html Hardware-Liste] und ein [https://www.youtube.com/watch?v=Q9_tqoOkmCU Video], das einige der Funktionen zeigt. Und mit ein paar Python-Kenntnissen kann man alles seinen Bedürfnissen anpassen und erweitern.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Leaf ===&lt;br /&gt;
Die einfachsten Ideen sind doch manchmal die Besten. „Dr. Monk” hat in seinem Blog eine Pinbelegung des Raspberry Pi [http://www.doctormonk.com/2013/02/raspberry-pi-and-breadboard-raspberry.html veröffentlicht], die (in der richtigen Größe ausgedruckt) genau auf den P1-GPIO-Anschluss des Raspberry Pi passt. So vergisst man nie die Pinbelegung, wenn man gerade mal wieder mit dem Raspberry Pi bastelt und auch ein falsches Anschließen, das zur Zerstörung des Mini-Computers oder der angeschlossenen Teile führen kann, passiert nicht mehr so leicht.&lt;br /&gt;
&lt;br /&gt;
=== raspberry-tools ===&lt;br /&gt;
Eine Tool-Sammlung für den Raspberry Pi, veröffentlicht unter der GNU General Public License Version 2 und gehostet auf [https://github.com/rookies/raspberry-tools github]. Momentan enthält diese Sammlung nur ein Programm, es folgen aber noch weitere nützliche Tools.&lt;br /&gt;
&lt;br /&gt;
==== scope ====&lt;br /&gt;
Scope ist Teil von raspberry-tools. Es zeichnet digitale Signale von einem oder mehreren GPIO-Pins auf und bereitet die Daten für eine Auswertung mit [http://xoscope.sourceforge.net/ xoscope] auf.&lt;br /&gt;
&lt;br /&gt;
Wenn man sich den Quellcode geholt hat, muss man erst einmal das Hauptprogramm für den Raspberry Pi kompilieren. Das geht entweder direkt auf dem Raspberry Pi oder per Cross-Compiler.&lt;br /&gt;
* g++ -o RasPi_logGPIO RasPi_logGPIO.cpp&lt;br /&gt;
Nachdem sowohl die entstandene Datei &#039;&#039;RasPi_logGPIO&#039;&#039; als auch das Script &#039;&#039;RasPi_logGPIO.sh&#039;&#039; im gleichen Ordner auf dem Raspberry Pi sind, kann man die Aufzeichnung starten:&lt;br /&gt;
* ./RasPi_logGPIO.sh [Liste mit GPIO-Pins] &amp;gt; ausgabedatei.txt&lt;br /&gt;
Für die Pins 14, 31 und 23 sieht das Kommando z.B. so aus:&lt;br /&gt;
* ./RasPi_logGPIO.sh 14 31 23 &amp;gt; ausgabedatei.txt&lt;br /&gt;
Die Aufzeichnung kann mit Strg+C gestoppt werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man die entstandene Datei (z.B. hier ausgabedatei.txt) normalisieren und ins xoscope-Format umwandeln, das funktioniert auch problemlos auf einem anderen Computer:&lt;br /&gt;
* ./RasPi_normalizeGPIO.py ausgabedatei.txt &amp;gt; ausgabedatei.dat&lt;br /&gt;
Nun entsteht die Datei &#039;&#039;ausgabedatei.dat&#039;&#039;, die man mit xoscope ansehen kann:&lt;br /&gt;
&amp;lt;gallery heights=&amp;quot;300&amp;quot; widths=&amp;quot;300&amp;quot;&amp;gt;&lt;br /&gt;
Datei:RasPiTools_scope_sample1.png|eine Beispiel-Aufnahme&lt;br /&gt;
Datei:RasPiTools_scope_sample2.png|die gleiche Aufnahme, vergrößert&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Dazu muss man nur die Datei laden und die entsprechenden Memory-Einträge anzeigen lassen. In diesem Beispiel ist Pin 14 in Mem A, Pin 31 in Mem B und Pin 23 in Mem C, also genau in der Reihenfolge, in der man die Pin-Nummern dem Programm übergeben hat.&lt;br /&gt;
&lt;br /&gt;
== Anhang ==&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
[[Datei:Raspberry_Pi_Power.jpg|thumb|Der microUSB-Anschluss zur Stromversorgung]]&lt;br /&gt;
Um den Raspberry Pi mit Strom zu versorgen gibt es verschiedene Möglichkeiten. Entscheidend ist nur, dass möglichst konstante 5V bei bis zu 700 mA auf einem microUSB-Stecker geliefert werden.&lt;br /&gt;
==== mit USB-Netzteil ====&lt;br /&gt;
Wenn man ein genügend starkes USB-Netzteil mit einem microUSB-Kabel verbindet hat man eine passende Stromversorgung für den Raspberry Pi.&lt;br /&gt;
Gut funktioniert zum Beispiel das iPhone-Ladegerät, aber auch andere, günstigere Netzteile sollten keine Probleme machen.&lt;br /&gt;
==== Netzteil selbst bauen ====&lt;br /&gt;
Wenn man kein USB-Netzteil zur Hand hat kann man auch selbst ein Steckernetzteil, das 5V Gleichspannung liefert, mit einem microUSB-Kabel zusammenlöten.&lt;br /&gt;
&lt;br /&gt;
Dafür braucht man erst einmal ein microUSB-Kabel und ein passendes Steckernetzteil. (siehe Abb. 1)&lt;br /&gt;
Man entfernt den USB-A-Stecker und befreit das Kabelende ein Stück von seinem Mantel, es kommen vier Adern zum Vorschein. (siehe Abb. 2)&lt;br /&gt;
Uns interessiert die grüne und die weiße Ader nicht, da wir keine Daten übertragen wollen.&lt;br /&gt;
Jetzt muss auch noch der Stecker vom Netzteil entfernt und die Adern abisoliert werden. (siehe Abb. 3)&lt;br /&gt;
Bei manchen Netzteilen ist eine Markierung für Plus- oder Minus-Pol angebracht. Wenn das nicht der Fall ist, muss man mit einem Multimeter nachmessen. (siehe Abb. 4)&lt;br /&gt;
Nun isoliert man auch noch die schwarze und rote Ader des USB-Kabels ab und verlötet die schwarze Ader mit dem Minus-Pol des Netzteils und die rote Ader mit dem Plus-Pol des Netzteils. Danach packt man um die Adern jeweils einen Schrumpfschlauch zur Isolation. Wenn man um die ganze Verbindung noch einen großen Schrumpfschlauch packt wird die Verbindung nochmal um einiges stabiler. &lt;br /&gt;
(siehe Abb. 5)&lt;br /&gt;
Es ist auch möglich den Raspberry Pi über jedes alte PC Netzteil zu betreiben, bei einem alten 300 Watt Netzteil hat man einen Verlust im Leerlauf von ca. 8 Watt.&lt;br /&gt;
Dafür kann man aber einige andere Komponenten (LEDs, usw.) mitbetreiben.&lt;br /&gt;
Hier ein Link zu einem deutschen Youtube Video:&lt;br /&gt;
http://www.youtube.com/watch?v=hqevlVn1Osk&lt;br /&gt;
&lt;br /&gt;
Wer kein Micro-USB Kabel opfern möchte, kann zwar den GPIO-Pinheader verwenden, dabei umgeht man aber die interne Eingangssicherung sowie die TVS-Diode (Überspannungsschutz). Siehe Schema, Seite 1: http://www.raspberrypi.org/wp-content/uploads/2012/04/Raspberry-Pi-Schematics-R1.0.pdf&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau1.jpg|Abb. 1: Die Ausgangsmaterialien&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau2.jpg|Abb. 2: Das USB-Kabel ohne Mantel mit der roten (+5V), schwarzen (GND), grünen (Data+) und weißen (Data-) Ader&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau3.jpg|Abb. 3: Das Netzteil mit abisolierten Kabelenden&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau4.jpg|Abb. 4: Das Multimeter zeigt eine positive Zahl an, daher ist das Kabel mit der roten Klemme der Plus-Pol, das Kabel mit der schwarzen Klemme der Minus-Pol.&lt;br /&gt;
Datei:RasPi_Netzteil_Selbstbau5.jpg|Abb. 5: Das fertige Netzteil, die Verbindung ist mit einem Schrumpfschlauch geschützt.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB-Geräte ===&lt;br /&gt;
[[Datei:Raspberry_Pi_USB.jpg|thumb|Die beiden USB Host-Anschlüsse]]&lt;br /&gt;
Generell kann man am Raspberry Pi alle USB-Geräte verwenden, die vom Linux-Kernel unterstützt werden und somit auch an anderen Linux-PCs funktionieren.&lt;br /&gt;
&lt;br /&gt;
Es ist allerdings zu beachten, dass die USB-Ports nur vergleichsweise wenig Strom liefern können (nicht die vollen 500 mA, die laut USB2.0 Standard maximal möglich sind), für größere Verbraucher wie z.B. 2,5-Zoll-Festplatten ohne externe Stromversorgung muss man daher einen externen USB-Hub mit Stromversorgung verwenden.&lt;br /&gt;
==== Maus &amp;amp; Tastatur ====&lt;br /&gt;
Da es für Mäuse und Tastaturen Standard-Profile gibt, die auch von allen (bis auf extrem wenige Ausnahmefälle) Geräten eingehalten werden, sollte es hier keine Probleme geben. Die Eingabegeräte sollten sofort verwendbar sein und auch Hot-Plugging stellt im Normalfall kein Problem dar.&lt;br /&gt;
==== USB-Sticks &amp;amp; USB-Festplatten ====&lt;br /&gt;
Wenn man seinem Raspberry Pi zusätzlichen Speicherplatz verpassen will bietet es sich an, USB-Sticks bzw. -Festplatten anzuschließen. Da es auch hier Standard-Profile gibt sollten diese sofort vom Linux-Kernel erkannt werden. Einhängen ([https://de.wikipedia.org/wiki/Mounten mounten]) muss man sie jedoch unter Arch Linux ARM generell selbst, wenn man nicht einen [https://de.wikipedia.org/wiki/Fstab fstab-Eintrag] erstellt hat oder eine Desktop-Oberfläche installiert hat, die das automatisch erledigt.&lt;br /&gt;
==== WLAN-Sticks ====&lt;br /&gt;
Wird der WLAN-Stick vom Kernel erkannt (erkennbar daran, dass ein entsprechendes Interface von &#039;&#039;&#039;ifconfig -a&#039;&#039;&#039; aufgelistet wird), kann man ein Netzwerk-Profil mit [https://wiki.archlinux.org/index.php/Netcfg netcfg] (Quasi-Standard unter ArchLinux, bei dem die Profile über Konfigurationsdateien erstellt werden), dem [https://wiki.archlinux.org/index.php/NetworkManager NetworkManager] oder [https://wiki.archlinux.org/index.php/Wicd Wicd] erstellen. Sollte die Karte nicht erkannt werden, hilft eventuell ein Blick auf die [https://wiki.archlinux.org/index.php/Wireless_Setup Wireless Setup] Seite im ArchLinux Wiki.&lt;br /&gt;
==== TV-Karten ====&lt;br /&gt;
Will man den Raspberry Pi als HTPC verwenden, kann es sinnvoll sein, eine TV-Karte per USB anzuschließen.&lt;br /&gt;
Hier gibt es generell 4 Möglichkeiten:&lt;br /&gt;
* &#039;&#039;&#039;DVB-T&#039;&#039;&#039;, also digitales Fernsehen, das per Funk ausgestrahlt wird - kostenlos, jedoch nicht überall verfügbar&lt;br /&gt;
* &#039;&#039;&#039;DVB-S&#039;&#039;&#039;, also digitales Fernsehen, das per Satellit ausgestrahlt wird - kostenlos und generell überall verfügbar, jedoch wird eine Satelliten-Schüssel benötigt&lt;br /&gt;
* &#039;&#039;&#039;DVB-C&#039;&#039;&#039;, also digitales Fernsehen, das über das Kabelnetz ausgestrahlt wird - Kosten für den Kabelanschluss fallen an, Sender-Angebot vom Kabelanbieter abhängig&lt;br /&gt;
* &#039;&#039;&#039;Analog-TV&#039;&#039;&#039;, also analoges Fernsehen, das über das Kabelnetz ausgestrahlt wird - Kosten für den Kabelanschluss fallen an, kein HD, Sender-Angebot vom Kabelanbieter abhängig&lt;br /&gt;
&lt;br /&gt;
Nicht alle Geräte werden von Linux unterstützt, eine Übersicht, die nach Übertragungstechnik (DVB-T/-S/-C oder Analog) und Anschluss-Art (beim Raspberry Pi immer USB) geordnet ist, findet man im [http://linuxtv.org/wiki/index.php/Hardware_Device_Information LinuxTVWiki], zu dem man natürlich auch selbst beitragen kann, wenn man ein Gerät getestet hat.&lt;br /&gt;
==== Soundkarten ====&lt;br /&gt;
Da der Klinke-Ausgang des Raspberry Pi nicht mit einem D/A-Wandler, sondern nur per PWM funktioniert, ist die Sound-Qualität nicht gerade überragend. Wenn man das verbessern will, oder wenn man Sound per Line-Eingang oder per Mikrofon aufnehmen will, bietet es sich an, eine USB-Soundkarte anzuschließen.&lt;br /&gt;
&lt;br /&gt;
Ist man unsicher, ob die Soundkarte unterstützt wird, hilft ein Blick ins [http://www.alsa-project.org/main/index.php/Matrix:Main Wiki vom ALSA-Projekt].&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [http://downloads.raspberrypi.org/images/archlinuxarm/archlinux-hf-2013-02-11/archlinux-hf-2013-02-11.zip.torrent Torrent-Download von Arch Linux ARM 2013-02-11]&lt;br /&gt;
* [http://downloads.raspberrypi.org/images/archlinuxarm/archlinux-hf-2013-02-11/archlinux-hf-2013-02-11.zip HTTP-Download von Arch Linux ARM 2013-02-11] (SHA-1: 1d2508908e7d8c899f4a5284e855cb27c17645dc)&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.raspberrypi.org/ offizielle Website des Raspberry Pi] (englisch)&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Raspberry_Pi Wikipedia: Raspberry Pi] (deutsch)&lt;br /&gt;
* [http://www.themagpi.com/ The MagPi] (englisch)&lt;br /&gt;
* [http://archlinuxarm.org/ Arch Linux ARM] (englisch)&lt;br /&gt;
* [https://www.archlinux.org/ Arch Linux] (englisch)&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Arch_Linux Wikipedia: Arch Linux] (deutsch)&lt;br /&gt;
* [http://www.kammerath.net/asterisk-virtuelle-telefonanlage.html Asterisk auf dem Raspberry Pi] (deutsch)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_als_Universalprogrammer&amp;diff=86950</id>
		<title>Raspberry Pi als Universalprogrammer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_als_Universalprogrammer&amp;diff=86950"/>
		<updated>2015-01-31T07:50:20Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Der µC meldet sich nicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014-12-27: Dieser Artikel hat &amp;quot;Reife&amp;quot;, die Beschreibung wie man den RasPi als AVR Programmer nutzt ist komplett.&lt;br /&gt;
&lt;br /&gt;
[[Datei:AllesPowerBar.JPG|thumb|400px|Raspberry Pi as AVR-programmer]]&lt;br /&gt;
=Vorüberlegungen=&lt;br /&gt;
==Grundkonzept==&lt;br /&gt;
Die nötigen GPIO&#039;s des Raspberries sind mit dem Programmierinterface des µC verbunden, ebenso die Stromversorgung&lt;br /&gt;
des zu programmierenden Devices. Die Programmierdatei wird von einem Host-PC auf den RasPi kopiert.&lt;br /&gt;
Über die Kommandozeile wird das Programmiertool auf dem RasPi gestartet.&lt;br /&gt;
&lt;br /&gt;
===Variante Ethernet-Dongle===&lt;br /&gt;
Ein Raspi ist über Ethernet mit einem PC verbunden. Auf dem PC (Laptop, Windows, Apple, egal) &lt;br /&gt;
läuft ein Terminal-Programm mit dem die Programmiertools auf dem RasPi gesteuert werden. &lt;br /&gt;
Die Programmierdatei wird ebenfalls über Ethernet auf den RasPi übetragen. Falls diese Konfiguration auch&lt;br /&gt;
an einem Laptop laufen soll muss die Powersupply auch mobil sein, also kein Steckernetzteil.&lt;br /&gt;
 &lt;br /&gt;
===Variante Standalone Programmer===&lt;br /&gt;
Der RasPi läuft als StandAlone Programmer, also ohne verbundenen PC. Dann muss am RasPi eine Tastatur über&lt;br /&gt;
USB und ein Monitor über HDMI angeschlossen sein.&lt;br /&gt;
&lt;br /&gt;
===Variante WLAN===&lt;br /&gt;
Erfordert Router? &lt;br /&gt;
&lt;br /&gt;
===Headless Betrieb===&lt;br /&gt;
Für die Nutzung des RasPis ohne Monitor und RasPi eigene Tastatur nur über eine &#039;&#039;ssh&#039;&#039;-Verbindung über Ethernet (headless Betrieb) werden oft Einstellungen vorgeschlagen, die leider dazu führen das eine Internetverbindung des RaspPis über WLAN nicht mehr möglich ist. Leider ist es dann auch nicht mehr möglich die Pakete für den Programmer zu installieren. Deshalb empfiehlt der Autor erst nachdem der RasPi nachweislich als Programmer funktioniert, diesen auf Headless-Betrieb umzustellen.&lt;br /&gt;
&lt;br /&gt;
Der Autor hat seinen Raspi über zwei Subnetze eingebunden, eins um den WLAN-router (DHCP, subnetz 192.168.178.*/255.255.0.0) und eins zum über Ethernet angeschloßenen Steuer-PC. Letzteres als statische IP (subnetz 10.1.1.1/255.255.255.0). &lt;br /&gt;
&lt;br /&gt;
Auszug &#039;&#039;/etc/network/interfaces&#039;&#039; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
address 10.1.1.1&lt;br /&gt;
netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet manual&lt;br /&gt;
&lt;br /&gt;
wpa-roam /etc/wpa_supplicant/wpa_supplivant.conf&lt;br /&gt;
iface default inet dhcp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Filetransfer===&lt;br /&gt;
Um Dateien wie das Flash-Image für den µC zwischen Steuer-PC und RasPi zu transferien gibt es mehrere Möglichkeiten. Die typischen sind &#039;&#039;ftp&#039;&#039; oder &#039;&#039;SAMBA&#039;&#039; (Windows-PC). Bei beiden ist der jeweils der passende Server aus dem RasPi zu installieren und gegebenfalls der Port dafür in der firewall freizuschalten. FTP scheint die einfachere und universellere Variante zu sein, da diese mit beliebeigen ftp-programmen funktioniert. Als ftpserver macht &#039;&#039;proftpd&#039;&#039; eine gute Figur.&lt;br /&gt;
*Installationsanleitung für proftd: [http://www.gnet4u.de/raspberryweb/proFTPD.pdf]&lt;br /&gt;
*Firewallfreischaltungen beispielsweise für ftp: [http://www.gtkdb.de/index_36_2253.html]&lt;br /&gt;
&lt;br /&gt;
==RasPi Hardware==   &lt;br /&gt;
===Modell-Auswahl===&lt;br /&gt;
Für die stand-alone Variante (RasPi mit Tastatur und Monitor) eignen sich model-A und B gleichermaßen,&lt;br /&gt;
Dagegen ist eine Terminalverbindung über Ethernet mit dem Modell A oder A+ nicht möglich da diesem die Schnittstelle fehlt. Eine Terminalverbindung über WLAN dagegen ist mit allen RasPi&#039;s möglich. Die A+ und B+ Modelle bieten zwar mehr GPIO&#039;s, die Grundausstattung der RasPi ohne Plus genügt aber für den Einsatz als &lt;br /&gt;
Programmer völlig. &lt;br /&gt;
&lt;br /&gt;
Der portable Betrieb mit Speisung über eine USB-Powerbar oder aus den USB-Ports&lt;br /&gt;
eines Laptops ist dem &amp;quot;Plus&amp;quot; Modellen einfacher da diese dank effizienter Regler weniger verbrauchen.&lt;br /&gt;
Ohne diese Regler gerät das Model B (ohne plus) schnell an die Grenze einer USB-Stromversorgung.&lt;br /&gt;
Das kann zu ungewollten Neustarts des RasPi führen, Abhilfe schafft nur ein sehr gutes USB-Netzteil.&lt;br /&gt;
Etwas geringer wird das Problem  wenn der RasPi über ein sogenanntes Y-Kabel von zwei USB-Anschlüssen des Laptops betrieben wird.&lt;br /&gt;
Ein USB-Anschluss darf mit höchstens 500 mA belastet werden, mit  dem genannten Kabel erhöht sich der verfügbare Strom auf 600 mA (Nach USB2.0.-Spec).&lt;br /&gt;
&lt;br /&gt;
===Raspberry Pinleiste===   &lt;br /&gt;
Der RasPi kann über seine Steckerleiste folgende Interface ansteuern&lt;br /&gt;
*Bitwackler (bitbanging) über 25 GPIO (Model b+)&lt;br /&gt;
*SPI  (wie die ISP -Schnittstelle der Atmel AVR-controller) 2x SPI_CE ; 3 Pins MISO,MOSI,SCLK&lt;br /&gt;
*UART (ein Paar RxD/TxD) &lt;br /&gt;
*I2C   (?ein Paar SDA,SCL)&lt;br /&gt;
&lt;br /&gt;
Ebenso liegen an zwei Pins 3V3 an mit denen bspw. ein µC leicht versorgbar ist. An zwei weiteren Pins stellt&lt;br /&gt;
der RasPi 5V zur Verfügung, allerdings ist die Spannung verbrauchsabhängig meist etwas niedriger.&lt;br /&gt;
Massepotential liegt an 8 (Modell B+) Pins.&lt;br /&gt;
&lt;br /&gt;
Das Bitwackler Interface kann natürlich auch SPI, UART und I2C nachstellen, allerdings mit erhöhten Programmieraufwand&lt;br /&gt;
und meist nicht so schnell wie mit den speziellen SPI-Pins. Dafür ist es erste Wahl bei anderen Schnittstellen&lt;br /&gt;
wie JTAG.&lt;br /&gt;
&lt;br /&gt;
==Beschaltung==&lt;br /&gt;
Es gelten die üblichen RasPi GPIO Hinweise: &lt;br /&gt;
*An die Eingänge keine Signale mit Pegel höher 3.3V oder kleiner als 0V legen, diese können die CPU beschädigen. &lt;br /&gt;
*Schäden können auch auftreten falls ein Pin mit mehr Strom belastet wird als konfiguriert. Minimal sind 2 mA ein höherer Wert in 2 mA Schritten aber nicht mehr als 16 mA kann konfiguriert werden. Dieser Wert gilt für alle GPIO&#039;s, er kann nicht Pin-individuell geändert werden. Nach einem Reset ist ein Wert von  8 mA voreingestellt. Nie mehr Strom &amp;quot;ziehen&amp;quot; als konfiguriert, ganz vorsichtige Naturen begrenzen den Strom durch einen Serienwiderstand (bspw. 10k).&lt;br /&gt;
*Die 3V3 Spannung an der Pin-leiste wird über einen IC erzeugt, der höchstens 50 mA zur Verfügung stellt. (Dieser Wert wurde für die nicht &#039;+&#039; Modelle angegeben, möglichweise bei den im Bereich der Stromversorgung überarbeiteten &#039;+&#039; Modellen höher.&lt;br /&gt;
&lt;br /&gt;
===Bitwackler===&lt;br /&gt;
nicht unbedingt schnell (über Python 60 KHz ermittelt), mit passenden Treibern sollten &lt;br /&gt;
aber mehrere Hundert kHz möglich sein. Dafür ist das timing nach belieben programmierbar, was bspw. für&lt;br /&gt;
JTAG nützlich ist.&lt;br /&gt;
&lt;br /&gt;
===SPI-Schnittstelle und -Treiber===&lt;br /&gt;
Der RasPi hat in den betrachten Modellen (&amp;quot;model A&amp;quot;, &amp;quot;model B&amp;quot;, &amp;quot;model B+&amp;quot;) nur eine SPI-Schnittstelle, die&lt;br /&gt;
bei allen dreien die selben Pins nutzt. Varianten sind nur in der Nutzung der beiden Pins &#039;&#039;SPI_CE0&#039;&#039; und &#039;&#039;SPI_CE1&#039;&#039; möglich, welche eines der angeschlossenen SPI-Geräte auswählen (bis zu zwei möglich). Befindet sich nur ein Gerät an dieser Schnittstelle können die beiden &#039;&#039;SPI_CE&#039;&#039; Pins unbenutzt bleiben.&lt;br /&gt;
 &lt;br /&gt;
Für die Nutzung der SPI - Schnittstelle des RasPi muß der passende SPI-Treiber (module) laufen. Das ist an dem&lt;br /&gt;
vorhandenen device &#039;&#039;/dev/spi0.0&#039;&#039; erkennbar. Findet sich unter &#039;&#039;/dev/&#039;&#039; kein SPI-device, dann ist das Module nicht gestartet. Dieses wird über &#039;&#039;modprobe spi-bcm2708&#039;&#039; manuell gestartet. Soll es automatisch gestartet werden, darf das SPI-module nicht auf der schwarzen Liste &#039;&#039;/etc/modprobe.d/raspi-blacklist.conf&#039;&#039; stehen. Falls dort die Zeile &#039;&#039;blacklist spi-bcm2708&#039;&#039; steht mit einem vorangestellten &#039;#&#039; deaktivieren oder die gesamte Zeile löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# file: /etc/modprobe.d/raspi-blacklist.conf&lt;br /&gt;
# blacklist spi and i2c by default (many users don&#039;t need them)&lt;br /&gt;
&lt;br /&gt;
#blacklist spi-bcm2708&lt;br /&gt;
blacklist i2c-bcm2708&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Raspberry Konfigurations tool &#039;&#039;raspi-config&#039;&#039; wie es bspw. bei NOOB Installation automatisch gestartet wird, findet sich versteckt unter &#039;&#039;&amp;quot;8 Advanced Options &amp;quot;&#039;&#039; der Unterpunkt &#039;&#039;SPI&#039;&#039; der standardmäßig auf No steht und so das Laden das benötigten Kernel-moduls verhindert. Setzt man diese Option auf &#039;&#039;Yes&#039;&#039; entfällt u.U. die oben beschriebene manuelle Aktivierung des SPI-Moduls.&lt;br /&gt;
 &lt;br /&gt;
=AVR-Programmer=&lt;br /&gt;
Um AVR-µC zu programmieren, benötigt man ein modifiziertes &#039;&#039;avrdude&#039;&#039; - ein weit verbreitetes Programmiertool. Dieses findet mal als Quellcode in einem git-Source-Depot und kompiliert es direkt&lt;br /&gt;
auf dem RasPi. Dazu werden weitere Pakete benötigt die aber nach Installation des kompilierten &#039;&#039;avrdude&#039;&#039; wieder entfernt werden können. Der &#039;&#039;avrdude&#039;&#039; nutzt auf dem RasPi die SPI-Schnittstelle auf der GPIO-Leiste und ein weiteres GPIO-Pin für die Resetleitung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:RasPi prog ATMega328P.JPG|thumb|400px|ATmega328P auf breadboard mit RasPi als Programmer]]&lt;br /&gt;
&lt;br /&gt;
==Verdrahtung==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Wiring RasPi &amp;lt;-&amp;gt; AVR&lt;br /&gt;
|-&lt;br /&gt;
!Signal  ||RasPi     ||Atmel  ||Mega32&lt;br /&gt;
|-&lt;br /&gt;
|MOSI    ||GPIO 10   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|MISO    ||GPIO  9   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|SCLK    ||GPIO 11   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|RST_N   ||GPIO 25   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|3V3     ||          ||       || &lt;br /&gt;
|- &lt;br /&gt;
|GND     ||          ||       || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation der Compiler==&lt;br /&gt;
Um die Quelltexte für den &#039;&#039;avrdude&#039;&#039; aus den Depot runter zuladen, automatisch anzupassen und zu übersetzen &lt;br /&gt;
sind diese 6 Pakete nötig:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;git&#039;&#039; - Source-Versionsverwaltung, nötig zum Download der avrdude-Sources, Paketname &#039;&#039;git-core&#039;&#039;&lt;br /&gt;
*&#039;&#039;make&#039;&#039; - zum Regelbasierten Built aus den Quelltexten&lt;br /&gt;
*&#039;&#039;autoconf&#039;&#039; - zwecks Anpassung der Compiler-Skripte an das RasPi-Linux&lt;br /&gt;
*&#039;&#039;gcc&#039;&#039; - C-Compiler&lt;br /&gt;
*&#039;&#039;bison&#039;&#039; - mit Flex zusammen zum parsen von Quelltexten/Konfigdateien&lt;br /&gt;
*&#039;&#039;flex&#039;&#039; - mit bison zusammen zum parsen von Quelltexten/Konfigdateien&lt;br /&gt;
&lt;br /&gt;
Wer direkt auf dem RasPi in C/ASM für den AVR µC programmieren möchte, sollte auch folgende 3 Pakete installieren. Für die Nutzung des RasPi nur als avr-programmer sind sie nicht nötig:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;gcc-avr&#039;&#039;&lt;br /&gt;
*&#039;&#039;binutils-avr&#039;&#039; &lt;br /&gt;
*&#039;&#039;avr-libc&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kommando:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install gcc git-core make  bison autoconf flex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==avrdude Sourcen für RasPi aus Depot holen==&lt;br /&gt;
Depot: &lt;br /&gt;
https://github.com/kcuzner/avrude&lt;br /&gt;
Befehl: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/kcuzner/avrude&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loginformationen zeigt &#039;&#039;git&#039;&#039; mit &#039;&#039;git log&#039;&#039; an, Aktualisierungen werden mit &#039;&#039;git pull origin&#039;&#039; heruntergeladen.&lt;br /&gt;
&lt;br /&gt;
==avrdude übersetzen und installieren==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd avrdude/avrdude&lt;br /&gt;
./bootstrap &amp;amp;&amp;amp; ./configure&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Einstellungen avrdude überprüfen und testen==&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;/usr/local/etc/averdude.conf&#039;&#039; stehen die Einstellungen für die verschiedenen AVR Programmer wie die Pinzuordnung - Welches AVR-Pin mit welchem Programmer Pin verbunden ist.&lt;br /&gt;
Für den RasPi finden sich diese in der Sektion &#039;&#039;linuxspi&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
programmer &lt;br /&gt;
  id       = &amp;quot;linuxspi&amp;quot;;&lt;br /&gt;
  desc     = &amp;quot;Use Linux SPI device in /dev/spidev*&amp;quot;;&lt;br /&gt;
  type     = &amp;quot;linuxspi&amp;quot;;&lt;br /&gt;
  reset    = 25;&lt;br /&gt;
  baudrate = 400000;&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier das Pin das mit dem Reset des AVR verbunden ist (Zeile &#039;&#039;reset = 25&#039;&#039;). Das kann ein beliebiges GPIO-Pin sein, hier wurde das Pin &#039;&#039;GPIO25&#039;&#039; gewählt. Die SPI-Pins (&#039;&#039;MISO&#039;&#039;, &#039;&#039;MOSI&#039;&#039;, &#039;&#039;CLK&#039;&#039;) sind nicht wählbar, da der RasPi in allen betrachteten Modellen nur einen SPI-Port hat.&lt;br /&gt;
 &lt;br /&gt;
Kritisch ist ebenfalls der Eintrag unter baudrate. Mit diesen wird eingestellt wie schnell das Signal &#039;&#039;SPI_CLK&#039;&#039; schaltet und damit wie schnell der Controller programmiert wird. Die maximal mögliche Baudrate variiert je nach AVR-Typ, Versorgungsspannung, Taktbeschaltung und Konfigurationsregister. Ein sicherer Wert sind 125 kHz, die default Einstellung des avrdude liegt mit 400 000 deutlich darüber. Deshalb sollte man bei Problemen die Zeile zu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  baudrate = 100000;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ändern.&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Auslesen des Flash-Speichers des controllers, hinter &#039;&#039;-p&#039;&#039; den Typ des Controllers (hier ATmega 328P) angeben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/local/bin/avrdude -c linuxspi -p m328p -P /dev/spidev0.0 -U flash:r:&amp;quot;/dev/null&amp;quot;:r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typische Fehler==&lt;br /&gt;
Der Fehler kann sein&lt;br /&gt;
*unvollständige Installation des Betriebssystem, wie Treiber für SPI nicht aktiv&lt;br /&gt;
*falsche Bedienung Programmiertool &#039;&#039;avrdude&#039;&#039; bspw. ohne root-Rechte (&#039;&#039;sudo&#039;&#039;)&lt;br /&gt;
*Verdrahtungsfehler bspw. Widerstand an der Reset-Leitung falsch&lt;br /&gt;
&lt;br /&gt;
avrdude schreibt auch Fehlermeldungen von Folgefehlern wie &#039;&#039;avrdude initialization failed&#039;&#039; was auf einen Fehler&lt;br /&gt;
in der Verdrahtung deutet, die eigentlich Fehlermeldung allerdings einige Zeilen früher genannt&lt;br /&gt;
wird: &amp;quot;Unable to open SPI Port&amp;quot;. Man tut also gut daran, die Ausgaben von avrdude komplett zu lesen.&lt;br /&gt;
&lt;br /&gt;
===Zugriff auf SPI scheitert===&lt;br /&gt;
Die SPI-Schnittstelle liegt wie alle Geräte im Verzeichnis &#039;&#039;/dev/&#039;&#039; , am besten mit &#039;&#039;ls /dev/&#039;&#039; überprüfen. Findet sich dort kein &#039;&#039;spidev0.0&#039;&#039; ist der SPI-Treiber/-module nicht aktiv oder nicht installiert. Siehe dazu Abschnitt SPI oben.&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die SPI - Schnittstelle sind root-Rechte erforderlich. &#039;&#039;avrdude&#039;&#039; ist also von root - login oder mit vorangestellten &#039;&#039;sudo&#039;&#039; zu starten. &lt;br /&gt;
&lt;br /&gt;
===Der µC meldet sich nicht===&lt;br /&gt;
Oft sind fehlende oder falsche elektrische Verbindungen dafür verantwortlich. Man sollte jetzt die Spannungen&lt;br /&gt;
zwischen &#039;&#039;Vcc&#039;&#039; und &#039;&#039;GND&#039;&#039; resp. zwischen &#039;&#039;AVcc&#039;&#039; und &#039;&#039;GND&#039;&#039; am Controller messen. Die sollten 3.3 V betragen. Muss man den Controller mit 5V betreiben ist statt auf 3.3 V auf 5.0V zu prüfen und die Pegelwandler (levelshifter) zwischen Controller und RasPi. Die 5V sind an der GPIO-Leiste des RasPi&#039;s meist etwas geringer (~ 4.9V), eine leistungsstarke RasPi Stromversorgung (USB-Netzteil 1000 mA) und das Abziehen von beim AVR-Programmieren unbenutzte Hardware wie WLAN-Stick hilft dabei. &lt;br /&gt;
&lt;br /&gt;
An der Reset-Leitung sollte im Normalfall die Betriebsspannung (3.3 V) anliegen, nur während der Programmierung misst man hier 0V. Die anderen Verbindungen klingelt man im stromlosen Zustand durch oder prüft die Signale mit einem Oszilloskop. &lt;br /&gt;
&lt;br /&gt;
Für manche AVR-Typen muss der Code von avrdude leicht angepasst werden, sonst wird der µC nach Umstellung auf Quarztakt nicht mehr ansprechbar: [https://www.mikrocontroller.net/topic/356707#3985870 Patch].&lt;br /&gt;
&lt;br /&gt;
Weitere Tipps zur Fehlersuche finden sich in der [[AVR_Checkliste]].&lt;br /&gt;
&lt;br /&gt;
=JTAG dongle/ FPGA-programmer=&lt;br /&gt;
Über JTAG sind auch FPGA&#039;s und deren Firmware-PROMs programmierbar. Als Programmier-tool ist hierfür die OpenOCD-Software einsetzbar. Für JTAG wird nicht die SPI-Schnittstelle, sondern &amp;quot;normale&amp;quot; GPIO-Pins genutzt. &lt;br /&gt;
&lt;br /&gt;
Achtung: der RasPi unterstützt nur 3V3 Pegel, die JTAG-Schnittstelle auf den FPGA&#039;s kann je nach Beschaltung auch andere Spannungspegel beispielsweise 2V5 erfordern.&lt;br /&gt;
&lt;br /&gt;
=Links/Quellen=&lt;br /&gt;
*Deutschsprachige Beschreibung RasPi AVR programmer [http://www.forum-raspberrypi.de/Thread-tutorial-raspberry-als-programmiergeraet-fuer-atmel-%C2%B5controller]&lt;br /&gt;
*Englischsprachige Beschreibung der avrdude Variante [https://gist.github.com/akavel/8832366]&lt;br /&gt;
--&lt;br /&gt;
*Website OpenOCD (JTAG-Software): [http://openocd.sourceforge.net/about/]&lt;br /&gt;
--&lt;br /&gt;
*Elektrische Kenn- und Grenzwerte GPIOs: [http://www.mosaic-industries.com/embedded-systems/microcontroller-projects/raspberry-pi/gpio-pin-electrical-specifications]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_als_Universalprogrammer&amp;diff=86949</id>
		<title>Raspberry Pi als Universalprogrammer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_als_Universalprogrammer&amp;diff=86949"/>
		<updated>2015-01-31T07:50:00Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Der µC meldet sich nicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014-12-27: Dieser Artikel hat &amp;quot;Reife&amp;quot;, die Beschreibung wie man den RasPi als AVR Programmer nutzt ist komplett.&lt;br /&gt;
&lt;br /&gt;
[[Datei:AllesPowerBar.JPG|thumb|400px|Raspberry Pi as AVR-programmer]]&lt;br /&gt;
=Vorüberlegungen=&lt;br /&gt;
==Grundkonzept==&lt;br /&gt;
Die nötigen GPIO&#039;s des Raspberries sind mit dem Programmierinterface des µC verbunden, ebenso die Stromversorgung&lt;br /&gt;
des zu programmierenden Devices. Die Programmierdatei wird von einem Host-PC auf den RasPi kopiert.&lt;br /&gt;
Über die Kommandozeile wird das Programmiertool auf dem RasPi gestartet.&lt;br /&gt;
&lt;br /&gt;
===Variante Ethernet-Dongle===&lt;br /&gt;
Ein Raspi ist über Ethernet mit einem PC verbunden. Auf dem PC (Laptop, Windows, Apple, egal) &lt;br /&gt;
läuft ein Terminal-Programm mit dem die Programmiertools auf dem RasPi gesteuert werden. &lt;br /&gt;
Die Programmierdatei wird ebenfalls über Ethernet auf den RasPi übetragen. Falls diese Konfiguration auch&lt;br /&gt;
an einem Laptop laufen soll muss die Powersupply auch mobil sein, also kein Steckernetzteil.&lt;br /&gt;
 &lt;br /&gt;
===Variante Standalone Programmer===&lt;br /&gt;
Der RasPi läuft als StandAlone Programmer, also ohne verbundenen PC. Dann muss am RasPi eine Tastatur über&lt;br /&gt;
USB und ein Monitor über HDMI angeschlossen sein.&lt;br /&gt;
&lt;br /&gt;
===Variante WLAN===&lt;br /&gt;
Erfordert Router? &lt;br /&gt;
&lt;br /&gt;
===Headless Betrieb===&lt;br /&gt;
Für die Nutzung des RasPis ohne Monitor und RasPi eigene Tastatur nur über eine &#039;&#039;ssh&#039;&#039;-Verbindung über Ethernet (headless Betrieb) werden oft Einstellungen vorgeschlagen, die leider dazu führen das eine Internetverbindung des RaspPis über WLAN nicht mehr möglich ist. Leider ist es dann auch nicht mehr möglich die Pakete für den Programmer zu installieren. Deshalb empfiehlt der Autor erst nachdem der RasPi nachweislich als Programmer funktioniert, diesen auf Headless-Betrieb umzustellen.&lt;br /&gt;
&lt;br /&gt;
Der Autor hat seinen Raspi über zwei Subnetze eingebunden, eins um den WLAN-router (DHCP, subnetz 192.168.178.*/255.255.0.0) und eins zum über Ethernet angeschloßenen Steuer-PC. Letzteres als statische IP (subnetz 10.1.1.1/255.255.255.0). &lt;br /&gt;
&lt;br /&gt;
Auszug &#039;&#039;/etc/network/interfaces&#039;&#039; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
address 10.1.1.1&lt;br /&gt;
netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet manual&lt;br /&gt;
&lt;br /&gt;
wpa-roam /etc/wpa_supplicant/wpa_supplivant.conf&lt;br /&gt;
iface default inet dhcp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Filetransfer===&lt;br /&gt;
Um Dateien wie das Flash-Image für den µC zwischen Steuer-PC und RasPi zu transferien gibt es mehrere Möglichkeiten. Die typischen sind &#039;&#039;ftp&#039;&#039; oder &#039;&#039;SAMBA&#039;&#039; (Windows-PC). Bei beiden ist der jeweils der passende Server aus dem RasPi zu installieren und gegebenfalls der Port dafür in der firewall freizuschalten. FTP scheint die einfachere und universellere Variante zu sein, da diese mit beliebeigen ftp-programmen funktioniert. Als ftpserver macht &#039;&#039;proftpd&#039;&#039; eine gute Figur.&lt;br /&gt;
*Installationsanleitung für proftd: [http://www.gnet4u.de/raspberryweb/proFTPD.pdf]&lt;br /&gt;
*Firewallfreischaltungen beispielsweise für ftp: [http://www.gtkdb.de/index_36_2253.html]&lt;br /&gt;
&lt;br /&gt;
==RasPi Hardware==   &lt;br /&gt;
===Modell-Auswahl===&lt;br /&gt;
Für die stand-alone Variante (RasPi mit Tastatur und Monitor) eignen sich model-A und B gleichermaßen,&lt;br /&gt;
Dagegen ist eine Terminalverbindung über Ethernet mit dem Modell A oder A+ nicht möglich da diesem die Schnittstelle fehlt. Eine Terminalverbindung über WLAN dagegen ist mit allen RasPi&#039;s möglich. Die A+ und B+ Modelle bieten zwar mehr GPIO&#039;s, die Grundausstattung der RasPi ohne Plus genügt aber für den Einsatz als &lt;br /&gt;
Programmer völlig. &lt;br /&gt;
&lt;br /&gt;
Der portable Betrieb mit Speisung über eine USB-Powerbar oder aus den USB-Ports&lt;br /&gt;
eines Laptops ist dem &amp;quot;Plus&amp;quot; Modellen einfacher da diese dank effizienter Regler weniger verbrauchen.&lt;br /&gt;
Ohne diese Regler gerät das Model B (ohne plus) schnell an die Grenze einer USB-Stromversorgung.&lt;br /&gt;
Das kann zu ungewollten Neustarts des RasPi führen, Abhilfe schafft nur ein sehr gutes USB-Netzteil.&lt;br /&gt;
Etwas geringer wird das Problem  wenn der RasPi über ein sogenanntes Y-Kabel von zwei USB-Anschlüssen des Laptops betrieben wird.&lt;br /&gt;
Ein USB-Anschluss darf mit höchstens 500 mA belastet werden, mit  dem genannten Kabel erhöht sich der verfügbare Strom auf 600 mA (Nach USB2.0.-Spec).&lt;br /&gt;
&lt;br /&gt;
===Raspberry Pinleiste===   &lt;br /&gt;
Der RasPi kann über seine Steckerleiste folgende Interface ansteuern&lt;br /&gt;
*Bitwackler (bitbanging) über 25 GPIO (Model b+)&lt;br /&gt;
*SPI  (wie die ISP -Schnittstelle der Atmel AVR-controller) 2x SPI_CE ; 3 Pins MISO,MOSI,SCLK&lt;br /&gt;
*UART (ein Paar RxD/TxD) &lt;br /&gt;
*I2C   (?ein Paar SDA,SCL)&lt;br /&gt;
&lt;br /&gt;
Ebenso liegen an zwei Pins 3V3 an mit denen bspw. ein µC leicht versorgbar ist. An zwei weiteren Pins stellt&lt;br /&gt;
der RasPi 5V zur Verfügung, allerdings ist die Spannung verbrauchsabhängig meist etwas niedriger.&lt;br /&gt;
Massepotential liegt an 8 (Modell B+) Pins.&lt;br /&gt;
&lt;br /&gt;
Das Bitwackler Interface kann natürlich auch SPI, UART und I2C nachstellen, allerdings mit erhöhten Programmieraufwand&lt;br /&gt;
und meist nicht so schnell wie mit den speziellen SPI-Pins. Dafür ist es erste Wahl bei anderen Schnittstellen&lt;br /&gt;
wie JTAG.&lt;br /&gt;
&lt;br /&gt;
==Beschaltung==&lt;br /&gt;
Es gelten die üblichen RasPi GPIO Hinweise: &lt;br /&gt;
*An die Eingänge keine Signale mit Pegel höher 3.3V oder kleiner als 0V legen, diese können die CPU beschädigen. &lt;br /&gt;
*Schäden können auch auftreten falls ein Pin mit mehr Strom belastet wird als konfiguriert. Minimal sind 2 mA ein höherer Wert in 2 mA Schritten aber nicht mehr als 16 mA kann konfiguriert werden. Dieser Wert gilt für alle GPIO&#039;s, er kann nicht Pin-individuell geändert werden. Nach einem Reset ist ein Wert von  8 mA voreingestellt. Nie mehr Strom &amp;quot;ziehen&amp;quot; als konfiguriert, ganz vorsichtige Naturen begrenzen den Strom durch einen Serienwiderstand (bspw. 10k).&lt;br /&gt;
*Die 3V3 Spannung an der Pin-leiste wird über einen IC erzeugt, der höchstens 50 mA zur Verfügung stellt. (Dieser Wert wurde für die nicht &#039;+&#039; Modelle angegeben, möglichweise bei den im Bereich der Stromversorgung überarbeiteten &#039;+&#039; Modellen höher.&lt;br /&gt;
&lt;br /&gt;
===Bitwackler===&lt;br /&gt;
nicht unbedingt schnell (über Python 60 KHz ermittelt), mit passenden Treibern sollten &lt;br /&gt;
aber mehrere Hundert kHz möglich sein. Dafür ist das timing nach belieben programmierbar, was bspw. für&lt;br /&gt;
JTAG nützlich ist.&lt;br /&gt;
&lt;br /&gt;
===SPI-Schnittstelle und -Treiber===&lt;br /&gt;
Der RasPi hat in den betrachten Modellen (&amp;quot;model A&amp;quot;, &amp;quot;model B&amp;quot;, &amp;quot;model B+&amp;quot;) nur eine SPI-Schnittstelle, die&lt;br /&gt;
bei allen dreien die selben Pins nutzt. Varianten sind nur in der Nutzung der beiden Pins &#039;&#039;SPI_CE0&#039;&#039; und &#039;&#039;SPI_CE1&#039;&#039; möglich, welche eines der angeschlossenen SPI-Geräte auswählen (bis zu zwei möglich). Befindet sich nur ein Gerät an dieser Schnittstelle können die beiden &#039;&#039;SPI_CE&#039;&#039; Pins unbenutzt bleiben.&lt;br /&gt;
 &lt;br /&gt;
Für die Nutzung der SPI - Schnittstelle des RasPi muß der passende SPI-Treiber (module) laufen. Das ist an dem&lt;br /&gt;
vorhandenen device &#039;&#039;/dev/spi0.0&#039;&#039; erkennbar. Findet sich unter &#039;&#039;/dev/&#039;&#039; kein SPI-device, dann ist das Module nicht gestartet. Dieses wird über &#039;&#039;modprobe spi-bcm2708&#039;&#039; manuell gestartet. Soll es automatisch gestartet werden, darf das SPI-module nicht auf der schwarzen Liste &#039;&#039;/etc/modprobe.d/raspi-blacklist.conf&#039;&#039; stehen. Falls dort die Zeile &#039;&#039;blacklist spi-bcm2708&#039;&#039; steht mit einem vorangestellten &#039;#&#039; deaktivieren oder die gesamte Zeile löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# file: /etc/modprobe.d/raspi-blacklist.conf&lt;br /&gt;
# blacklist spi and i2c by default (many users don&#039;t need them)&lt;br /&gt;
&lt;br /&gt;
#blacklist spi-bcm2708&lt;br /&gt;
blacklist i2c-bcm2708&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Raspberry Konfigurations tool &#039;&#039;raspi-config&#039;&#039; wie es bspw. bei NOOB Installation automatisch gestartet wird, findet sich versteckt unter &#039;&#039;&amp;quot;8 Advanced Options &amp;quot;&#039;&#039; der Unterpunkt &#039;&#039;SPI&#039;&#039; der standardmäßig auf No steht und so das Laden das benötigten Kernel-moduls verhindert. Setzt man diese Option auf &#039;&#039;Yes&#039;&#039; entfällt u.U. die oben beschriebene manuelle Aktivierung des SPI-Moduls.&lt;br /&gt;
 &lt;br /&gt;
=AVR-Programmer=&lt;br /&gt;
Um AVR-µC zu programmieren, benötigt man ein modifiziertes &#039;&#039;avrdude&#039;&#039; - ein weit verbreitetes Programmiertool. Dieses findet mal als Quellcode in einem git-Source-Depot und kompiliert es direkt&lt;br /&gt;
auf dem RasPi. Dazu werden weitere Pakete benötigt die aber nach Installation des kompilierten &#039;&#039;avrdude&#039;&#039; wieder entfernt werden können. Der &#039;&#039;avrdude&#039;&#039; nutzt auf dem RasPi die SPI-Schnittstelle auf der GPIO-Leiste und ein weiteres GPIO-Pin für die Resetleitung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:RasPi prog ATMega328P.JPG|thumb|400px|ATmega328P auf breadboard mit RasPi als Programmer]]&lt;br /&gt;
&lt;br /&gt;
==Verdrahtung==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Wiring RasPi &amp;lt;-&amp;gt; AVR&lt;br /&gt;
|-&lt;br /&gt;
!Signal  ||RasPi     ||Atmel  ||Mega32&lt;br /&gt;
|-&lt;br /&gt;
|MOSI    ||GPIO 10   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|MISO    ||GPIO  9   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|SCLK    ||GPIO 11   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|RST_N   ||GPIO 25   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|3V3     ||          ||       || &lt;br /&gt;
|- &lt;br /&gt;
|GND     ||          ||       || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation der Compiler==&lt;br /&gt;
Um die Quelltexte für den &#039;&#039;avrdude&#039;&#039; aus den Depot runter zuladen, automatisch anzupassen und zu übersetzen &lt;br /&gt;
sind diese 6 Pakete nötig:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;git&#039;&#039; - Source-Versionsverwaltung, nötig zum Download der avrdude-Sources, Paketname &#039;&#039;git-core&#039;&#039;&lt;br /&gt;
*&#039;&#039;make&#039;&#039; - zum Regelbasierten Built aus den Quelltexten&lt;br /&gt;
*&#039;&#039;autoconf&#039;&#039; - zwecks Anpassung der Compiler-Skripte an das RasPi-Linux&lt;br /&gt;
*&#039;&#039;gcc&#039;&#039; - C-Compiler&lt;br /&gt;
*&#039;&#039;bison&#039;&#039; - mit Flex zusammen zum parsen von Quelltexten/Konfigdateien&lt;br /&gt;
*&#039;&#039;flex&#039;&#039; - mit bison zusammen zum parsen von Quelltexten/Konfigdateien&lt;br /&gt;
&lt;br /&gt;
Wer direkt auf dem RasPi in C/ASM für den AVR µC programmieren möchte, sollte auch folgende 3 Pakete installieren. Für die Nutzung des RasPi nur als avr-programmer sind sie nicht nötig:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;gcc-avr&#039;&#039;&lt;br /&gt;
*&#039;&#039;binutils-avr&#039;&#039; &lt;br /&gt;
*&#039;&#039;avr-libc&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kommando:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install gcc git-core make  bison autoconf flex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==avrdude Sourcen für RasPi aus Depot holen==&lt;br /&gt;
Depot: &lt;br /&gt;
https://github.com/kcuzner/avrude&lt;br /&gt;
Befehl: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/kcuzner/avrude&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loginformationen zeigt &#039;&#039;git&#039;&#039; mit &#039;&#039;git log&#039;&#039; an, Aktualisierungen werden mit &#039;&#039;git pull origin&#039;&#039; heruntergeladen.&lt;br /&gt;
&lt;br /&gt;
==avrdude übersetzen und installieren==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd avrdude/avrdude&lt;br /&gt;
./bootstrap &amp;amp;&amp;amp; ./configure&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Einstellungen avrdude überprüfen und testen==&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;/usr/local/etc/averdude.conf&#039;&#039; stehen die Einstellungen für die verschiedenen AVR Programmer wie die Pinzuordnung - Welches AVR-Pin mit welchem Programmer Pin verbunden ist.&lt;br /&gt;
Für den RasPi finden sich diese in der Sektion &#039;&#039;linuxspi&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
programmer &lt;br /&gt;
  id       = &amp;quot;linuxspi&amp;quot;;&lt;br /&gt;
  desc     = &amp;quot;Use Linux SPI device in /dev/spidev*&amp;quot;;&lt;br /&gt;
  type     = &amp;quot;linuxspi&amp;quot;;&lt;br /&gt;
  reset    = 25;&lt;br /&gt;
  baudrate = 400000;&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier das Pin das mit dem Reset des AVR verbunden ist (Zeile &#039;&#039;reset = 25&#039;&#039;). Das kann ein beliebiges GPIO-Pin sein, hier wurde das Pin &#039;&#039;GPIO25&#039;&#039; gewählt. Die SPI-Pins (&#039;&#039;MISO&#039;&#039;, &#039;&#039;MOSI&#039;&#039;, &#039;&#039;CLK&#039;&#039;) sind nicht wählbar, da der RasPi in allen betrachteten Modellen nur einen SPI-Port hat.&lt;br /&gt;
 &lt;br /&gt;
Kritisch ist ebenfalls der Eintrag unter baudrate. Mit diesen wird eingestellt wie schnell das Signal &#039;&#039;SPI_CLK&#039;&#039; schaltet und damit wie schnell der Controller programmiert wird. Die maximal mögliche Baudrate variiert je nach AVR-Typ, Versorgungsspannung, Taktbeschaltung und Konfigurationsregister. Ein sicherer Wert sind 125 kHz, die default Einstellung des avrdude liegt mit 400 000 deutlich darüber. Deshalb sollte man bei Problemen die Zeile zu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  baudrate = 100000;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ändern.&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Auslesen des Flash-Speichers des controllers, hinter &#039;&#039;-p&#039;&#039; den Typ des Controllers (hier ATmega 328P) angeben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/local/bin/avrdude -c linuxspi -p m328p -P /dev/spidev0.0 -U flash:r:&amp;quot;/dev/null&amp;quot;:r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typische Fehler==&lt;br /&gt;
Der Fehler kann sein&lt;br /&gt;
*unvollständige Installation des Betriebssystem, wie Treiber für SPI nicht aktiv&lt;br /&gt;
*falsche Bedienung Programmiertool &#039;&#039;avrdude&#039;&#039; bspw. ohne root-Rechte (&#039;&#039;sudo&#039;&#039;)&lt;br /&gt;
*Verdrahtungsfehler bspw. Widerstand an der Reset-Leitung falsch&lt;br /&gt;
&lt;br /&gt;
avrdude schreibt auch Fehlermeldungen von Folgefehlern wie &#039;&#039;avrdude initialization failed&#039;&#039; was auf einen Fehler&lt;br /&gt;
in der Verdrahtung deutet, die eigentlich Fehlermeldung allerdings einige Zeilen früher genannt&lt;br /&gt;
wird: &amp;quot;Unable to open SPI Port&amp;quot;. Man tut also gut daran, die Ausgaben von avrdude komplett zu lesen.&lt;br /&gt;
&lt;br /&gt;
===Zugriff auf SPI scheitert===&lt;br /&gt;
Die SPI-Schnittstelle liegt wie alle Geräte im Verzeichnis &#039;&#039;/dev/&#039;&#039; , am besten mit &#039;&#039;ls /dev/&#039;&#039; überprüfen. Findet sich dort kein &#039;&#039;spidev0.0&#039;&#039; ist der SPI-Treiber/-module nicht aktiv oder nicht installiert. Siehe dazu Abschnitt SPI oben.&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die SPI - Schnittstelle sind root-Rechte erforderlich. &#039;&#039;avrdude&#039;&#039; ist also von root - login oder mit vorangestellten &#039;&#039;sudo&#039;&#039; zu starten. &lt;br /&gt;
&lt;br /&gt;
===Der µC meldet sich nicht===&lt;br /&gt;
Oft sind fehlende oder falsche elektrische Verbindungen dafür verantwortlich. Man sollte jetzt die Spannungen&lt;br /&gt;
zwischen &#039;&#039;Vcc&#039;&#039; und &#039;&#039;GND&#039;&#039; resp. zwischen &#039;&#039;AVcc&#039;&#039; und &#039;&#039;GND&#039;&#039; am Controller messen. Die sollten 3.3 V betragen. Muss man den Controller mit 5V betreiben ist statt auf 3.3 V auf 5.0V zu prüfen und die Pegelwandler (levelshifter) zwischen Controller und RasPi. Die 5V sind an der GPIO-Leiste des RasPi&#039;s meist etwas geringer (~ 4.9V), eine leistungsstarke RasPi Stromversorgung (USB-Netzteil 1000 mA) und das Abziehen von beim AVR-Programmieren unbenutzte Hardware wie WLAN-Stick hilft dabei. &lt;br /&gt;
&lt;br /&gt;
An der Reset-Leitung sollte im Normalfall die Betriebsspannung (3.3 V) anliegen, nur während der Programmierung misst man hier 0V. Die anderen Verbindungen klingelt man im stromlosen Zustand durch oder prüft die Signale mit einem Oszilloskop. &lt;br /&gt;
&lt;br /&gt;
Für manche AVR-Typen muss der Code von avrdude leicht angepasst werden, sonst wird der µC nach Umstellung auf Quarztakt nicht meht ansprechbar: [https://www.mikrocontroller.net/topic/356707#3985870 Patch].&lt;br /&gt;
&lt;br /&gt;
Weitere Tipps zur Fehlersuche finden sich in der [[AVR_Checkliste]].&lt;br /&gt;
&lt;br /&gt;
=JTAG dongle/ FPGA-programmer=&lt;br /&gt;
Über JTAG sind auch FPGA&#039;s und deren Firmware-PROMs programmierbar. Als Programmier-tool ist hierfür die OpenOCD-Software einsetzbar. Für JTAG wird nicht die SPI-Schnittstelle, sondern &amp;quot;normale&amp;quot; GPIO-Pins genutzt. &lt;br /&gt;
&lt;br /&gt;
Achtung: der RasPi unterstützt nur 3V3 Pegel, die JTAG-Schnittstelle auf den FPGA&#039;s kann je nach Beschaltung auch andere Spannungspegel beispielsweise 2V5 erfordern.&lt;br /&gt;
&lt;br /&gt;
=Links/Quellen=&lt;br /&gt;
*Deutschsprachige Beschreibung RasPi AVR programmer [http://www.forum-raspberrypi.de/Thread-tutorial-raspberry-als-programmiergeraet-fuer-atmel-%C2%B5controller]&lt;br /&gt;
*Englischsprachige Beschreibung der avrdude Variante [https://gist.github.com/akavel/8832366]&lt;br /&gt;
--&lt;br /&gt;
*Website OpenOCD (JTAG-Software): [http://openocd.sourceforge.net/about/]&lt;br /&gt;
--&lt;br /&gt;
*Elektrische Kenn- und Grenzwerte GPIOs: [http://www.mosaic-industries.com/embedded-systems/microcontroller-projects/raspberry-pi/gpio-pin-electrical-specifications]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_als_Universalprogrammer&amp;diff=86948</id>
		<title>Raspberry Pi als Universalprogrammer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_als_Universalprogrammer&amp;diff=86948"/>
		<updated>2015-01-31T07:47:42Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014-12-27: Dieser Artikel hat &amp;quot;Reife&amp;quot;, die Beschreibung wie man den RasPi als AVR Programmer nutzt ist komplett.&lt;br /&gt;
&lt;br /&gt;
[[Datei:AllesPowerBar.JPG|thumb|400px|Raspberry Pi as AVR-programmer]]&lt;br /&gt;
=Vorüberlegungen=&lt;br /&gt;
==Grundkonzept==&lt;br /&gt;
Die nötigen GPIO&#039;s des Raspberries sind mit dem Programmierinterface des µC verbunden, ebenso die Stromversorgung&lt;br /&gt;
des zu programmierenden Devices. Die Programmierdatei wird von einem Host-PC auf den RasPi kopiert.&lt;br /&gt;
Über die Kommandozeile wird das Programmiertool auf dem RasPi gestartet.&lt;br /&gt;
&lt;br /&gt;
===Variante Ethernet-Dongle===&lt;br /&gt;
Ein Raspi ist über Ethernet mit einem PC verbunden. Auf dem PC (Laptop, Windows, Apple, egal) &lt;br /&gt;
läuft ein Terminal-Programm mit dem die Programmiertools auf dem RasPi gesteuert werden. &lt;br /&gt;
Die Programmierdatei wird ebenfalls über Ethernet auf den RasPi übetragen. Falls diese Konfiguration auch&lt;br /&gt;
an einem Laptop laufen soll muss die Powersupply auch mobil sein, also kein Steckernetzteil.&lt;br /&gt;
 &lt;br /&gt;
===Variante Standalone Programmer===&lt;br /&gt;
Der RasPi läuft als StandAlone Programmer, also ohne verbundenen PC. Dann muss am RasPi eine Tastatur über&lt;br /&gt;
USB und ein Monitor über HDMI angeschlossen sein.&lt;br /&gt;
&lt;br /&gt;
===Variante WLAN===&lt;br /&gt;
Erfordert Router? &lt;br /&gt;
&lt;br /&gt;
===Headless Betrieb===&lt;br /&gt;
Für die Nutzung des RasPis ohne Monitor und RasPi eigene Tastatur nur über eine &#039;&#039;ssh&#039;&#039;-Verbindung über Ethernet (headless Betrieb) werden oft Einstellungen vorgeschlagen, die leider dazu führen das eine Internetverbindung des RaspPis über WLAN nicht mehr möglich ist. Leider ist es dann auch nicht mehr möglich die Pakete für den Programmer zu installieren. Deshalb empfiehlt der Autor erst nachdem der RasPi nachweislich als Programmer funktioniert, diesen auf Headless-Betrieb umzustellen.&lt;br /&gt;
&lt;br /&gt;
Der Autor hat seinen Raspi über zwei Subnetze eingebunden, eins um den WLAN-router (DHCP, subnetz 192.168.178.*/255.255.0.0) und eins zum über Ethernet angeschloßenen Steuer-PC. Letzteres als statische IP (subnetz 10.1.1.1/255.255.255.0). &lt;br /&gt;
&lt;br /&gt;
Auszug &#039;&#039;/etc/network/interfaces&#039;&#039; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
address 10.1.1.1&lt;br /&gt;
netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet manual&lt;br /&gt;
&lt;br /&gt;
wpa-roam /etc/wpa_supplicant/wpa_supplivant.conf&lt;br /&gt;
iface default inet dhcp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Filetransfer===&lt;br /&gt;
Um Dateien wie das Flash-Image für den µC zwischen Steuer-PC und RasPi zu transferien gibt es mehrere Möglichkeiten. Die typischen sind &#039;&#039;ftp&#039;&#039; oder &#039;&#039;SAMBA&#039;&#039; (Windows-PC). Bei beiden ist der jeweils der passende Server aus dem RasPi zu installieren und gegebenfalls der Port dafür in der firewall freizuschalten. FTP scheint die einfachere und universellere Variante zu sein, da diese mit beliebeigen ftp-programmen funktioniert. Als ftpserver macht &#039;&#039;proftpd&#039;&#039; eine gute Figur.&lt;br /&gt;
*Installationsanleitung für proftd: [http://www.gnet4u.de/raspberryweb/proFTPD.pdf]&lt;br /&gt;
*Firewallfreischaltungen beispielsweise für ftp: [http://www.gtkdb.de/index_36_2253.html]&lt;br /&gt;
&lt;br /&gt;
==RasPi Hardware==   &lt;br /&gt;
===Modell-Auswahl===&lt;br /&gt;
Für die stand-alone Variante (RasPi mit Tastatur und Monitor) eignen sich model-A und B gleichermaßen,&lt;br /&gt;
Dagegen ist eine Terminalverbindung über Ethernet mit dem Modell A oder A+ nicht möglich da diesem die Schnittstelle fehlt. Eine Terminalverbindung über WLAN dagegen ist mit allen RasPi&#039;s möglich. Die A+ und B+ Modelle bieten zwar mehr GPIO&#039;s, die Grundausstattung der RasPi ohne Plus genügt aber für den Einsatz als &lt;br /&gt;
Programmer völlig. &lt;br /&gt;
&lt;br /&gt;
Der portable Betrieb mit Speisung über eine USB-Powerbar oder aus den USB-Ports&lt;br /&gt;
eines Laptops ist dem &amp;quot;Plus&amp;quot; Modellen einfacher da diese dank effizienter Regler weniger verbrauchen.&lt;br /&gt;
Ohne diese Regler gerät das Model B (ohne plus) schnell an die Grenze einer USB-Stromversorgung.&lt;br /&gt;
Das kann zu ungewollten Neustarts des RasPi führen, Abhilfe schafft nur ein sehr gutes USB-Netzteil.&lt;br /&gt;
Etwas geringer wird das Problem  wenn der RasPi über ein sogenanntes Y-Kabel von zwei USB-Anschlüssen des Laptops betrieben wird.&lt;br /&gt;
Ein USB-Anschluss darf mit höchstens 500 mA belastet werden, mit  dem genannten Kabel erhöht sich der verfügbare Strom auf 600 mA (Nach USB2.0.-Spec).&lt;br /&gt;
&lt;br /&gt;
===Raspberry Pinleiste===   &lt;br /&gt;
Der RasPi kann über seine Steckerleiste folgende Interface ansteuern&lt;br /&gt;
*Bitwackler (bitbanging) über 25 GPIO (Model b+)&lt;br /&gt;
*SPI  (wie die ISP -Schnittstelle der Atmel AVR-controller) 2x SPI_CE ; 3 Pins MISO,MOSI,SCLK&lt;br /&gt;
*UART (ein Paar RxD/TxD) &lt;br /&gt;
*I2C   (?ein Paar SDA,SCL)&lt;br /&gt;
&lt;br /&gt;
Ebenso liegen an zwei Pins 3V3 an mit denen bspw. ein µC leicht versorgbar ist. An zwei weiteren Pins stellt&lt;br /&gt;
der RasPi 5V zur Verfügung, allerdings ist die Spannung verbrauchsabhängig meist etwas niedriger.&lt;br /&gt;
Massepotential liegt an 8 (Modell B+) Pins.&lt;br /&gt;
&lt;br /&gt;
Das Bitwackler Interface kann natürlich auch SPI, UART und I2C nachstellen, allerdings mit erhöhten Programmieraufwand&lt;br /&gt;
und meist nicht so schnell wie mit den speziellen SPI-Pins. Dafür ist es erste Wahl bei anderen Schnittstellen&lt;br /&gt;
wie JTAG.&lt;br /&gt;
&lt;br /&gt;
==Beschaltung==&lt;br /&gt;
Es gelten die üblichen RasPi GPIO Hinweise: &lt;br /&gt;
*An die Eingänge keine Signale mit Pegel höher 3.3V oder kleiner als 0V legen, diese können die CPU beschädigen. &lt;br /&gt;
*Schäden können auch auftreten falls ein Pin mit mehr Strom belastet wird als konfiguriert. Minimal sind 2 mA ein höherer Wert in 2 mA Schritten aber nicht mehr als 16 mA kann konfiguriert werden. Dieser Wert gilt für alle GPIO&#039;s, er kann nicht Pin-individuell geändert werden. Nach einem Reset ist ein Wert von  8 mA voreingestellt. Nie mehr Strom &amp;quot;ziehen&amp;quot; als konfiguriert, ganz vorsichtige Naturen begrenzen den Strom durch einen Serienwiderstand (bspw. 10k).&lt;br /&gt;
*Die 3V3 Spannung an der Pin-leiste wird über einen IC erzeugt, der höchstens 50 mA zur Verfügung stellt. (Dieser Wert wurde für die nicht &#039;+&#039; Modelle angegeben, möglichweise bei den im Bereich der Stromversorgung überarbeiteten &#039;+&#039; Modellen höher.&lt;br /&gt;
&lt;br /&gt;
===Bitwackler===&lt;br /&gt;
nicht unbedingt schnell (über Python 60 KHz ermittelt), mit passenden Treibern sollten &lt;br /&gt;
aber mehrere Hundert kHz möglich sein. Dafür ist das timing nach belieben programmierbar, was bspw. für&lt;br /&gt;
JTAG nützlich ist.&lt;br /&gt;
&lt;br /&gt;
===SPI-Schnittstelle und -Treiber===&lt;br /&gt;
Der RasPi hat in den betrachten Modellen (&amp;quot;model A&amp;quot;, &amp;quot;model B&amp;quot;, &amp;quot;model B+&amp;quot;) nur eine SPI-Schnittstelle, die&lt;br /&gt;
bei allen dreien die selben Pins nutzt. Varianten sind nur in der Nutzung der beiden Pins &#039;&#039;SPI_CE0&#039;&#039; und &#039;&#039;SPI_CE1&#039;&#039; möglich, welche eines der angeschlossenen SPI-Geräte auswählen (bis zu zwei möglich). Befindet sich nur ein Gerät an dieser Schnittstelle können die beiden &#039;&#039;SPI_CE&#039;&#039; Pins unbenutzt bleiben.&lt;br /&gt;
 &lt;br /&gt;
Für die Nutzung der SPI - Schnittstelle des RasPi muß der passende SPI-Treiber (module) laufen. Das ist an dem&lt;br /&gt;
vorhandenen device &#039;&#039;/dev/spi0.0&#039;&#039; erkennbar. Findet sich unter &#039;&#039;/dev/&#039;&#039; kein SPI-device, dann ist das Module nicht gestartet. Dieses wird über &#039;&#039;modprobe spi-bcm2708&#039;&#039; manuell gestartet. Soll es automatisch gestartet werden, darf das SPI-module nicht auf der schwarzen Liste &#039;&#039;/etc/modprobe.d/raspi-blacklist.conf&#039;&#039; stehen. Falls dort die Zeile &#039;&#039;blacklist spi-bcm2708&#039;&#039; steht mit einem vorangestellten &#039;#&#039; deaktivieren oder die gesamte Zeile löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# file: /etc/modprobe.d/raspi-blacklist.conf&lt;br /&gt;
# blacklist spi and i2c by default (many users don&#039;t need them)&lt;br /&gt;
&lt;br /&gt;
#blacklist spi-bcm2708&lt;br /&gt;
blacklist i2c-bcm2708&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Raspberry Konfigurations tool &#039;&#039;raspi-config&#039;&#039; wie es bspw. bei NOOB Installation automatisch gestartet wird, findet sich versteckt unter &#039;&#039;&amp;quot;8 Advanced Options &amp;quot;&#039;&#039; der Unterpunkt &#039;&#039;SPI&#039;&#039; der standardmäßig auf No steht und so das Laden das benötigten Kernel-moduls verhindert. Setzt man diese Option auf &#039;&#039;Yes&#039;&#039; entfällt u.U. die oben beschriebene manuelle Aktivierung des SPI-Moduls.&lt;br /&gt;
 &lt;br /&gt;
=AVR-Programmer=&lt;br /&gt;
Um AVR-µC zu programmieren, benötigt man ein modifiziertes &#039;&#039;avrdude&#039;&#039; - ein weit verbreitetes Programmiertool. Dieses findet mal als Quellcode in einem git-Source-Depot und kompiliert es direkt&lt;br /&gt;
auf dem RasPi. Dazu werden weitere Pakete benötigt die aber nach Installation des kompilierten &#039;&#039;avrdude&#039;&#039; wieder entfernt werden können. Der &#039;&#039;avrdude&#039;&#039; nutzt auf dem RasPi die SPI-Schnittstelle auf der GPIO-Leiste und ein weiteres GPIO-Pin für die Resetleitung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:RasPi prog ATMega328P.JPG|thumb|400px|ATmega328P auf breadboard mit RasPi als Programmer]]&lt;br /&gt;
&lt;br /&gt;
==Verdrahtung==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Wiring RasPi &amp;lt;-&amp;gt; AVR&lt;br /&gt;
|-&lt;br /&gt;
!Signal  ||RasPi     ||Atmel  ||Mega32&lt;br /&gt;
|-&lt;br /&gt;
|MOSI    ||GPIO 10   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|MISO    ||GPIO  9   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|SCLK    ||GPIO 11   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|RST_N   ||GPIO 25   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|3V3     ||          ||       || &lt;br /&gt;
|- &lt;br /&gt;
|GND     ||          ||       || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation der Compiler==&lt;br /&gt;
Um die Quelltexte für den &#039;&#039;avrdude&#039;&#039; aus den Depot runter zuladen, automatisch anzupassen und zu übersetzen &lt;br /&gt;
sind diese 6 Pakete nötig:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;git&#039;&#039; - Source-Versionsverwaltung, nötig zum Download der avrdude-Sources, Paketname &#039;&#039;git-core&#039;&#039;&lt;br /&gt;
*&#039;&#039;make&#039;&#039; - zum Regelbasierten Built aus den Quelltexten&lt;br /&gt;
*&#039;&#039;autoconf&#039;&#039; - zwecks Anpassung der Compiler-Skripte an das RasPi-Linux&lt;br /&gt;
*&#039;&#039;gcc&#039;&#039; - C-Compiler&lt;br /&gt;
*&#039;&#039;bison&#039;&#039; - mit Flex zusammen zum parsen von Quelltexten/Konfigdateien&lt;br /&gt;
*&#039;&#039;flex&#039;&#039; - mit bison zusammen zum parsen von Quelltexten/Konfigdateien&lt;br /&gt;
&lt;br /&gt;
Wer direkt auf dem RasPi in C/ASM für den AVR µC programmieren möchte, sollte auch folgende 3 Pakete installieren. Für die Nutzung des RasPi nur als avr-programmer sind sie nicht nötig:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;gcc-avr&#039;&#039;&lt;br /&gt;
*&#039;&#039;binutils-avr&#039;&#039; &lt;br /&gt;
*&#039;&#039;avr-libc&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kommando:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install gcc git-core make  bison autoconf flex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==avrdude Sourcen für RasPi aus Depot holen==&lt;br /&gt;
Depot: &lt;br /&gt;
https://github.com/kcuzner/avrude&lt;br /&gt;
Befehl: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/kcuzner/avrude&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loginformationen zeigt &#039;&#039;git&#039;&#039; mit &#039;&#039;git log&#039;&#039; an, Aktualisierungen werden mit &#039;&#039;git pull origin&#039;&#039; heruntergeladen.&lt;br /&gt;
&lt;br /&gt;
==avrdude übersetzen und installieren==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd avrdude/avrdude&lt;br /&gt;
./bootstrap &amp;amp;&amp;amp; ./configure&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Einstellungen avrdude überprüfen und testen==&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;/usr/local/etc/averdude.conf&#039;&#039; stehen die Einstellungen für die verschiedenen AVR Programmer wie die Pinzuordnung - Welches AVR-Pin mit welchem Programmer Pin verbunden ist.&lt;br /&gt;
Für den RasPi finden sich diese in der Sektion &#039;&#039;linuxspi&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
programmer &lt;br /&gt;
  id       = &amp;quot;linuxspi&amp;quot;;&lt;br /&gt;
  desc     = &amp;quot;Use Linux SPI device in /dev/spidev*&amp;quot;;&lt;br /&gt;
  type     = &amp;quot;linuxspi&amp;quot;;&lt;br /&gt;
  reset    = 25;&lt;br /&gt;
  baudrate = 400000;&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier das Pin das mit dem Reset des AVR verbunden ist (Zeile &#039;&#039;reset = 25&#039;&#039;). Das kann ein beliebiges GPIO-Pin sein, hier wurde das Pin &#039;&#039;GPIO25&#039;&#039; gewählt. Die SPI-Pins (&#039;&#039;MISO&#039;&#039;, &#039;&#039;MOSI&#039;&#039;, &#039;&#039;CLK&#039;&#039;) sind nicht wählbar, da der RasPi in allen betrachteten Modellen nur einen SPI-Port hat.&lt;br /&gt;
 &lt;br /&gt;
Kritisch ist ebenfalls der Eintrag unter baudrate. Mit diesen wird eingestellt wie schnell das Signal &#039;&#039;SPI_CLK&#039;&#039; schaltet und damit wie schnell der Controller programmiert wird. Die maximal mögliche Baudrate variiert je nach AVR-Typ, Versorgungsspannung, Taktbeschaltung und Konfigurationsregister. Ein sicherer Wert sind 125 kHz, die default Einstellung des avrdude liegt mit 400 000 deutlich darüber. Deshalb sollte man bei Problemen die Zeile zu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  baudrate = 100000;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ändern.&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Auslesen des Flash-Speichers des controllers, hinter &#039;&#039;-p&#039;&#039; den Typ des Controllers (hier ATmega 328P) angeben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/local/bin/avrdude -c linuxspi -p m328p -P /dev/spidev0.0 -U flash:r:&amp;quot;/dev/null&amp;quot;:r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typische Fehler==&lt;br /&gt;
Der Fehler kann sein&lt;br /&gt;
*unvollständige Installation des Betriebssystem, wie Treiber für SPI nicht aktiv&lt;br /&gt;
*falsche Bedienung Programmiertool &#039;&#039;avrdude&#039;&#039; bspw. ohne root-Rechte (&#039;&#039;sudo&#039;&#039;)&lt;br /&gt;
*Verdrahtungsfehler bspw. Widerstand an der Reset-Leitung falsch&lt;br /&gt;
&lt;br /&gt;
avrdude schreibt auch Fehlermeldungen von Folgefehlern wie &#039;&#039;avrdude initialization failed&#039;&#039; was auf einen Fehler&lt;br /&gt;
in der Verdrahtung deutet, die eigentlich Fehlermeldung allerdings einige Zeilen früher genannt&lt;br /&gt;
wird: &amp;quot;Unable to open SPI Port&amp;quot;. Man tut also gut daran, die Ausgaben von avrdude komplett zu lesen.&lt;br /&gt;
&lt;br /&gt;
===Zugriff auf SPI scheitert===&lt;br /&gt;
Die SPI-Schnittstelle liegt wie alle Geräte im Verzeichnis &#039;&#039;/dev/&#039;&#039; , am besten mit &#039;&#039;ls /dev/&#039;&#039; überprüfen. Findet sich dort kein &#039;&#039;spidev0.0&#039;&#039; ist der SPI-Treiber/-module nicht aktiv oder nicht installiert. Siehe dazu Abschnitt SPI oben.&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die SPI - Schnittstelle sind root-Rechte erforderlich. &#039;&#039;avrdude&#039;&#039; ist also von root - login oder mit vorangestellten &#039;&#039;sudo&#039;&#039; zu starten. &lt;br /&gt;
&lt;br /&gt;
===Der µC meldet sich nicht===&lt;br /&gt;
Oft sind fehlende oder falsche elektrische Verbindungen dafür verantwortlich. Man sollte jetzt die Spannungen&lt;br /&gt;
zwischen &#039;&#039;Vcc&#039;&#039; und &#039;&#039;GND&#039;&#039; resp. zwischen &#039;&#039;AVcc&#039;&#039; und &#039;&#039;GND&#039;&#039; am Controller messen. Die sollten 3.3 V betragen. Muss man den Controller mit 5V betreiben ist statt auf 3.3 V auf 5.0V zu prüfen und die Pegelwandler (levelshifter) zwischen Controller und RasPi. Die 5V sind an der GPIO-Leiste des RasPi&#039;s meist etwas geringer (~ 4.9V), eine leistungsstarke RasPi Stromversorgung (USB-Netzteil 1000 mA) und das Abziehen von beim AVR-Programmieren unbenutzte Hardware wie WLAN-Stick hilft dabei. &lt;br /&gt;
&lt;br /&gt;
An der Reset-Leitung sollte im Normalfall die Betriebsspannung (3.3 V) anliegen, nur während der Programmierung misst man hier 0V. Die anderen Verbindungen klingelt man im stromlosen Zustand durch oder prüft die Signale mit einem Oszilloskop. &lt;br /&gt;
&lt;br /&gt;
Für manche AVR-Typen muss der Code von avrdude leicht angepasst werden, sonst wird der µC nach Umstellung auf Quarztakt nicht meht ansprechbar.&lt;br /&gt;
&lt;br /&gt;
Weitere Tipps zur Fehlersuche finden sich in der [[AVR_Checkliste]].&lt;br /&gt;
&lt;br /&gt;
=JTAG dongle/ FPGA-programmer=&lt;br /&gt;
Über JTAG sind auch FPGA&#039;s und deren Firmware-PROMs programmierbar. Als Programmier-tool ist hierfür die OpenOCD-Software einsetzbar. Für JTAG wird nicht die SPI-Schnittstelle, sondern &amp;quot;normale&amp;quot; GPIO-Pins genutzt. &lt;br /&gt;
&lt;br /&gt;
Achtung: der RasPi unterstützt nur 3V3 Pegel, die JTAG-Schnittstelle auf den FPGA&#039;s kann je nach Beschaltung auch andere Spannungspegel beispielsweise 2V5 erfordern.&lt;br /&gt;
&lt;br /&gt;
=Links/Quellen=&lt;br /&gt;
*Deutschsprachige Beschreibung RasPi AVR programmer [http://www.forum-raspberrypi.de/Thread-tutorial-raspberry-als-programmiergeraet-fuer-atmel-%C2%B5controller]&lt;br /&gt;
*Englischsprachige Beschreibung der avrdude Variante [https://gist.github.com/akavel/8832366]&lt;br /&gt;
--&lt;br /&gt;
*Website OpenOCD (JTAG-Software): [http://openocd.sourceforge.net/about/]&lt;br /&gt;
--&lt;br /&gt;
*Elektrische Kenn- und Grenzwerte GPIOs: [http://www.mosaic-industries.com/embedded-systems/microcontroller-projects/raspberry-pi/gpio-pin-electrical-specifications]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_als_Universalprogrammer&amp;diff=86947</id>
		<title>Raspberry Pi als Universalprogrammer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Raspberry_Pi_als_Universalprogrammer&amp;diff=86947"/>
		<updated>2015-01-31T07:46:48Z</updated>

		<summary type="html">&lt;p&gt;Prx: avrdude patch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014-12-27: Dieser Artikel hat &amp;quot;Reife&amp;quot;, die Beschreibung wie man den RasPi als AVR Programmer nutzt ist komplett.&lt;br /&gt;
&lt;br /&gt;
[[Datei:AllesPowerBar.JPG|thumb|400px|Raspberry Pi as AVR-programmer]]&lt;br /&gt;
=Vorüberlegungen=&lt;br /&gt;
==Grundkonzept==&lt;br /&gt;
Die nötigen GPIO&#039;s des Raspberries sind mit dem Programmierinterface des µC verbunden, ebenso die Stromversorgung&lt;br /&gt;
des zu programmierenden Devices. Die Programmierdatei wird von einem Host-PC auf den RasPi kopiert.&lt;br /&gt;
Über die Kommandozeile wird das Programmiertool auf dem RasPi gestartet.&lt;br /&gt;
&lt;br /&gt;
===Variante Ethernet-Dongle===&lt;br /&gt;
Ein Raspi ist über Ethernet mit einem PC verbunden. Auf dem PC (Laptop, Windows, Apple, egal) &lt;br /&gt;
läuft ein Terminal-Programm mit dem die Programmiertools auf dem RasPi gesteuert werden. &lt;br /&gt;
Die Programmierdatei wird ebenfalls über Ethernet auf den RasPi übetragen. Falls diese Konfiguration auch&lt;br /&gt;
an einem Laptop laufen soll muss die Powersupply auch mobil sein, also kein Steckernetzteil.&lt;br /&gt;
 &lt;br /&gt;
===Variante Standalone Programmer===&lt;br /&gt;
Der RasPi läuft als StandAlone Programmer, also ohne verbundenen PC. Dann muss am RasPi eine Tastatur über&lt;br /&gt;
USB und ein Monitor über HDMI angeschlossen sein.&lt;br /&gt;
&lt;br /&gt;
===Variante WLAN===&lt;br /&gt;
Erfordert Router? &lt;br /&gt;
&lt;br /&gt;
===Headless Betrieb===&lt;br /&gt;
Für die Nutzung des RasPis ohne Monitor und RasPi eigene Tastatur nur über eine &#039;&#039;ssh&#039;&#039;-Verbindung über Ethernet (headless Betrieb) werden oft Einstellungen vorgeschlagen, die leider dazu führen das eine Internetverbindung des RaspPis über WLAN nicht mehr möglich ist. Leider ist es dann auch nicht mehr möglich die Pakete für den Programmer zu installieren. Deshalb empfiehlt der Autor erst nachdem der RasPi nachweislich als Programmer funktioniert, diesen auf Headless-Betrieb umzustellen.&lt;br /&gt;
&lt;br /&gt;
Der Autor hat seinen Raspi über zwei Subnetze eingebunden, eins um den WLAN-router (DHCP, subnetz 192.168.178.*/255.255.0.0) und eins zum über Ethernet angeschloßenen Steuer-PC. Letzteres als statische IP (subnetz 10.1.1.1/255.255.255.0). &lt;br /&gt;
&lt;br /&gt;
Auszug &#039;&#039;/etc/network/interfaces&#039;&#039; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
address 10.1.1.1&lt;br /&gt;
netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet manual&lt;br /&gt;
&lt;br /&gt;
wpa-roam /etc/wpa_supplicant/wpa_supplivant.conf&lt;br /&gt;
iface default inet dhcp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Filetransfer===&lt;br /&gt;
Um Dateien wie das Flash-Image für den µC zwischen Steuer-PC und RasPi zu transferien gibt es mehrere Möglichkeiten. Die typischen sind &#039;&#039;ftp&#039;&#039; oder &#039;&#039;SAMBA&#039;&#039; (Windows-PC). Bei beiden ist der jeweils der passende Server aus dem RasPi zu installieren und gegebenfalls der Port dafür in der firewall freizuschalten. FTP scheint die einfachere und universellere Variante zu sein, da diese mit beliebeigen ftp-programmen funktioniert. Als ftpserver macht &#039;&#039;proftpd&#039;&#039; eine gute Figur.&lt;br /&gt;
*Installationsanleitung für proftd: [http://www.gnet4u.de/raspberryweb/proFTPD.pdf]&lt;br /&gt;
*Firewallfreischaltungen beispielsweise für ftp: [http://www.gtkdb.de/index_36_2253.html]&lt;br /&gt;
&lt;br /&gt;
==RasPi Hardware==   &lt;br /&gt;
===Modell-Auswahl===&lt;br /&gt;
Für die stand-alone Variante (RasPi mit Tastatur und Monitor) eignen sich model-A und B gleichermaßen,&lt;br /&gt;
Dagegen ist eine Terminalverbindung über Ethernet mit dem Modell A oder A+ nicht möglich da diesem die Schnittstelle fehlt. Eine Terminalverbindung über WLAN dagegen ist mit allen RasPi&#039;s möglich. Die A+ und B+ Modelle bieten zwar mehr GPIO&#039;s, die Grundausstattung der RasPi ohne Plus genügt aber für den Einsatz als &lt;br /&gt;
Programmer völlig. &lt;br /&gt;
&lt;br /&gt;
Der portable Betrieb mit Speisung über eine USB-Powerbar oder aus den USB-Ports&lt;br /&gt;
eines Laptops ist dem &amp;quot;Plus&amp;quot; Modellen einfacher da diese dank effizienter Regler weniger verbrauchen.&lt;br /&gt;
Ohne diese Regler gerät das Model B (ohne plus) schnell an die Grenze einer USB-Stromversorgung.&lt;br /&gt;
Das kann zu ungewollten Neustarts des RasPi führen, Abhilfe schafft nur ein sehr gutes USB-Netzteil.&lt;br /&gt;
Etwas geringer wird das Problem  wenn der RasPi über ein sogenanntes Y-Kabel von zwei USB-Anschlüssen des Laptops betrieben wird.&lt;br /&gt;
Ein USB-Anschluss darf mit höchstens 500 mA belastet werden, mit  dem genannten Kabel erhöht sich der verfügbare Strom auf 600 mA (Nach USB2.0.-Spec).&lt;br /&gt;
&lt;br /&gt;
===Raspberry Pinleiste===   &lt;br /&gt;
Der RasPi kann über seine Steckerleiste folgende Interface ansteuern&lt;br /&gt;
*Bitwackler (bitbanging) über 25 GPIO (Model b+)&lt;br /&gt;
*SPI  (wie die ISP -Schnittstelle der Atmel AVR-controller) 2x SPI_CE ; 3 Pins MISO,MOSI,SCLK&lt;br /&gt;
*UART (ein Paar RxD/TxD) &lt;br /&gt;
*I2C   (?ein Paar SDA,SCL)&lt;br /&gt;
&lt;br /&gt;
Ebenso liegen an zwei Pins 3V3 an mit denen bspw. ein µC leicht versorgbar ist. An zwei weiteren Pins stellt&lt;br /&gt;
der RasPi 5V zur Verfügung, allerdings ist die Spannung verbrauchsabhängig meist etwas niedriger.&lt;br /&gt;
Massepotential liegt an 8 (Modell B+) Pins.&lt;br /&gt;
&lt;br /&gt;
Das Bitwackler Interface kann natürlich auch SPI, UART und I2C nachstellen, allerdings mit erhöhten Programmieraufwand&lt;br /&gt;
und meist nicht so schnell wie mit den speziellen SPI-Pins. Dafür ist es erste Wahl bei anderen Schnittstellen&lt;br /&gt;
wie JTAG.&lt;br /&gt;
&lt;br /&gt;
==Beschaltung==&lt;br /&gt;
Es gelten die üblichen RasPi GPIO Hinweise: &lt;br /&gt;
*An die Eingänge keine Signale mit Pegel höher 3.3V oder kleiner als 0V legen, diese können die CPU beschädigen. &lt;br /&gt;
*Schäden können auch auftreten falls ein Pin mit mehr Strom belastet wird als konfiguriert. Minimal sind 2 mA ein höherer Wert in 2 mA Schritten aber nicht mehr als 16 mA kann konfiguriert werden. Dieser Wert gilt für alle GPIO&#039;s, er kann nicht Pin-individuell geändert werden. Nach einem Reset ist ein Wert von  8 mA voreingestellt. Nie mehr Strom &amp;quot;ziehen&amp;quot; als konfiguriert, ganz vorsichtige Naturen begrenzen den Strom durch einen Serienwiderstand (bspw. 10k).&lt;br /&gt;
*Die 3V3 Spannung an der Pin-leiste wird über einen IC erzeugt, der höchstens 50 mA zur Verfügung stellt. (Dieser Wert wurde für die nicht &#039;+&#039; Modelle angegeben, möglichweise bei den im Bereich der Stromversorgung überarbeiteten &#039;+&#039; Modellen höher.&lt;br /&gt;
&lt;br /&gt;
===Bitwackler===&lt;br /&gt;
nicht unbedingt schnell (über Python 60 KHz ermittelt), mit passenden Treibern sollten &lt;br /&gt;
aber mehrere Hundert kHz möglich sein. Dafür ist das timing nach belieben programmierbar, was bspw. für&lt;br /&gt;
JTAG nützlich ist.&lt;br /&gt;
&lt;br /&gt;
===SPI-Schnittstelle und -Treiber===&lt;br /&gt;
Der RasPi hat in den betrachten Modellen (&amp;quot;model A&amp;quot;, &amp;quot;model B&amp;quot;, &amp;quot;model B+&amp;quot;) nur eine SPI-Schnittstelle, die&lt;br /&gt;
bei allen dreien die selben Pins nutzt. Varianten sind nur in der Nutzung der beiden Pins &#039;&#039;SPI_CE0&#039;&#039; und &#039;&#039;SPI_CE1&#039;&#039; möglich, welche eines der angeschlossenen SPI-Geräte auswählen (bis zu zwei möglich). Befindet sich nur ein Gerät an dieser Schnittstelle können die beiden &#039;&#039;SPI_CE&#039;&#039; Pins unbenutzt bleiben.&lt;br /&gt;
 &lt;br /&gt;
Für die Nutzung der SPI - Schnittstelle des RasPi muß der passende SPI-Treiber (module) laufen. Das ist an dem&lt;br /&gt;
vorhandenen device &#039;&#039;/dev/spi0.0&#039;&#039; erkennbar. Findet sich unter &#039;&#039;/dev/&#039;&#039; kein SPI-device, dann ist das Module nicht gestartet. Dieses wird über &#039;&#039;modprobe spi-bcm2708&#039;&#039; manuell gestartet. Soll es automatisch gestartet werden, darf das SPI-module nicht auf der schwarzen Liste &#039;&#039;/etc/modprobe.d/raspi-blacklist.conf&#039;&#039; stehen. Falls dort die Zeile &#039;&#039;blacklist spi-bcm2708&#039;&#039; steht mit einem vorangestellten &#039;#&#039; deaktivieren oder die gesamte Zeile löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# file: /etc/modprobe.d/raspi-blacklist.conf&lt;br /&gt;
# blacklist spi and i2c by default (many users don&#039;t need them)&lt;br /&gt;
&lt;br /&gt;
#blacklist spi-bcm2708&lt;br /&gt;
blacklist i2c-bcm2708&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Raspberry Konfigurations tool &#039;&#039;raspi-config&#039;&#039; wie es bspw. bei NOOB Installation automatisch gestartet wird, findet sich versteckt unter &#039;&#039;&amp;quot;8 Advanced Options &amp;quot;&#039;&#039; der Unterpunkt &#039;&#039;SPI&#039;&#039; der standardmäßig auf No steht und so das Laden das benötigten Kernel-moduls verhindert. Setzt man diese Option auf &#039;&#039;Yes&#039;&#039; entfällt u.U. die oben beschriebene manuelle Aktivierung des SPI-Moduls.&lt;br /&gt;
 &lt;br /&gt;
=AVR-Programmer=&lt;br /&gt;
Um AVR-µC zu programmieren, benötigt man ein modifiziertes &#039;&#039;avrdude&#039;&#039; - ein weit verbreitetes Programmiertool. Dieses findet mal als Quellcode in einem git-Source-Depot und kompiliert es direkt&lt;br /&gt;
auf dem RasPi. Dazu werden weitere Pakete benötigt die aber nach Installation des kompilierten &#039;&#039;avrdude&#039;&#039; wieder entfernt werden können. Der &#039;&#039;avrdude&#039;&#039; nutzt auf dem RasPi die SPI-Schnittstelle auf der GPIO-Leiste und ein weiteres GPIO-Pin für die Resetleitung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:RasPi prog ATMega328P.JPG|thumb|400px|ATmega328P auf breadboard mit RasPi als Programmer]]&lt;br /&gt;
&lt;br /&gt;
==Verdrahtung==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Wiring RasPi &amp;lt;-&amp;gt; AVR&lt;br /&gt;
|-&lt;br /&gt;
!Signal  ||RasPi     ||Atmel  ||Mega32&lt;br /&gt;
|-&lt;br /&gt;
|MOSI    ||GPIO 10   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|MISO    ||GPIO  9   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|SCLK    ||GPIO 11   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|RST_N   ||GPIO 25   ||       || &lt;br /&gt;
|-&lt;br /&gt;
|3V3     ||          ||       || &lt;br /&gt;
|- &lt;br /&gt;
|GND     ||          ||       || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation der Compiler==&lt;br /&gt;
Um die Quelltexte für den &#039;&#039;avrdude&#039;&#039; aus den Depot runter zuladen, automatisch anzupassen und zu übersetzen &lt;br /&gt;
sind diese 6 Pakete nötig:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;git&#039;&#039; - Source-Versionsverwaltung, nötig zum Download der avrdude-Sources, Paketname &#039;&#039;git-core&#039;&#039;&lt;br /&gt;
*&#039;&#039;make&#039;&#039; - zum Regelbasierten Built aus den Quelltexten&lt;br /&gt;
*&#039;&#039;autoconf&#039;&#039; - zwecks Anpassung der Compiler-Skripte an das RasPi-Linux&lt;br /&gt;
*&#039;&#039;gcc&#039;&#039; - C-Compiler&lt;br /&gt;
*&#039;&#039;bison&#039;&#039; - mit Flex zusammen zum parsen von Quelltexten/Konfigdateien&lt;br /&gt;
*&#039;&#039;flex&#039;&#039; - mit bison zusammen zum parsen von Quelltexten/Konfigdateien&lt;br /&gt;
&lt;br /&gt;
Wer direkt auf dem RasPi in C/ASM für den AVR µC programmieren möchte, sollte auch folgende 3 Pakete installieren. Für die Nutzung des RasPi nur als avr-programmer sind sie nicht nötig:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;gcc-avr&#039;&#039;&lt;br /&gt;
*&#039;&#039;binutils-avr&#039;&#039; &lt;br /&gt;
*&#039;&#039;avr-libc&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kommando:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install gcc git-core make  bison autoconf flex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==avrdude Sourcen für RasPi aus Depot holen==&lt;br /&gt;
Depot: &lt;br /&gt;
https://github.com/kcuzner/avrude&lt;br /&gt;
Befehl: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/kcuzner/avrude&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loginformationen zeigt &#039;&#039;git&#039;&#039; mit &#039;&#039;git log&#039;&#039; an, Aktualisierungen werden mit &#039;&#039;git pull origin&#039;&#039; heruntergeladen.&lt;br /&gt;
&lt;br /&gt;
==avrdude übersetzen und installieren==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd avrdude/avrdude&lt;br /&gt;
./bootstrap &amp;amp;&amp;amp; ./configure&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Einstellungen avrdude überprüfen und testen==&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;/usr/local/etc/averdude.conf&#039;&#039; stehen die Einstellungen für die verschiedenen AVR Programmer wie die Pinzuordnung - Welches AVR-Pin mit welchem Programmer Pin verbunden ist.&lt;br /&gt;
Für den RasPi finden sich diese in der Sektion &#039;&#039;linuxspi&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
programmer &lt;br /&gt;
  id       = &amp;quot;linuxspi&amp;quot;;&lt;br /&gt;
  desc     = &amp;quot;Use Linux SPI device in /dev/spidev*&amp;quot;;&lt;br /&gt;
  type     = &amp;quot;linuxspi&amp;quot;;&lt;br /&gt;
  reset    = 25;&lt;br /&gt;
  baudrate = 400000;&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier das Pin das mit dem Reset des AVR verbunden ist (Zeile &#039;&#039;reset = 25&#039;&#039;). Das kann ein beliebiges GPIO-Pin sein, hier wurde das Pin &#039;&#039;GPIO25&#039;&#039; gewählt. Die SPI-Pins (&#039;&#039;MISO&#039;&#039;, &#039;&#039;MOSI&#039;&#039;, &#039;&#039;CLK&#039;&#039;) sind nicht wählbar, da der RasPi in allen betrachteten Modellen nur einen SPI-Port hat.&lt;br /&gt;
 &lt;br /&gt;
Kritisch ist ebenfalls der Eintrag unter baudrate. Mit diesen wird eingestellt wie schnell das Signal &#039;&#039;SPI_CLK&#039;&#039; schaltet und damit wie schnell der Controller programmiert wird. Die maximal mögliche Baudrate variiert je nach AVR-Typ, Versorgungsspannung, Taktbeschaltung und Konfigurationsregister. Ein sicherer Wert sind 125 kHz, die default Einstellung des avrdude liegt mit 400 000 deutlich darüber. Deshalb sollte man bei Problemen die Zeile zu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  baudrate = 100000;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ändern.&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Auslesen des Flash-Speichers des controllers, hinter &#039;&#039;-p&#039;&#039; den Typ des Controllers (hier ATmega 328P) angeben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo /usr/local/bin/avrdude -c linuxspi -p m328p -P /dev/spidev0.0 -U flash:r:&amp;quot;/dev/null&amp;quot;:r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typische Fehler==&lt;br /&gt;
Der Fehler kann sein&lt;br /&gt;
*unvollständige Installation des Betriebssystem, wie Treiber für SPI nicht aktiv&lt;br /&gt;
*falsche Bedienung Programmiertool &#039;&#039;avrdude&#039;&#039; bspw. ohne root-Rechte (&#039;&#039;sudo&#039;&#039;)&lt;br /&gt;
*Verdrahtungsfehler bspw. Widerstand an der Reset-Leitung falsch&lt;br /&gt;
&lt;br /&gt;
avrdude schreibt auch Fehlermeldungen von Folgefehlern wie &#039;&#039;avrdude initialization failed&#039;&#039; was auf einen Fehler&lt;br /&gt;
in der Verdrahtung deutet, die eigentlich Fehlermeldung allerdings einige Zeilen früher genannt&lt;br /&gt;
wird: &amp;quot;Unable to open SPI Port&amp;quot;. Man tut also gut daran, die Ausgaben von avrdude komplett zu lesen.&lt;br /&gt;
&lt;br /&gt;
===Zugriff auf SPI scheitert===&lt;br /&gt;
Die SPI-Schnittstelle liegt wie alle Geräte im Verzeichnis &#039;&#039;/dev/&#039;&#039; , am besten mit &#039;&#039;ls /dev/&#039;&#039; überprüfen. Findet sich dort kein &#039;&#039;spidev0.0&#039;&#039; ist der SPI-Treiber/-module nicht aktiv oder nicht installiert. Siehe dazu Abschnitt SPI oben.&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die SPI - Schnittstelle sind root-Rechte erforderlich. &#039;&#039;avrdude&#039;&#039; ist also von root - login oder mit vorangestellten &#039;&#039;sudo&#039;&#039; zu starten. &lt;br /&gt;
&lt;br /&gt;
===Der µC meldet sich nicht===&lt;br /&gt;
Oft sind fehlende oder falsche elektrische Verbindungen dafür verantwortlich. Man sollte jetzt die Spannungen&lt;br /&gt;
zwischen &#039;&#039;Vcc&#039;&#039; und &#039;&#039;GND&#039;&#039; resp. zwischen &#039;&#039;AVcc&#039;&#039; und &#039;&#039;GND&#039;&#039; am Controller messen. Die sollten 3.3 V betragen. Muss man den Controller mit 5V betreiben ist statt auf 3.3 V auf 5.0V zu prüfen und die Pegelwandler (levelshifter) zwischen Controller und RasPi. Die 5V sind an der GPIO-Leiste des RasPi&#039;s meist etwas geringer (~ 4.9V), eine leistungsstarke RasPi Stromversorgung (USB-Netzteil 1000 mA) und das Abziehen von beim AVR-Programmieren unbenutzte Hardware wie WLAN-Stick hilft dabei. &lt;br /&gt;
&lt;br /&gt;
An der Reset-Leitung sollte im Normalfall die Betriebsspannung (3.3 V) anliegen, nur während der Programmierung misst man hier 0V. Die anderen Verbindungen klingelt man im stromlosen Zustand durch oder prüft die Signale mit einem Oszilloskop. &lt;br /&gt;
&lt;br /&gt;
Für manche AVR-Typen muss der Code von avrdude leicht angepasst werden, sonst wird der µC nach Umstellung auf Quarztakt nicht meht ansprechbar: [[https://www.mikrocontroller.net/topic/356707|Patch]]&lt;br /&gt;
&lt;br /&gt;
Weitere Tipps zur Fehlersuche finden sich in der [[AVR_Checkliste]].&lt;br /&gt;
&lt;br /&gt;
=JTAG dongle/ FPGA-programmer=&lt;br /&gt;
Über JTAG sind auch FPGA&#039;s und deren Firmware-PROMs programmierbar. Als Programmier-tool ist hierfür die OpenOCD-Software einsetzbar. Für JTAG wird nicht die SPI-Schnittstelle, sondern &amp;quot;normale&amp;quot; GPIO-Pins genutzt. &lt;br /&gt;
&lt;br /&gt;
Achtung: der RasPi unterstützt nur 3V3 Pegel, die JTAG-Schnittstelle auf den FPGA&#039;s kann je nach Beschaltung auch andere Spannungspegel beispielsweise 2V5 erfordern.&lt;br /&gt;
&lt;br /&gt;
=Links/Quellen=&lt;br /&gt;
*Deutschsprachige Beschreibung RasPi AVR programmer [http://www.forum-raspberrypi.de/Thread-tutorial-raspberry-als-programmiergeraet-fuer-atmel-%C2%B5controller]&lt;br /&gt;
*Englischsprachige Beschreibung der avrdude Variante [https://gist.github.com/akavel/8832366]&lt;br /&gt;
--&lt;br /&gt;
*Website OpenOCD (JTAG-Software): [http://openocd.sourceforge.net/about/]&lt;br /&gt;
--&lt;br /&gt;
*Elektrische Kenn- und Grenzwerte GPIOs: [http://www.mosaic-industries.com/embedded-systems/microcontroller-projects/raspberry-pi/gpio-pin-electrical-specifications]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diode&amp;diff=84377</id>
		<title>Diode</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diode&amp;diff=84377"/>
		<updated>2014-08-06T11:35:53Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Z-Diode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemeine Diode ==&lt;br /&gt;
&lt;br /&gt;
Die Bezeichnung Diode wurde ursprünglich für Elektronenröhren mit zwei Elektroden verwendet, später für das Halbleiter-Bauteil mit dem selben elektrischen Verhalten. &amp;quot;Di&amp;quot; wegen &#039;&#039;&#039;zwei&#039;&#039;&#039; und &amp;quot;ode&amp;quot; vermutlich wegen Elektr&#039;&#039;&#039;ode&#039;&#039;&#039;, auch wenn bei Wikipedia was anderes steht (Es gibt bei den Elektronenröhren z.&amp;amp;nbsp;B. auch &#039;&#039;Tri&#039;&#039;oden mit drei oder &#039;&#039;Pent&#039;&#039;oden mit fünf Elektroden).&lt;br /&gt;
&lt;br /&gt;
Eine Diode sperrt den Stromfluss in einer Richtung und erlaubt ihn in der anderen. Als diskretes Bauteil besitzen Halbleiterdioden i.d.R. einen aufgedruckten Ring, der die Kathode kennzeichnet. Liegt an diesem Anschluss  eine negativere Spannung als an der Anode, ist die Diode in Durchlassrichtung geschaltet, d.h. sobald die [[Durchlass-Spannung]] überschritten wird, setzt der Stromfluss ein. Bei der umgekehrten Polarität sperrt die Diode den Stromfluss. &lt;br /&gt;
&lt;br /&gt;
Beim Betrieb von Dioden sind insbesondere drei wichtige Kenngrößen zu beachten:&lt;br /&gt;
* max. Durchlassstrom in Durchlassrichtung,&lt;br /&gt;
* max. Sperrspannung in Sperrrichtung und &lt;br /&gt;
* größte zulässige Verlustleistung aufgrund des Spannungsabfalls in Durchlassrichtung.&lt;br /&gt;
&lt;br /&gt;
Das Überschreiten der zulässigen Grenzwerte führt zur Überlastung der Diode.&lt;br /&gt;
&lt;br /&gt;
Dioden werden in elektronischen Schaltungen sehr häufig und zu ganz unterschiedlichen Zwecken eingesetzt, z.&amp;amp;nbsp;B.&lt;br /&gt;
* zur Gleichrichtung,&lt;br /&gt;
* als [[Spannungsreferenz]] (siehe auch Z-Diode),&lt;br /&gt;
* als elektrisch veränderliche Kapazität (Varaktor), oder&lt;br /&gt;
* zum Schutz gegen falsche Polung und Überspannung (Beispiel: [[Relais_mit_Logik_ansteuern#Freilaufdiode|Freilaufdiode]]).&lt;br /&gt;
&lt;br /&gt;
Dioden mit der letzteren Funktion sind heute auch oft in ICs wie [[Mikrocontroller]]n integriert und helfen, die Ein- und Ausgangs-Pins dieser teilweise sehr teuren Bauelemente vor moderater Fehlbehandlung und elektrischen Entladungen (ESD) zu schützen.&lt;br /&gt;
&lt;br /&gt;
Eine Sonderform der Dioden sind [[LED|LEDs]], die elektrisch zwar auch Diodenverhalten besitzen, deren eigentlicher Zweck aber die Erzeugung von sichtbarem oder infrarotem Licht ist.&lt;br /&gt;
&lt;br /&gt;
== Z-Diode ==&lt;br /&gt;
&lt;br /&gt;
Dieses auch &#039;&#039;Zener-Diode&#039;&#039; genannte Bauteil ist eine spezielle Variante der Halbleiter-[[Diode]], die produktionstechnisch so ausgelegt ist, dass sie nach Überschreiten der Durchbruchspannung unbeschadet einen bestimmten Strom in Sperrrichtung aushalten kann.&lt;br /&gt;
&lt;br /&gt;
Halbleiter haben grundsätzlich die Eigenschaft, ab einer bestimmten Schwellspannung einen Stromfluss zu ermöglichen, was auch bei Z-Dioden der Fall ist. Sie sind damit wie normale Siliziumdioden verwendbar. In Sperrichtung können sie aber nicht so hohe negative Spannungen sperren (→ Durchbruch- oder Sperrspannung), besitzen dafür aber eine besonders scharf definierte Durchbruchspannung, die einen abrupten Stromfluss ermöglicht. Dieser Effekt wird nach dem Entdecker Zener-Effekt genannt und ist bis ca. 5 V dominierend. Danach überwiegt der Lawineneffekt. Beide sind ähnlich. [http://de.wikipedia.org/wiki/Z-Diode Z-Dioden] unterhalb ca. 6,5V haben eine eher weiche Kennlinie, der Knick ist schwächer ausgebildet. Diese Effekte treten auch bei Leuchtdioden und Diodenstrecken in Transistoren auf, sind dort aber nicht der angestrebte Arbeitspunkt, da dies zur Zerstörung der Bauteile führt.&lt;br /&gt;
&lt;br /&gt;
Die Durchbruchspannung – auch Z-Spannung genannt – kann zur Spannungsstabilisierung verwendet werden und ist bei diesem Diodentyp der normale Arbeitspunkt. Als [[Spannungsreferenz]] sind Band-Gap-Referenzen einer Z-Diode wegen ihrer Temperatur-Drift von 20mV/K vorzuziehen. Z-Dioden werden neben der Anwendung zur Spannungsstabilisierung auch gerne als Spannungsbegrenzer in einem [[Pegelwandler]] eingesetzt. Beispiel: RS232-Pegel =&amp;gt; TTL-Pegel (+-15V =&amp;gt; 5.6V/-0.6V), das sind zwar die Maximalwerte von typischen Logik-Eingängen, funktioniert aber meist tadellos. Z-Dioden müssen immer mit einer Strombegrenzung betrieben werden, praktisch ist das meist ein Vorwiderstand.&lt;br /&gt;
&lt;br /&gt;
Die Spannung von Z-Dioden unterhalb von 5V ist stark vom Strom abhängig und die Nennspannung wird je nach Typ bei unterschiedlichem Strom spezifiziert, so dass bei verschiedenen 3,3V Typen in gleicher Schaltung recht verschiedene Spannungen auftreten können.&lt;br /&gt;
&lt;br /&gt;
== Suppressordiode ==&lt;br /&gt;
&lt;br /&gt;
Dabei handelt es sich um spezielle Z-Dioden, welche durch ihre Konstruktion in der Lage sind, sehr hohe Pulsströme für kurze Zeit auszuhalten, je nach Typ zwischen 600-5000W. Sie werden als Schutzbauelemente gegen Überspannungen an Stromversorgungsleitungen oder Signalleitungen verwendet. Nachteilig ist die teilweise hohe Kapazität dieser Dioden, welche bei niedrigen Spannungen mehrere Nanofarad betragen kann. Allerdings gibt es mehr und mehr Typen, welche trotz hoher Pulsbelastbarkeit eine sehr geringe Kapazität haben und damit direkt zum Schutz von hochfrequenten Signalleitungen genutzt werden können.&lt;br /&gt;
&lt;br /&gt;
== Avalanchediode ==&lt;br /&gt;
&lt;br /&gt;
Avalancedioden sind praktisch wie Z-Dioden. Durch diese Eigenschaft kann man Avalancedioden ohne zusätzliche Symetrierungsmaßnahmen in Reihe schalten. Dioden mit weniger Sperrstrom weden dabei mit etwas mehr Sperrspannung  belastet und zwar so weit, dass der einsetzende Avalanchestrom genau dem Sperrstrom der anderen Dioden entspricht.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Dioden-Übersicht]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/265145#2758976 Forumsbeitrag]: Präzisions-Z-Diode zur Symetrierung von Akkus in Reihenschaltung&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/265367#2771241 Forumsbeitrag]: Aktive Nachbildung einer HV-Z-Diode, Linearregler für 2kV/2µA&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Diode Diode] bei Wikipedia&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Standardbauelemente&amp;diff=84376</id>
		<title>Standardbauelemente</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Standardbauelemente&amp;diff=84376"/>
		<updated>2014-08-06T11:33:57Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gerade Neulinge kennen das Problem: Man hat eine tolle Schaltung mit vielen Operationsverstärkern, Spannungsreglern, Logikbausteinen, ADCs, was auch immer entwickelt und jetzt geht&#039;s an die Realisierung.&lt;br /&gt;
&lt;br /&gt;
Aber welche Bausteine nehmen unter dem Wust der Angebote? Also erstmal auf die Seiten der Hersteller und die Produktpalette durchforsten. Nach einigen Stunden gewissenhafter Recherche hat man dann endlich alle Bauteile beisammen und will bestellen. Und dann kommt das böse Erwachen: Einige Bauelemente gibt&#039;s nur bei Reichelt, andere nur bei Conrad. Farnell hat zwar das meiste, aber da kann man als Privatperson leider nicht bestellen. Manche ICs bekommt man nur in 1000er Stückzahlen oder sind halt einfach nur viel zu teuer.&lt;br /&gt;
&lt;br /&gt;
Nach einigen Jahren praktischer Erfahrung hat man dann seine &amp;quot;Standardbauelemente&amp;quot;, die man immer wieder verwendet. Dieser Artikel soll helfen andere von dieser Erfahrung profitieren zu lassen. Ähnliche Anregungen findet man auch in der de.sci.electronics-FAQ: Grundausstattung des Bastlers [[http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.2]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Hier soll eine Liste von häufig anzutreffenden, preiswerten und verfügbaren Standardbauelementen entstehen. Diese Liste soll knapp und bündig sein, für technische Daten wird auf die Datenblätter verwiesen. Hier gilt: &amp;quot;weniger ist mehr&amp;quot;, exotische Bauelemente sind also unerwünscht. Für hier gelistete Typen sollte gelten:&lt;br /&gt;
* für Privatpersonen verfügbar&lt;br /&gt;
* preiswert (nicht billig)&lt;br /&gt;
&lt;br /&gt;
Nicht gelistet werden sollen:&lt;br /&gt;
* hunderte Typen, die alle den gleichen Zweck erfüllen, aber keinen Mehrwert bringen. Stattdessen auf die bekanntesten / preiswertesten beschränken.&lt;br /&gt;
* Details. Stattdessen die Felder &amp;quot;Besonderheiten&amp;quot; und &amp;quot;Anwendungen&amp;quot; benutzen, z.&amp;amp;nbsp;B. &amp;quot;I²C, 12bit&amp;quot; bei Besonderheiten für einen ADC oder &amp;quot;Präzision, Audio&amp;quot; bei Anwendungen für einen OpAmp.&lt;br /&gt;
&lt;br /&gt;
Wer eine Sparte, oder eine Anwendung vermisst, aber selber nichts dazu beitragen kann: Einfach hinzufügen. Wer z.&amp;amp;nbsp;B. einen HF OpAmp sucht und hier nicht fündig wird sollte also eine neue Zeile einfügen und in die Spalte Anwendungen &amp;quot;HF&amp;quot; eintragen. Vielleicht kann ja jemand den Rest der Zeile füllen.&lt;br /&gt;
&lt;br /&gt;
Immer den Grundtypen listen und nicht eine der Varianten, und schon gar nicht alle Varianten einzeln! Also z.&amp;amp;nbsp;B. &amp;quot;LM324&amp;quot; statt &amp;quot;LM324N&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Wenn möglich Direktlinks auf Datenblätter vermeiden und eine Suchmaschine befragen: &amp;quot;http://www.datasheetarchive.com/search.php?q=lm324&amp;quot;&lt;br /&gt;
* so werden alle Varianten gefunden&lt;br /&gt;
* und tote Links vermieden&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten, allgemeinen Standard-Typen ganz oben in der Tabelle listen, danach erst die Spezialtypen für bestimmte Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Und weil es mir so wichtig ist nochmal: Ich rufe geradezu dazu auf, überflüssige, unverfügbare Typen zu löschen!&lt;br /&gt;
&lt;br /&gt;
= Aktive Bauelemente =&lt;br /&gt;
== Analog ==&lt;br /&gt;
&lt;br /&gt;
=== Transistoren ===&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[Transistor-Übersicht#NPN|Transistor-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
====NPN====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;transistors-npn&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC337 BC337]&lt;br /&gt;
| 0,04&lt;br /&gt;
| Standardtyp (SMD: [http://www.mikrocontroller.net/part/BC817 BC817])&lt;br /&gt;
| bis ~300mA sinnvoll&lt;br /&gt;
| R,D,P,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+bc337+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MMBT2222A MMBT2222A]&lt;br /&gt;
| 0,05&lt;br /&gt;
| SMD TO-23 Gehäuse, Ptot bis 350mW&lt;br /&gt;
| bis ~ 300mA sinnvoll &lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A100%252F2N2222ASMD%2523FAI.pdf;SID=29Jo9LE6wQAR0AADnPx904c70c3257c398b8b92e44b2052e44b2f PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC547 BC547]&lt;br /&gt;
| 0,03&lt;br /&gt;
| Standardtyp, [http://www.mikrocontroller.net/part/BC847 in SMD BC847]&lt;br /&gt;
| bis ~50mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat_download/datasheets/BC847_BC547_SER_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC635 BC635]/[http://www.mikrocontroller.net/part/BC639 BC639]&lt;br /&gt;
| 0,07&lt;br /&gt;
| andere Pinbelegung als BC547 (= BD135 in anderem Gehäuse)&lt;br /&gt;
| bis ~500mA sinnvoll&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/BC635_BCP54_BCX54_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BD433 BD433]/[http://www.mikrocontroller.net/part/BD437 BD437]&lt;br /&gt;
| 0,19&lt;br /&gt;
| niedrige Sättigungsspannung&lt;br /&gt;
| bis ~2A sinnvoll&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BD%2FBD435.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP41C TIP41C]&lt;br /&gt;
| 0,24&lt;br /&gt;
| Ptot: 65W, geringe Stromverstärkung (max.75)&lt;br /&gt;
| Grenzwert 10A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.org/datasheet/fairchild/TIP41C.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP102 TIP102]&lt;br /&gt;
| 0,42&lt;br /&gt;
| Ptot bis 80W mit Kühlkörper, hohe Stromverstärkung von über 1000 über einen sehr großen Bereich (Darlington).&lt;br /&gt;
| Grenzwert 8A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/TI%2FTIP102.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP3055 TIP3055]&lt;br /&gt;
| 0,75&lt;br /&gt;
| Ptot bis 90W mit Kühlkörper, Stromverstärkung sehr niedrig (bei großen Strömen &amp;lt;&amp;lt; 100)&lt;br /&gt;
| Grenzwert 15A &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/PowerInnovations/mXvutwr.pdf PDF]&lt;br /&gt;
|-====&lt;br /&gt;
| [http://www.mikrocontroller.net/part/2N6284 2N6284]&lt;br /&gt;
| 4,50&lt;br /&gt;
| Lin. NPN-PowerDarlington, Ptot bis 160W, Stromverstärkung ~ 750&lt;br /&gt;
| 100V Ic 20A &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/SGSThomsonMicroelectronics/mXvsruq.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PNP====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;transistors-pnp&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC327 BC327]&lt;br /&gt;
| 0,04&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC337 BC337]&lt;br /&gt;
| bis ~300mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+bc327+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC557 BC557]&lt;br /&gt;
| 0,03&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC547 BC547]&lt;br /&gt;
| bis ~50mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat_download/datasheets/BC556_557_4.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC636 BC636]/[http://www.mikrocontroller.net/part/BC640 BC640]&lt;br /&gt;
| 0,07&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC635 BC635]&lt;br /&gt;
| bis ~500mA sinnvoll&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/BC640_BCP53_BCX53_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP2955 TIP2955]&lt;br /&gt;
| 0,75&lt;br /&gt;
| Ptot bis 90W mit Kühlkörper&lt;br /&gt;
| Grenzwert 15A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/motorola/TIP2955.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N-MOSFET====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[MOSFET-Übersicht#N-Kanal_MOSFET|MOSFET-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BUZ10, BUZ11 etc. sind wie alle BUZ Typen ziemlich veraltet. Bitte nicht listen; es gibt fast immer was besseres von IRF.&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-n&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1010N IRF1010N]&lt;br /&gt;
| 0,78&lt;br /&gt;
| max 50V, max 85A, 11 mOhm On-Widerstand&lt;br /&gt;
| Alles, was mit POWER zu tun hat ...&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf1010n.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1404 IRF1404]&lt;br /&gt;
| 0,96&lt;br /&gt;
| max 40V, max 162A, 4 mOhm, 200W&lt;br /&gt;
| sehr geringer Rds, TO-220&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf1404.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLZ34N IRLZ34N]&lt;br /&gt;
| 0,43&lt;br /&gt;
| max 55V, max 30A, 35 mOhm On-Widerstand&lt;br /&gt;
| Gatespannung kompatibel mit 5V-Controllern.&lt;br /&gt;
| R, D, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlz34n.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML2502 IRLML2502]&lt;br /&gt;
| 0,17&lt;br /&gt;
| max 20V, max 4,2A (cont.), 45 mOhm On-Widerstand&lt;br /&gt;
| SOT23 SMD-FET, extrem niedrige V_GS_th, bei niedrigem R_DS_on&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlml2502.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS170 BS170]&lt;br /&gt;
| 0,10&lt;br /&gt;
| max 60V, bis 500mA, 5Ω On-Widerstand&lt;br /&gt;
| veraltete Technik, aber in bastelfreundlichem TO-92 Gehäuse&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BS/BS170.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS123 BSS123]&lt;br /&gt;
| 0,05&lt;br /&gt;
| max 100V, max 170mA (cont.), Thresholdspannung 1,7V, On-Widerstand 1,3Ω&lt;br /&gt;
| SOT23 SMD-FET, auch für 3V3-versorgte Schaltungen bestens geeignet&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BS/BSS123.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| BUK100-50GL &lt;br /&gt;
| 1,15&lt;br /&gt;
| Logic-Level Power&lt;br /&gt;
| &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.nxp.com/pip/BUK100-50GL_1.html PDF] (NXP)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLIZ44N IRLIZ44N]&lt;br /&gt;
| 1,45&lt;br /&gt;
| Logic-Level Power 30A 55V 22mohm&lt;br /&gt;
| TO-220&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLR2905 IRLR2905]/[http://www.mikrocontroller.net/part/IRLU2905 IRLU2905]&lt;br /&gt;
| 0,60&lt;br /&gt;
| Logic-Level Power 36A 55V RDS=27 mOhm&lt;br /&gt;
| D-Pak &lt;br /&gt;
| C, P&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLU3410 IRLU3410]&lt;br /&gt;
| 0,71&lt;br /&gt;
| Logic-Level Power, 100V, 17A, 105mOhm RDS(on), I-PAK&lt;br /&gt;
| &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/pdf-datasheets/Datasheets-303/37622.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7301 IRF7301]&lt;br /&gt;
| 0,91&lt;br /&gt;
| Dual N-MOSFET mit nur 70mOhm RDS(on) bei 2.7 V, SO-8&lt;br /&gt;
| Laststromschaltung bei kleinen Spannungen, z.&amp;amp;nbsp;B. an Akkus&lt;br /&gt;
| C, R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7301.pdf PDF] &lt;br /&gt;
|-&lt;br /&gt;
| PMV30UN,&lt;br /&gt;
| 0.35&lt;br /&gt;
| max 20V, 5.7A (5s), &amp;lt;36mOhm(@4.5V), &amp;lt;63mOhm(@1.8V) On-Widerstand, Ultra-Low-Level: 1.8V.&lt;br /&gt;
| SOT-23 SMD, Treiber f&amp;amp;uuml;r Microcontroller-Ausg&amp;amp;auml;nge, Motortreiber, Verpolschutz.&lt;br /&gt;
| D&lt;br /&gt;
| (NXP)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====P-MOSFET====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[MOSFET-Übersicht#P-Kanal_MOSFET|MOSFET-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-p&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML6401 IRLML6401]&lt;br /&gt;
| 0,18&lt;br /&gt;
| max -12V, ca -4,3A (cont.), ca. 0,05Ω On-Widerstand&lt;br /&gt;
| SOT-23 SMD FET, extrem niedrige V_GS_th, bei niedrigem R_DS_on&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlml6401.pdf]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7220 IRF7220]&lt;br /&gt;
| 0,50&lt;br /&gt;
| max -14V, ca -10A (cont.), ca. 0,02Ω On-Widerstand&lt;br /&gt;
| Gehäuse SO-8, brauchbar in 3,3V Systemen&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7220.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFR5305 IRFR5305]&lt;br /&gt;
| 0,56&lt;br /&gt;
| max -55V, -31A (cont.), ca. 0,065Ω On-Widerstand&lt;br /&gt;
| Gehäuse D-Pak (SMD, TO-252AA), Uth=-2 bis -4V&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irfr5305.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS250 BS250]&lt;br /&gt;
| 0,26&lt;br /&gt;
| max -45V, bis -230mA (cont.), 14 (und mehr) Ohm On-Widerstand&lt;br /&gt;
| veraltete Technik aber in bastelfreundlichem TO-92 Gehäuse von R lieferbar &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.vishay.com/docs/70209/70209.pdf PDF] (Vishay)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NDS0610 NDS0610]&lt;br /&gt;
| 0,07&lt;br /&gt;
| max -60V, bis -120mA (cont.), 20 (und mehr) Ohm On-Widerstand&lt;br /&gt;
| SOT-23 SMD Gehäuse Anwendung z.&amp;amp;nbsp;B. als [http://www.mikrocontroller.net/topic/42113#317220 Verpolschutz mit geringem Spannungsabfall]&lt;br /&gt;
| R, D DK&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/ND%2FNDS0610.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| PMV33UPE,&lt;br /&gt;
| 0.52&lt;br /&gt;
| max -20V, 5.3A (5s), &amp;lt;36mOhm(@4.5V), &amp;lt;65mOhm(@1.8V) On-Widerstand, Ultra-Low-Level: 1.8V.&lt;br /&gt;
| SOT-23 SMD, Treiber f&amp;amp;uuml;r Microcontroller-Ausg&amp;amp;auml;nge, Motortreiber, Verpolschutz.&lt;br /&gt;
| D&lt;br /&gt;
| (NXP)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====MOSFET-Pärchen====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-n-p&amp;quot;&lt;br /&gt;
|-  bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7389 IRF7389]&lt;br /&gt;
| 0,51&lt;br /&gt;
| 30 V, &amp;gt;2,5 A, 30/60 mOhm On-Widerstand&lt;br /&gt;
| Gehäuse SO-8&lt;br /&gt;
| D,R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7389.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dioden ===&lt;br /&gt;
==== Standarddioden ====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[Dioden-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-p&amp;quot;&lt;br /&gt;
|-  bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N4148 1N4148]&lt;br /&gt;
| 0,02&lt;br /&gt;
| Kleinsignal-Gleichrichterdiode&lt;br /&gt;
| 75V/150mA&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/1N/1N4148.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N4007 1N4001]..[http://www.mikrocontroller.net/part/1N4007 1N4007]&lt;br /&gt;
| 0,02&lt;br /&gt;
| Mehrzweck-Gleichrichterdiode, 1N4001..1N4007 mit gestaffelter Sperrspannung&lt;br /&gt;
| 1A 50..1000V&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/1N/1N4001.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UF4001 UF4001]..[http://www.mikrocontroller.net/part/UF4007 UF4007]&lt;br /&gt;
| 0,06 - 0,07&lt;br /&gt;
| UltraFast-Gleichrichterdiode, gestaffelte Sperrspannung, trr&amp;lt;50ns bzw 75ns&lt;br /&gt;
| 1A&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/vishay/uf4001.pdf Datenblatt]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N5400 1N5400]..[http://www.mikrocontroller.net/part/1N5408 1N5408]&lt;br /&gt;
| 0,06&lt;br /&gt;
| Mehrzweck-Gleichrichterdiode, 1N5400..1N5408 mit gestaffelter Sperrspannung&lt;br /&gt;
| 3A, 50..1000V&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/fairchild/1N5401.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UF5404 UF5404], [http://www.mikrocontroller.net/part/UF5408 UF5408]&lt;br /&gt;
| 0,11 bzw 0,22&lt;br /&gt;
| UltraFast-Gleichrichterdiode, gestaffelte Sperrspannung, trr&amp;lt;50ns bzw 75ns&lt;br /&gt;
| 3A, 50..1000V&lt;br /&gt;
| R&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAT46 BAT46]&lt;br /&gt;
| 0,10&lt;br /&gt;
| Kleinsignal-Schottky-Diode&lt;br /&gt;
| 150mA&lt;br /&gt;
| D,R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAT46 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAT54 BAT54(A/C/S)]&lt;br /&gt;
| 0,072&lt;br /&gt;
| sehr schnelle Kleinsignal-(Doppel-)Schottky-Diode&lt;br /&gt;
| 200mA&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAT54 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SB120 SB120]..[http://www.mikrocontroller.net/part/SB160 SB160]&lt;br /&gt;
| 0,13&lt;br /&gt;
| Schottky-Diode&lt;br /&gt;
| 1A 20-60V&lt;br /&gt;
| R,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=SB140 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N5817 1N5817]..[http://www.mikrocontroller.net/part/1N5819 1N5819]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Schottky-Diode, sehr ähnlich zu SB120-140&lt;br /&gt;
| 1A 20/30/40V&lt;br /&gt;
| R, D, C, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=1N5819 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BA159 BA159]&lt;br /&gt;
| 0,051&lt;br /&gt;
| Standard-Diode&lt;br /&gt;
| HF 1A 1000V&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BA159 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAV99 BAV99]&lt;br /&gt;
| 0,041&lt;br /&gt;
| Standard-Doppeldiode, SOT-23&lt;br /&gt;
| ESD-Schutz&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAV99 D]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Z-Dioden ====&lt;br /&gt;
Nahezu jeder Lieferant von Elektronikbauteilen hat [[Diode#Z-Diode|Z-Dioden]] im Sortiment. Meist gliedert sich dieses Angebot in die 0,5W und 1,3W-Typen. Für den Handapparat sind fertig gefüllte Sortierkästen eine gute Wahl. Sie enthalten 10-20 Stück jeder Spannung einer Leistungsklasse. Wer weniger braucht, dem seien einige Standardanwendungsfälle angeraten:&lt;br /&gt;
* Querregler für kleinste Leistungen, typ. Spannungen 3.3V, 5,1V, 9V, 12V&lt;br /&gt;
* Spannungsbegrenzung an MOSFET-Gates 10V&lt;br /&gt;
* Bereitstellung von Referenzspannungen 2,4V-15V (bis 10V in 0,3V-Schritten, darüber 1V-Schritte)&lt;br /&gt;
* Die Spannung von Z-Dioden unterhalb von 5V ist stark vom Strom abhängig und die Nennspannung wird je nach Typ bei unterschiedlichem Strom spezifiziert, so dass bei verschiedenen 3,3V Typen recht verschiedene Spannungen auftreten können&lt;br /&gt;
&lt;br /&gt;
==== Suppressordioden ====&lt;br /&gt;
==== Leuchtdioden====&lt;br /&gt;
Die Auswahl an [[LED|Leuchtdioden]] übersteigt die 2000 Typen. Sie unterscheiden sich nicht nur in der Farbe, der Form und den Bauweisen, auch die Leuchtstärke und der dafür notwendige Strom sind Auswahlkriterien. Wie bei den Z-Dioden sind Sortimente im Fall von Unsicherheit die beste Wahl. Ansonsten sind:&lt;br /&gt;
* für Anzeigezwecke Leuchtstärken von 2-50mcd ausreichend, zumal die Abstrahlwinkel über 90° liegen. &lt;br /&gt;
* Bis 2000mcd sind bereits Schutzmaßnahmen notwendig, denn bei 30° Abstrahlwinkel ist es fürs Auge bereits gefährlich&lt;br /&gt;
* Mehr als 4000mcd sind schon sehr hell, selten sind die Abstrahlwinkel allerdings größer als 15°&lt;br /&gt;
&lt;br /&gt;
RGB-LEDs gibt es in zwei Grundkonfigurationen. Die gemeinsame Anode (common anode) erlaubt die Open-Collector-Ansteuerung der einzelnen Farben per NPN-Transistor. Für die gemeinsame Kathode (common cathode) muss man dann einen PNP-Transistor einsetzen oder spezielle Anzeigentreiber. Letztere setzen zu einem wesentlichen Teil auf gemeinsame Kathode. Die Ansteuerung mit Logik-Ausgängen hängt davon ab, wieviel Strom der Ausgang verträgt (sink, common anode) oder liefert (source, common cathode).&lt;br /&gt;
&lt;br /&gt;
Leistungs-LEDs, die 0,3A und mehr vertragen gehören nicht zu den Standardbauteilen, erfreuen sich aber großer Beliebtheit. Da sie grundsätzlich der Kühlung bedürfen und in SMD-Bauweise gefertigt werden, ist der Kauf auf fertigen sog. Star-Platinen (engl. Stern) empfehlenswert. Eine solche Platine lässt sich leicht auf größere Kühlkörper schrauben und bietet sehr gut lötbare Anschlussflächen.&lt;br /&gt;
&lt;br /&gt;
Ein Handappart aus je 10 LEDs der Farben rot, grün, gelb und weiß, 5mm Durchmesser und ca. 30mcd, zzgl. 20 Widerstände 330 Ohm (1/4W) sind für 5V und das Steckbrett völlig ausreichend. Für die Unterstützung (warm)weißer Leistungs-LEDs (je ca. 90lm) müssen schon Typen mit &amp;gt;2000mcd (bevorzugt gelb oder orange) vorgesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Instrumentenverstärker ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/INA128 INA128]&lt;br /&gt;
| 6,37 (F)&lt;br /&gt;
| Verstärkung über 1 Widerstand einstellbar&lt;br /&gt;
| Brückenverstärker , Datenerfassung&lt;br /&gt;
| F&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/ina128.pdf#search=%22ina128%22 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/INA326 INA326]&lt;br /&gt;
| ca. 3 (DK)&lt;br /&gt;
| Low Power, läuft an 3.3 oder 5 V&lt;br /&gt;
| Medizintechnik (EKG), Sensoren&lt;br /&gt;
| DK&lt;br /&gt;
| [http://www.ti.com/lit/gpn/ina326 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/AD620 AD620]&lt;br /&gt;
| ca. 8 (R)&lt;br /&gt;
| Standardtyp&lt;br /&gt;
| EKG, EEG, Brückenverstärker&lt;br /&gt;
| R, RS, DK&lt;br /&gt;
| [http://www.analog.com/UploadedFiles/Data_Sheets/37793330023930AD620_e.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operationsverstärker ===&lt;br /&gt;
==== Liste ====&lt;br /&gt;
Es sind die &#039;&#039;typical values&#039;&#039; bei &#039;&#039;25°C&#039;&#039; angegeben. Falls es selektierte Versionen gibt (z.&amp;amp;nbsp;B. LM358&#039;&#039;&#039;A&#039;&#039;&#039;) ist der schlechtere Wert des Standardteils angegeben.&lt;br /&gt;
&lt;br /&gt;
Bei den R2R output Werten immer die Last RL in Ohm mitangeben, ansonsten sind die Werte relativ sinnlos. Teilweise steht auch dabei für welche Versorgungsspannung dies gilt.&lt;br /&gt;
Vcc ist Versorgungs-Plus. Vee ist Versorgungs-Minus.&lt;br /&gt;
&lt;br /&gt;
Bei der Stromaufnahme (supply current) ist der Strom pro IC angegeben. Weil es besser aussieht, ist es in den Datenblättern oft pro OPV angegeben und muss z.&amp;amp;nbsp;B. bei einem Quad noch mit vier multipliziert werden.&lt;br /&gt;
&lt;br /&gt;
Der Preis ist für Einzelstücke angegeben und entspricht meistens dem bei Reichelt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;Siehe auch:&#039;&#039; [http://www.rn-wissen.de/index.php/Operationsverst%C3%A4rker#Liste_g.C3.A4ngiger_Typen_von_Operationsverst.C3.A4rkern RN - Liste gängiger Typen von Operationsverstärkern]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;Die Tabelle lässt sich mit einem Klick auf die Überschriften &#039;&#039;&#039;sortieren&#039;&#039;&#039;.&amp;lt;/center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} style=&amp;quot;font-size:80%&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! OPVs&lt;br /&gt;
! Unity- Gain in&amp;amp;nbsp;MHz&lt;br /&gt;
! Slew-Rate in V/µs&lt;br /&gt;
! &amp;lt;small&amp;gt;Input Offset Spannung in mV&amp;lt;/small&amp;gt;&lt;br /&gt;
! Input Offset Strom&lt;br /&gt;
! Input Bias Strom&lt;br /&gt;
! R2R in&lt;br /&gt;
! R2R out @RL&amp;amp;nbsp;Vcc&lt;br /&gt;
! Strom- aufnahme in mA&lt;br /&gt;
! Bemerkung&lt;br /&gt;
! Daten- blatt&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM358 LM358] / [http://www.mikrocontroller.net/part/LM324 LM324]&lt;br /&gt;
| 2 / 4&lt;br /&gt;
| 1&lt;br /&gt;
| 0,5&lt;br /&gt;
| 3&lt;br /&gt;
| 5 nA&lt;br /&gt;
| 45 nA&lt;br /&gt;
| Vcc-2V Vee-0,1V&lt;br /&gt;
| Vcc-1,5V Vee+5mV @10kΩ 5V&lt;br /&gt;
| 0,8&lt;br /&gt;
| Standard-OP, Vcc=3V-30V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=15mA I&amp;lt;sub&amp;gt;source&amp;lt;/sub&amp;gt;=30mA I&amp;lt;sub&amp;gt;sink-max&amp;lt;/sub&amp;gt;=40mA&lt;br /&gt;
| [http://www.ti.com/lit/gpn/lm358 PDF(358)] / [http://www.ti.com/lit/gpn/lm324 PDF(324)]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,19&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL072 TL072]&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 13&lt;br /&gt;
| 3&lt;br /&gt;
| 5 pA&lt;br /&gt;
| 65 pA&lt;br /&gt;
| Vcc-0V Vee+3V&lt;br /&gt;
| Vcc-1,5V Vee+1,5V @10kΩ 30V&lt;br /&gt;
| 2,8&lt;br /&gt;
| Standard Audio, Low Noise/JFET Eingang, Quad-Version: TL074, single: TL071(mit Offsetkorr.)&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tl072.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,17&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE5532 NE5532]&lt;br /&gt;
| 2&lt;br /&gt;
| 10&lt;br /&gt;
| 9&lt;br /&gt;
| 0,5&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 500 nA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-2V Vee+2V @600Ω 30V&lt;br /&gt;
| 8&lt;br /&gt;
| Standard Audio OP, treibt 600Ω, Iout=35mA&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/ne5532.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,23&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX4238 MAX4238/4239]&lt;br /&gt;
| 1&lt;br /&gt;
| MAX4238: 1.0, MAX4239: 6.5&lt;br /&gt;
| MAX4238: 0.35, MAX4239: 1.6&lt;br /&gt;
| 0,0001&lt;br /&gt;
| 2 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0.3V Vee-0.3V&lt;br /&gt;
| Vcc-4mV Vee+4mV @10kΩ / Vcc-35mV Vee+35mV @1kΩ&lt;br /&gt;
| 0.6 @Vcc=5.5V&lt;br /&gt;
| very low offset (&amp;quot;zero offset&amp;quot;) 0.1µV, Rail2Rail, Vcc=2.7-5.5V, MAX4239: min. Gain x10&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX4238-MAX4239.pdf PDF]&lt;br /&gt;
| F, (R MAX4238)&lt;br /&gt;
| 2,55 (1,45)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA333 OPA333]&lt;br /&gt;
| 1&lt;br /&gt;
| 0.350&lt;br /&gt;
| 0.16&lt;br /&gt;
| 0.002&lt;br /&gt;
| 140 pA&lt;br /&gt;
| 70 pA&lt;br /&gt;
| Vcc+0.1V Vee-0.1V&lt;br /&gt;
| Vcc-30mV Vee+30mV @10kΩ&lt;br /&gt;
| 0.017&lt;br /&gt;
| micro power, low offset 2µV, Rail2Rail, Vcc=1.8-5.5V, SOT23-5 SO-8, Dual:OPA2333&lt;br /&gt;
| [http://focus.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=opa333&amp;amp;fileType=pdf PDF]&lt;br /&gt;
| F&lt;br /&gt;
| 3,60&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA335 OPA335]&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 1.6&lt;br /&gt;
| 0.001&lt;br /&gt;
| 120 pA&lt;br /&gt;
| 70 pA&lt;br /&gt;
| Vcc-1.5V Vee-0.1V&lt;br /&gt;
| Vcc-15mV Vee+15mV @10kΩ, Vcc-1mV Vee+1mV @100kΩ&lt;br /&gt;
| 0.285&lt;br /&gt;
| low offset 1µV, Rail2Rail, Vcc=2.7-5.5V, SOT23-5 SO-8, Dual:OPA2335&lt;br /&gt;
| [http://focus.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=opa335&amp;amp;fileType=pdf PDF]&lt;br /&gt;
| F&lt;br /&gt;
| 3,50&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL062 TL062]&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| 5 pA&lt;br /&gt;
| 30 pA&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 0,4&lt;br /&gt;
| Low Power/JFET Eingang, veraltet&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tl062.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,17&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TS912 TS912]&lt;br /&gt;
| 2&lt;br /&gt;
| 1 @5V&lt;br /&gt;
| 0,8 @5V&lt;br /&gt;
| 2-10&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0,2V Vee-0,2V over the rail&lt;br /&gt;
| Vcc-0,05V Vee+0,04V @10kΩ 5V&lt;br /&gt;
| 0,4&lt;br /&gt;
| Standard Rail2Rail Typ, Vcc=2,7-16V, Iout=40mA, Quad: TS914&lt;br /&gt;
| [http://www.st.com/stonline/products/literature/ds/2325/ts912.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LMC6484 LMC6484]&lt;br /&gt;
| 4&lt;br /&gt;
| 1,5&lt;br /&gt;
| 0,9&lt;br /&gt;
| 3&lt;br /&gt;
| 2 pA&lt;br /&gt;
| 4 pA&lt;br /&gt;
| Vcc+0,2V Vee-0,2V over the rail&lt;br /&gt;
| Vcc-0,2V Vee+0,2V @2kΩ 5V&lt;br /&gt;
| 3&lt;br /&gt;
| Iout=16mA@5V Iout=28mA@15V&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LMC6484.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 2,35&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA2340 OPA2340]&lt;br /&gt;
| 2&lt;br /&gt;
| 5,5&lt;br /&gt;
| 6&lt;br /&gt;
| 0,150&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0,5V Vee-0,5V over the rail&lt;br /&gt;
| Vcc-0,04V Vee+0,04V @2kΩ&lt;br /&gt;
| 1,5&lt;br /&gt;
| CMOS Vcc=2,5V - 5,5V&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/opa4340.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 1,65&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LF356 LF356]&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| 12&lt;br /&gt;
| 3&lt;br /&gt;
| 3 pA&lt;br /&gt;
| 30 pA&lt;br /&gt;
| Vcc&#039;&#039;&#039;+&#039;&#039;&#039;0,1V Vee+3V &lt;br /&gt;
| Vcc-2V Vee+2V  @10kΩ 30V&lt;br /&gt;
| 5&lt;br /&gt;
| high bandwidth J-FET, Settling-Time = 1,5µs @0.01% error-voltage, Eingang knapp über Vcc, &lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLF355_LF356_LF357%2523STM.pdf; PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OP07 OP07]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,6&lt;br /&gt;
| 0,3&lt;br /&gt;
| 0,030&lt;br /&gt;
| 0,4 nA&lt;br /&gt;
| 1 nA&lt;br /&gt;
| Vcc-1,5V Vee+1,5V&lt;br /&gt;
| Vcc-2,2V Vee+2,2V @2kΩ 15V&lt;br /&gt;
| 0,7 - 2,5&lt;br /&gt;
| geringer Offset &amp;lt;80µV je nach Hersteller&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A200%252FOP07%2523AD.pdf; PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,25&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LMC6062 LMC6062]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,1&lt;br /&gt;
| 0,015&lt;br /&gt;
| 0,1&lt;br /&gt;
| 0,01 pA max:2pA&lt;br /&gt;
| 0,01 pA max:4pA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-0,05V Vee+0,05V @25kΩ 5V&lt;br /&gt;
| 0,045&lt;br /&gt;
| Precision, Micropower, CMOS, Is~40µA (typ.), Iout=8mA&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LMC6062.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 2,05&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM4250 LM4250]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,3-0,01&lt;br /&gt;
| 1-0,001&lt;br /&gt;
| 3-5&lt;br /&gt;
| 3-10 nA&lt;br /&gt;
| 8-50 nA&lt;br /&gt;
| Vcc-0,6V Vee+0,6V&lt;br /&gt;
| Vcc-0,6V Vee+0,6V @10kΩ 3V&lt;br /&gt;
| 0,008 - 0,09&lt;br /&gt;
| Micropower, &amp;quot;programmierbar&amp;quot;, Werte jeweils für Is=8µA und 90µA&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LM4250.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,98&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7621 ICL7621]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,15&lt;br /&gt;
| 15&lt;br /&gt;
| 30 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-0,3V Vee+0,3V unklar &amp;lt;!-- Das Datenblatt sagt folgendes. Bedeutet dies R2R input?    Differential Input Voltage [(V+ +0.3) - (V- -0.3)]V --&amp;gt;&lt;br /&gt;
| Vcc-0,1V Vee+0,1V @100kΩ&lt;br /&gt;
| 0,2&lt;br /&gt;
| Micropower CMOS Vcc=2V - 16V &lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/ICL7611-ICL764X.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 1,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7611 ICL7611] / [http://www.mikrocontroller.net/part/ICL7612 ICL7612]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,15&lt;br /&gt;
| 15&lt;br /&gt;
| 30 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-0,3V Vee+0,3V unklar &amp;lt;!-- Das Datenblatt sagt folgendes. Bedeutet dies R2R input?    Differential Input Voltage [(V+ +0.3) - (V- -0.3)]V --&amp;gt;&lt;br /&gt;
| Vcc-0,1V Vee+0,1V @100kΩ&lt;br /&gt;
| 0,010 - 1 &lt;br /&gt;
| gleich mit ICL7621, aber nur 1 OPV und dafür programmierbar: Is= 10µA, 100µA, 1mA&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/ICL7611-ICL764X.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,82&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM13700 LM13700]&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| 50&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,1 µA&lt;br /&gt;
| 0,4 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-0,8V Vee+0,6V&lt;br /&gt;
| 2,6&lt;br /&gt;
| OTA - Steilheits-OP 50V/µs&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LM13700.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,90&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [http://www.mikrocontroller.net/part/µA733 µA733]&lt;br /&gt;
| 1&lt;br /&gt;
| 1200*&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 6 µA&lt;br /&gt;
| 40 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-3,5V Vee+3,5V @2kΩ&lt;br /&gt;
| 25&lt;br /&gt;
| Video OP,  Vcc=12V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=2mA; Gains of 10, 100, 400; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=8kΩ; V&amp;lt;sub&amp;gt;Output offset&amp;lt;/sub&amp;gt;=0,6V; &lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/µA733 PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE592 NE592]&lt;br /&gt;
| 1&lt;br /&gt;
| 1200*&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1 µA&lt;br /&gt;
| 9 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-4V Vee+4V @2kΩ&lt;br /&gt;
| 20&lt;br /&gt;
| Video OP,  Vcc=12V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=15mA; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=4-30kΩ; V&amp;lt;sub&amp;gt;Output offset&amp;lt;/sub&amp;gt;=1,5V; &lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/NE592 PDF]&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| 0,40&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1363 LT1363]&lt;br /&gt;
| 1&lt;br /&gt;
| 70&lt;br /&gt;
| 1000&lt;br /&gt;
| 1,5&lt;br /&gt;
| 120 nA&lt;br /&gt;
| 0,6 µA&lt;br /&gt;
| Vcc-1,6V Vee+1,8V&lt;br /&gt;
| Vcc-0,9V Vee+0,9V @500Ω 10V&lt;br /&gt;
| 7&lt;br /&gt;
| Steilheits OP,  Vcc=5-15V, I&amp;lt;sub&amp;gt;sink/source&amp;lt;/sub&amp;gt;=30-60mA; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=5MΩ*;&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LT1363 PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 3,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CA3140 CA3140]&lt;br /&gt;
| 1&lt;br /&gt;
| 4,5&lt;br /&gt;
| 9&lt;br /&gt;
| 5&lt;br /&gt;
| 0,5 pA&lt;br /&gt;
| 10 pA&lt;br /&gt;
| Vee-0,5V&lt;br /&gt;
| Vcc-2V Vee+0,6V  @2kΩ 15V&lt;br /&gt;
| 4&lt;br /&gt;
| BIMOS-OP - kleiner Eingangsstrom, ideal für Single-Supply, Vcc-min=4V&lt;br /&gt;
| [http://www.intersil.com/data/fn/fn957.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,47&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TCA0372 TCA0372]&lt;br /&gt;
| 2&lt;br /&gt;
| 1,1&lt;br /&gt;
| 1,3&lt;br /&gt;
| 1&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 100 nA&lt;br /&gt;
| Vee to Vcc-1,0V&lt;br /&gt;
| Vcc-0,8V Vee+0,8V @0,1A 30V  Vcc-1,3V Vee+1,3V  @1A 24V &lt;br /&gt;
| 5&lt;br /&gt;
| Power-OPV, Thermal Shutdown, Io=1A Io(max)=1.5A&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FTCA0372%2523MOT.pdf; PDF]&lt;br /&gt;
| alle, R&lt;br /&gt;
| 0,70&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LA6510 LA6510]&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
| 0,15&lt;br /&gt;
| 2&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 100 nA&lt;br /&gt;
| Vcc-2V Vee+0V&lt;br /&gt;
| Vcc-2V Vee+2V  @33Ω 30V&lt;br /&gt;
| 12&lt;br /&gt;
| Power-OPV, current limiter pin, Imax=1A P=2,5W, Gehäuse:SIP10F&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLA6510%2523SAN.pdf; PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/L272 L272]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1&lt;br /&gt;
| 15&lt;br /&gt;
| 50 nA&lt;br /&gt;
| 300 nA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-1V Vee+0,3V @0,1A 24V  Vcc-1,5V Vee+0,6V  @0,5A 24V &lt;br /&gt;
| 8&lt;br /&gt;
| Power-OPV, Vcc=4V-28V, Io=0,7A P=1W, Thermal Shutdown @160°C&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FL272fai.pdf; PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,70&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TLC272 TLC272]&lt;br /&gt;
| 2&lt;br /&gt;
| 1,7&lt;br /&gt;
| 2,9&lt;br /&gt;
| 1,1&lt;br /&gt;
| 0,1 pA&lt;br /&gt;
| 0,7 pA&lt;br /&gt;
| Vcc-0.8V Vee-0.3V&lt;br /&gt;
| Vcc-1.2V Vee+0V  @10kΩ&lt;br /&gt;
| 5&lt;br /&gt;
| Precision OPV, für hochohmige Messanwendungen, Single: TLC271, Quad: TLC274, weniger Offset: TLC277&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tlc272.pdf PDF]&lt;br /&gt;
| R, CSD&lt;br /&gt;
| 0,26&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP602 MCP602-I/P]&lt;br /&gt;
| 2&lt;br /&gt;
| 2,8&lt;br /&gt;
| 2,3&lt;br /&gt;
| 1&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-1,2V Vee-0,2V&lt;br /&gt;
| Vcc-0,1V Vee+0,1V  @5kΩ&lt;br /&gt;
| 0,5&lt;br /&gt;
| Vcc=2,7V-5,5V Vout=20mA&lt;br /&gt;
| [http://www.chipcatalog.com/Doc/88306CED2FD891755A0736169A8D31C1.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,55&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM393 LM393]&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| 5 nA&lt;br /&gt;
| 65 nA&lt;br /&gt;
| Vcc-2V Vee+0V&lt;br /&gt;
| Open- Collector&lt;br /&gt;
| 1,6&lt;br /&gt;
| Standard-Komparator, Isink=16mA, Vcc=2V - 36V, Response-Time=1,5µs&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=lm393 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM339 LM339]&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1,4&lt;br /&gt;
| 2,3 nA&lt;br /&gt;
| 60 nA&lt;br /&gt;
| &lt;br /&gt;
| Open- Collector&lt;br /&gt;
| 1,1&lt;br /&gt;
| Standard-Komparator, Isink=16mA, Vcc=2V - 36V, Response-Time=1,5µs&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=lm339 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TLC3702 TLC3702]&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1,2&lt;br /&gt;
| &lt;br /&gt;
| 5pA&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 0,02&lt;br /&gt;
| Micropower-Komparator (20µA) PushPull Ausgang&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=tlc3702 PDF]&lt;br /&gt;
| F, C&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| Bezeichnung&lt;br /&gt;
| OPVs pro Gehäuse&lt;br /&gt;
| Unity-Gain&lt;br /&gt;
| Slew-Rate&lt;br /&gt;
| Input Offset Spannung&lt;br /&gt;
| Input Offset Strom&lt;br /&gt;
| Input Bias Strom&lt;br /&gt;
| R2R in&lt;br /&gt;
| R2R out&lt;br /&gt;
| Stromaufnahme&lt;br /&gt;
| Bemerkung&lt;br /&gt;
| [http://www. PDF]&lt;br /&gt;
| Lieferant&lt;br /&gt;
| Preis&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Warum findet sich in obiger Liste kein [http://www.mikrocontroller.net/part/LM741 741], war er doch lange Zeit &amp;quot;der&amp;quot; OPV schlechthin? Nun, er wird allgemein als &amp;quot;veraltet&amp;quot; angesehen, da er aus den 60er Jahren stammt (1968 von Fairchild vorgestellt, etwa ab 1969 kommerziell erhältlich) und keine besonderen technischen Daten aufweist. Der immerhin etwa fünf Jahre jüngere 324 (von 1974) kostet häufig ein paar Cent weniger, enthält dafür aber vier statt einen OPV mit besseren Daten.&lt;br /&gt;
&lt;br /&gt;
==== Empfehlungen ====&lt;br /&gt;
===== Lineare NF-Verstärker =====&lt;br /&gt;
Als besonders lineare Verstärker für Audiozwecke eignen sich u.a der LF356.&lt;br /&gt;
&lt;br /&gt;
===== HF-taugliche Verstärker =====&lt;br /&gt;
Für HF-Anwendungen eigenen sich besonders:&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/part/LT1222 LT1222]&lt;br /&gt;
&lt;br /&gt;
===== Komparatoren =====&lt;br /&gt;
Komparatoren müssen schnell aber nicht so genau schalten. Dafür eigenen sich:&lt;br /&gt;
&lt;br /&gt;
=== Spannungsregler ===&lt;br /&gt;
==== Linearregler ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;linearregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung Datenblatt&lt;br /&gt;
! Preis (€)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LP2950 LP2950]&lt;br /&gt;
| 0,39 - 0,53&lt;br /&gt;
| Festspannungsregler Low-Dropout&lt;br /&gt;
| 3 - 5V 100mA, TO-92, &amp;lt;120µA Ruhestrom&lt;br /&gt;
| R, D&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2940 LM2940]&lt;br /&gt;
| 0,40&lt;br /&gt;
| Festspannungsregler Low-Dropout&lt;br /&gt;
| z. B. 5V, 1A(@0,5V drop), Verpolschutz, TO-220, SOT-223.&lt;br /&gt;
| R, D&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM1117 LM1117]&lt;br /&gt;
| 0,65&lt;br /&gt;
| Festspannungsregler Low-Dropout (auch LT1117, NCP#, REG#, usw.)&lt;br /&gt;
| z. B. 3V3, 800mA(@1,1V drop), SOT-223. fixed 3V3 oder adjustable&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM317 LM317]&lt;br /&gt;
| 0,22&lt;br /&gt;
| Linearer einstellbarer Spannungsregler (LM337 für neg. Spannungen)&lt;br /&gt;
| max 40V -&amp;gt; 1,2 - 37V, max 1.5A, TO220&lt;br /&gt;
| alle&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX663 MAX663]&lt;br /&gt;
| 1,80&lt;br /&gt;
| Linearer, einstellbarer Spannungsregler&lt;br /&gt;
| sehr niedriger Eigenstromverbrauch&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM7805 LM78xx]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
| Festspannungregler (xx=05: 5V, xx=12: 12V ...)&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM7905 LM79xx]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
| Festspannungregler, negative Spannung (xx=05: -5V, xx=12: -12V ...)&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LF33 LF33]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
| Festspannungregler &lt;br /&gt;
| +3,3V, TO-220, 1A&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP1700 MCP1700]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
| Festspannungregler, Low-Dropout, sehr niedriger Eigenstromverbrauch, siehe auch MCP1702/MCP1703, durch geringe PSRR eher nur für Batterieanwendung&lt;br /&gt;
| +3,3V u.a., TO-92, SOT-89, SOT-23, 200mA&lt;br /&gt;
| R, F, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2931 LM2931]&lt;br /&gt;
| ~0,30 - 0,40&lt;br /&gt;
| feste (5V; 3,3V) und variable (3..24V) Low-Dropout Spannungsregler (max. 100mA)&lt;br /&gt;
| TO-220, TO-92, SMD, Automotive, Iq=0,4mA&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM723 &amp;amp;mu;A723/LM723]&lt;br /&gt;
| ~0,30&lt;br /&gt;
| einstellbar 2-37V&lt;br /&gt;
| Netzteile mit Strombegrenzung, Netzteile mit hohem Ausgangsstrom, Labornetzteile, DIP-14, SO-14&lt;br /&gt;
| alle&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.national.com/an/AN/AN-1148.pdf AN-1148: Application Note 1148 Linear Regulators: Theory of Operation and Compensation] von National Semiconductor Corporation (PDF)&lt;br /&gt;
&lt;br /&gt;
==== Schaltregler ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;schaltregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2576 LM2576, LM2575, LM2574]&lt;br /&gt;
| 0,90&lt;br /&gt;
| Step-Down, als ADJ (einstellbare Spannung) und als Festspannungsregler&lt;br /&gt;
| max 40V -&amp;gt; 1,2 - 37V, TO220-5 u.a., LM2576 bis 3A, LM2575 bis 1A, LM2574 bis 0,5A, als HV-Typen Vin bis 63V&lt;br /&gt;
| alle - Achtung: R liefert u.U. den nur zum LM2596 äquivalenten P3596&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM2576 PDF] - [http://www.mikrocontroller.net/topic/58094#450561 mit Funk-Entstördrossel FED100µ (Reichelt...) bis 3 A]&lt;br /&gt;
|-&lt;br /&gt;
| [[MC34063]]A&lt;br /&gt;
| 0,29&lt;br /&gt;
| Step-Up ~0,3A / Step-Down 0,7A / Inverter 0,2A-0,6A&lt;br /&gt;
| SO-8/DIP-8; Tool zum Berechnen auf [http://www.nomad.ee/micros/mc34063a/index.shtml www.nomad.ee]&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.onsemi.com/pub/Collateral/MC34063A-D.PDF PDF], [http://www.mikrocontroller.net/articles/MC34063]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PR4401 PR4401]&lt;br /&gt;
| 0,50&lt;br /&gt;
| Led-Treiber, Step-Up, Batteriebetrieb mit einer Zelle (bis 0,9 V)&lt;br /&gt;
| SO-23&lt;br /&gt;
| R, [http://www.ak-modul-bus.de/ AK Modul-Bus], [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.prema.com/pdf/pr4401.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1930 LT1930] und [http://www.mikrocontroller.net/part/LT1932 LT1932]&lt;br /&gt;
| ~3 €&lt;br /&gt;
| Leistungs-Led-Treiber, Step-Up&lt;br /&gt;
| SO-23&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.linear.com/pc/productDetail.jsp?navId=H0,C1,C1003,C1042,C1031,C1061,P1813]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Shuntregler/[[Spannungsreferenz]] ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;schaltregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; style=&amp;quot;text-align:center&amp;quot; &lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Spannung [V]&lt;br /&gt;
! Strom [mA]&lt;br /&gt;
! Fehler [%]&lt;br /&gt;
! Temperatur koeffizient typ/max [ppm/K]&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL431 TL431]&lt;br /&gt;
| 0,15&lt;br /&gt;
| 2,5-36&lt;br /&gt;
| 1-100&lt;br /&gt;
| 2&lt;br /&gt;
| 20/70 &lt;br /&gt;
| Präzise Alternative zur Z-Diode; SO8; TO92&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=TL431 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1021 LT1021]&lt;br /&gt;
| 5,00&lt;br /&gt;
| 5; 7; 10&lt;br /&gt;
| 10 &lt;br /&gt;
| 1; 0,05&lt;br /&gt;
| 2/5&lt;br /&gt;
| Präzisionsreferenz, +/-10mA Ausgangsstrom&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/pdf/getfile.php?dir=Datasheets-17&amp;amp;file=DSA-321686.pdf&amp;amp;scan= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1004  LT1004]&lt;br /&gt;
| 1,90&lt;br /&gt;
| 1,235; 2,5 &lt;br /&gt;
| 0.01-20 &lt;br /&gt;
| 0,8&lt;br /&gt;
| 20/50&lt;br /&gt;
| niedriger Stromverbrauch, ab 20 µA; 1,2V bessere Eigenschaften; TI =! LT&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1004 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1009  LT1009]&lt;br /&gt;
| 1,95&lt;br /&gt;
| 2,5 &lt;br /&gt;
| 1-10&lt;br /&gt;
| 0,2&lt;br /&gt;
| 20/30&lt;br /&gt;
| verbesserter Ersatz für LM336&lt;br /&gt;
| R&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1009 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM336-2.5 LM336-2.5]&lt;br /&gt;
| 0,20&lt;br /&gt;
| 2,5; 5,0&lt;br /&gt;
| 0,6-10&lt;br /&gt;
| 4&lt;br /&gt;
| 70/230&lt;br /&gt;
| TO92; SO8; 1% erhältlich&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LM336 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM385 LM385]&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1,2V; 2,5&lt;br /&gt;
| 0,015-20&lt;br /&gt;
| 2&lt;br /&gt;
| 30/150&lt;br /&gt;
| Präzise Alternative zur Z-Diode; SO8; TO92&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLM385Z1%252C2%2523TEX.pdf; PDF]&lt;br /&gt;
|-&lt;br /&gt;
| LM 4041 CIDBZT&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1,22V-10,0&lt;br /&gt;
| 0,000045-12&lt;br /&gt;
| 0,5&lt;br /&gt;
| 20/100&lt;br /&gt;
| Battery Powered Equipment&lt;br /&gt;
| elpro.org&lt;br /&gt;
|[http://www.google.de/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=5&amp;amp;ved=0CEYQFjAE&amp;amp;url=http%3A%2F%2Fwww.farnell.com%2Fdatasheets%2F36982.pdf&amp;amp;ei=MCbJU9ShJajy7Ab41YDIBw&amp;amp;usg=AFQjCNEhAH7BdMUd-YWQB1HRbdUNmvzA_Q&amp;amp;bvm=bv.71198958,d.ZGU]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1029 LT1029]&lt;br /&gt;
| 2,20&lt;br /&gt;
| 5,0&lt;br /&gt;
| 0,6-10&lt;br /&gt;
| 1&lt;br /&gt;
| 8/40&lt;br /&gt;
| Bandgap TO92; 0,2% erhältlich&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1029 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| ADR36x&lt;br /&gt;
| 2,20&lt;br /&gt;
| 2,048; 2,5; 3; 3,3; 4,096; 5 &lt;br /&gt;
| -1, +5&lt;br /&gt;
| 0,1&lt;br /&gt;
| 3/9&lt;br /&gt;
| Bandgap; SOT23&lt;br /&gt;
| DK, RS, FAR&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=ADR363 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viele Spannungsreferenzen haben auch [http://www.maxim-ic.com/products/references/ Maxim] und [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=401&amp;amp;uiTemplateId=NODE_STRY_PGE_T TI] im Programm.&lt;br /&gt;
&lt;br /&gt;
=== Stromquelle ===&lt;br /&gt;
==== Referenzstromquelle ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;referenzstromquelle&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM334 LM334]&lt;br /&gt;
| 0,58 - 1,84&lt;br /&gt;
| Referenzstromquelle, 1µA...10mA, TO-92&lt;br /&gt;
| Referenzstromquelle/Temperatursensor&lt;br /&gt;
| R, C&lt;br /&gt;
| [http://www.national.com/ds/LM/LM134.pdf PDF]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Timer ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE555 555]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Universeller Zeitgeber.&lt;br /&gt;
| Für alles, wirklich alles. CMOS-Versionen lassen sich aufgrund ihrer niedrigeren Betriebsspannung besser mit µCs verbinden.&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=555+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS1307 DS1307]&lt;br /&gt;
| 1,95&lt;br /&gt;
| 64 X 8 Serial Real Time Clock. Quarzuhr / Kalender Baustein mit serieller TWI-Schnittstelle.  &lt;br /&gt;
| Uhrenfunktion, unabhängig vom µC, aber µC-Steuerbar. Batteriepufferbar (3V-Knopfzelle wie CR2032) um die Zeit bei ausgeschalteter Board-Betriebsspannung weiter zu zählen.&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?q=DS1307 Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PCF8583 PCF8583]&lt;br /&gt;
| 1,50&lt;br /&gt;
| I²C/TWI Real Time Clock, Calendar, SRAM, Alarm, Timer, Eventcounter&lt;br /&gt;
| Auf Basis eines SRAM-chips, deshalb kann ein großer Teil als SRAM genutzt werden (ca 240 bytes). Berechnet Datum (4 Jahre, Jahr 0 = Schaltjahr), Uhrzeit (12/24), Wochentag. ein 32-kHz-Uhrenquarz ist nötig, sonst als Uhr unbrauchbar da  störempfindlich. Möglichkeit eines Interruptausganges bei voreingestellter Alarmzeit. Bemerkenswert einfaches Protokoll. Kann umgeschaltet werden in einen Timer-Modus (einfacher Counter mit bestimmter Timebase) oder Event-Counter-Modus (Eingangssignale zählen).&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=PCF8583]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Analogschalter und Multiplexer ===&lt;br /&gt;
Die DG2xx DG3xx DG4xx, teilweise auch DG5xx bezeichnen Analogschalter und Multiplexer die sich zum Industriestandard entwickelt haben. Es gibt sie von vielen Herstellern und zahlreichen Ausführungen in allen R(on) Bereichen und sind Pinkompatibel. Anstelle von &amp;quot;DGxxx&amp;quot; benutzen Hersteller für verbesserte/moderne Versionen ihre eigenen Präfixe wie &amp;quot;ADGxxx&amp;quot; von Analog Devices oder &amp;quot;MAXxxx&amp;quot; von Maxim. Für einfache Schalter werden häufig die letzten zwei Ziffern 01 bis 05 und 11-13 benutzt, 06/07/08/09 bezeichnet 16:1 8:1 und 4:1 Multiplexer in Single Ended und Differential Ended. Spannungsbereich geht bis +/-12 oder +/-15 V, die Steuereingänge haben zum Teil TTL-Kompatibilität, andernfalls einen Pin der den Logikpegel definiert (z.&amp;amp;nbsp;B. VCC).&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG201 DG201]/[http://www.mikrocontroller.net/part/DG202 DG202]/[http://www.mikrocontroller.net/part/DG212 DG212]&lt;br /&gt;
| ~2-3€&lt;br /&gt;
| Vierfach Einzelschalter in SPST, SPDT, &lt;br /&gt;
| Zum µC-gesteuerten schalten von Analogsignalen, in Audio, Video, und Messschaltungen, in OP-Schaltungen für programmierbare Verstärkungen&lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG202&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG306 DG306]/[http://www.mikrocontroller.net/part/DG406 DG406]&lt;br /&gt;
| ~4-10€&lt;br /&gt;
| 16:1 Analog-Multiplexer&lt;br /&gt;
| Zum Multiplexen von Analogsignalen, Kanalauswahl für ADC-Messschaltungen.&lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG306&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG307 DG307]/[http://www.mikrocontroller.net/part/DG408 DG408]&lt;br /&gt;
| ~4-10€&lt;br /&gt;
| Zweifach 8:1 bzw Einfach 8:1 differential ended (8 Doppelkanäle)&lt;br /&gt;
| Zum Multiplexen von Analogsignalen, Kanalauswahl für ADC-Messschaltungen auch für differentielle Eingänge. &lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG308&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 4051, z.&amp;amp;nbsp;B. [http://www.mikrocontroller.net/part/74HC4051 74HC4051]&lt;br /&gt;
| ab 25ct&lt;br /&gt;
| 1:8 Multiplexer, R_on &amp;lt;100Ω, auch 2:4, 1:16 usw  &lt;br /&gt;
| Zum µC-gesteuerten schalten von Analogsignalen, in Audio, Video, und Messschaltungen, in OP-Schaltungen für programmierbare Verstärkungen&lt;br /&gt;
| verschiedende&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=74HC4051&amp;amp;action=Search]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Digital ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CAN ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP2515 MCP2515]&lt;br /&gt;
| 2,55&lt;br /&gt;
| CAN 2.0B, [[SPI]]-Schnittstelle&lt;br /&gt;
| &lt;br /&gt;
| D,F,R,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SJA1000 SJA1000]&lt;br /&gt;
| 4,55&lt;br /&gt;
| PellCAN 2.0B, 8 Bit parallele Schnittstelle&lt;br /&gt;
|&lt;br /&gt;
| F,R&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Logik ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (€)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/74HC4050 74HC4050]&lt;br /&gt;
| 0,27&lt;br /&gt;
| z.&amp;amp;nbsp;B. 5V =&amp;gt; 3V&lt;br /&gt;
| Pegelwandler unidirektional abwärts&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=74hc4050 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/HEF4104B HEF4104B]&lt;br /&gt;
| 0,77&lt;br /&gt;
| z.&amp;amp;nbsp;B. 5V =&amp;gt; 12V&lt;br /&gt;
| Pegelwandler unidirektional aufwärts&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=HEF4104B PDF]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FT232 FT232]&lt;br /&gt;
| 3,59&lt;br /&gt;
| USB &amp;lt;-&amp;gt; RS232 Wandler&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232BL_BQ.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FT245 FT245]&lt;br /&gt;
| 4,79&lt;br /&gt;
| USB &amp;lt;-&amp;gt; Seriell Wandler mit paralleler Schnittstelle&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| D, R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ft245 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TUSB3410 TUSB3410]&lt;br /&gt;
| 3,50&lt;br /&gt;
| USB &amp;lt;-&amp;gt; RS232 mit 8052 CPU&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| DK&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tusb3410.html PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP2200 MCP2200]&lt;br /&gt;
| 1,90&lt;br /&gt;
| USB &amp;lt;-&amp;gt; UART per fest-vorprogrammiertem PIC&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| R, RS, F, M, DK, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/22228B.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GPS ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| NL-552ETTL (uBlox5) &lt;br /&gt;
| 25,43&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über TTL (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkte/gruppen/13/Boards_und_Module/60721_NL-552ETTL_ublox5.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| NL-550ERS (uBlox5) &lt;br /&gt;
| 24,95&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über RS232 (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkte/gruppen/13/Boards_und_Module/60418_NL-550ERS_ublox5.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| NL-551EUSB (uBlox5) &lt;br /&gt;
| 22,56&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über USB (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkt/60419/pdf.html?sprache=de PDF]&lt;br /&gt;
|-&lt;br /&gt;
| EM-406A (Sirf III)&lt;br /&gt;
| um 35 Euro&lt;br /&gt;
| GPS-Empfänger mit 1PPS-Ausgang&lt;br /&gt;
| Zugriff über TTL (NMEA Protokoll)&lt;br /&gt;
|&lt;br /&gt;
| [http://www.navilock.de/produkte/G_60407/merkmale.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| CW25-TIM &lt;br /&gt;
| ca. 35 Euro (ab 10 Stk)&lt;br /&gt;
| GPS Empfänger mit zusätzlichen Frequenzausgang(programmierbar von 10Hz..30Mhz)&lt;br /&gt;
| Sehr interesant wenn man einen präzisen Takt braucht.(für Adwandler, Datenlogger usw)&lt;br /&gt;
| [http://www.navsync.com]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Treiber ===&lt;br /&gt;
==== Diverse Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ULN2003A ULN2003A]&lt;br /&gt;
| 0,29&lt;br /&gt;
| 7-fach Low-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| R, D, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ULN2003 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ULN2803A ULN2803A]&lt;br /&gt;
| 0,31&lt;br /&gt;
| 8-fach Low-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ULN2803 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TPIC6B595 TPIC6B595]&lt;br /&gt;
| 1,00&lt;br /&gt;
| 8-fach Low-Side Treiber mit integriertem Schieberegister&lt;br /&gt;
| 45V/250mA&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TPIC6B595 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UDN2981 UDN2981]&lt;br /&gt;
| 1,50&lt;br /&gt;
| 8-fach High-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=UDN2981 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7667 ICL7667]&lt;br /&gt;
| 1&lt;br /&gt;
| Dual inverting MOSFET Treiber&lt;br /&gt;
| 18V, 20ns@1nF&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ICL7667 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/HCPL3120 HCPL3120]&lt;br /&gt;
| 3.70&lt;br /&gt;
| Optokoppler mit integriertem MOSFET-Treiber&lt;br /&gt;
| Schaltnetzteile, etc.&lt;br /&gt;
| C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=HCPL3120 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SN75179B SN75179B]&lt;br /&gt;
| 0.36&lt;br /&gt;
| RS-485/422 Receiver/Transmitter, alter IC mit hohem Stromverbrauch (60mA!)&lt;br /&gt;
| Serielle Daten (z.&amp;amp;nbsp;B.UART) über weite Strecken&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=SN75174 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX485 MAX485]&lt;br /&gt;
| 1.50&lt;br /&gt;
| RS-485/422 Receiver/Transmitter, moderner CMOS IC mit geringem Stromverbrauch (0,3mA!)&lt;br /&gt;
| Serielle Daten (z.&amp;amp;nbsp;B.UART) über weite Strecken&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=MAX485 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| LTC1480&lt;br /&gt;
| &lt;br /&gt;
| RS-485 Transceiver&lt;br /&gt;
| Betriebsspannung 3,3V, &amp;quot;Ultralow Power&amp;quot;&lt;br /&gt;
| R, C u.a.&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LTC1480 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| MAX3232&lt;br /&gt;
| &lt;br /&gt;
| RS-232 Transceiver&lt;br /&gt;
| Betriebsspannung 3V bis 5,5V&lt;br /&gt;
| R, D, C, [https://www.IT-WNS.de/ I] u.a.&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=MAX3232 PDF]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 7-Segment LED-Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;led&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SAA1064 SAA1064]&lt;br /&gt;
| ~2€&lt;br /&gt;
| Vier-Stellen Treiber mit [[I2C|I²C]] ([[TWI]]) Bus&lt;br /&gt;
| Treibt bis zu vier 7-Segment (plus Dezimalpunkt) Stellen mit gemeinsamer Anode. Bis zu vier SAA1064 können an einem I²C-Bus betrieben werden. Damit kann man insgesamt 16 Stellen treiben.&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.nxp.com/pip/SAA1064_CNV_2.html NXP]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/STLED316S STLED316S], [http://www.mikrocontroller.net/part/STLED316SMTR STLED316SMTR]&lt;br /&gt;
| ~2€&lt;br /&gt;
| Sechs-Stellen Treiber mit [[SPI]]-ähnlicher Busschnittstelle&lt;br /&gt;
| Sechs-Stellen Treiber, der zusätzlich noch ein 8x2 Tastaturdekoder enthält. Die Busschnittstelle ist [[SPI]]-ähnlich, MOSI und MISO liegen auf einem gemeinsamen PIN als DIN/DOUT.&lt;br /&gt;
| Mouser&lt;br /&gt;
| [http://www.st.com/stonline/products/literature/ds/14307/stled316s.pdf ST]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICM7218 ICM7218C]&lt;br /&gt;
| ~6€&lt;br /&gt;
| Acht-Stellen Treiber mit paralleler Busschnittstelle&lt;br /&gt;
| Alt, teuer, benötigt viele µC-Pins für die parallele Schnittstelle&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.intersil.com/data/fn/FN3159.pdf Intersil]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX7221 MAX7221]&lt;br /&gt;
| ~6€&lt;br /&gt;
| Acht-Stellen Treiber mit [[SPI]]-Schnittstelle&lt;br /&gt;
| Mit BCD-Dekoder, kann auch beliebige 8x8 LED-Matrix ansteuern&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf Maxim]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Punkt/Streifen (Dot/Bar) LED-Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;bar&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM3914 LM3914]&lt;br /&gt;
| ~1,20 €&lt;br /&gt;
| 10-Stellen Balkenanzeigetreiber mit Analogeingang&lt;br /&gt;
| Lineare A/D-Wandlung&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.national.com/pf/LM/LM3914.html National]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM3915 LM3915]&lt;br /&gt;
| ~1,40 €&lt;br /&gt;
| 10-Stellen Balkenanzeigetreiber mit Analogeingang&lt;br /&gt;
| Logarithmische A/D-Wandlung&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.national.com/pf/LM/LM3915.html National]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Analogschalter aus der 4000 Logikreihe ===&lt;br /&gt;
Die folgenden Schalter werden digital gesteuert, daher sind sie im Kapitel [[#Digital|Digital]] einsortiert. Sie basieren auf standard CMOS-Technologien, sind daher weit verbreitet, günstig, haben aber daher auch nur mäßige Eigenschaften und begrenzte Anwendungsbereiche. Analogschalter für Präzisionsanwendungen sind im Kapitel [[#Analog|Analog]]. Zum Schalten Analog- oder Digitalsignalen. Je nach Typ sind  Analogsignale bis in den 100 MHz Bereich mit einer Schaltfrequenz bis mehrere 10 MHz möglich.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4051 4051]&lt;br /&gt;
| 0,25&lt;br /&gt;
| Ein 8:1 Analogmultiplexer.&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4051+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4052 4052]&lt;br /&gt;
| 0,11&lt;br /&gt;
| Zwei 4:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4052+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4053 4053]&lt;br /&gt;
| 0,16&lt;br /&gt;
| Drei 2:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4053+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4066 4066]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Vier Analogschalter&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheets.org.uk/pdf/347282.pdf 4066.pdf]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4067 4067]&lt;br /&gt;
| 0,60&lt;br /&gt;
| Ein 16:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
|&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4067+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Galvanische Trennelemente ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CNY17 CNY17]&lt;br /&gt;
| 0,28&lt;br /&gt;
| Optisch, Standardtyp&lt;br /&gt;
| 3,7kV 50-100kHz&lt;br /&gt;
| R,C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=CNY17 PDF], [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A500%252FCNY17-I_CNY17-II_CNY17-III.pdf; PDF Temic]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/6N137 6N137]&lt;br /&gt;
| 0,49&lt;br /&gt;
| Optisch, Logikausgang (5V)&lt;br /&gt;
| sehr schnell 14MHz&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A500%252F6N137.pdf; PDF]&lt;br /&gt;
|-&lt;br /&gt;
| ADUM240*&lt;br /&gt;
| 10&lt;br /&gt;
| Induktiv, 3V/5V Logik&lt;br /&gt;
| extrem schnell, EN90650, 5kV&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=adum240 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| ISO72*&lt;br /&gt;
| 1,25&lt;br /&gt;
| Kapazitiv, 3V/5V&lt;br /&gt;
| 6kV, bis zu 150MHz&lt;br /&gt;
| DK,F&lt;br /&gt;
| [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=897&amp;amp;uiTemplateId=NODE_STRY_PGE_T PDF]&lt;br /&gt;
|-&lt;br /&gt;
| PC817/827/837/847&lt;br /&gt;
| 0,3&lt;br /&gt;
| Optisch&lt;br /&gt;
| 8x7, x=Anzahl der Optokoppler&lt;br /&gt;
| C, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=897&amp;amp;uiTemplateId=NODE_STRY_PGE_T PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Displays ===&lt;br /&gt;
Bei den Textdisplays eignet sich praktisch jedes [[HD44780]] konforme Display.&lt;br /&gt;
Praktisch jeder Elektronikversender hat eine Auswahl an verschiedenen Größen zu bieten. &lt;br /&gt;
Wer keinen besonderen Anspruch auf die Größe der Displays hat sollte sich bei Pollin und in Ebay umschauen.&lt;br /&gt;
&lt;br /&gt;
=== Speicher ===&lt;br /&gt;
&lt;br /&gt;
==== [[RAM]] ====&lt;br /&gt;
&lt;br /&gt;
==== [[EEPROM]] ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;EEPROMmemory&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| ST 24C01 BN6, ST 24C02 BN6, ST 24C256 BN6 (allgemein 24C## mit ## Größe in kbit)&lt;br /&gt;
| 0,14€ - 1,50€&lt;br /&gt;
| EEPROM Speicher mit seriellem (I2C) Interface, 1kbit bis 512 kbit Speicher. Viele verschiedene Hersteller.&lt;br /&gt;
| Speichern von Konfigurationsdaten &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=24C PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Converter ==&lt;br /&gt;
=== ADC ===&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Geschwindigkeit / Sps/s&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ADC830 ADC830]&lt;br /&gt;
| 6&lt;br /&gt;
| 8-Bit-ADC, Differentiell, Parallel, (DIL-20)&lt;br /&gt;
| 8770&lt;br /&gt;
| C,R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=adc830 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC2400 LTC2400CS8]&lt;br /&gt;
| 8,30&lt;br /&gt;
| 24-Bit-ADC, Single Ended, Seriell (SPI), (SO-8) &lt;br /&gt;
| ca. 6&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.linear.com/pc/downloadDocument.do?navId=H0,C1,C1155,C1001,C1152,P1636,D1887]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC2440 LTC2440CGN]&lt;br /&gt;
| 8,40&lt;br /&gt;
| 24-Bit-ADC, Differentiell, Seriell (SPI), (SSOP-16)&lt;br /&gt;
| bis 3500&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LTC2440 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| CS5381&lt;br /&gt;
| 37,50&lt;br /&gt;
| 24 Bit Stereo-Audio-ADC  (SOIC-24) &lt;br /&gt;
| bis 192k&lt;br /&gt;
| &lt;br /&gt;
| [http://www.cirrus.com/en/products/cs5381.html Seite]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| ADS830&lt;br /&gt;
| 6,10&lt;br /&gt;
| 8 Bit ADC Parallel (SSOP-20) &lt;br /&gt;
| bis 60M&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.com/datasheets_pdf/A/D/S/8/ADS830.shtml PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP3204 MCP3204]&lt;br /&gt;
| 2,65&lt;br /&gt;
| 12-Bit-SAR-ADC, Single Ended, 4 Kanäle mit MUX, Seriell (SPI), (DIL-14/SO-14) &lt;br /&gt;
| bis 100k&lt;br /&gt;
| C,R&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DAC ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DAC08 DAC08]&lt;br /&gt;
| 0,90&lt;br /&gt;
| 8-Bit DAC mit parallelem Businterface.&lt;br /&gt;
| Alt, preiswert. Benötigt viele µC Pins (min. 8, paralleler Bus) und eine doppelte Spannungsversorgung. Langsamere Version: 0808.&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=DAC08+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/AD7524  AD7524]&lt;br /&gt;
| 3,00&lt;br /&gt;
| 8-Bit DAC mit parallelem Businterface&lt;br /&gt;
| Benötigt viele µC Pins. Single-Supply (5V bis 15V).&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=7524+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA8444  TDA8444]&lt;br /&gt;
| 1,20&lt;br /&gt;
| Achtfach 6-Bit DAC mit seriellem TWI-Businterface. Bezahlbarer sechsfach-DAC, allerdings mit geringer Auflösung.&lt;br /&gt;
| Dort wo µC gesteuert viele Ausgangskanäle mit geringer, ungenauer Auflösung benötigt werden.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=TDA8444+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PCF8591 PCF8591]&lt;br /&gt;
| 2,50&lt;br /&gt;
| 8-Bit DAC, 8-Bit ADC mit seriellem TWI-Businterface.&lt;br /&gt;
| Z.B. in Regelkreisen wo sowohl ein DAC, als auch ein ADC benötigt wird.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=PFC8591+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA8702 TDA8702]&lt;br /&gt;
| 2,50&lt;br /&gt;
| 8-Bit Video DAC mit parallelem Businterface und Clock-Eingang.&lt;br /&gt;
| Schnelle Wandlung bis 30 MHz. Benötigt viele µC Pins.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=TDA8702+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1661 LTC1661]&lt;br /&gt;
| 2,45&lt;br /&gt;
| Dual 10-bit DAC mit seriellem 3-Leitungs-Businterface.&lt;br /&gt;
| Guter Kompromiss aus Preis und Leistung. (Achtung, Micro-SO8-Gehäuse)&lt;br /&gt;
| F, C (Suchfunktion weigert sich manchmal ihn im Conrad-Shop zu finden), R&lt;br /&gt;
| [http://www.google.de/search?q=LTC1661+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1257 LTC1257]&lt;br /&gt;
| 6,20&lt;br /&gt;
| 12-bit DAC mit kaskadierbarem seriellen 3-Leitungs-Businterface.&lt;br /&gt;
| Genauer µC-steuerbarer DAC.&lt;br /&gt;
| C, F, R&lt;br /&gt;
| [http://www.google.de/search?q=LTC1257+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1456 LTC1456]&lt;br /&gt;
| 10,-&lt;br /&gt;
| 12-bit DAC mit kaskadierbarem seriellen 3-Leitungs-Businterface.&lt;br /&gt;
| Genauer µC-steuerbarer DAC.&lt;br /&gt;
| C&lt;br /&gt;
| [http://www.google.de/search?q=LTC1456+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| MCP4922&lt;br /&gt;
| 2,25&lt;br /&gt;
| 2Kanal 12-bit DAC mit SPI-Interface&lt;br /&gt;
| Genauer µC-steuerbarer DAC von Microchip.&lt;br /&gt;
| R&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/devicedoc/21897a.pdf Datenblatt]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sensoren (aktiv) ==&lt;br /&gt;
=== [[Temperatursensor|Temperatur]] ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM75 LM75]&lt;br /&gt;
| 1,75&lt;br /&gt;
| Temperatursensor mit I²C (TWI) Bus Interface (3.3V und 5V Version) (SMD)&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM75 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS1621 DS1621]&lt;br /&gt;
| ~5&lt;br /&gt;
| Temperatursensor mit I²C (TWI) Bus Interface (wie LM75, kein SMD)&lt;br /&gt;
| C, D&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS18B20 DS18B20]&lt;br /&gt;
| 2,95&lt;br /&gt;
| Temperatursensor mit 1-Wire Interface&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=DS18B20 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM35 LM35]&lt;br /&gt;
| 1,19&lt;br /&gt;
| Analoger Temperatursensor&lt;br /&gt;
| D, R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM35 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM335 LM335]&lt;br /&gt;
| 0,87&lt;br /&gt;
| Analoger Temperatursensor&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM335 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TSIC306 TSIC306]&lt;br /&gt;
| 6&lt;br /&gt;
| Digitaler Temperatursensor (auch analog oder ratiometrisch)&lt;br /&gt;
| R,C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TSIC306 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TSIC506 TSIC506]&lt;br /&gt;
| 6&lt;br /&gt;
| Digitaler Temperatursensor (fertig kalibriert bis zu 0,1K zwischen 0-45°C)&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.zmd.de/pdf/ZMD%20TSic%20Data%20Sheet%20V3%207.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn man z.&amp;amp;nbsp;B. einen Übertemperaturschutz bauen will, bei der es nur eine Schaltschwelle gibt, dann empfiehlt sich die Verwendung eines NTCs. Dessen Kennlinie ist gegenüber den Kennlinien von z.&amp;amp;nbsp;B. LM335 dahingehend im Vorteil, dass eine geringe Temperaturänderung besser messbar ist. Eine detailliertere Übersicht findet sich im Artikel [[Temperatursensor]]en, andere Sensoren sind in der [[:Category:Sensorik|Kategorie Sensorik]] zu finden.&lt;br /&gt;
&lt;br /&gt;
= Passive Bauelemente =&lt;br /&gt;
== Sensoren (passiv)==&lt;br /&gt;
=== Licht ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPX65 BPX65]&lt;br /&gt;
| 4,25&lt;br /&gt;
| Fotodiode 10µA, 350-1000nm&lt;br /&gt;
| schnelle Lichtmessungen (bis MHz Bereich), großer Wellenlängenbereich&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPW34 BPW34]&lt;br /&gt;
| 0,59&lt;br /&gt;
| Fotodiode 80µA, 400-1100nm&lt;br /&gt;
| großer Wellenlängenbereich, Low Cost model, große Verfügbarkeit&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPW21 BPW21]&lt;br /&gt;
| 5,25&lt;br /&gt;
| Fotodiode 10µA, 550nm&lt;br /&gt;
| Lichtspektrum des menschlichen Auges&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[Temperatursensor|Temperatur]] ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/KTY81 KTY81]&lt;br /&gt;
| ~0,50&lt;br /&gt;
| nichtlinear(*), bis 150°C&lt;br /&gt;
| in &amp;amp;#956;C Schaltungen&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/KTY84_SERIES_5.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/KTY84 KTY84]&lt;br /&gt;
| 0,72&lt;br /&gt;
| nichtlinear(*), bis 300°C&lt;br /&gt;
| in &amp;amp;#956;C Schaltungen&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.org/datasheet2/e/0l2lc3p1dl8e5dgghsfh2oee43py.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PT100 Pt100] / [http://www.mikrocontroller.net/part/PT1000 Pt1000]&lt;br /&gt;
| ab 3,00&lt;br /&gt;
| lineare Kennlinie&lt;br /&gt;
| analoge Messschaltungen&lt;br /&gt;
| F C R&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Verschaltet man den Sensor als Spannungsteiler (Abgriff an den ADC), so erhält man dadurch eine meist ausreichende Linearisierung!&lt;br /&gt;
&lt;br /&gt;
== Widerstände ==&lt;br /&gt;
Mit einem Widerstandssortiment, welches die E12-Werte enthält, kann man normalerweise nicht falsch liegen. Denn früher oder später benötigt man jeden Widerstandswert der E12-Reihe einmal. Für einen Einstieg eignen sich die Sortimente vom Pollin. Auch ein Blick in Ebay kann sich lohnen, um ein Einstiegssortiment zu bekommen. Wer Schaltungen an Netzspannung entwickelt, sollte auf die &#039;&#039;Operation Voltage&#039;&#039; achten, denn nicht alle Typen weisen die nötige Spannungsfestigkeit auf. Als Daumenregel gilt: &amp;amp;frac12;-Watt-Widerstände oder größer passen immer, zwei bis drei in Reihe geschaltete &amp;amp;frac14;-Watt-Widerständen tun es auch.&lt;br /&gt;
&lt;br /&gt;
== Kondensatoren ==&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Keramik&lt;br /&gt;
| ~0.05&lt;br /&gt;
| &lt;br /&gt;
| [[Kondensator#Entkoppelkondensator | Abblockkondensator]] zwischen VCC und GND vor allem bei Digital-ICs &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Keramik SMD 0603&lt;br /&gt;
| ~0.01 (bei 100 Stück)&lt;br /&gt;
| SMD 0603&lt;br /&gt;
| [[Kondensator#Entkoppelkondensator | Abblockkondensator]] zwischen VCC und GND vor allem bei Digital-ICs&lt;br /&gt;
| D&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+0603+chip-capacitors+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Mechanische Bauelemente =&lt;br /&gt;
&lt;br /&gt;
== Taster / Schalter ==&lt;br /&gt;
&lt;br /&gt;
== Steckverbinder ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| WSL 10G&lt;br /&gt;
| 0,07&lt;br /&gt;
| Wannenstecker, 10-polig, gerade, Raster 2,54 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R, alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| PFL 10&lt;br /&gt;
| 0,09&lt;br /&gt;
| Pfostenleiste, 10-polig, Schneidklemmtechnik, Raster 2,54 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R,alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| AWG 28-10G&lt;br /&gt;
| 0,70€/m&lt;br /&gt;
| Flachbandkabel, 10-polig, 3 Meter, Raster 1,27 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R,alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| D-SUB BU 09FB&lt;br /&gt;
| 0,50&lt;br /&gt;
| D-Sub 9-polig auf 10-polig Pfostenleiste mit Flachbandkabel&lt;br /&gt;
| Anschluss für serielle Schnittstelle am PC&lt;br /&gt;
| R&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| KKxx025C&lt;br /&gt;
| 0,35 - 1,20&lt;br /&gt;
| Flachkabel-IC-Sockelverbinder, xx-polig (08, 14, 16, 18, 20, 28 erhältlich)&lt;br /&gt;
| Übergang von Leiterplatte auf Steckbrett&lt;br /&gt;
| R&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| Anreihklemmen&lt;br /&gt;
| 0,30 &lt;br /&gt;
| Reihenklemme/Anreihklemme (verschieden Typen, für Lochraster: Raster 5.08)&lt;br /&gt;
| Anschluss der Spannungsversorung, leistungsstarke Verbraucher&lt;br /&gt;
| alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 0,30&lt;br /&gt;
| Hohlstecker/DC-Stecker&lt;br /&gt;
| siehe englische Wikipedia [http://en.wikipedia.org/wiki/Coaxial_power_connector Coaxial power connector] &lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Lieferanten =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lokale Lieferanten: [[Lokale Anbieter]]&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Allgemeine Lieferantenliste: [[Elektronikversender]]&amp;lt;br&amp;gt;&lt;br /&gt;
Metallteile/Mechanik Lieferantenliste: [[Eisenwarenversender]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Kürzel&lt;br /&gt;
! Name&lt;br /&gt;
! Webseite&lt;br /&gt;
! Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;B&amp;lt;/b&amp;gt;&lt;br /&gt;
|Bürklin&lt;br /&gt;
|[http://www.buerklin.de www.buerklin.de]&lt;br /&gt;
|Ladengeschäft in München&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;&lt;br /&gt;
|Conrad&lt;br /&gt;
|[http://www.conrad.de www.conrad.de]&lt;br /&gt;
|Gigantisches Sortiment, aber sehr hohe Preise. Nur zu empfehlen, wenn die benötigten Teile nirgendwo anders aufzutreiben sind. Trotzdem kann man auch hier gelegentlich ein Schnäppchen machen. Filialen haben nicht alle Katalogartikel auf Lager&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;D&amp;lt;/b&amp;gt;&lt;br /&gt;
|CSD-Electronics&lt;br /&gt;
|[http://www.csd-electronics.de www.csd-electronics.de]&lt;br /&gt;
|Kleiner Shop mit überschaubarem Sortiment und akzeptablen Preisen.&amp;lt;br /&amp;gt;Ladengeschäft in Bonn&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;DK&amp;lt;/b&amp;gt;&lt;br /&gt;
|Digikey&lt;br /&gt;
|[http://de.digikey.com www.de.digikey.com]&lt;br /&gt;
|Mindestbestellmenge von 65€, sonst 18€ Versandkosten&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;F&amp;lt;/b&amp;gt;&lt;br /&gt;
|Farnell&lt;br /&gt;
|[http://www.farnell.de www.farnell.de]&lt;br /&gt;
|Versand nur Firmen &amp;amp; Studenten.  Farnell-Zwischenhändler für Privatkunden: HBE-Shop [http://www.hbe-shop.de] (wenn Ware im Shop nicht gelistet, einfach Farnell-Bestellnummer eingeben)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;I&amp;lt;/b&amp;gt;&lt;br /&gt;
|IT-WNS&lt;br /&gt;
|[http://www.it-wns.de www.it-wns.de]&lt;br /&gt;
|Kein Mindestbestellwert, geringe Versandkosten ab 1,90;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;M&amp;lt;/b&amp;gt;&lt;br /&gt;
|Meilhaus&lt;br /&gt;
|[http://www.meilhaus.de www.meilhaus.de]&lt;br /&gt;
|Nur gewerbliche Kunden&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;P&amp;lt;/b&amp;gt;&lt;br /&gt;
|Pollin&lt;br /&gt;
|[http://www.pollin.de www.pollin.de]&lt;br /&gt;
|Hier finden sich viele Schnäppchen und Industrierestposten&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;U&amp;lt;/b&amp;gt;&lt;br /&gt;
|Mouser&lt;br /&gt;
|[http://www.mouser.com www.mouser.com]&lt;br /&gt;
| 20€ Versand, ab 65€ Versandkostenfrei. Großes Sortiment und meist die niedrigsten Preise wenn man größere Stückzahlen benötigt.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;R&amp;lt;/b&amp;gt;&lt;br /&gt;
|Reichelt&lt;br /&gt;
|[http://www.reichelt.de www.reichelt.de]&lt;br /&gt;
| Mindestbestellmenge von 10€, sonst Zuschlag von 3€, 5,60€ Versand, großes Sortiment und meist gute Preise&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile| ]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;br /&gt;
[[Kategorie:Liste mit Bauteilen]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=83629</id>
		<title>AVR-Tutorial: Stack</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=83629"/>
		<updated>2014-07-15T08:19:59Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;[[Stack]]&amp;quot; bedeutet übersetzt soviel wie Stapel. Damit ist ein Speicher nach dem LIFO-Prinzip (&amp;quot;last in first out&amp;quot;) gemeint. Das bedeutet, dass das zuletzt auf den Stapel gelegte Element auch zuerst wieder heruntergenommen wird. Es ist nicht möglich, Elemente irgendwo in der Mitte des Stapels herauszuziehen oder hineinzuschieben. &lt;br /&gt;
&lt;br /&gt;
Bei allen aktuellen AVR-Controllern wird der Stack im [[Speicher#RAM|RAM]] angelegt. Der Stack wächst dabei von oben nach unten: Am Anfang wird der Stackpointer (Adresse der aktuellen Stapelposition) auf das Ende des RAMs gesetzt. Wird nun ein Element hinzugefügt, wird dieses an der momentanen Stackpointerposition abgespeichert und der Stackpointer um 1 erniedrigt. Soll ein Element vom Stack heruntergenommen werden, wird zuerst der Stackpointer um 1 erhöht und dann das Byte von der vom Stackpointer angezeigten Position gelesen.&lt;br /&gt;
&lt;br /&gt;
== Aufruf von Unterprogrammen ==&lt;br /&gt;
Dem Prozessor dient der Stack hauptsächlich dazu, Rücksprungadressen beim Aufruf von Unterprogrammen zu speichern, damit er später noch weiß, an welche Stelle zurückgekehrt werden muss, wenn das Unterprogramm mit &#039;&#039;&#039;ret&#039;&#039;&#039; oder die Interruptroutine mit &#039;&#039;&#039;reti&#039;&#039;&#039; beendet wird. &lt;br /&gt;
&lt;br /&gt;
Das folgende Beispielprogramm (AT90S4433) zeigt, wie der Stack dabei beeinflusst wird: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack.asm Download stack.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;     ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND  ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2        ; sub2 aufrufen&lt;br /&gt;
                           ; hier könnten auch ein paar Befehle stehen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;.def temp = r16&#039;&#039;&#039; ist eine Assemblerdirektive. Diese sagt dem Assembler, dass er überall, wo er &amp;quot;temp&amp;quot; findet, stattdessen &amp;quot;r16&amp;quot; einsetzen soll. Das ist oft praktisch, damit man nicht mit den Registernamen durcheinander kommt. Eine Übersicht über die Assemblerdirektiven findet man [http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html hier]. &lt;br /&gt;
&lt;br /&gt;
Bei Controllern, die mehr als 256 Byte RAM besitzen (z.&amp;amp;nbsp;B. ATmega8), passt die Adresse nicht mehr in ein Byte. Deswegen gibt es bei diesen Controllern das Stack-Pointer-Register aufgeteilt in &#039;&#039;&#039;SPL&#039;&#039;&#039; (Low) und &#039;&#039;&#039;SPH&#039;&#039;&#039; (High), in denen das Low- und das High-Byte der Adresse gespeichert wird. Damit es funktioniert, muss das Programm dann folgendermaßen geändert werden: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-bigmem.asm Download stack-bigmem.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPH, temp&lt;br /&gt;
         ldi temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPL, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2                        ; sub2 aufrufen&lt;br /&gt;
                                           ; hier könnten auch Befehle stehen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich ist es unsinnig, dieses Programm in einen Controller zu programmieren. Stattdessen sollte man es mal mit dem AVR-Studio simulieren, um die Funktion des Stacks zu verstehen. &lt;br /&gt;
&lt;br /&gt;
Als erstes wird mit &#039;&#039;&#039;Project/New&#039;&#039;&#039; ein neues Projekt erstellt, zu dem man dann mit &#039;&#039;&#039;Project/Add File&#039;&#039;&#039; eine Datei mit dem oben gezeigten Programm (stack.asm) hinzufügt. Nachdem man unter &#039;&#039;&#039;Project/Project Settings&#039;&#039;&#039; das &#039;&#039;&#039;Object Format for AVR-Studio&#039;&#039;&#039; ausgewählt hat, kann man das Programm mit Strg+F7 assemblieren und den Debug-Modus starten. &lt;br /&gt;
&lt;br /&gt;
Danach sollte man im Menu &#039;&#039;&#039;View&#039;&#039;&#039; die Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039; und &#039;&#039;&#039;Memory&#039;&#039;&#039; öffnen und im Memory-Fenster &#039;&#039;&#039;Data&#039;&#039;&#039; auswählen. &lt;br /&gt;
&lt;br /&gt;
Das Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;Program Counter&#039;&#039;: Adresse im Programmspeicher (FLASH), die gerade abgearbeitet wird&lt;br /&gt;
* &#039;&#039;Stack Pointer&#039;&#039;: Adresse im Datenspeicher (RAM), auf die der Stackpointer gerade zeigt&lt;br /&gt;
* &#039;&#039;Cycle Counter&#039;&#039;: Anzahl der Taktzyklen seit Beginn der Simulation&lt;br /&gt;
* &#039;&#039;Time Elapsed&#039;&#039;: Zeit, die seit dem Beginn der Simulation vergangen ist &lt;br /&gt;
&lt;br /&gt;
Im Fenster &#039;&#039;&#039;Memory&#039;&#039;&#039; wird der Inhalt des RAMs angezeigt. &lt;br /&gt;
&lt;br /&gt;
Sind alle 3 Fenster gut auf einmal sichtbar, kann man anfangen, das Programm (in diesem Fall &amp;quot;stack.asm&amp;quot;) mit der Taste F11 langsam Befehl für Befehl zu simulieren. &lt;br /&gt;
&lt;br /&gt;
Wenn der gelbe Pfeil in der Zeile &#039;&#039;&#039;out SPL, temp&#039;&#039;&#039; vorbeikommt, kann man im Prozessor-Fenster sehen, wie der Stackpointer auf 0xDF (&#039;&#039;ATmega8&#039;&#039;: 0x45F) gesetzt wird. Wie man im Memory-Fenster sieht, ist das die letzte RAM-Adresse. &lt;br /&gt;
&lt;br /&gt;
Wenn der Pfeil auf dem Befehl &#039;&#039;&#039;rcall sub1&#039;&#039;&#039; steht, sollte man sich den Program Counter anschauen: Er steht auf 0x02 (&#039;&#039;ATmega8&#039;&#039;: 0x04). &lt;br /&gt;
&lt;br /&gt;
Drückt man jetzt nochmal auf F11, springt der Pfeil zum Unterprogramm sub1. Im RAM erscheint an der Stelle, auf die der Stackpointer vorher zeigte, die Zahl 0x03 (&#039;&#039;ATmega8&#039;&#039;: 0x05). Das ist die Adresse im ROM, an der das Hauptprogramm nach dem Abarbeiten des Unterprogramms fortgesetzt wird. Doch warum wurde der Stackpointer um 2 verkleinert? Das liegt daran, dass eine Programmspeicheradresse bis zu 2 Byte breit sein kann, und somit auch 2 Byte auf dem Stack benötigt werden, um die Adresse zu speichern. &lt;br /&gt;
&lt;br /&gt;
Das gleiche passiert beim Aufruf von sub2. &lt;br /&gt;
&lt;br /&gt;
Zur Rückkehr aus dem mit rcall aufgerufenen Unterprogramm gibt es den Befehl &#039;&#039;&#039;ret&#039;&#039;&#039;. Dieser Befehl sorgt dafür, dass der Stackpointer wieder um 2 erhöht wird und die dabei eingelesene Adresse in den &amp;quot;Program Counter&amp;quot; kopiert wird, so dass das Programm dort fortgesetzt wird. &lt;br /&gt;
&lt;br /&gt;
Apropos Program Counter: Wer sehen will, wie so ein Programm aussieht, wenn es assembliert ist, sollte mal die Datei mit der Endung &amp;quot;.lst&amp;quot; im Projektverzeichnis öffnen. Die Datei sollte ungefähr so aussehen: &lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/listfile.gif&lt;br /&gt;
&lt;br /&gt;
Im blau umrahmten Bereich steht die Adresse des Befehls im Programmspeicher. Das ist auch die Zahl, die im Program Counter angezeigt wird, und die beim Aufruf eines Unterprogramms auf den Stack gelegt wird. Der grüne Bereich rechts daneben ist der OP-Code des Befehls, so wie er in den Programmspeicher des Controllers programmiert wird, und im roten Kasten stehen die &amp;quot;mnemonics&amp;quot;: Das sind die Befehle, die man im Assembler eingibt.&lt;br /&gt;
Der nicht eingerahmte Rest besteht aus Assemblerdirektiven, Labels (Sprungmarkierungen) und Kommentaren, die nicht direkt in OP-Code umgewandelt werden.&lt;br /&gt;
Der grün eingerahmte Bereich ist das eigentliche Programm, so wie es der µC versteht. Die jeweils erste Zahl im grünen Bereich steht für einen Befehl, den sog. OP-Code (OP = Operation). Die zweite Zahl codiert Argumente für diesen Befehl.&lt;br /&gt;
&lt;br /&gt;
== Sichern von Registern ==&lt;br /&gt;
Eine weitere Anwendung des Stacks ist das &amp;quot;Sichern&amp;quot; von Registern. Wenn man z.&amp;amp;nbsp;B. im Hauptprogramm die Register R16, R17 und R18 verwendet, dann ist es i.d.R. erwünscht, dass diese Register durch aufgerufene Unterprogramme nicht beeinflusst werden. Man muss also nun entweder auf die Verwendung dieser Register innerhalb von Unterprogrammen verzichten, oder man sorgt dafür, dass am Ende jedes Unterprogramms der ursprüngliche Zustand der Register wiederhergestellt wird. Wie man sich leicht vorstellen kann ist ein &amp;quot;Stapelspeicher&amp;quot; dafür ideal: Zu Beginn des Unterprogramms legt man die Daten aus den zu sichernden Registern oben auf den Stapel, und am Ende holt man sie wieder (in der umgekehrten Reihenfolge) in die entsprechenden Register zurück. Das Hauptprogramm bekommt also wenn es fortgesetzt wird überhaupt nichts davon mit, dass die Register inzwischen anderweitig verwendet wurden. &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-saveregs.asm Download stack-saveregs.asm]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;            ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = R16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND         ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         ldi temp, 0xFF&lt;br /&gt;
         out DDRB, temp           ; Port B = Ausgang&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0b10101010      ; einen Wert ins Register R17 laden&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                ; Unterprogramm &amp;quot;sub1&amp;quot; aufrufen&lt;br /&gt;
 &lt;br /&gt;
         out PORTB, R17           ; Wert von R17 an den Port B ausgeben&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop                ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
         push R17                 ; Inhalt von R17 auf dem Stack speichern&lt;br /&gt;
&lt;br /&gt;
         ; hier kann nach belieben mit R17 gearbeitet werden,&lt;br /&gt;
         ; als Beispiel wird es hier auf 0 gesetzt&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0&lt;br /&gt;
&lt;br /&gt;
         pop R17                  ; R17 zurückholen&lt;br /&gt;
         ret                      ; wieder zurück zum Hauptprogramm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man dieses Programm assembliert und in den Controller lädt, dann wird man feststellen, dass jede zweite LED an Port B leuchtet. Der ursprüngliche Wert von R17 blieb also erhalten, obwohl dazwischen ein Unterprogramm aufgerufen wurde, das R17 geändert hat. &lt;br /&gt;
&lt;br /&gt;
Auch in diesem Fall kann man bei der Simulation des Programms im AVR-Studio die Beeinflussung des Stacks durch die Befehle &#039;&#039;&#039;push&#039;&#039;&#039; und &#039;&#039;&#039;pop&#039;&#039;&#039; genau nachvollziehen.&lt;br /&gt;
&lt;br /&gt;
== Sprung zu beliebiger Adresse ==&lt;br /&gt;
&#039;&#039;Dieser Abschnitt ist veraltet, da nahezu alle ATmega/ATtiny Typen IJMP/ICALL unterstützen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kleinere AVR besitzen keinen Befehl, um direkt zu einer Adresse zu springen, die in einem Registerpaar gespeichert ist. Man kann dies aber mit etwas Stack-Akrobatik erreichen. Dazu einfach zuerst den niederen Teil der Adresse, dann den höheren Teil der Adresse mit &#039;&#039;&#039;push&#039;&#039;&#039; auf den Stack legen und ein &#039;&#039;&#039;ret&#039;&#039;&#039; ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
testRoutine:&lt;br /&gt;
	rjmp testRoutine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf diese Art und Weise kann man auch Unterprogrammaufrufe durchführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	rcall indirectZCall&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
indirectZCall:&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
testRoutine:&lt;br /&gt;
	...&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Größere AVR haben dafür die Befehle &amp;lt;code&amp;gt;ijmp&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;icall&amp;lt;/code&amp;gt;.&lt;br /&gt;
Bei diesen Befehlen muss das Sprungziel in ZH:ZL stehen.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen (von Lothar Müller): ==&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/301/Der-Stack-1.pdf Der Stack - Funktion und Nutzen (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/299/Der-Stack-2.pdf Der Stack - Parameterübergabe an Unterprogramme (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/676/Der-Stack-3.pdf Der Stack - Unterprogramme mit variabler Parameteranzahl (pdf) ]&lt;br /&gt;
&lt;br /&gt;
(Der in dieser Abhandlung angegebene Befehl &#039;&#039;MOV ZLow, SPL&#039;&#039; muss &#039;&#039;IN ZL, SPL&#039;&#039; heißen, da SPL und SPH I/O-Register sind. Ggf ist auch SPH zu berücksichtigen --&amp;gt; 2byte Stack-Pointer)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=logische Operatoren|&lt;br /&gt;
zurücklink=AVR-Tutorial: Logik|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=LCD|&lt;br /&gt;
vorlink=AVR-Tutorial: LCD}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Stack]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=83628</id>
		<title>AVR-Tutorial: Stack</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=83628"/>
		<updated>2014-07-15T08:06:11Z</updated>

		<summary type="html">&lt;p&gt;Prx: Indirekte Sprünge veraltet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;[[Stack]]&amp;quot; bedeutet übersetzt soviel wie Stapel. Damit ist ein Speicher nach dem LIFO-Prinzip (&amp;quot;last in first out&amp;quot;) gemeint. Das bedeutet, dass das zuletzt auf den Stapel gelegte Element auch zuerst wieder heruntergenommen wird. Es ist nicht möglich, Elemente irgendwo in der Mitte des Stapels herauszuziehen oder hineinzuschieben. &lt;br /&gt;
&lt;br /&gt;
Bei allen aktuellen AVR-Controllern wird der Stack im [[Speicher#RAM|RAM]] angelegt. Der Stack wächst dabei von oben nach unten: Am Anfang wird der Stackpointer (Adresse der aktuellen Stapelposition) auf das Ende des RAMs gesetzt. Wird nun ein Element hinzugefügt, wird dieses an der momentanen Stackpointerposition abgespeichert und der Stackpointer um 1 erniedrigt. Soll ein Element vom Stack heruntergenommen werden, wird zuerst der Stackpointer um 1 erhöht und dann das Byte von der vom Stackpointer angezeigten Position gelesen.&lt;br /&gt;
&lt;br /&gt;
== Aufruf von Unterprogrammen ==&lt;br /&gt;
Dem Prozessor dient der Stack hauptsächlich dazu, Rücksprungadressen beim Aufruf von Unterprogrammen zu speichern, damit er später noch weiß, an welche Stelle zurückgekehrt werden muss, wenn das Unterprogramm mit &#039;&#039;&#039;ret&#039;&#039;&#039; oder die Interruptroutine mit &#039;&#039;&#039;reti&#039;&#039;&#039; beendet wird. &lt;br /&gt;
&lt;br /&gt;
Das folgende Beispielprogramm (AT90S4433) zeigt, wie der Stack dabei beeinflusst wird: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack.asm Download stack.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;     ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND  ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2        ; sub2 aufrufen&lt;br /&gt;
                           ; hier könnten auch ein paar Befehle stehen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;.def temp = r16&#039;&#039;&#039; ist eine Assemblerdirektive. Diese sagt dem Assembler, dass er überall, wo er &amp;quot;temp&amp;quot; findet, stattdessen &amp;quot;r16&amp;quot; einsetzen soll. Das ist oft praktisch, damit man nicht mit den Registernamen durcheinander kommt. Eine Übersicht über die Assemblerdirektiven findet man [http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html hier]. &lt;br /&gt;
&lt;br /&gt;
Bei Controllern, die mehr als 256 Byte RAM besitzen (z.&amp;amp;nbsp;B. ATmega8), passt die Adresse nicht mehr in ein Byte. Deswegen gibt es bei diesen Controllern das Stack-Pointer-Register aufgeteilt in &#039;&#039;&#039;SPL&#039;&#039;&#039; (Low) und &#039;&#039;&#039;SPH&#039;&#039;&#039; (High), in denen das Low- und das High-Byte der Adresse gespeichert wird. Damit es funktioniert, muss das Programm dann folgendermaßen geändert werden: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-bigmem.asm Download stack-bigmem.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPH, temp&lt;br /&gt;
         ldi temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPL, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2                        ; sub2 aufrufen&lt;br /&gt;
                                           ; hier könnten auch Befehle stehen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich ist es unsinnig, dieses Programm in einen Controller zu programmieren. Stattdessen sollte man es mal mit dem AVR-Studio simulieren, um die Funktion des Stacks zu verstehen. &lt;br /&gt;
&lt;br /&gt;
Als erstes wird mit &#039;&#039;&#039;Project/New&#039;&#039;&#039; ein neues Projekt erstellt, zu dem man dann mit &#039;&#039;&#039;Project/Add File&#039;&#039;&#039; eine Datei mit dem oben gezeigten Programm (stack.asm) hinzufügt. Nachdem man unter &#039;&#039;&#039;Project/Project Settings&#039;&#039;&#039; das &#039;&#039;&#039;Object Format for AVR-Studio&#039;&#039;&#039; ausgewählt hat, kann man das Programm mit Strg+F7 assemblieren und den Debug-Modus starten. &lt;br /&gt;
&lt;br /&gt;
Danach sollte man im Menu &#039;&#039;&#039;View&#039;&#039;&#039; die Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039; und &#039;&#039;&#039;Memory&#039;&#039;&#039; öffnen und im Memory-Fenster &#039;&#039;&#039;Data&#039;&#039;&#039; auswählen. &lt;br /&gt;
&lt;br /&gt;
Das Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;Program Counter&#039;&#039;: Adresse im Programmspeicher (FLASH), die gerade abgearbeitet wird&lt;br /&gt;
* &#039;&#039;Stack Pointer&#039;&#039;: Adresse im Datenspeicher (RAM), auf die der Stackpointer gerade zeigt&lt;br /&gt;
* &#039;&#039;Cycle Counter&#039;&#039;: Anzahl der Taktzyklen seit Beginn der Simulation&lt;br /&gt;
* &#039;&#039;Time Elapsed&#039;&#039;: Zeit, die seit dem Beginn der Simulation vergangen ist &lt;br /&gt;
&lt;br /&gt;
Im Fenster &#039;&#039;&#039;Memory&#039;&#039;&#039; wird der Inhalt des RAMs angezeigt. &lt;br /&gt;
&lt;br /&gt;
Sind alle 3 Fenster gut auf einmal sichtbar, kann man anfangen, das Programm (in diesem Fall &amp;quot;stack.asm&amp;quot;) mit der Taste F11 langsam Befehl für Befehl zu simulieren. &lt;br /&gt;
&lt;br /&gt;
Wenn der gelbe Pfeil in der Zeile &#039;&#039;&#039;out SPL, temp&#039;&#039;&#039; vorbeikommt, kann man im Prozessor-Fenster sehen, wie der Stackpointer auf 0xDF (&#039;&#039;ATmega8&#039;&#039;: 0x45F) gesetzt wird. Wie man im Memory-Fenster sieht, ist das die letzte RAM-Adresse. &lt;br /&gt;
&lt;br /&gt;
Wenn der Pfeil auf dem Befehl &#039;&#039;&#039;rcall sub1&#039;&#039;&#039; steht, sollte man sich den Program Counter anschauen: Er steht auf 0x02 (&#039;&#039;ATmega8&#039;&#039;: 0x04). &lt;br /&gt;
&lt;br /&gt;
Drückt man jetzt nochmal auf F11, springt der Pfeil zum Unterprogramm sub1. Im RAM erscheint an der Stelle, auf die der Stackpointer vorher zeigte, die Zahl 0x03 (&#039;&#039;ATmega8&#039;&#039;: 0x05). Das ist die Adresse im ROM, an der das Hauptprogramm nach dem Abarbeiten des Unterprogramms fortgesetzt wird. Doch warum wurde der Stackpointer um 2 verkleinert? Das liegt daran, dass eine Programmspeicheradresse bis zu 2 Byte breit sein kann, und somit auch 2 Byte auf dem Stack benötigt werden, um die Adresse zu speichern. &lt;br /&gt;
&lt;br /&gt;
Das gleiche passiert beim Aufruf von sub2. &lt;br /&gt;
&lt;br /&gt;
Zur Rückkehr aus dem mit rcall aufgerufenen Unterprogramm gibt es den Befehl &#039;&#039;&#039;ret&#039;&#039;&#039;. Dieser Befehl sorgt dafür, dass der Stackpointer wieder um 2 erhöht wird und die dabei eingelesene Adresse in den &amp;quot;Program Counter&amp;quot; kopiert wird, so dass das Programm dort fortgesetzt wird. &lt;br /&gt;
&lt;br /&gt;
Apropos Program Counter: Wer sehen will, wie so ein Programm aussieht, wenn es assembliert ist, sollte mal die Datei mit der Endung &amp;quot;.lst&amp;quot; im Projektverzeichnis öffnen. Die Datei sollte ungefähr so aussehen: &lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/listfile.gif&lt;br /&gt;
&lt;br /&gt;
Im blau umrahmten Bereich steht die Adresse des Befehls im Programmspeicher. Das ist auch die Zahl, die im Program Counter angezeigt wird, und die beim Aufruf eines Unterprogramms auf den Stack gelegt wird. Der grüne Bereich rechts daneben ist der OP-Code des Befehls, so wie er in den Programmspeicher des Controllers programmiert wird, und im roten Kasten stehen die &amp;quot;mnemonics&amp;quot;: Das sind die Befehle, die man im Assembler eingibt.&lt;br /&gt;
Der nicht eingerahmte Rest besteht aus Assemblerdirektiven, Labels (Sprungmarkierungen) und Kommentaren, die nicht direkt in OP-Code umgewandelt werden.&lt;br /&gt;
Der grün eingerahmte Bereich ist das eigentliche Programm, so wie es der µC versteht. Die jeweils erste Zahl im grünen Bereich steht für einen Befehl, den sog. OP-Code (OP = Operation). Die zweite Zahl codiert Argumente für diesen Befehl.&lt;br /&gt;
&lt;br /&gt;
== Sichern von Registern ==&lt;br /&gt;
Eine weitere Anwendung des Stacks ist das &amp;quot;Sichern&amp;quot; von Registern. Wenn man z.&amp;amp;nbsp;B. im Hauptprogramm die Register R16, R17 und R18 verwendet, dann ist es i.d.R. erwünscht, dass diese Register durch aufgerufene Unterprogramme nicht beeinflusst werden. Man muss also nun entweder auf die Verwendung dieser Register innerhalb von Unterprogrammen verzichten, oder man sorgt dafür, dass am Ende jedes Unterprogramms der ursprüngliche Zustand der Register wiederhergestellt wird. Wie man sich leicht vorstellen kann ist ein &amp;quot;Stapelspeicher&amp;quot; dafür ideal: Zu Beginn des Unterprogramms legt man die Daten aus den zu sichernden Registern oben auf den Stapel, und am Ende holt man sie wieder (in der umgekehrten Reihenfolge) in die entsprechenden Register zurück. Das Hauptprogramm bekommt also wenn es fortgesetzt wird überhaupt nichts davon mit, dass die Register inzwischen anderweitig verwendet wurden. &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-saveregs.asm Download stack-saveregs.asm]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;            ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = R16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND         ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         ldi temp, 0xFF&lt;br /&gt;
         out DDRB, temp           ; Port B = Ausgang&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0b10101010      ; einen Wert ins Register R17 laden&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                ; Unterprogramm &amp;quot;sub1&amp;quot; aufrufen&lt;br /&gt;
 &lt;br /&gt;
         out PORTB, R17           ; Wert von R17 an den Port B ausgeben&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop                ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
         push R17                 ; Inhalt von R17 auf dem Stack speichern&lt;br /&gt;
&lt;br /&gt;
         ; hier kann nach belieben mit R17 gearbeitet werden,&lt;br /&gt;
         ; als Beispiel wird es hier auf 0 gesetzt&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0&lt;br /&gt;
&lt;br /&gt;
         pop R17                  ; R17 zurückholen&lt;br /&gt;
         ret                      ; wieder zurück zum Hauptprogramm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man dieses Programm assembliert und in den Controller lädt, dann wird man feststellen, dass jede zweite LED an Port B leuchtet. Der ursprüngliche Wert von R17 blieb also erhalten, obwohl dazwischen ein Unterprogramm aufgerufen wurde, das R17 geändert hat. &lt;br /&gt;
&lt;br /&gt;
Auch in diesem Fall kann man bei der Simulation des Programms im AVR-Studio die Beeinflussung des Stacks durch die Befehle &#039;&#039;&#039;push&#039;&#039;&#039; und &#039;&#039;&#039;pop&#039;&#039;&#039; genau nachvollziehen.&lt;br /&gt;
&lt;br /&gt;
== Sprung zu beliebiger Adresse ==&lt;br /&gt;
&#039;&#039;Dieser Abschnitt ist veraltet, da alle ATmega/ATtiny Typen IJMP/ICALL unterstützen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kleinere AVR besitzen keinen Befehl, um direkt zu einer Adresse zu springen, die in einem Registerpaar gespeichert ist. Man kann dies aber mit etwas Stack-Akrobatik erreichen. Dazu einfach zuerst den niederen Teil der Adresse, dann den höheren Teil der Adresse mit &#039;&#039;&#039;push&#039;&#039;&#039; auf den Stack legen und ein &#039;&#039;&#039;ret&#039;&#039;&#039; ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
testRoutine:&lt;br /&gt;
	rjmp testRoutine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf diese Art und Weise kann man auch Unterprogrammaufrufe durchführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	rcall indirectZCall&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
indirectZCall:&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
testRoutine:&lt;br /&gt;
	...&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Größere AVR haben dafür die Befehle &amp;lt;code&amp;gt;ijmp&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;icall&amp;lt;/code&amp;gt;.&lt;br /&gt;
Bei diesen Befehlen muss das Sprungziel in ZH:ZL stehen.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen (von Lothar Müller): ==&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/301/Der-Stack-1.pdf Der Stack - Funktion und Nutzen (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/299/Der-Stack-2.pdf Der Stack - Parameterübergabe an Unterprogramme (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/676/Der-Stack-3.pdf Der Stack - Unterprogramme mit variabler Parameteranzahl (pdf) ]&lt;br /&gt;
&lt;br /&gt;
(Der in dieser Abhandlung angegebene Befehl &#039;&#039;MOV ZLow, SPL&#039;&#039; muss &#039;&#039;IN ZL, SPL&#039;&#039; heißen, da SPL und SPH I/O-Register sind. Ggf ist auch SPH zu berücksichtigen --&amp;gt; 2byte Stack-Pointer)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=logische Operatoren|&lt;br /&gt;
zurücklink=AVR-Tutorial: Logik|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=LCD|&lt;br /&gt;
vorlink=AVR-Tutorial: LCD}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Stack]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=83627</id>
		<title>AVR-Tutorial: Stack</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=83627"/>
		<updated>2014-07-15T08:01:50Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;[[Stack]]&amp;quot; bedeutet übersetzt soviel wie Stapel. Damit ist ein Speicher nach dem LIFO-Prinzip (&amp;quot;last in first out&amp;quot;) gemeint. Das bedeutet, dass das zuletzt auf den Stapel gelegte Element auch zuerst wieder heruntergenommen wird. Es ist nicht möglich, Elemente irgendwo in der Mitte des Stapels herauszuziehen oder hineinzuschieben. &lt;br /&gt;
&lt;br /&gt;
Bei allen aktuellen AVR-Controllern wird der Stack im [[Speicher#RAM|RAM]] angelegt. Der Stack wächst dabei von oben nach unten: Am Anfang wird der Stackpointer (Adresse der aktuellen Stapelposition) auf das Ende des RAMs gesetzt. Wird nun ein Element hinzugefügt, wird dieses an der momentanen Stackpointerposition abgespeichert und der Stackpointer um 1 erniedrigt. Soll ein Element vom Stack heruntergenommen werden, wird zuerst der Stackpointer um 1 erhöht und dann das Byte von der vom Stackpointer angezeigten Position gelesen.&lt;br /&gt;
&lt;br /&gt;
== Aufruf von Unterprogrammen ==&lt;br /&gt;
Dem Prozessor dient der Stack hauptsächlich dazu, Rücksprungadressen beim Aufruf von Unterprogrammen zu speichern, damit er später noch weiß, an welche Stelle zurückgekehrt werden muss, wenn das Unterprogramm mit &#039;&#039;&#039;ret&#039;&#039;&#039; oder die Interruptroutine mit &#039;&#039;&#039;reti&#039;&#039;&#039; beendet wird. &lt;br /&gt;
&lt;br /&gt;
Das folgende Beispielprogramm (AT90S4433) zeigt, wie der Stack dabei beeinflusst wird: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack.asm Download stack.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;     ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND  ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2        ; sub2 aufrufen&lt;br /&gt;
                           ; hier könnten auch ein paar Befehle stehen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;.def temp = r16&#039;&#039;&#039; ist eine Assemblerdirektive. Diese sagt dem Assembler, dass er überall, wo er &amp;quot;temp&amp;quot; findet, stattdessen &amp;quot;r16&amp;quot; einsetzen soll. Das ist oft praktisch, damit man nicht mit den Registernamen durcheinander kommt. Eine Übersicht über die Assemblerdirektiven findet man [http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html hier]. &lt;br /&gt;
&lt;br /&gt;
Bei Controllern, die mehr als 256 Byte RAM besitzen (z.&amp;amp;nbsp;B. ATmega8), passt die Adresse nicht mehr in ein Byte. Deswegen gibt es bei diesen Controllern das Stack-Pointer-Register aufgeteilt in &#039;&#039;&#039;SPL&#039;&#039;&#039; (Low) und &#039;&#039;&#039;SPH&#039;&#039;&#039; (High), in denen das Low- und das High-Byte der Adresse gespeichert wird. Damit es funktioniert, muss das Programm dann folgendermaßen geändert werden: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-bigmem.asm Download stack-bigmem.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPH, temp&lt;br /&gt;
         ldi temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPL, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2                        ; sub2 aufrufen&lt;br /&gt;
                                           ; hier könnten auch Befehle stehen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich ist es unsinnig, dieses Programm in einen Controller zu programmieren. Stattdessen sollte man es mal mit dem AVR-Studio simulieren, um die Funktion des Stacks zu verstehen. &lt;br /&gt;
&lt;br /&gt;
Als erstes wird mit &#039;&#039;&#039;Project/New&#039;&#039;&#039; ein neues Projekt erstellt, zu dem man dann mit &#039;&#039;&#039;Project/Add File&#039;&#039;&#039; eine Datei mit dem oben gezeigten Programm (stack.asm) hinzufügt. Nachdem man unter &#039;&#039;&#039;Project/Project Settings&#039;&#039;&#039; das &#039;&#039;&#039;Object Format for AVR-Studio&#039;&#039;&#039; ausgewählt hat, kann man das Programm mit Strg+F7 assemblieren und den Debug-Modus starten. &lt;br /&gt;
&lt;br /&gt;
Danach sollte man im Menu &#039;&#039;&#039;View&#039;&#039;&#039; die Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039; und &#039;&#039;&#039;Memory&#039;&#039;&#039; öffnen und im Memory-Fenster &#039;&#039;&#039;Data&#039;&#039;&#039; auswählen. &lt;br /&gt;
&lt;br /&gt;
Das Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;Program Counter&#039;&#039;: Adresse im Programmspeicher (FLASH), die gerade abgearbeitet wird&lt;br /&gt;
* &#039;&#039;Stack Pointer&#039;&#039;: Adresse im Datenspeicher (RAM), auf die der Stackpointer gerade zeigt&lt;br /&gt;
* &#039;&#039;Cycle Counter&#039;&#039;: Anzahl der Taktzyklen seit Beginn der Simulation&lt;br /&gt;
* &#039;&#039;Time Elapsed&#039;&#039;: Zeit, die seit dem Beginn der Simulation vergangen ist &lt;br /&gt;
&lt;br /&gt;
Im Fenster &#039;&#039;&#039;Memory&#039;&#039;&#039; wird der Inhalt des RAMs angezeigt. &lt;br /&gt;
&lt;br /&gt;
Sind alle 3 Fenster gut auf einmal sichtbar, kann man anfangen, das Programm (in diesem Fall &amp;quot;stack.asm&amp;quot;) mit der Taste F11 langsam Befehl für Befehl zu simulieren. &lt;br /&gt;
&lt;br /&gt;
Wenn der gelbe Pfeil in der Zeile &#039;&#039;&#039;out SPL, temp&#039;&#039;&#039; vorbeikommt, kann man im Prozessor-Fenster sehen, wie der Stackpointer auf 0xDF (&#039;&#039;ATmega8&#039;&#039;: 0x45F) gesetzt wird. Wie man im Memory-Fenster sieht, ist das die letzte RAM-Adresse. &lt;br /&gt;
&lt;br /&gt;
Wenn der Pfeil auf dem Befehl &#039;&#039;&#039;rcall sub1&#039;&#039;&#039; steht, sollte man sich den Program Counter anschauen: Er steht auf 0x02 (&#039;&#039;ATmega8&#039;&#039;: 0x04). &lt;br /&gt;
&lt;br /&gt;
Drückt man jetzt nochmal auf F11, springt der Pfeil zum Unterprogramm sub1. Im RAM erscheint an der Stelle, auf die der Stackpointer vorher zeigte, die Zahl 0x03 (&#039;&#039;ATmega8&#039;&#039;: 0x05). Das ist die Adresse im ROM, an der das Hauptprogramm nach dem Abarbeiten des Unterprogramms fortgesetzt wird. Doch warum wurde der Stackpointer um 2 verkleinert? Das liegt daran, dass eine Programmspeicheradresse bis zu 2 Byte breit sein kann, und somit auch 2 Byte auf dem Stack benötigt werden, um die Adresse zu speichern. &lt;br /&gt;
&lt;br /&gt;
Das gleiche passiert beim Aufruf von sub2. &lt;br /&gt;
&lt;br /&gt;
Zur Rückkehr aus dem mit rcall aufgerufenen Unterprogramm gibt es den Befehl &#039;&#039;&#039;ret&#039;&#039;&#039;. Dieser Befehl sorgt dafür, dass der Stackpointer wieder um 2 erhöht wird und die dabei eingelesene Adresse in den &amp;quot;Program Counter&amp;quot; kopiert wird, so dass das Programm dort fortgesetzt wird. &lt;br /&gt;
&lt;br /&gt;
Apropos Program Counter: Wer sehen will, wie so ein Programm aussieht, wenn es assembliert ist, sollte mal die Datei mit der Endung &amp;quot;.lst&amp;quot; im Projektverzeichnis öffnen. Die Datei sollte ungefähr so aussehen: &lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/listfile.gif&lt;br /&gt;
&lt;br /&gt;
Im blau umrahmten Bereich steht die Adresse des Befehls im Programmspeicher. Das ist auch die Zahl, die im Program Counter angezeigt wird, und die beim Aufruf eines Unterprogramms auf den Stack gelegt wird. Der grüne Bereich rechts daneben ist der OP-Code des Befehls, so wie er in den Programmspeicher des Controllers programmiert wird, und im roten Kasten stehen die &amp;quot;mnemonics&amp;quot;: Das sind die Befehle, die man im Assembler eingibt.&lt;br /&gt;
Der nicht eingerahmte Rest besteht aus Assemblerdirektiven, Labels (Sprungmarkierungen) und Kommentaren, die nicht direkt in OP-Code umgewandelt werden.&lt;br /&gt;
Der grün eingerahmte Bereich ist das eigentliche Programm, so wie es der µC versteht. Die jeweils erste Zahl im grünen Bereich steht für einen Befehl, den sog. OP-Code (OP = Operation). Die zweite Zahl codiert Argumente für diesen Befehl.&lt;br /&gt;
&lt;br /&gt;
== Sichern von Registern ==&lt;br /&gt;
Eine weitere Anwendung des Stacks ist das &amp;quot;Sichern&amp;quot; von Registern. Wenn man z.&amp;amp;nbsp;B. im Hauptprogramm die Register R16, R17 und R18 verwendet, dann ist es i.d.R. erwünscht, dass diese Register durch aufgerufene Unterprogramme nicht beeinflusst werden. Man muss also nun entweder auf die Verwendung dieser Register innerhalb von Unterprogrammen verzichten, oder man sorgt dafür, dass am Ende jedes Unterprogramms der ursprüngliche Zustand der Register wiederhergestellt wird. Wie man sich leicht vorstellen kann ist ein &amp;quot;Stapelspeicher&amp;quot; dafür ideal: Zu Beginn des Unterprogramms legt man die Daten aus den zu sichernden Registern oben auf den Stapel, und am Ende holt man sie wieder (in der umgekehrten Reihenfolge) in die entsprechenden Register zurück. Das Hauptprogramm bekommt also wenn es fortgesetzt wird überhaupt nichts davon mit, dass die Register inzwischen anderweitig verwendet wurden. &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-saveregs.asm Download stack-saveregs.asm]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;            ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = R16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND         ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         ldi temp, 0xFF&lt;br /&gt;
         out DDRB, temp           ; Port B = Ausgang&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0b10101010      ; einen Wert ins Register R17 laden&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                ; Unterprogramm &amp;quot;sub1&amp;quot; aufrufen&lt;br /&gt;
 &lt;br /&gt;
         out PORTB, R17           ; Wert von R17 an den Port B ausgeben&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop                ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
         push R17                 ; Inhalt von R17 auf dem Stack speichern&lt;br /&gt;
&lt;br /&gt;
         ; hier kann nach belieben mit R17 gearbeitet werden,&lt;br /&gt;
         ; als Beispiel wird es hier auf 0 gesetzt&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0&lt;br /&gt;
&lt;br /&gt;
         pop R17                  ; R17 zurückholen&lt;br /&gt;
         ret                      ; wieder zurück zum Hauptprogramm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man dieses Programm assembliert und in den Controller lädt, dann wird man feststellen, dass jede zweite LED an Port B leuchtet. Der ursprüngliche Wert von R17 blieb also erhalten, obwohl dazwischen ein Unterprogramm aufgerufen wurde, das R17 geändert hat. &lt;br /&gt;
&lt;br /&gt;
Auch in diesem Fall kann man bei der Simulation des Programms im AVR-Studio die Beeinflussung des Stacks durch die Befehle &#039;&#039;&#039;push&#039;&#039;&#039; und &#039;&#039;&#039;pop&#039;&#039;&#039; genau nachvollziehen.&lt;br /&gt;
&lt;br /&gt;
== Sprung zu beliebiger Adresse ==&lt;br /&gt;
Kleinere AVR besitzen keinen Befehl, um direkt zu einer Adresse zu springen, die in einem Registerpaar gespeichert ist. Man kann dies aber mit etwas Stack-Akrobatik erreichen. Dazu einfach zuerst den niederen Teil der Adresse, dann den höheren Teil der Adresse mit &#039;&#039;&#039;push&#039;&#039;&#039; auf den Stack legen und ein &#039;&#039;&#039;ret&#039;&#039;&#039; ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
testRoutine:&lt;br /&gt;
	rjmp testRoutine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf diese Art und Weise kann man auch Unterprogrammaufrufe durchführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	rcall indirectZCall&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
indirectZCall:&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
testRoutine:&lt;br /&gt;
	...&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Größere AVR haben dafür die Befehle &amp;lt;code&amp;gt;ijmp&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;icall&amp;lt;/code&amp;gt;.&lt;br /&gt;
Bei diesen Befehlen muss das Sprungziel in ZH:ZL stehen.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen (von Lothar Müller): ==&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/301/Der-Stack-1.pdf Der Stack - Funktion und Nutzen (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/299/Der-Stack-2.pdf Der Stack - Parameterübergabe an Unterprogramme (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/676/Der-Stack-3.pdf Der Stack - Unterprogramme mit variabler Parameteranzahl (pdf) ]&lt;br /&gt;
&lt;br /&gt;
(Der in dieser Abhandlung angegebene Befehl &#039;&#039;MOV ZLow, SPL&#039;&#039; muss &#039;&#039;IN ZL, SPL&#039;&#039; heißen, da SPL und SPH I/O-Register sind. Ggf ist auch SPH zu berücksichtigen --&amp;gt; 2byte Stack-Pointer)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=logische Operatoren|&lt;br /&gt;
zurücklink=AVR-Tutorial: Logik|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=LCD|&lt;br /&gt;
vorlink=AVR-Tutorial: LCD}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Stack]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=83626</id>
		<title>AVR-Tutorial: Stack</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=83626"/>
		<updated>2014-07-15T07:59:42Z</updated>

		<summary type="html">&lt;p&gt;Prx: IN statt MOV&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;[[Stack]]&amp;quot; bedeutet übersetzt soviel wie Stapel. Damit ist ein Speicher nach dem LIFO-Prinzip (&amp;quot;last in first out&amp;quot;) gemeint. Das bedeutet, dass das zuletzt auf den Stapel gelegte Element auch zuerst wieder heruntergenommen wird. Es ist nicht möglich, Elemente irgendwo in der Mitte des Stapels herauszuziehen oder hineinzuschieben. &lt;br /&gt;
&lt;br /&gt;
Bei allen aktuellen AVR-Controllern wird der Stack im [[Speicher#RAM|RAM]] angelegt. Der Stack wächst dabei von oben nach unten: Am Anfang wird der Stackpointer (Adresse der aktuellen Stapelposition) auf das Ende des RAMs gesetzt. Wird nun ein Element hinzugefügt, wird dieses an der momentanen Stackpointerposition abgespeichert und der Stackpointer um 1 erniedrigt. Soll ein Element vom Stack heruntergenommen werden, wird zuerst der Stackpointer um 1 erhöht und dann das Byte von der vom Stackpointer angezeigten Position gelesen.&lt;br /&gt;
&lt;br /&gt;
== Aufruf von Unterprogrammen ==&lt;br /&gt;
Dem Prozessor dient der Stack hauptsächlich dazu, Rücksprungadressen beim Aufruf von Unterprogrammen zu speichern, damit er später noch weiß, an welche Stelle zurückgekehrt werden muss, wenn das Unterprogramm mit &#039;&#039;&#039;ret&#039;&#039;&#039; oder die Interruptroutine mit &#039;&#039;&#039;reti&#039;&#039;&#039; beendet wird. &lt;br /&gt;
&lt;br /&gt;
Das folgende Beispielprogramm (AT90S4433) zeigt, wie der Stack dabei beeinflusst wird: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack.asm Download stack.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;     ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND  ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2        ; sub2 aufrufen&lt;br /&gt;
                           ; hier könnten auch ein paar Befehle stehen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;.def temp = r16&#039;&#039;&#039; ist eine Assemblerdirektive. Diese sagt dem Assembler, dass er überall, wo er &amp;quot;temp&amp;quot; findet, stattdessen &amp;quot;r16&amp;quot; einsetzen soll. Das ist oft praktisch, damit man nicht mit den Registernamen durcheinander kommt. Eine Übersicht über die Assemblerdirektiven findet man [http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html hier]. &lt;br /&gt;
&lt;br /&gt;
Bei Controllern, die mehr als 256 Byte RAM besitzen (z.&amp;amp;nbsp;B. ATmega8), passt die Adresse nicht mehr in ein Byte. Deswegen gibt es bei diesen Controllern das Stack-Pointer-Register aufgeteilt in &#039;&#039;&#039;SPL&#039;&#039;&#039; (Low) und &#039;&#039;&#039;SPH&#039;&#039;&#039; (High), in denen das Low- und das High-Byte der Adresse gespeichert wird. Damit es funktioniert, muss das Programm dann folgendermaßen geändert werden: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-bigmem.asm Download stack-bigmem.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPH, temp&lt;br /&gt;
         ldi temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPL, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2                        ; sub2 aufrufen&lt;br /&gt;
                                           ; hier könnten auch Befehle stehen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich ist es unsinnig, dieses Programm in einen Controller zu programmieren. Stattdessen sollte man es mal mit dem AVR-Studio simulieren, um die Funktion des Stacks zu verstehen. &lt;br /&gt;
&lt;br /&gt;
Als erstes wird mit &#039;&#039;&#039;Project/New&#039;&#039;&#039; ein neues Projekt erstellt, zu dem man dann mit &#039;&#039;&#039;Project/Add File&#039;&#039;&#039; eine Datei mit dem oben gezeigten Programm (stack.asm) hinzufügt. Nachdem man unter &#039;&#039;&#039;Project/Project Settings&#039;&#039;&#039; das &#039;&#039;&#039;Object Format for AVR-Studio&#039;&#039;&#039; ausgewählt hat, kann man das Programm mit Strg+F7 assemblieren und den Debug-Modus starten. &lt;br /&gt;
&lt;br /&gt;
Danach sollte man im Menu &#039;&#039;&#039;View&#039;&#039;&#039; die Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039; und &#039;&#039;&#039;Memory&#039;&#039;&#039; öffnen und im Memory-Fenster &#039;&#039;&#039;Data&#039;&#039;&#039; auswählen. &lt;br /&gt;
&lt;br /&gt;
Das Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;Program Counter&#039;&#039;: Adresse im Programmspeicher (FLASH), die gerade abgearbeitet wird&lt;br /&gt;
* &#039;&#039;Stack Pointer&#039;&#039;: Adresse im Datenspeicher (RAM), auf die der Stackpointer gerade zeigt&lt;br /&gt;
* &#039;&#039;Cycle Counter&#039;&#039;: Anzahl der Taktzyklen seit Beginn der Simulation&lt;br /&gt;
* &#039;&#039;Time Elapsed&#039;&#039;: Zeit, die seit dem Beginn der Simulation vergangen ist &lt;br /&gt;
&lt;br /&gt;
Im Fenster &#039;&#039;&#039;Memory&#039;&#039;&#039; wird der Inhalt des RAMs angezeigt. &lt;br /&gt;
&lt;br /&gt;
Sind alle 3 Fenster gut auf einmal sichtbar, kann man anfangen, das Programm (in diesem Fall &amp;quot;stack.asm&amp;quot;) mit der Taste F11 langsam Befehl für Befehl zu simulieren. &lt;br /&gt;
&lt;br /&gt;
Wenn der gelbe Pfeil in der Zeile &#039;&#039;&#039;out SPL, temp&#039;&#039;&#039; vorbeikommt, kann man im Prozessor-Fenster sehen, wie der Stackpointer auf 0xDF (&#039;&#039;ATmega8&#039;&#039;: 0x45F) gesetzt wird. Wie man im Memory-Fenster sieht, ist das die letzte RAM-Adresse. &lt;br /&gt;
&lt;br /&gt;
Wenn der Pfeil auf dem Befehl &#039;&#039;&#039;rcall sub1&#039;&#039;&#039; steht, sollte man sich den Program Counter anschauen: Er steht auf 0x02 (&#039;&#039;ATmega8&#039;&#039;: 0x04). &lt;br /&gt;
&lt;br /&gt;
Drückt man jetzt nochmal auf F11, springt der Pfeil zum Unterprogramm sub1. Im RAM erscheint an der Stelle, auf die der Stackpointer vorher zeigte, die Zahl 0x03 (&#039;&#039;ATmega8&#039;&#039;: 0x05). Das ist die Adresse im ROM, an der das Hauptprogramm nach dem Abarbeiten des Unterprogramms fortgesetzt wird. Doch warum wurde der Stackpointer um 2 verkleinert? Das liegt daran, dass eine Programmspeicheradresse bis zu 2 Byte breit sein kann, und somit auch 2 Byte auf dem Stack benötigt werden, um die Adresse zu speichern. &lt;br /&gt;
&lt;br /&gt;
Das gleiche passiert beim Aufruf von sub2. &lt;br /&gt;
&lt;br /&gt;
Zur Rückkehr aus dem mit rcall aufgerufenen Unterprogramm gibt es den Befehl &#039;&#039;&#039;ret&#039;&#039;&#039;. Dieser Befehl sorgt dafür, dass der Stackpointer wieder um 2 erhöht wird und die dabei eingelesene Adresse in den &amp;quot;Program Counter&amp;quot; kopiert wird, so dass das Programm dort fortgesetzt wird. &lt;br /&gt;
&lt;br /&gt;
Apropos Program Counter: Wer sehen will, wie so ein Programm aussieht, wenn es assembliert ist, sollte mal die Datei mit der Endung &amp;quot;.lst&amp;quot; im Projektverzeichnis öffnen. Die Datei sollte ungefähr so aussehen: &lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/listfile.gif&lt;br /&gt;
&lt;br /&gt;
Im blau umrahmten Bereich steht die Adresse des Befehls im Programmspeicher. Das ist auch die Zahl, die im Program Counter angezeigt wird, und die beim Aufruf eines Unterprogramms auf den Stack gelegt wird. Der grüne Bereich rechts daneben ist der OP-Code des Befehls, so wie er in den Programmspeicher des Controllers programmiert wird, und im roten Kasten stehen die &amp;quot;mnemonics&amp;quot;: Das sind die Befehle, die man im Assembler eingibt.&lt;br /&gt;
Der nicht eingerahmte Rest besteht aus Assemblerdirektiven, Labels (Sprungmarkierungen) und Kommentaren, die nicht direkt in OP-Code umgewandelt werden.&lt;br /&gt;
Der grün eingerahmte Bereich ist das eigentliche Programm, so wie es der µC versteht. Die jeweils erste Zahl im grünen Bereich steht für einen Befehl, den sog. OP-Code (OP = Operation). Die zweite Zahl codiert Argumente für diesen Befehl.&lt;br /&gt;
&lt;br /&gt;
== Sichern von Registern ==&lt;br /&gt;
Eine weitere Anwendung des Stacks ist das &amp;quot;Sichern&amp;quot; von Registern. Wenn man z.&amp;amp;nbsp;B. im Hauptprogramm die Register R16, R17 und R18 verwendet, dann ist es i.d.R. erwünscht, dass diese Register durch aufgerufene Unterprogramme nicht beeinflusst werden. Man muss also nun entweder auf die Verwendung dieser Register innerhalb von Unterprogrammen verzichten, oder man sorgt dafür, dass am Ende jedes Unterprogramms der ursprüngliche Zustand der Register wiederhergestellt wird. Wie man sich leicht vorstellen kann ist ein &amp;quot;Stapelspeicher&amp;quot; dafür ideal: Zu Beginn des Unterprogramms legt man die Daten aus den zu sichernden Registern oben auf den Stapel, und am Ende holt man sie wieder (in der umgekehrten Reihenfolge) in die entsprechenden Register zurück. Das Hauptprogramm bekommt also wenn es fortgesetzt wird überhaupt nichts davon mit, dass die Register inzwischen anderweitig verwendet wurden. &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-saveregs.asm Download stack-saveregs.asm]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;            ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = R16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND         ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         ldi temp, 0xFF&lt;br /&gt;
         out DDRB, temp           ; Port B = Ausgang&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0b10101010      ; einen Wert ins Register R17 laden&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                ; Unterprogramm &amp;quot;sub1&amp;quot; aufrufen&lt;br /&gt;
 &lt;br /&gt;
         out PORTB, R17           ; Wert von R17 an den Port B ausgeben&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop                ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
         push R17                 ; Inhalt von R17 auf dem Stack speichern&lt;br /&gt;
&lt;br /&gt;
         ; hier kann nach belieben mit R17 gearbeitet werden,&lt;br /&gt;
         ; als Beispiel wird es hier auf 0 gesetzt&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0&lt;br /&gt;
&lt;br /&gt;
         pop R17                  ; R17 zurückholen&lt;br /&gt;
         ret                      ; wieder zurück zum Hauptprogramm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man dieses Programm assembliert und in den Controller lädt, dann wird man feststellen, dass jede zweite LED an Port B leuchtet. Der ursprüngliche Wert von R17 blieb also erhalten, obwohl dazwischen ein Unterprogramm aufgerufen wurde, das R17 geändert hat. &lt;br /&gt;
&lt;br /&gt;
Auch in diesem Fall kann man bei der Simulation des Programms im AVR-Studio die Beeinflussung des Stacks durch die Befehle &#039;&#039;&#039;push&#039;&#039;&#039; und &#039;&#039;&#039;pop&#039;&#039;&#039; genau nachvollziehen.&lt;br /&gt;
&lt;br /&gt;
== Sprung zu beliebiger Adresse ==&lt;br /&gt;
Kleinere AVR besitzen keinen Befehl, um direkt zu einer Adresse zu springen, die in einem Registerpaar gespeichert ist. Man kann dies aber mit etwas Stack-Akrobatik erreichen. Dazu einfach zuerst den niederen Teil der Adresse, dann den höheren Teil der Adresse mit &#039;&#039;&#039;push&#039;&#039;&#039; auf den Stack legen und ein &#039;&#039;&#039;ret&#039;&#039;&#039; ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
testRoutine:&lt;br /&gt;
	rjmp testRoutine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf diese Art und Weise kann man auch Unterprogrammaufrufe durchführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	rcall indirectZCall&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
indirectZCall:&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
testRoutine:&lt;br /&gt;
	...&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Größere AVR haben dafür die Befehle &amp;lt;code&amp;gt;ijmp&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;icall&amp;lt;/code&amp;gt;.&lt;br /&gt;
Bei diesen Befehlen muss das Sprungziel in ZH:ZL stehen.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen (von Lothar Müller): ==&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/301/Der-Stack-1.pdf Der Stack - Funktion und Nutzen (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/299/Der-Stack-2.pdf Der Stack - Parameterübergabe an Unterprogramme (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/676/Der-Stack-3.pdf Der Stack - Unterprogramme mit variabler Parameteranzahl (pdf) ]&lt;br /&gt;
&lt;br /&gt;
(Der in dieser Abhandlung irrtümlich angegebene Befehl &#039;&#039;MOV ZLow, SPL&#039;&#039; muss &#039;&#039;IN ZL, SPL&#039;&#039; heißen, da SPL und SPH I/O-Register sind. Ggf ist auch SPH zu berücksichtigen --&amp;gt; 2byte Stack-Pointer)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=logische Operatoren|&lt;br /&gt;
zurücklink=AVR-Tutorial: Logik|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=LCD|&lt;br /&gt;
vorlink=AVR-Tutorial: LCD}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Stack]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Feuchtesensor&amp;diff=82027</id>
		<title>Feuchtesensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Feuchtesensor&amp;diff=82027"/>
		<updated>2014-03-12T09:35:46Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Micromaus gibts nicht mehr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Feuchtigkeitssensoren bzw. Feuchtesensoren arbeiten meist nach dem Prinzip eines feuchtigkeitsabhängigen Kondensators.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typen==&lt;br /&gt;
&lt;br /&gt;
===Dallas/Maxim DS1923===&lt;br /&gt;
Eigentlich ein Temperatur-&amp;amp; Feuchtelogger, aber auch nur als Sensor verwendbar.&amp;lt;br&amp;gt;&lt;br /&gt;
Edelstahl-1wire-iButton mit Lithiumzelle&amp;lt;br&amp;gt;&lt;br /&gt;
Gibt es nicht mehr als Sample, kostet etwa 50 Euro bei www.spezial.de.&amp;lt;br&amp;gt;&lt;br /&gt;
Hygrochron Temperature/Humidity Logger iButton with 8KB Data-Log Memory&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/4379/t/al&lt;br /&gt;
&lt;br /&gt;
===Philips H1 2322 691 90001===&lt;br /&gt;
vom Reichelt (Datenblatt dort downloaden):&amp;lt;br&amp;gt;&lt;br /&gt;
jetzt von vishay hergestellt: http://www.vishay.com/docs/29001/23226919.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
Applikation von Valvo dazu:&lt;br /&gt;
http://docs.poulter.de/Elektronik/Sensoren/Luftfeuchtesensor%20VALVO.pdf&amp;lt;br&amp;gt; (link down)&lt;br /&gt;
FEUCHTESENSOR Sensor für Feuchtigkeit  € 10.00&amp;lt;br&amp;gt;&lt;br /&gt;
Feuchtesensor zur Messung und Regelung der relativen Luftfeuchte&amp;lt;br&amp;gt;&lt;br /&gt;
Kapazität: 122pF +/-15%&lt;br /&gt;
Empf.(Frel=43%): 0,4pF/%Frel&amp;lt;br&amp;gt;&lt;br /&gt;
Meßfrequenz: 1kHz...1MHz&lt;br /&gt;
Meßbereich: 10%...90%&amp;lt;br&amp;gt;&lt;br /&gt;
Top: 0°C...+85°C&lt;br /&gt;
Vmax: 15V&amp;lt;br&amp;gt;&lt;br /&gt;
Weitere Informationen zu diesem Artikel finden Sie in den Datenblättern &lt;br /&gt;
&lt;br /&gt;
Auswerten z.&amp;amp;nbsp;B. mit einem Oszillator muss man selbst!&lt;br /&gt;
&lt;br /&gt;
===KM33 von Innovative Computer===&lt;br /&gt;
ab € 43,00&amp;lt;br&amp;gt;&lt;br /&gt;
Schuricht 115-245057&amp;lt;br&amp;gt;&lt;br /&gt;
vermutlich auch nur ein variabler Kondensator&lt;br /&gt;
&lt;br /&gt;
===HIH-3610, HIH3610===&lt;br /&gt;
von Honeywell (sehr linear, aber über € 23,00)&amp;lt;br&amp;gt;&lt;br /&gt;
analoger Ausgang 0..4V&amp;lt;br&amp;gt;&lt;br /&gt;
Versionen:&lt;br /&gt;
* -001 RM 2,54 unkalibriert&lt;br /&gt;
* -002 RM 1,27 unkalibriert&lt;br /&gt;
* -003 RM 2,54 kalibriert&lt;br /&gt;
* -004 RM 1,27 kalibriert&lt;br /&gt;
Nachtrag: sind abgekündigt, Nachfolger:&amp;lt;br&amp;gt;&lt;br /&gt;
HIH-4000-001, HIH4000-001 und HIH-4000-003, HIH4000-003&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile ist der HIH-5030/31 aktuell. (Stand: Sep. 2009)&lt;br /&gt;
&lt;br /&gt;
http://catalog.sensing.honeywell.com/ss.asp?FAM=humiditymoisture &amp;lt;p&amp;gt;&lt;br /&gt;
Für den Sensor HIH-3605 gibt es eine Applikation, in der der Sensor an den 1-wire Bus von Dallas angeschlossen wird. Der Sensor läßt sich so mit einer verdrillten Leitung betreiben und auslesen.&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.sensorsmag.com/sensors/humidity-moisture/a-1-wire-humidity-sensor-1080&lt;br /&gt;
&lt;br /&gt;
===H25K5A===&lt;br /&gt;
von Sencera (&amp;lt;4€ bei CSD)&amp;lt;br&amp;gt;&lt;br /&gt;
Variabler Widerstand bei Wechselspannung.&amp;lt;br&amp;gt;&lt;br /&gt;
Bereich 0..+60°C, 20..90%RH. Achtung: auch Lagerung nur bis 90%RH&amp;lt;br&amp;gt;&lt;br /&gt;
Temperaturkompensierte Messung über Spannungsteiler mit handelsüblichem NTC.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===HS1101===&lt;br /&gt;
von Humirel (~14€ bei CSD)&amp;lt;br&amp;gt;&lt;br /&gt;
Variable Kapazität, 164..200pF.&amp;lt;br&amp;gt;&lt;br /&gt;
Temperaturbereich -40..+100°C.&amp;lt;br&amp;gt;&lt;br /&gt;
Temperaturkompensierter Oszillator mit CMOS-Timer 555 im Datasheet.&lt;br /&gt;
&lt;br /&gt;
===HYT371===&lt;br /&gt;
von Hygrosens (~11€ bei Reichelt)&amp;lt;br&amp;gt;&lt;br /&gt;
Temperaturbereich -40..+100°C.&amp;lt;br&amp;gt;&lt;br /&gt;
Genauigkeit 3% rF, 0.4°C&amp;lt;br&amp;gt;&lt;br /&gt;
Interface I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C&amp;lt;br&amp;gt;&lt;br /&gt;
Me&amp;amp;szlig;prinzip kapazitiv&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt diverse weitere Sensoren, die Dokumentation ist allerdings bei allen sehr schlecht bzw. steht in separaten Dokumenten unter [http://www.hygrosens.com/produkte/sensorelemente/digitale-feuchtesensoren.html Doku].&amp;lt;br&amp;gt;&lt;br /&gt;
Für Parallelbetrieb mehrerer Sensoren läßt sich die I2C Adresse im EEPROM ändern (Beitrag: [http://www.mikrocontroller.net/topic/222242#2234294 I2C Adresse ändern]).&lt;br /&gt;
sieht auch: HYT Serie von [http://www.hygrosens.com/produkte/sensorelemente/digitale-feuchtesensoren.html Hygrosens Instruments Web-Seiten]&lt;br /&gt;
&lt;br /&gt;
===INSED===&lt;br /&gt;
* HIH3602A Feuchtigkeit und Temperatur (ab € 79,00) bei RS-Components&lt;br /&gt;
* HIH3602C Feuchtigkeit und Temperatur (ab € 82,00) bei RS-Components&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&amp;lt;br&amp;gt;&lt;br /&gt;
INSED GmbH + Co KG Sensoren für die Industrie  Kronenstr 10  70794 Filderstadt  0711-9972758 Fax 9972762&amp;lt;br&amp;gt;&lt;br /&gt;
IBA GmbH Ingenieurbüro für Sensorik&lt;br /&gt;
Am Sandborn 14  63500 Seligenstadt  06182 95980&amp;lt;br&amp;gt;&lt;br /&gt;
Schuricht, RS-Components, Farnell&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===www.vaisala.be===&lt;br /&gt;
* 17204HM-humichip- mit Temp-Sensor KTY85-110 (special selection), analog 0..1V&amp;lt;br&amp;gt;&lt;br /&gt;
* 17205HM ohne Temp-Sensor analog 0..1V&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datenblatt fand ich nicht auf deren Homepage, aber im Forum:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/forum/read-1-15717.html#48616 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vermutlich verkaufen sie lieber fertige Module:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.vaisala.com/businessareas/instruments/products/humidity&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.vaisala.com/businessareas/instruments/products/humidity/modules/oemmodules&lt;br /&gt;
&lt;br /&gt;
===Sensirion===&lt;br /&gt;
Von [http://www.sensirion.com Sensirion] gibt es eine ganze Reihe kombinierter Feuchte- und Temperatursensoren mit digitaler Schnittstelle.&lt;br /&gt;
* Sensoren mit digitaler 2-Draht Schnittstelle (nicht kompatibel zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C): SHT10, SHT11, SHT15, SHT71, SHT75&lt;br /&gt;
* Sensoren mit I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C-Schnittstelle: SHT21, SHT25&lt;br /&gt;
* Eval-Kits: EK-H4  EK-H5 (für SHT1x, 2x, 7x)&lt;br /&gt;
&lt;br /&gt;
Siehe hierzu auch:&lt;br /&gt;
* [http://pic-projekte.de/phpBB3/viewtopic.php?f=39&amp;amp;t=94 Assembler Ansteuerung]&lt;br /&gt;
&lt;br /&gt;
===Silicon Labs===&lt;br /&gt;
Von [http://www.silabs.com Silicon Labs] gibt es einen kombinierten Feuchte- Temperatursensor mit I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C. Temperaturbereich -45 °C - 85 °C, Feuchte 0% bis 100%, [http://www.silabs.com/products/sensors/humidity-sensors/Pages/Si7005.aspx Si7005]&lt;br /&gt;
Bezugsquelle: SiLabs direkt bzw. über Mouser&lt;br /&gt;
&lt;br /&gt;
===E+E Elektronik===&lt;br /&gt;
&lt;br /&gt;
[http://www.epluse.com www.epluse.com]&lt;br /&gt;
&lt;br /&gt;
Von E+E Elektronik gibt es einige Sensoren für verschiedene Anwendungsbereiche und Montagearten:&lt;br /&gt;
&lt;br /&gt;
*HC1000 High End Feuchtesensor für hochpräzise Anwendung &lt;br /&gt;
*HC201  Sensor für Standardanwendungen&lt;br /&gt;
&lt;br /&gt;
Erhältlich bei Distrelec HC1000 [https://www.distrelec.at/feuchtesensor/e-e-elektronik/hc1000-0-100/241104] und HC201 [https://www.distrelec.at/feuchtesensor/e-e-elektronik/hc201/245000]&lt;br /&gt;
&lt;br /&gt;
*HCT01  kombinierter Feuchte- und Temperatursensor im SMD Gehäuse mit Schutzbeschichtung; Datenblatt [http://www.epluse.com/fileadmin/data/product/hct01/Datenblatt_HCT01.pdf]&lt;br /&gt;
&lt;br /&gt;
Module&lt;br /&gt;
&lt;br /&gt;
*Gut geschützes Modul EE04 [https://www.distrelec.at/feuchte-temperatur-messumformer/e-e-elektronik/ee04-ftb4a7-ha010305/245002]&lt;br /&gt;
&lt;br /&gt;
*Kleiner Messumformer für Temperatur und Feuchte EE06 [https://www.distrelec.at/feuchte-temperatur-messumformer/e-e-elektronik/ee06-ft1a1/245284]&lt;br /&gt;
&lt;br /&gt;
===Hoperf===&lt;br /&gt;
HH10D Humidity sensor&lt;br /&gt;
*C-F Wandler mit Kalibrierdaten im EEPROM [http://www.hoperf.com/sensor/app/HH10D.htm]&lt;br /&gt;
&lt;br /&gt;
==Informationen==&lt;br /&gt;
&lt;br /&gt;
* Applikationnote [http://www.sensirion.com/images/getFile?id=91 #91 (PDF)] und [http://www.sensirion.com/images/getFile?id=95 #95 (C-Quellcode)] des Herstellers&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/48590#372123 C-Bibliothek] von Timo Dittmar im Forum&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/145736 C-Bibliothek] in der Codesammlung&lt;br /&gt;
* Fertige Ansteuerung durch AVR ATMega in [http://www.ethersex.de/index.php/SHT Ethersex]&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen u.a.: &lt;br /&gt;
* http://www.driesen-kern.de/ und CSD (SHT11, 20€)&lt;br /&gt;
* [http://www.tme.eu/de/katalog/#id_category%3D100525%26cleanParameters%3D1%26path%3D%3B100124%3B100249%3B100525 TME]&lt;br /&gt;
* [http://www.csd-electronics.de/de/index.htm CSD] (Klick: ICs &amp;gt;&amp;gt; Sensoren &amp;gt;&amp;gt; Feuchtigkeit)&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;tabelleabc&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;tabellarische Übersicht 11/2013&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil         || Hersteller              || Schnittstelle || Temperatur inkl.&lt;br /&gt;
|-&lt;br /&gt;
|DS1923           || Maxim                   || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|2381 691 90001   || Vishay                  || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|P14              || ISTAG                   || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|MK 33            || ISTAG                   || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HYT-271          || ISTAG                   || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|HYT-221          || ISTAG                   || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|HYT-939          || ISTAG                   || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|HIH-6000 series  || Honeywell               || I2C/SPI       || ja&lt;br /&gt;
|-&lt;br /&gt;
|HIH-4000 series  || Honeywell               || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HIH-1000 series  || Honeywell               || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|H25K5A           || Sencera                 || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|818              || Sencera                 || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|H23K5A           || Sencera                 || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|H12K5            || Sencera                 || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HTS2030SMD       || Measurement Specialties || analog        || ja&lt;br /&gt;
|-&lt;br /&gt;
|HTU21D           || Measurement Specialties || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|HS1101LF         || Measurement Specialties || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|KFS140-D         || B+B Thermo-Technik      || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|KFS33LC          || B+B Thermo-Technik      || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|SHT10            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT11            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT15            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT20            || Sensirion               || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT21            || Sensirion               || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT25            || Sensirion               || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT71            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT75            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|Si7005-B         || Silicon Labs            || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|HCT01            || E+E Elektronik          || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HC109            || E+E Elektronik          || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HC201            || E+E Elektronik          || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HC103M2          || E+E Elektronik          || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|AM2321           || Aosong                  || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|DHT11            || Aosong                  || I2C           || ja  &lt;br /&gt;
|-&lt;br /&gt;
|AM2305           || Aosong                  || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|AM2301           || Aosong                  || I2C           || ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Bitbanding&amp;diff=81750</id>
		<title>ARM Bitbanding</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_Bitbanding&amp;diff=81750"/>
		<updated>2014-02-21T20:32:35Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Wortbreite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hintergrund =&lt;br /&gt;
&lt;br /&gt;
Eine RISC Architektur wie die der ARM Prozessoren besitzt oft keine&lt;br /&gt;
Befehle, um einzelne Bits im Speicher zu manipulieren. Um ein&lt;br /&gt;
einzelnes Bit in einem Peripherieregister zu setzen ist daher eine Folge&lt;br /&gt;
mehrerer Befehle erforderlich, wie beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
ldr     r0, =0x40012C0C&lt;br /&gt;
ldrh    r1, [r0]&lt;br /&gt;
orr     r1, #1&amp;lt;&amp;lt;9&lt;br /&gt;
strh    r1, [r0]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder in C formuliert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t temp = TIM1.DIER;&lt;br /&gt;
temp |= 1&amp;lt;&amp;lt;9;&lt;br /&gt;
TIM1.DIER = temp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine solche Befehlssequenz im Hauptprogramm steht und in einem&lt;br /&gt;
Interrupt Handler ein anderes Bit des gleichen Peripherieregisters verändert&lt;br /&gt;
wird, dann kann es vorkommen, dass der Handler zwischen dem Load- und&lt;br /&gt;
dem Store-Befehl dieser Sequenz ausgeführt wird. In diesem Fall geht&lt;br /&gt;
die Änderung im Handler mit dem Store-Befehl verloren, der seinen Wert&lt;br /&gt;
aus dem Zustand vor dem Aufruf des Handlers ableitet.&lt;br /&gt;
&lt;br /&gt;
Nun kann man natürlich die Befehlssequenz dagegen absichern, indem man&lt;br /&gt;
sie mit abgeschalteten Interrupts ausführt. Das ist aber recht&lt;br /&gt;
umständlich und verlängert zudem die Reaktionszeit von Interrupts.&lt;br /&gt;
&lt;br /&gt;
ARM Controller mit den Cores Cortex-M3 und -M4 sowie auch manche&lt;br /&gt;
Cortex M0+ besitzen jedoch die Fähigkeit, einzelne Bits im RAM und im&lt;br /&gt;
Peripheriebereich direkt adressieren zu können. Dazu existiert für den&lt;br /&gt;
Peripheriebereich 0x40000000-0x400FFFFF ein weiterer Adressbereich&lt;br /&gt;
0x42000000-0x43FFFFFF und für den RAM-Bereich 0x20000000-0x200FFFFF&lt;br /&gt;
der Bereich 0x22000000-0x23FFFFFF. Das sogenannte &#039;&#039;&#039;Bitbanding&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Arbeitsweise =&lt;br /&gt;
&lt;br /&gt;
In der Bitbanding-Region wird aus den Adressbits 5..24 die Byteadresse&lt;br /&gt;
abgeleitet, indem diese Bits um 5 Bits nach rechts verschoben zur&lt;br /&gt;
Basisadresse der normalen Region addiert werden. Die Adressbits 2..4&lt;br /&gt;
geben die Bitnummer im Byte an. Die Adressbits 0..1 besitzen keine&lt;br /&gt;
Funktion und sollten 0 enthalten.&lt;br /&gt;
&lt;br /&gt;
Ladebefehle in einer Bitbanding-Region laden den Wert 1, wenn das&lt;br /&gt;
adressierte Bit gesetzt ist, sonst 0. Speicherbefehle speichern Bit 0&lt;br /&gt;
des Wertes ins adressierte Bit.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Bitbanding1.png|Adressierung]]&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die obige Sequenz nun zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
ldr     r0, =0x422581A4&lt;br /&gt;
mov     r1, #1&lt;br /&gt;
strh    r1, [r0]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder in C&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
*(volatile uint16_t *)0x422581A4 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skizzierte Problem mit Interrupt-Handlern kann hier nicht mehr&lt;br /&gt;
auftreten, da die Bitmodifikation als ununterbrechbarer Teil des&lt;br /&gt;
Store-Befehls ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
= Zu beachten =&lt;br /&gt;
&lt;br /&gt;
== Interner Ablauf ==&lt;br /&gt;
&lt;br /&gt;
Es handelt sich bei einer Bitmodifikation weiterhin um eine Abfolge von drei getrennten Operationen:&lt;br /&gt;
* Wert aus dem RAM/Peripherieregister laden,&lt;br /&gt;
* Bit setzen,&lt;br /&gt;
* Wert wieder speichern.&lt;br /&gt;
Nur wird diese Sequenz vom Core im Store-Befehl ausgeführt.&lt;br /&gt;
Die Bitbanding-Operation ist also nicht exakt äquivalent zu speziellen&lt;br /&gt;
Peripherieregistern mit Setzen/Löschen Funktion, wie sie insbesondere&lt;br /&gt;
bei GPIO Ports nicht selten zu finden sind. Diese speziellen Register&lt;br /&gt;
führen wirklich nur eine Bitoperation durch, während es sich beim&lt;br /&gt;
Bitbanding technisch um Operationen auf das gesamte Register handelt.&lt;br /&gt;
&lt;br /&gt;
Siehe: [http://www.mikrocontroller.net/topic/267654 Wo Bitbanding nicht funktioniert]&lt;br /&gt;
&lt;br /&gt;
== Wortbreite ==&lt;br /&gt;
&lt;br /&gt;
Der Core verwendet bei den Bitbanding-Operationen intern die&lt;br /&gt;
Zugriffsbreite genau so, wie sie im Befehl angegeben wird. Ports die&lt;br /&gt;
nur wortweise angesprochen werden dürfen, müssen also auch beim&lt;br /&gt;
Bitbanding wortweise angesprochen werden. Halbwort- oder Bytebefehle&lt;br /&gt;
sind dann nicht zulässig.&lt;br /&gt;
&lt;br /&gt;
== Aliasing ==&lt;br /&gt;
&lt;br /&gt;
Der C Compiler weiss nicht, dass es sich bei den verschiedenen&lt;br /&gt;
Adressen für die normalen Daten und deren Bitbanding-Adressen in&lt;br /&gt;
Wirklichkeit um die gleiche Speicherstelle handelt. Es kann also&lt;br /&gt;
sogenanntes Aliasing auftreten.&lt;br /&gt;
&lt;br /&gt;
Damit der Optimizer des Compilers keinen Strich durch die Rechnung&lt;br /&gt;
macht sollten alle Daten, die per Bitbanding angesprochen werden, als&lt;br /&gt;
&amp;quot;volatile&amp;quot; deklariert werden. Das gilt sowohl für die Daten selbst,&lt;br /&gt;
als auch für deren Spiegelbereich in der Bitbanding-Region.&lt;br /&gt;
&lt;br /&gt;
Dies betrifft in der Praxis hauptsächlich Bitbanding im RAM-Bereich, da&lt;br /&gt;
die Peripherieregister ohnehin als &amp;quot;volatile&amp;quot; deklariert sind.&lt;br /&gt;
&lt;br /&gt;
= Makros =&lt;br /&gt;
&lt;br /&gt;
Um die Adressrechnung vom Bitbanding zu vereinfachen wird man&lt;br /&gt;
sinnvollerweise Makros einsetzen. Wer C++ verwendet kann natürlich&lt;br /&gt;
auch Templates nutzen.&lt;br /&gt;
&lt;br /&gt;
==GCC==&lt;br /&gt;
&lt;br /&gt;
Beim GNU Compiler kann man für den Peripheriebereich beispielsweise diese Makros verwenden, die auf den Definitionen und der Konvention von ARM CMSIS aufsetzen und Besonderheiten des GNU Compilers nutzen:&lt;br /&gt;
&lt;br /&gt;
===Direkte Adressierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Access bitbanded peripheral register by direct address.&lt;br /&gt;
#define BBPeriphBit(perReg, bit)   (*(__typeof__(perReg)*) ((PERIPH_BB_BASE + (((unsigned)&amp;amp;(perReg) - PERIPH_BASE) &amp;lt;&amp;lt; 5) + ((bit) &amp;lt;&amp;lt; 2))))&lt;br /&gt;
#define BBPeriphMask(perReg, mask) BBPeriphBit(perReg, BBitOfMask(mask))&lt;br /&gt;
#define BBitOfMask(mask)           (31 - __builtin_clz(mask))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich direkt adressierte Peripherieregister ansprechen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
BBPeriphBit(TIM1-&amp;gt;DIER, 9) = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Makro BBPeriphMask erwartet keine Bitnummer, sondern eine&lt;br /&gt;
Bitmaske, da die Definitionen in den Include-Files der Hersteller die&lt;br /&gt;
Bits u.U. nur als Maske zur Verfügung stellen. Die Umrechnung einer konstanten&lt;br /&gt;
Maske in eine Bitnummer erfolgt durch den Compiler.&lt;br /&gt;
&lt;br /&gt;
Die Adressrechnung erfolgt bei konstanten Adressen durch den Compiler. Über einen Pointer adressierte Register sollten so nicht verwendet werden, jedenfalls nicht wenn man über diesen Pointer mehrere Zugriffe in der Funktion durchführt, da dann die Adressrechnung zur Laufzeit erfolgt und man sehr von der Intelligenz des Optimierers abhängt.&lt;br /&gt;
&lt;br /&gt;
===Indirekte Adressierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Convert regular base address of a peripheral to bitbanded base address.&lt;br /&gt;
// perPtr: base address of peripheral, typed as pointer to peripheral_TypeDef &lt;br /&gt;
#define BBaseOfPeriph(perPtr)		((__typeof__(*(perPtr))*) (PERIPH_BB_BASE + (((unsigned)(perPtr) - PERIPH_BASE) &amp;lt;&amp;lt; 5)))&lt;br /&gt;
&lt;br /&gt;
// Access bitbanded peripheral register by bitbanded base address and register offset.&lt;br /&gt;
// perBB: bitbanded base address of peripheral, typed as pointer to peripheral_TypeDef &lt;br /&gt;
// member: member name of peripheral_TypeDef&lt;br /&gt;
#define BBOffset(perBB, member)         (__builtin_offsetof(__typeof__(*(perBB)), member) &amp;lt;&amp;lt; 5)&lt;br /&gt;
#define BBasedBit(perBB, member, bit)   (*(__typeof__((perBB)-&amp;gt;member)*) (((unsigned)(perBB) + BBOffset(perBB, member) + ((bit) &amp;lt;&amp;lt; 2))))&lt;br /&gt;
#define BBasedMask(perBB, member, mask) BBasedBit(perBB, member, BBitOfMask(mask))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern TIM_TypeDef *timer;&lt;br /&gt;
TIM_TypeDef *timer_bbptr = BBaseOfPeriph(timer);&lt;br /&gt;
BBasedMask(timer_bbptr, DIER, TIM_DIER_CC1DE) = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Adressrechnung erfolgt hier zur Laufzeit in BBaseOfPeriph(). Bei konstanter Bitnummer erfolgt die Berechnung des Offsets relativ zum Pointer durch den Compiler, beim Zugriff entsteht dann also kein Zusatzaufwand. Der Bitbanding-Pointer timer_bbptr lässt sich für alle Register des Timers verwenden.&lt;br /&gt;
&lt;br /&gt;
===Portierung auf andere Compiler===&lt;br /&gt;
&lt;br /&gt;
Es wird der Maschinenbefehl CLZ (Count Leading Zeroes) verwendet, um eine Bitmaske in eine Bitnummer zu übersetzen. Alternativ kann dies auch per ?: Kaskade realisiert werden, nur übersetzt sich dies bei nicht-konstanter Maske in hässlich viel Code. GCC berechnet bei konstanter Maske die CLZ Operation bereits selbst.&lt;br /&gt;
&lt;br /&gt;
Mit __typeof__ wird erreicht, dass die Zugriffe automatisch mit der richtigen Breite durchgeführt werden. Ein in Halbwortbreite deklariertes Register wird auch mit Halbwortbefehlen angesprochen.&lt;br /&gt;
&lt;br /&gt;
Das Konstrukt __builtin_offsetof existiert auch als offsetof.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Bitbanding&amp;diff=81749</id>
		<title>ARM Bitbanding</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_Bitbanding&amp;diff=81749"/>
		<updated>2014-02-21T20:27:12Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Portierung auf andere Compiler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hintergrund =&lt;br /&gt;
&lt;br /&gt;
Eine RISC Architektur wie die der ARM Prozessoren besitzt oft keine&lt;br /&gt;
Befehle, um einzelne Bits im Speicher zu manipulieren. Um ein&lt;br /&gt;
einzelnes Bit in einem Peripherieregister zu setzen ist daher eine Folge&lt;br /&gt;
mehrerer Befehle erforderlich, wie beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
ldr     r0, =0x40012C0C&lt;br /&gt;
ldrh    r1, [r0]&lt;br /&gt;
orr     r1, #1&amp;lt;&amp;lt;9&lt;br /&gt;
strh    r1, [r0]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder in C formuliert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t temp = TIM1.DIER;&lt;br /&gt;
temp |= 1&amp;lt;&amp;lt;9;&lt;br /&gt;
TIM1.DIER = temp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine solche Befehlssequenz im Hauptprogramm steht und in einem&lt;br /&gt;
Interrupt Handler ein anderes Bit des gleichen Peripherieregisters verändert&lt;br /&gt;
wird, dann kann es vorkommen, dass der Handler zwischen dem Load- und&lt;br /&gt;
dem Store-Befehl dieser Sequenz ausgeführt wird. In diesem Fall geht&lt;br /&gt;
die Änderung im Handler mit dem Store-Befehl verloren, der seinen Wert&lt;br /&gt;
aus dem Zustand vor dem Aufruf des Handlers ableitet.&lt;br /&gt;
&lt;br /&gt;
Nun kann man natürlich die Befehlssequenz dagegen absichern, indem man&lt;br /&gt;
sie mit abgeschalteten Interrupts ausführt. Das ist aber recht&lt;br /&gt;
umständlich und verlängert zudem die Reaktionszeit von Interrupts.&lt;br /&gt;
&lt;br /&gt;
ARM Controller mit den Cores Cortex-M3 und -M4 sowie auch manche&lt;br /&gt;
Cortex M0+ besitzen jedoch die Fähigkeit, einzelne Bits im RAM und im&lt;br /&gt;
Peripheriebereich direkt adressieren zu können. Dazu existiert für den&lt;br /&gt;
Peripheriebereich 0x40000000-0x400FFFFF ein weiterer Adressbereich&lt;br /&gt;
0x42000000-0x43FFFFFF und für den RAM-Bereich 0x20000000-0x200FFFFF&lt;br /&gt;
der Bereich 0x22000000-0x23FFFFFF. Das sogenannte &#039;&#039;&#039;Bitbanding&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Arbeitsweise =&lt;br /&gt;
&lt;br /&gt;
In der Bitbanding-Region wird aus den Adressbits 5..24 die Byteadresse&lt;br /&gt;
abgeleitet, indem diese Bits um 5 Bits nach rechts verschoben zur&lt;br /&gt;
Basisadresse der normalen Region addiert werden. Die Adressbits 2..4&lt;br /&gt;
geben die Bitnummer im Byte an. Die Adressbits 0..1 besitzen keine&lt;br /&gt;
Funktion und sollten 0 enthalten.&lt;br /&gt;
&lt;br /&gt;
Ladebefehle in einer Bitbanding-Region laden den Wert 1, wenn das&lt;br /&gt;
adressierte Bit gesetzt ist, sonst 0. Speicherbefehle speichern Bit 0&lt;br /&gt;
des Wertes ins adressierte Bit.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Bitbanding1.png|Adressierung]]&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die obige Sequenz nun zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
ldr     r0, =0x422581A4&lt;br /&gt;
mov     r1, #1&lt;br /&gt;
strh    r1, [r0]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder in C&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
*(volatile uint16_t *)0x422581A4 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skizzierte Problem mit Interrupt-Handlern kann hier nicht mehr&lt;br /&gt;
auftreten, da die Bitmodifikation als ununterbrechbarer Teil des&lt;br /&gt;
Store-Befehls ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
= Zu beachten =&lt;br /&gt;
&lt;br /&gt;
== Interner Ablauf ==&lt;br /&gt;
&lt;br /&gt;
Es handelt sich bei einer Bitmodifikation weiterhin um eine Abfolge von drei getrennten Operationen:&lt;br /&gt;
* Wert aus dem RAM/Peripherieregister laden,&lt;br /&gt;
* Bit setzen,&lt;br /&gt;
* Wert wieder speichern.&lt;br /&gt;
Nur wird diese Sequenz vom Core im Store-Befehl ausgeführt.&lt;br /&gt;
Die Bitbanding-Operation ist also nicht exakt äquivalent zu speziellen&lt;br /&gt;
Peripherieregistern mit Setzen/Löschen Funktion, wie sie insbesondere&lt;br /&gt;
bei GPIO Ports nicht selten zu finden sind. Diese speziellen Register&lt;br /&gt;
führen wirklich nur eine Bitoperation durch, während es sich beim&lt;br /&gt;
Bitbanding technisch um Operationen auf das gesamte Register handelt.&lt;br /&gt;
&lt;br /&gt;
Siehe: [http://www.mikrocontroller.net/topic/267654 Wo Bitbanding nicht funktioniert]&lt;br /&gt;
&lt;br /&gt;
== Wortbreite ==&lt;br /&gt;
&lt;br /&gt;
Der Core verwendet bei den Bitbanding-Operationen intern die&lt;br /&gt;
Zugriffsbreite genau so, wie sie im Befehl angegeben wird. Ports die&lt;br /&gt;
nur nur wortweise angesprochen werden dürfen, müssen also auch beim&lt;br /&gt;
Bitbanding wortweise angesprochen werden. Halbwort- oder Bytebefehle&lt;br /&gt;
sind dann nicht zulässig.&lt;br /&gt;
&lt;br /&gt;
== Aliasing ==&lt;br /&gt;
&lt;br /&gt;
Der C Compiler weiss nicht, dass es sich bei den verschiedenen&lt;br /&gt;
Adressen für die normalen Daten und deren Bitbanding-Adressen in&lt;br /&gt;
Wirklichkeit um die gleiche Speicherstelle handelt. Es kann also&lt;br /&gt;
sogenanntes Aliasing auftreten.&lt;br /&gt;
&lt;br /&gt;
Damit der Optimizer des Compilers keinen Strich durch die Rechnung&lt;br /&gt;
macht sollten alle Daten, die per Bitbanding angesprochen werden, als&lt;br /&gt;
&amp;quot;volatile&amp;quot; deklariert werden. Das gilt sowohl für die Daten selbst,&lt;br /&gt;
als auch für deren Spiegelbereich in der Bitbanding-Region.&lt;br /&gt;
&lt;br /&gt;
Dies betrifft in der Praxis hauptsächlich Bitbanding im RAM-Bereich, da&lt;br /&gt;
die Peripherieregister ohnehin als &amp;quot;volatile&amp;quot; deklariert sind.&lt;br /&gt;
&lt;br /&gt;
= Makros =&lt;br /&gt;
&lt;br /&gt;
Um die Adressrechnung vom Bitbanding zu vereinfachen wird man&lt;br /&gt;
sinnvollerweise Makros einsetzen. Wer C++ verwendet kann natürlich&lt;br /&gt;
auch Templates nutzen.&lt;br /&gt;
&lt;br /&gt;
==GCC==&lt;br /&gt;
&lt;br /&gt;
Beim GNU Compiler kann man für den Peripheriebereich beispielsweise diese Makros verwenden, die auf den Definitionen und der Konvention von ARM CMSIS aufsetzen und Besonderheiten des GNU Compilers nutzen:&lt;br /&gt;
&lt;br /&gt;
===Direkte Adressierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Access bitbanded peripheral register by direct address.&lt;br /&gt;
#define BBPeriphBit(perReg, bit)   (*(__typeof__(perReg)*) ((PERIPH_BB_BASE + (((unsigned)&amp;amp;(perReg) - PERIPH_BASE) &amp;lt;&amp;lt; 5) + ((bit) &amp;lt;&amp;lt; 2))))&lt;br /&gt;
#define BBPeriphMask(perReg, mask) BBPeriphBit(perReg, BBitOfMask(mask))&lt;br /&gt;
#define BBitOfMask(mask)           (31 - __builtin_clz(mask))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich direkt adressierte Peripherieregister ansprechen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
BBPeriphBit(TIM1-&amp;gt;DIER, 9) = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Makro BBPeriphMask erwartet keine Bitnummer, sondern eine&lt;br /&gt;
Bitmaske, da die Definitionen in den Include-Files der Hersteller die&lt;br /&gt;
Bits u.U. nur als Maske zur Verfügung stellen. Die Umrechnung einer konstanten&lt;br /&gt;
Maske in eine Bitnummer erfolgt durch den Compiler.&lt;br /&gt;
&lt;br /&gt;
Die Adressrechnung erfolgt bei konstanten Adressen durch den Compiler. Über einen Pointer adressierte Register sollten so nicht verwendet werden, jedenfalls nicht wenn man über diesen Pointer mehrere Zugriffe in der Funktion durchführt, da dann die Adressrechnung zur Laufzeit erfolgt und man sehr von der Intelligenz des Optimierers abhängt.&lt;br /&gt;
&lt;br /&gt;
===Indirekte Adressierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Convert regular base address of a peripheral to bitbanded base address.&lt;br /&gt;
// perPtr: base address of peripheral, typed as pointer to peripheral_TypeDef &lt;br /&gt;
#define BBaseOfPeriph(perPtr)		((__typeof__(*(perPtr))*) (PERIPH_BB_BASE + (((unsigned)(perPtr) - PERIPH_BASE) &amp;lt;&amp;lt; 5)))&lt;br /&gt;
&lt;br /&gt;
// Access bitbanded peripheral register by bitbanded base address and register offset.&lt;br /&gt;
// perBB: bitbanded base address of peripheral, typed as pointer to peripheral_TypeDef &lt;br /&gt;
// member: member name of peripheral_TypeDef&lt;br /&gt;
#define BBOffset(perBB, member)         (__builtin_offsetof(__typeof__(*(perBB)), member) &amp;lt;&amp;lt; 5)&lt;br /&gt;
#define BBasedBit(perBB, member, bit)   (*(__typeof__((perBB)-&amp;gt;member)*) (((unsigned)(perBB) + BBOffset(perBB, member) + ((bit) &amp;lt;&amp;lt; 2))))&lt;br /&gt;
#define BBasedMask(perBB, member, mask) BBasedBit(perBB, member, BBitOfMask(mask))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern TIM_TypeDef *timer;&lt;br /&gt;
TIM_TypeDef *timer_bbptr = BBaseOfPeriph(timer);&lt;br /&gt;
BBasedMask(timer_bbptr, DIER, TIM_DIER_CC1DE) = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Adressrechnung erfolgt hier zur Laufzeit in BBaseOfPeriph(). Bei konstanter Bitnummer erfolgt die Berechnung des Offsets relativ zum Pointer durch den Compiler, beim Zugriff entsteht dann also kein Zusatzaufwand. Der Bitbanding-Pointer timer_bbptr lässt sich für alle Register des Timers verwenden.&lt;br /&gt;
&lt;br /&gt;
===Portierung auf andere Compiler===&lt;br /&gt;
&lt;br /&gt;
Es wird der Maschinenbefehl CLZ (Count Leading Zeroes) verwendet, um eine Bitmaske in eine Bitnummer zu übersetzen. Alternativ kann dies auch per ?: Kaskade realisiert werden, nur übersetzt sich dies bei nicht-konstanter Maske in hässlich viel Code. GCC berechnet bei konstanter Maske die CLZ Operation bereits selbst.&lt;br /&gt;
&lt;br /&gt;
Mit __typeof__ wird erreicht, dass die Zugriffe automatisch mit der richtigen Breite durchgeführt werden. Ein in Halbwortbreite deklariertes Register wird auch mit Halbwortbefehlen angesprochen.&lt;br /&gt;
&lt;br /&gt;
Das Konstrukt __builtin_offsetof existiert auch als offsetof.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=79922</id>
		<title>C-Präprozessor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=79922"/>
		<updated>2013-12-09T09:01:49Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* #if, #ifdef */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der erste Verarbeitungsschritt bei der Kompilierung eines [[C]]/[[C++]]-Programmes erfolgt durch den &#039;&#039;&#039;Präprozessor&#039;&#039;&#039;. Dieser verändert den Quelltext, den die späteren Verarbeitungsphasen erhalten, in folgender Hinsicht:&lt;br /&gt;
* Einbeziehen zusätzlicher Dateien ([[Include-Files]])&lt;br /&gt;
* Ersetzen von (parametrisierbaren) [[Makro]]s&lt;br /&gt;
* Entfernen einzelner Abschnitte (= bedingte Kompilierung)&lt;br /&gt;
&lt;br /&gt;
Im Grunde kann man sich den Präprozessor als eine Art Texteditor vorstellen, der die Anweisungen, was er zu tun hat, dem Text entnimmt, den er bearbeitet. In jedem Texteditor gibt es zb. die Funktion &#039;Suchen und Ersetzen&#039;. Auch im Präprozessor gibt es sie, nur heißt sie dort #define. Alle Anweisungen an den Präprozessor beginnen grundsätzlich damit, daß das Zeichen &#039;#&#039; das erste Zeichen in einer Textzeile darstellt. Und umgekehrt: Ist das erste Zeichen in einer Textzeile ein &#039;#&#039;, so handelt es sich um eine Präprozessor-Anweisung.&lt;br /&gt;
&lt;br /&gt;
==#include==&lt;br /&gt;
Die #include weist den Präprozessor an, den Inhalt der angegebenen Datei anstelle der #include Anweisung einzusetzen. Weiter passiert nichts. Bei der Angabe des Dateinamens der einzusetzenden Datei gibt es 2 Formen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Datei1.xyz&amp;quot;&lt;br /&gt;
#include &amp;lt;Datei2.abc&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Unterschied zwischen beiden Formen besteht rein im Aufsuchpfad, den der Präprozessor benutzt, um die Datei zu finden. Per Konvention wird die &amp;lt; &amp;gt;-Form benutzt, um systemweite Includes durchzuführen. Alle mit dem Compiler mitgelieferten Header Files sind zb. solche systemweite-Includes. Bei der Installation des Compilers wurde im System hinterlassen, auf welchem Pfad sie gefunden werden können. Durch Verwendung der &amp;lt; &amp;gt;-Form wird dem Präprozessor mitgeteilt, dass diese damals vereinbarten Pfadangaben zur Aufsuche dieser Datei benutzt werden soll.&lt;br /&gt;
&lt;br /&gt;
==#define==&lt;br /&gt;
Mittels #define wird eine Textersetzung vereinbart.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ABC xyz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
weist den Präprozessor an, im weiteren Quelltext alle Vorkommen von &#039;ABC&#039; durch den Text &#039;xyz&#039; zu ersetzen. Der Präprozessor macht dies überall, solange&lt;br /&gt;
* es sich an der zu ersetzenden Stelle um keinen String handelt. Mit obigem #define würde also in &amp;quot;Dies ist ABC&amp;quot; keine Textersetzung stattfinden.&lt;br /&gt;
* er den Ursprungstext als &#039;Wort&#039; im Sinne eines C-Wortes handelt. Mit obigem #define würde also in cdABCef = 5; keine Textersetzung stattfinden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist: Der Präprozessor führt eine reine Textersetzung durch! Ob sich durch diese Ersetzung eine Logikänderung im Programm ergibt, interessiert den Präprozessor nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define NR 5&lt;br /&gt;
&lt;br /&gt;
int Werte[NR];&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; NR; i++ )&lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, Werte[i] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bevor der eigentliche Compiler den Quelltext zu Gesicht bekommt, wird er zunächst vom Präprozessor bearbeitet. Dieser führt die Textersetzung durch, indem er alle Vorkommen von NR durch den Text 5 ersetzt. Erst dieses Ergebnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int Werte[5];&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; 5; i++ )&lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, Werte[i] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird dann dem eigentlichen Compiler zur Übersetzung vorgelegt. In diesem Beispiel hat man durch den Einsatz des Präprozessors erreicht, dass die Anzahl der Arrayelemente immer mit dem Maximalwert in der for-Schleife übereinstimmt. Ein Fehler, dass beispielweise die Arraygröße verändert wird, ohne das die for-Schleife angepasst würde, ist durch den Einsatz des Präprozessors wirkungsvoll verhindert worden.&lt;br /&gt;
&lt;br /&gt;
Aber auch hier wieder: Der Präprozessors macht nur eine Textersetzung! Für den Präprozessors ist es völlig unerheblich, ob sich dadurch die Logik des Programms aus Sicht des Programmierers verändert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    3+5&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  y = 4*PART;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Beispiel mag es schon so sein, dass der Programmierer im Sinn hatte, den Ausdruck 4 mal 8 berechnen zu lassen, wobei sich die 8 durch eine Addition von 3 und 5 ergeben. Das interessiert aber den Präprozessor nicht. Der macht eine reine textuelle Ersetzung, indem er den Text &#039;PART&#039; durch den Text &#039;3+5&#039; austauscht, wodurch dieses Ergebnis entsteht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    3+5&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  y = 4*3+5;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist aber etwas anderes, nämlich &#039;(4*3)+5&#039;, also ursprünglich beabsichtigt war, nämlich &#039;4*(3+5)&#039;.&lt;br /&gt;
&lt;br /&gt;
Schlussfolgerung: Es ist bei komplexeren Makros nicht ungewöhnlich, dass sich in Makros relativ viele Klammern wiederfinden, deren Zweck gerade für einen Neuling nicht auf den ersten Blick zu durchschauen ist.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    (3+5)&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
  x = PART;&lt;br /&gt;
  y = 4*PART;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Während die Klammern im Makro bei der Zuweisung an x keine Funktion erfüllen (aber auch nicht störend sind), sind sie bei der Zuweisung an y lebenswichtig um der ganzen Anweisung nach der Textersetzung die beabsichtigte Bedeutung zu geben.&lt;br /&gt;
&lt;br /&gt;
==#define für eine Codesequenz==&lt;br /&gt;
&lt;br /&gt;
Wird ein #define nicht für einen Ausdruck verwendet, sondern für eine Codesequenz wie in &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F(n) { a = n; b = n; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann entsteht ein Problem bei &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) F(1); else F(2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
da hier für den Compiler letztlich&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) { ... }; else { ... };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stehen bleibt, und damit ein überzähliges Semikolon vor dem else. Nun kann man dies natürlich mit &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) { F(1); } else { F(2); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) F(1) else F(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
abhandeln. Gelegentlich findet man deshalb aber auch seltsam anmutende Definitionen wie&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F(n) do{ a = n; b = n; }while(0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==#if, #ifdef==&lt;br /&gt;
&lt;br /&gt;
Die Statements #if und #elsif sind die einzigen Präprozessor-Statements, in denen er selbst Berechnungen durchführt. In allen anderen Fällen findet eine reine Textersetzung statt und es rechnet erst der Compiler oder der Prozessor. Da der Präprozessor aber nach eigenen Regeln rechnet, wird Code wie&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define N (1000000*1000000)&lt;br /&gt;
#if N==1000000000000&lt;br /&gt;
   printf(&amp;quot;%Ld\n&amp;quot;, (long long)N);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oft zur Ausgabe von -727379968 führen. Wenn der Präprozessor mit 64 Bits rechnet und der Compiler mit 32 Bits.&lt;br /&gt;
&lt;br /&gt;
==mögliche Probleme beim Einsatz des Präprozessors==&lt;br /&gt;
Eine am C-Präprozessor häufig geäußerte Kritik ist, dass er (nahezu) ohne Berücksichtigung der eigentlichen Sprachsyntax arbeitet (&amp;quot;The C-Preprocessor doesn&#039;t know about C&amp;quot;). Die Tatsache, dass Makros beispielsweise auf der Basis von Textersatz arbeiten, kann zu Überaschungen führen. So wird in&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define cub(a) a*a*a&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
y = 4;&lt;br /&gt;
x = cub(y+1);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
in x nicht etwa der Wert 125 (5 hoch 3) stehen, sondern der Wert 13, da nach Ersetzen des Makros der folgende Quelltext kompiliert wird ...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
x = y+1*y+1*y+1; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
... und durch die arithmetischen Vorrangregeln, wird dieser Ausdruck so ausgewertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
x = y + (1*y) + (1*y) + 1; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte man jeden Parameter eines Makros bei jeder Verwendung klammern. Damit werden viele Probleme mit Makros gelöst und man erhält für obiges Beispiel folgende Form und damit auch eine korrekte Berechnung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define cub(a) ((a)*(a)*(a))&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
y = 4;&lt;br /&gt;
x = cub(y+1);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein weiteres Problem besteht jedoch, wenn ein Makro-Parameter im Ersatztext doppelt verwendet wird:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define max(a, b) ((a&amp;gt;b) ? (a) : (b))&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
...&lt;br /&gt;
x = max(y, 10);   /* OK */&lt;br /&gt;
x = max(++y, 10); /* ?? */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im zweiten Fall wird die Variable &#039;&#039;y&#039;&#039; u.U. &#039;&#039;zweimal&#039;&#039; inkrementiert - was ohne Kenntnis der Makro-Definition keineswegs offensichtlich ist (&#039;&#039;max&#039;&#039; könnte auch eine echte Funktion sein).&lt;br /&gt;
&lt;br /&gt;
Die Tatsache, dass der C-Präprozessor die Syntax von C/C++ nicht wirklich berücksichtigt, ist allerdings auch nützlich. So lassen sich mit dem C-Präprozessor Datentypen parametrisieren, um systematische Programmteile zu vereinfachen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* GSAWP:&lt;br /&gt;
   generiert Funktionsdefinition zum Vertauschen des Inhalts von zwei Variablen&lt;br /&gt;
*/&lt;br /&gt;
#define GSWAP(n, T)s\&lt;br /&gt;
        void n(T *xp, T *yp) { T tmp = *xp; *xp = *yp; *yp = tmp; }&lt;br /&gt;
...&lt;br /&gt;
GSWAP(iswap, int)&lt;br /&gt;
GSWAP(dswap, double)&lt;br /&gt;
GSWAP(swap_s, struct s)&lt;br /&gt;
...&lt;br /&gt;
int a, b;&lt;br /&gt;
double c, d;&lt;br /&gt;
struct s e, f;&lt;br /&gt;
...&lt;br /&gt;
iswap(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
dswap(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap_s(&amp;amp;e. &amp;amp;f);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele typische Anwendungsfälle des Präprozessors lassen sich allerdings bereits mit Standard-C-Bordmitteln erfolgreich erschlagen:&lt;br /&gt;
* Statt &#039;&#039;#define&#039;&#039; besser mit &#039;&#039;const&#039;&#039; vereinbarte Variablen benutzen. Bei jedem besseren Compiler ergeben sich dank Optimierung keinerlei Nachteile.&lt;br /&gt;
* &#039;&#039;enum&#039;&#039; für Konstantenfelder benutzen. Dabei sollte man allerdings sauber casten, da &#039;&#039;enum&#039;&#039;-Werte in der Regel als &#039;&#039;int&#039;&#039; interpretiert werden.&lt;br /&gt;
* Neuere Versionen des GCC unterstützen &#039;&#039;inline&#039;&#039;, wodurch Makros für Einzeiler überflüssig werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In [[C++]] wurden ergänzend zum C-Präprozessor weitere Mechanismen eingeführt. So erlauben [[Templates (C++)|Templates]] generische Programmierung, womit viele der &amp;quot;Makro-Tricks&amp;quot; wie die obigen überflüssig werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32F10x_Standard_Peripherals_Library&amp;diff=79914</id>
		<title>STM32F10x Standard Peripherals Library</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32F10x_Standard_Peripherals_Library&amp;diff=79914"/>
		<updated>2013-12-08T12:46:06Z</updated>

		<summary type="html">&lt;p&gt;Prx: GPIO_ToggleBits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;STM32F10x Standard Peripherals Library&#039;&#039;  ist eine umfangreiche komfortable C-Bibliothek, die den Zugriff auf alle Funktionen der &#039;&#039;&#039;STM32F10x&#039;&#039;&#039; Familie erlaubt. Dabei ist für die verschiedenen Peripheriekomponenten jeweils ein eigenes Modul verfügbar.&lt;br /&gt;
&lt;br /&gt;
Die Bibliothek kann hier bei ST kostenlos heruntergeladen werden.&lt;br /&gt;
Dazu auf der [http://www.st.com/web/en/home.html ST-Webseite]:&lt;br /&gt;
* Oben den Punkt Support wählen&lt;br /&gt;
* Auf der linken Seite &amp;quot;Tools and Software&amp;quot; anklicken&lt;br /&gt;
* Nun links nochmals &amp;quot;Software&amp;quot; auswählen&lt;br /&gt;
* Danach den Unterpunkt &amp;quot;MCU Software&amp;quot; wählen&lt;br /&gt;
* Nun die richtige MCU-Familie, also &amp;quot;STM32 MCUs Software&amp;quot; selektieren&lt;br /&gt;
* Es erscheint eine Tabelle mit vielen Packages für die zahlreichen Demoboards und verschiedene Bibliotheken (USB, Ethernet, etc.)&lt;br /&gt;
* Die STM32F10x Standard Peripherals Library ist hier als &amp;quot;STSW-STM32054&amp;quot; bezeichnet&lt;br /&gt;
* Nach der Auswahl kann diese über den Download-Button in einem *.zip-Archiv heruntergeladen werden&lt;br /&gt;
&lt;br /&gt;
Alternativ ist hier ein [http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stsw-stm32054.zip Direktlink].&lt;br /&gt;
In dem Archiv ist die ‎STM32F10x Standard Peripherals Library. Zu jeder Peripherie gibt es diverse Beispiele und eine Beschreibung als CHM Datei &amp;quot;stm32f10x_stdperiph_lib_um.chm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bevor Ihr lange sucht, die USB-Schnittstelle ist nicht in der &#039;&#039;STM32F10x Standard Peripherals Library&#039;&#039; enthalten. Die hierfür verfügbare Firmware sowie Beispielcode befindet sich in der [[STM32_USB-FS-Device_Lib]]&lt;br /&gt;
&lt;br /&gt;
===Hinweise===&lt;br /&gt;
Die notwendigen Informationen, um die Funktionen der Standard Peripherals Library zu verstehen, muss man sich leider aus verschiedenen Quellen zusammensuchen. Daher soll mit diesem Artikel versucht werden, deren Benutzung für die verschiedenen Peripheriekomponenten zu erläutern.&lt;br /&gt;
&lt;br /&gt;
Leider beziehen sich die von ST gelieferten Beispiele sehr auf die von ST verfügbaren Evalboards und der Code wimmelt von #defines, so dass man sich erst mühsam durchhangeln muss um zu verstehen, was da eigentlich passiert. Dies geht zwar durch die gute Verlinkung in der Hilfsdatei ganz gut, erschwert aber den Einstieg unnötig. &lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll daher die Anwendung &#039;&#039;bare bones&#039;&#039; ähnlich den Beispielen in den AVR Datenblättern erfolgen.&lt;br /&gt;
Wo nötig, werden die zum Verständnis relevanten Ausschnitte des Reference Manual [http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00171190.pdf RM0008] in den Artikel kopiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;(Bevor hier die Copyright Discussion entbrennt: Das Landgericht München hat 1996 festgestellt, dass die Beschreibung von elektronischen Schaltungen nicht dem Urheberrecht unterliegen. Außerdem sollte ST sehr daran gelegen sein mehr Entwickler für Ihre µC zu begeistern.)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Dokumentationen ===&lt;br /&gt;
&lt;br /&gt;
Um mit der Library zu arbeiten sind folgende Dokumentationen empfehlenswert:&lt;br /&gt;
&lt;br /&gt;
* RM0008 Reference Manual zum STM32F10xxx Controller&lt;br /&gt;
    Beschreibung und Registerdoku der Peripherie (GPIO, Timer ...)&lt;br /&gt;
* PM0056 STM32F10xxx Cortex-M3 programming manual&lt;br /&gt;
    Cortex-M3 eigene Peripherie (wichtig zb. NVIC)&lt;br /&gt;
* Datasheet des verwendeten µC Types (zb. STM32F103xC/D/E)&lt;br /&gt;
    Pinout des µC und alternative Verwendbarkeit der PINs&lt;br /&gt;
&lt;br /&gt;
Download from [[http://www.st.com/internet/mcu/class/1734.jsp Documents and files for STM32F family]]&lt;br /&gt;
&lt;br /&gt;
=== Die ST Standard Peripheral Lib in CrossWorks ===&lt;br /&gt;
Aufgrund mehrfacher Anfragen, hier ein Archiv, das meine Arbeitsumgebung [[Bild:CrossWorks_StandardLib_Setup.zip]] mit zwei Crossworks Projekten (ARM_LED_TEST und ARM_USB_Test) enthält. Einfach alles in ein Verzeichnis entpacken und schon sollte es Laufen.&lt;br /&gt;
&lt;br /&gt;
=== Einführungsbeispiel Blinking LED ===&lt;br /&gt;
&lt;br /&gt;
Einführungsbeispiel [[STM32 LEDBlinken AtollicTrueStudio]]&lt;br /&gt;
&lt;br /&gt;
=== Die Idee hinter der STM32 Standard Peripherals Library ===&lt;br /&gt;
&lt;br /&gt;
So stellt sich ARM und ST-Microelectronics die Library vor.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Stm32_std_peripherial_library_idee.JPG]]&lt;br /&gt;
&lt;br /&gt;
=Clocks - Der Herzschlag unseres Mikrocontrollers=&lt;br /&gt;
&lt;br /&gt;
[[Datei:stm32_aufbau.jpg|thumb|Interner Aufbau eines [[STM32F103]]]]&lt;br /&gt;
Unser Mikrocontroller hat viele interne Takte. Diese müssen unbedingt konfiguriert werden. Dazu verwenden wir die RCC (Reset and Clock Control). Dazu gibt es Funktionen in der ST-Library. Welche Takte an welchen Bussen liegen, siehst du im Bild.&lt;br /&gt;
&lt;br /&gt;
Die Controller verfügen über zwei getrennte Datenbusse für die langsameren Teile der Periphierie. Den APB1 und den APB2. Diese sind wiederum über Brücken am Systembus angeschlossen. Das wären in diesem Fall die AHB1 und AHB2. Man muss beachten, dass der APB1 &amp;quot;nur&amp;quot; mit maximal 36MHz getaktet werden darf, der APB2 hingegen mit 72MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig!&#039;&#039;&#039; Alle unsere Peripherie Teile, die wir verwenden möchten, &#039;&#039;&#039;müssen mit einem Takt versorgt werden,&#039;&#039;&#039; bevor man sie verwenden kann. Bei Nichtbeachten führt dies häufig zu langer Fehlersuche.&lt;br /&gt;
&lt;br /&gt;
Der [[STM32]] wird normalerweise mit einem Quarz von 4-16MHz versorgt. Aus diesem wird dann mittels der internen PLL der eigentliche Takt gebildet (bis 72MHz).&lt;br /&gt;
Jeder benötigte Takt wird vom Haupttakt abgeleitet. Die Controller verfügen auch über interne RC-Oszillatoren (typischerweise ein 8 MHz RC-Oszillator mit einer Genauigkeit von 1 % sowie einem 40 kHz RC-Oszillator). Zumindest der interne 8 MHz-Oszillator ist für die meisten Anwendungen genau genug. Für z.B. USB oder CAN mit Taktraten &amp;gt; 100 kbit/s ist er aber &#039;&#039;&#039;nicht&#039;&#039;&#039; genau genug. Der interne 40 kHz-Oszillator hingegen ist &#039;&#039;&#039;sehr&#039;&#039;&#039; ungenau (zwischen 30 und 60 kHz).&lt;br /&gt;
&lt;br /&gt;
Hardwaretechnisch sollte darauf geachtet werden, dass bei Verwendung eines externen Quarzes dieser eine Frequenz von 8 MHz besitzt. &lt;br /&gt;
Die gesamten Defines in der Library beziehen sich darauf. Ansonsten ist eine Anpassung der PLL Multiplikatoren in der Datei &amp;quot;system_stm32f10x.c&amp;quot; nötig.&lt;br /&gt;
&lt;br /&gt;
==Taktquelle auswählen==&lt;br /&gt;
&lt;br /&gt;
Nach dem Reset wird automatisch &#039;&#039;&#039;immer&#039;&#039;&#039; der interne HSI-Takt genutzt, um einen definierten Zustand zu haben (also der interne 8 MHz RC-Oszillator). Das ist z.B. erforderlich, damit der integrierte Bootloader mit einer bekannten Frequenz versorgt wird (sofern dieser über die Boot-Pins überhaupt gewünscht ist).&lt;br /&gt;
Zum Glück gibt es ein automatisches Sicherheitsfeature, sodass man die aktuelle Taktquelle des Controllers nicht abschalten kann, da der Controller sonst einfach stehen bleiben würde!&lt;br /&gt;
===HSI - Highspeed Internal Oscillator===&lt;br /&gt;
Man kann den internen Oszillator nach dem Reset umkonfigurieren. [Hier fehlt noch etwas]&lt;br /&gt;
&lt;br /&gt;
Zum Ein- und Ausschalten der HSI-Taktquelle verwendet man &#039;&#039;&#039;RCC_HSICmd()&#039;&#039;&#039;. Als Parameter werden entweder &#039;&#039;&#039;ENABLE&#039;&#039;&#039; oder &#039;&#039;&#039;DISABLE&#039;&#039;&#039; erwartet. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
RCC_HSICmd(ENABLE); //Aktiviert den internen Highspeed Oszillator.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Takte Reseten==&lt;br /&gt;
Nach dem Reset befindet sich die gesamte Taktkonfiguration in einem definierten Zustand. Macht man später irgendwelche Änderungen an der Taktkonfiguration kann es sinnvoll sein, vorher alle Takte auf ihre Standardwerte zurückzusetzen. Dies schafft wieder eine definierte zentrale Taktkonfiguration. Man muß sich nicht überlegen, wo man noch was zuvor eingestellt hat. Hat man allerdings schon z.B. irgendwelche Peripheriemodule konfiguriert, muß man natürlich aufpassen, welche Folgen die zentrale Taktänderung hier haben kann!&lt;br /&gt;
Nach &#039;&#039;&#039;RCC_DeInit()&#039;&#039;&#039; sind alle Takte resettet. Übergeben wird nichts!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
RCC_DeInit(); //Setzt alle Takte auf deren Ursprungsszustand zurück.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===HSE - Highspeed External Oscillator (Quarz)===&lt;br /&gt;
Es kann auch eine externe Taktquelle ausgewählt werden. Um dem Controller dies mitzuteilen, gibt es die Funktion &#039;&#039;&#039;RCC_HSEConfig()&#039;&#039;&#039;. Als Parameter erwartet sie einen der folgenden Werte: &#039;&#039;&#039;RCC_HSE_OFF&#039;&#039;&#039;, &#039;&#039;&#039;RCC_HSE_ON&#039;&#039;&#039; oder &#039;&#039;&#039;RCC_HSE_Bypass&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Ersten sind selbsterklärend. Wenn man der Funktion jedoch &#039;&#039;&#039;RCC_HSE_Bypass&#039;&#039;&#039; übergibt, so erwartet der Controller am OSC_IN Pin ein Taktsignal. Dieses darf bis zu 25MHz schnell sein und kann Rechteck, Sinus oder Dreieck Spannung mit einem Duty Cycle von 50% sein.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
RCC_HSEConfig(RCC_HSE_ON); //Aktiviert den Externen Highspeed Oszillator (Quarz).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=GPIOS - Wie greife ich auf einzelne Pins zur Ein/Ausgabe zu=&lt;br /&gt;
===Grundlagen===&lt;br /&gt;
&lt;br /&gt;
Unser Mikrocontroller hat ja einige Beinchen, diese können wir als Eingänge sowie als Ausgänge verwenden.&lt;br /&gt;
Dazu müssen wir unserem Käfer jedoch erst sagen welcher Pin was machen soll. Wie dies geht wird hier beschrieben.&lt;br /&gt;
&lt;br /&gt;
Der STM32F10x verfügt zur Manipulation der IO-Pins über ein sehr raffiniertes Feature, das es erlaubt Bits für die IO-Pins zu setzen / löschen ohne vorher deren aktuellen Zustand auslesen zu müssen (üblicherweise Read-Modify-Write). Dadurch ist gewährleistet, dass beim Setzen/Löschen von Bits kein Interrupt dies stören kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Each of the general-purpose I/O ports has two 32-bit configuration registers (GPIOx_CRL, GPIOx_CRH), two 32-bit data registers (GPIOx_IDR, GPIOx_ODR), a 32-bit set/reset register (GPIOx_BSRR), a 16-bit reset register (GPIOx_BRR) and a 32-bit locking register (GPIOx_LCKR).&#039;&#039;&#039;&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;Each I/O port bit is freely programmable, however the I/O port registers have to be accessed as 32-bit words (half-word or byte accesses are not allowed). The purpose of the GPIOx_BSRR and GPIOx_BRR registers is to allow atomic read/modify accesses to any of the GPIO registers. This way, there is no risk that an IRQ occurs between the read and the modify access.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Auf die &#039;&#039;&#039;BRR&#039;&#039;&#039; und &#039;&#039;&#039;BSRR&#039;&#039;&#039; register greift man über die entsprechenden GPIO-Port zu.&lt;br /&gt;
&lt;br /&gt;
Hierzu existieren in &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h&amp;lt;/syntaxhighlight&amp;gt; folgende Definition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  __IO uint32_t CRL;&lt;br /&gt;
  __IO uint32_t CRH;&lt;br /&gt;
  __IO uint32_t IDR;&lt;br /&gt;
  __IO uint32_t ODR;&lt;br /&gt;
  __IO uint32_t BSRR;&lt;br /&gt;
  __IO uint32_t BRR;&lt;br /&gt;
  __IO uint32_t LCKR;&lt;br /&gt;
} GPIO_TypeDef;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pointer auf die entsprechenden GPIO-Ports sind hier ebenfalls definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)&lt;br /&gt;
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)&lt;br /&gt;
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)&lt;br /&gt;
#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)&lt;br /&gt;
#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)&lt;br /&gt;
#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)&lt;br /&gt;
#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Welche GPIO-Ports tatsächlich verfügbar sind ist abhängig vom verwendeten Controller!&lt;br /&gt;
&lt;br /&gt;
In stm32f10x_gpio.h sind darüber hinaus Definitionen für alle Pins vorhanden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!&amp;lt; Pin 0 selected */&lt;br /&gt;
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!&amp;lt; Pin 1 selected */&lt;br /&gt;
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!&amp;lt; Pin 2 selected */&lt;br /&gt;
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!&amp;lt; Pin 3 selected */&lt;br /&gt;
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!&amp;lt; Pin 4 selected */&lt;br /&gt;
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!&amp;lt; Pin 5 selected */&lt;br /&gt;
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!&amp;lt; Pin 6 selected */&lt;br /&gt;
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!&amp;lt; Pin 7 selected */&lt;br /&gt;
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!&amp;lt; Pin 8 selected */&lt;br /&gt;
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!&amp;lt; Pin 9 selected */&lt;br /&gt;
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!&amp;lt; Pin 10 selected */&lt;br /&gt;
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!&amp;lt; Pin 11 selected */&lt;br /&gt;
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!&amp;lt; Pin 12 selected */&lt;br /&gt;
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!&amp;lt; Pin 13 selected */&lt;br /&gt;
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!&amp;lt; Pin 14 selected */&lt;br /&gt;
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!&amp;lt; Pin 15 selected */&lt;br /&gt;
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!&amp;lt; All pins selected */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man also von Hand auf die Bits dieser Register zugreifen, so ist das denkbar einfach:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 GPIOC-&amp;gt;BSRR = GPIO_Pin_13;   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
setzt das Bit für Pin 13 im Port C. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 GPIOC-&amp;gt;BRR = GPIO_Pin_13;   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 GPIOC-&amp;gt;BSRR = GPIO_Pin_13 &amp;lt;&amp;lt; 16;   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
löscht dieses Bit wieder. Mit&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 GPIOC-&amp;gt;BSRR = (0x00F0 &amp;lt;&amp;lt; 16) | ((data &amp;lt;&amp;lt; 4) &amp;amp; 0x00F0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
kann man die Pins 4..7 auf einen beliebigen Wert setzen, ohne die übrigen Pins zu beeinflussen. Die oberen 16 Bits des geschriebenen Wertes definieren die betroffenen Pins, die unteren 16 Bits den Wert. In der &#039;&#039;Standard Peripheral Library&#039;&#039; ist keine Funktion enthalten, die diese Fähigkeit des Ports unterstützt.&lt;br /&gt;
&lt;br /&gt;
Die äquivalente Operation über das ODR ist nicht atomar und somit in Verbindung mit Interrupts problematisch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Standard Peripheral Library&#039;&#039; stellt für dies Zugriffe allerdings auch komfortablere und vor allem sprechendere Funktionen zur verfügen, die weiter unten erklärt werden.&lt;br /&gt;
&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG: Bevor man Pins eines GPIO-Ports benutzen kann, muss man die Clock des entsprechenden Ports mit der Funktion &#039;&#039;RCC_APB2PeriphClockCmd&#039;&#039; aktivieren , da diese nach einem Reset immer ausgeschaltet ist. Dies ist ein sehr beliebter Fehler beim Arbeiten mit Ports. Mehr dazu bei [[STM32F10x Standard Peripherals Library#Clocks - Der Herzschlag unseres Mikrocontroller|Clocks]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bevor man einen Pin benutzen kann, muss dieser Initialisiert werden.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &#039;&#039;&#039;GPIO_Init()&#039;&#039;&#039; ermöglicht es einen oder mehere Pins auf einmal zu konfigurieren. Hierzu muss eine struct ausgefüllt und GPIO_Init übergeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  u16 GPIO_Pin;&lt;br /&gt;
  GPIOSpeed_TypeDef GPIO_Speed;&lt;br /&gt;
  GPIOMode_TypeDef GPIO_Mode;&lt;br /&gt;
}GPIO_InitTypeDef;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definieren müssen wir dieses zuvor jedoch auch. Dies geschieht mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
GPIO_InitTypeDef GPIO_InitStructure;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach können wir bequem auf die einzelnen Einträge aus der Struct zugreifen.&lt;br /&gt;
Der nachfolgende Code zeigt eine Beispielkonfiguration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&lt;br /&gt;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&lt;br /&gt;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;GPIO_Speed&#039;&#039;&#039; definiert die maximale Änderungsrate des Pins. Das ist aber keine harte Grenze, sondern verändert die Charakteristik des Pintreibers. Eine niedrigere Grenzfrequenz reduziert die Flankensteilheit und damit Leitungsreflexionen. &lt;br /&gt;
Mögliche Werte für GPIO_Speed&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039; Wert&#039;&#039;&#039; ||&#039;&#039;&#039; Bedeutung&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Speed_2MHz || 2MHz / 125ns&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Speed_10MHz || 10MHz / 25ns &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Speed_50MHz || 30-50MHz / 5-12ns&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;GPIO_Mode&#039;&#039;&#039; konfiguriert den Port oder den Port Pin.&lt;br /&gt;
Mögliche Werte für GPIO_Mode&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039; Wert&#039;&#039;&#039; ||&#039;&#039;&#039; Beschreibung&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_Out_PP || Der Pin wird als Ausgang im Push Pull Modus konfiguriert. Dies bedeutet, der Ausgang kann sowohl positive als auch negative Ströme liefern&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_Out_OD || Der Pin wird als Ausgang im Open Drain Modus konfiguriert.&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_IN_FLOATING || Der Pin wird als Eingang im Floating modus konfiguriert. Dies bedeutet, das der Pin kein Niveau hat. Er &amp;quot;schwebt&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_AIN || Der Pin wird als analoger Eingang konfiguriert&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_IPD || Der Pin wird als Eingang konfiguriert mit internem Pull Down Widerstand&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_IPU || Der Pin wird als Eingang konfiguriert mit internem Pull Up Widerstand&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_AF_OD || Der Pin wird mit Alternativer Funktion (SPI, I2C..) konfiguriert im Open Drain Modus&lt;br /&gt;
|-&lt;br /&gt;
| GPIO_Mode_AF_PP || Der Pin wird mit Alternativer Funktion (SPI, I2C..) konfiguriert im Push Pull Modus&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GPIO_Pin&#039;&#039;&#039; definiert den Pin welcher konfiguriert werden soll.&lt;br /&gt;
&lt;br /&gt;
Um den zu konfigurierenden Pin anzugeben, genügt es &#039;&#039;&#039;GPIO_Pin_X&#039;&#039;&#039; zu schreiben.&lt;br /&gt;
Wobei &amp;quot;X&amp;quot; durch die entsprechende Pinnummer zu ersetzen ist.&lt;br /&gt;
&amp;lt;br&amp;gt;Es können auch mehrere Pins gleichzeitig konfiguriert werden. &lt;br /&gt;
Dazu wird einfach logische ODER verknüfung verwendet ( | )&lt;br /&gt;
Möchte man den gesamten Port konfigurieren, so genügt es wenn man &#039;&#039;&#039;GPIO_Pin_All&#039;&#039;&#039; angibt.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit mehreren Pins&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&lt;br /&gt;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&lt;br /&gt;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GPIO_Init()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nachdem wir nun alle relevanten Parameter gesetzt haben, müssen wir den Port nur noch mit &#039;&#039;&#039;GPIO_Init()&#039;&#039;&#039; initialisieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;GPIOx&#039;&#039; ist der Pointer auf den den zu initialisierenden Port. Wobei x einfach mit dem entsprechenden Buchstaben zu ersetzen ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;GPIO_InitStruct&#039;&#039; ist der Pointer auf die soeben von uns ausgefüllte struct. &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für GPIOA&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Clock des Ports einschalten&lt;br /&gt;
&lt;br /&gt;
GPIO_InitTypeDef GPIO_InitStructure;&lt;br /&gt;
&lt;br /&gt;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&lt;br /&gt;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&lt;br /&gt;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7&lt;br /&gt;
&lt;br /&gt;
GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etwas auf den Port ausgeben===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um etwas an einem GPIO auszugeben, gibt es drei Möglichkeiten (Funktionen). &lt;br /&gt;
Entweder man schreibt den gesamten Port oder nur ein einzelnes Bit.&lt;br /&gt;
Die STMs bieten eine Bitbanding-Funktion, die in [[ARM Bitbanding]] genauer erklärt ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktion 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erste Funktion lautet &#039;&#039;&#039;GPIO_SetBits()&#039;&#039;&#039; und &#039;&#039;&#039;GPIO_ResetBits()&#039;&#039;&#039;&lt;br /&gt;
Erster Parameter ist der GPIO Port, der zweite ist der Pin oder eine Kombination daraus. Kombinationen sind wieder logisch zu verknüpfen mit ODER ( | )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_5); //Setzt die Bits 1 und 5 am GPIOA auf high&lt;br /&gt;
&lt;br /&gt;
GPIO_ResetBits(GPIOA,GPIO_Pin_2 | GPIO_Pin_9); //Setzt die Bits 2 und 9 am GPIOA auf low&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In neueren Versionen der Lib existiert auch eine Funktion GPIO_ToggleBits. Die ist allerdings Stand 2013 nicht atomar implementiert. Das kann im Zusammenspiel mit Interrupts zu sporadischen Überraschungen führen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktion 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die zweite Funktion lautet &#039;&#039;&#039;GPIO_WriteBit()&#039;&#039;&#039; Diese Funktion kann sowohl einen oder mehrere Pins setzen als auch löschen. Erster Parameter ist der GPIO Port, der zweite ist der Pin oder eine Kombination daraus, und der dritte sagt aus, ob gesetzt oder gelöscht wird! Kombinationen sind auch hier logisch zu verknüpfen mit ODER ( | ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_5, Bit_SET); //Setzt die Bits 1 und 5 am GPIOA auf high&lt;br /&gt;
&lt;br /&gt;
GPIO_WriteBit(GPIOA, GPIO_Pin_2 | GPIO_Pin_9, Bit_RESET); //Setzt die Bits 2 und 9 am GPIOA auf low&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktion 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die dritte und somit letzte Funktion lautet &#039;&#039;&#039;GPIO_Write()&#039;&#039;&#039;. Diese Funktion beschreibt den gesamten Port! Erster Parameter ist der GPIO Port, der zweite ist der an dem Port auszugebende Wert. &#039;&#039;&#039;Wichtig!&#039;&#039;&#039; Hier wird der ganze Port mit einem 16 bit Wert beschrieben. Viel leserlicher als mit magic numbers im Hex-Format zu arbeiten, sind natürlich auch hier die defines: GPIO_Pin_1 | GPIO_Pin_5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
GPIO_Write(GPIOA,0x0011); //Setzt die Bits 1 und 5 am GPIOA auf high&lt;br /&gt;
GPIO_Write(GPIOA, GPIO_Pin_1 | GPIO_Pin_5); // Geht natürlich auch und ist verständlicher                &lt;br /&gt;
&lt;br /&gt;
GPIO_ResetBits(GPIOA,0x0102); //Setzt die Bits 2 und 9 am GPIOA auf low&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Pin Sperren===&lt;br /&gt;
&lt;br /&gt;
Der [[STM32]] bietet die Möglichkeit, einen Pin zu sperren. Ist ein Pin gesperrt, so kann dessen Zustand (High / Low) &#039;&#039;&#039;bis zu einem Reset&#039;&#039;&#039; nicht mehr geändert werden! Wie wir es nun gewohnt sind, hat ST dafür eine eigene Funktion geschrieben. Diese lautet &#039;&#039;&#039;GPIO_PinLockConfig()&#039;&#039;&#039;. Erster Parameter ist der Port, der zweite sind die Pins, welche man sperren möchte. Diese kann man wieder mit der ODER Verknüpfung kombinieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
GPIO_PinLockConfig(GPIOA,GPIO_Pin_1 | GPIO_Pin_5); //Sperrt die Pins bis zu einem Reset&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eingänge einlesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten in den [[STM32]] einzulesen, gibt es wieder ein paar ST Funktionen. Diese möchten wir hier vorstellen. Die dafür verwendbaren Funktionen sind: &#039;&#039;&#039;GPIO_ReadInputDataBit()&#039;&#039;&#039; sowie &#039;&#039;&#039;GPIO_ReadInputData()&#039;&#039;&#039;. Erster Parameter ist der Port, der zweite sind die Pins, die man einlesen möchte. Bei &#039;&#039;&#039;GPIO_ReadInputData()&#039;&#039;&#039; wird jedoch nur der Port übergeben, da diese Funktion den &#039;&#039;&#039;gesamten&#039;&#039;&#039; Port zurück liefert! Hier wird der tatsächliche logische Pegel am Pin eingelesen!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t ucStatus = 0;&lt;br /&gt;
&lt;br /&gt;
ucStatus = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5); //Speichert den Zustand von Pin5 am GPIOA in die 8-bit-Variable ucStatus &lt;br /&gt;
                                                    //(uint8_t ist die kleinstmögliche, eigenständige Variable für dieses eine Bit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t uiPort = 0;&lt;br /&gt;
&lt;br /&gt;
uiPort = GPIO_ReadInputData(GPIOA); //Speichert den Zustand von GPIOA in die 16-bit-Variable uiPort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ausgänge einlesen===&lt;br /&gt;
&lt;br /&gt;
Man hat ja häufig das Problem, dass man gerne nachsehen möchte, was man denn gerade am Ausgang ausgibt. Dazu kann man den Ausgang wie ein Eingang einlesen. Die dafür verwendbaren Funktionen sind: &#039;&#039;&#039;GPIO_ReadOutputDataBit()&#039;&#039;&#039; sowie &#039;&#039;&#039;GPIO_ReadOutputData()&#039;&#039;&#039;. Erster Parameter ist der Port, der zweite sind die Pins, welche man auslesen möchte. Bei &#039;&#039;&#039;GPIO_ReadOutputData()&#039;&#039;&#039; wird jedoch nur der Port übergeben, da diese Funktion den &#039;&#039;&#039;gesamten&#039;&#039;&#039; Port zurück liefert!Hier wird &#039;&#039;&#039;nicht&#039;&#039;&#039; der tatsächliche logische Pegel am Pin eingelesen, sondern was im Ausgangsregister eingestellt wurde (also eigentlich anliegen sollte)! Diese beiden Werte können sich auf Grund externer Einflüsse aber unterscheiden!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t ucStatus = 0;&lt;br /&gt;
&lt;br /&gt;
ucStatus = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5); //Speichert den Zustand von Pin5 am GPIOA in die 8-bit-Variable ucStatus &lt;br /&gt;
                                                     //(uint8_t ist die kleinstmögliche, eigenständige Variable für dieses eine Bit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t uiPort = 0;&lt;br /&gt;
&lt;br /&gt;
uiPort = GPIO_ReadOutputData(GPIOA); //Speichert den Zustand von GPIOA in die 16-bit-Variable uiPort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Deinitialisieren von Ports===&lt;br /&gt;
&lt;br /&gt;
Es gibt auch die Möglichkeit, den Port zu deinitialisieren. Dann wird er mit seinen Standardwerten konfiguriert. Die Funktion dazu lautet &#039;&#039;&#039;GPIO_DeInit()&#039;&#039;&#039;. Erster und einziger Parameter ist der Port, den man deinitialisieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
GPIO_DeInit(GPIOA); //Setzt den GPIOA auf seine Standardwerte zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Weblinks, Foren, Communities =&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/175840 Diskussion zum Artikel]&lt;br /&gt;
* [http://www.libopencm3.org libopencm3] -- Eine Open-Source Alternative (GPL, Version 3 oder höher) zur ST Library&lt;br /&gt;
* Artikel [[STM32]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:STM32]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=79710</id>
		<title>C-Präprozessor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=79710"/>
		<updated>2013-11-26T11:15:41Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der erste Verarbeitungsschritt bei der Kompilierung eines [[C]]/[[C++]]-Programmes erfolgt durch den &#039;&#039;&#039;Präprozessor&#039;&#039;&#039;. Dieser verändert den Quelltext, den die späteren Verarbeitungsphasen erhalten, in folgender Hinsicht:&lt;br /&gt;
* Einbeziehen zusätzlicher Dateien ([[Include-Files]])&lt;br /&gt;
* Ersetzen von (parametrisierbaren) [[Makro]]s&lt;br /&gt;
* Entfernen einzelner Abschnitte (= bedingte Kompilierung)&lt;br /&gt;
&lt;br /&gt;
Im Grunde kann man sich den Präprozessor als eine Art Texteditor vorstellen, der die Anweisungen, was er zu tun hat, dem Text entnimmt, den er bearbeitet. In jedem Texteditor gibt es zb. die Funktion &#039;Suchen und Ersetzen&#039;. Auch im Präprozessor gibt es sie, nur heißt sie dort #define. Alle Anweisungen an den Präprozessor beginnen grundsätzlich damit, daß das Zeichen &#039;#&#039; das erste Zeichen in einer Textzeile darstellt. Und umgekehrt: Ist das erste Zeichen in einer Textzeile ein &#039;#&#039;, so handelt es sich um eine Präprozessor-Anweisung.&lt;br /&gt;
&lt;br /&gt;
==#include==&lt;br /&gt;
Die #include weist den Präprozessor an, den Inhalt der angegebenen Datei anstelle der #include Anweisung einzusetzen. Weiter passiert nichts. Bei der Angabe des Dateinamens der einzusetzenden Datei gibt es 2 Formen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Datei1.xyz&amp;quot;&lt;br /&gt;
#include &amp;lt;Datei2.abc&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Unterschied zwischen beiden Formen besteht rein im Aufsuchpfad, den der Präprozessor benutzt, um die Datei zu finden. Per Konvention wird die &amp;lt; &amp;gt;-Form benutzt, um systemweite Includes durchzuführen. Alle mit dem Compiler mitgelieferten Header Files sind zb. solche systemweite-Includes. Bei der Installation des Compilers wurde im System hinterlassen, auf welchem Pfad sie gefunden werden können. Durch Verwendung der &amp;lt; &amp;gt;-Form wird dem Präprozessor mitgeteilt, dass diese damals vereinbarten Pfadangaben zur Aufsuche dieser Datei benutzt werden soll.&lt;br /&gt;
&lt;br /&gt;
==#define==&lt;br /&gt;
Mittels #define wird eine Textersetzung vereinbart.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ABC xyz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
weist den Präprozessor an, im weiteren Quelltext alle Vorkommen von &#039;ABC&#039; durch den Text &#039;xyz&#039; zu ersetzen. Der Präprozessor macht dies überall, solange&lt;br /&gt;
* es sich an der zu ersetzenden Stelle um keinen String handelt. Mit obigem #define würde also in &amp;quot;Dies ist ABC&amp;quot; keine Textersetzung stattfinden.&lt;br /&gt;
* er den Ursprungstext als &#039;Wort&#039; im Sinne eines C-Wortes handelt. Mit obigem #define würde also in cdABCef = 5; keine Textersetzung stattfinden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist: Der Präprozessor führt eine reine Textersetzung durch! Ob sich durch diese Ersetzung eine Logikänderung im Programm ergibt, interessiert den Präprozessor nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define NR 5&lt;br /&gt;
&lt;br /&gt;
int Werte[NR];&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; NR; i++ )&lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, Werte[i] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bevor der eigentliche Compiler den Quelltext zu Gesicht bekommt, wird er zunächst vom Präprozessor bearbeitet. Dieser führt die Textersetzung durch, indem er alle Vorkommen von NR durch den Text 5 ersetzt. Erst dieses Ergebnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int Werte[5];&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; 5; i++ )&lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, Werte[i] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird dann dem eigentlichen Compiler zur Übersetzung vorgelegt. In diesem Beispiel hat man durch den Einsatz des Präprozessors erreicht, dass die Anzahl der Arrayelemente immer mit dem Maximalwert in der for-Schleife übereinstimmt. Ein Fehler, dass beispielweise die Arraygröße verändert wird, ohne das die for-Schleife angepasst würde, ist durch den Einsatz des Präprozessors wirkungsvoll verhindert worden.&lt;br /&gt;
&lt;br /&gt;
Aber auch hier wieder: Der Präprozessors macht nur eine Textersetzung! Für den Präprozessors ist es völlig unerheblich, ob sich dadurch die Logik des Programms aus Sicht des Programmierers verändert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    3+5&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  y = 4*PART;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Beispiel mag es schon so sein, dass der Programmierer im Sinn hatte, den Ausdruck 4 mal 8 berechnen zu lassen, wobei sich die 8 durch eine Addition von 3 und 5 ergeben. Das interessiert aber den Präprozessor nicht. Der macht eine reine textuelle Ersetzung, indem er den Text &#039;PART&#039; durch den Text &#039;3+5&#039; austauscht, wodurch dieses Ergebnis entsteht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    3+5&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  y = 4*3+5;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist aber etwas anderes, nämlich &#039;(4*3)+5&#039;, also ursprünglich beabsichtigt war, nämlich &#039;4*(3+5)&#039;.&lt;br /&gt;
&lt;br /&gt;
Schlussfolgerung: Es ist bei komplexeren Makros nicht ungewöhnlich, dass sich in Makros relativ viele Klammern wiederfinden, deren Zweck gerade für einen Neuling nicht auf den ersten Blick zu durchschauen ist.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    (3+5)&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
  x = PART;&lt;br /&gt;
  y = 4*PART;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Während die Klammern im Makro bei der Zuweisung an x keine Funktion erfüllen (aber auch nicht störend sind), sind sie bei der Zuweisung an y lebenswichtig um der ganzen Anweisung nach der Textersetzung die beabsichtigte Bedeutung zu geben.&lt;br /&gt;
&lt;br /&gt;
==#define für eine Codesequenz==&lt;br /&gt;
&lt;br /&gt;
Wird ein #define nicht für einen Ausdruck verwendet, sondern für eine Codesequenz wie in &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F(n) { a = n; b = n; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann entsteht ein Problem bei &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) F(1); else F(2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
da hier für den Compiler letztlich&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) { ... }; else { ... };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stehen bleibt, und damit ein überzähliges Semikolon vor dem else. Nun kann man dies natürlich mit &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) { F(1); } else { F(2); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) F(1) else F(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
abhandeln. Gelegentlich findet man deshalb aber auch seltsam anmutende Definitionen wie&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F(n) do{ a = n; b = n; }while(0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==#if, #ifdef==&lt;br /&gt;
&lt;br /&gt;
==mögliche Probleme beim Einsatz des Präprozessors==&lt;br /&gt;
Eine am C-Präprozessor häufig geäußerte Kritik ist, dass er (nahezu) ohne Berücksichtigung der eigentlichen Sprachsyntax arbeitet (&amp;quot;The C-Preprocessor doesn&#039;t know about C&amp;quot;). Die Tatsache, dass Makros beispielsweise auf der Basis von Textersatz arbeiten, kann zu Überaschungen führen. So wird in&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define cub(a) a*a*a&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
y = 4;&lt;br /&gt;
x = cub(y+1);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
in x nicht etwa der Wert 125 (5 hoch 3) stehen, sondern der Wert 13, da nach Ersetzen des Makros der folgende Quelltext kompiliert wird ...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
x = y+1*y+1*y+1; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
... und durch die arithmetischen Vorrangregeln, wird dieser Ausdruck so ausgewertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
x = y + (1*y) + (1*y) + 1; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte man jeden Parameter eines Makros bei jeder Verwendung klammern. Damit werden viele Probleme mit Makros gelöst und man erhält für obiges Beispiel folgende Form und damit auch eine korrekte Berechnung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define cub(a) ((a)*(a)*(a))&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
y = 4;&lt;br /&gt;
x = cub(y+1);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein weiteres Problem besteht jedoch, wenn ein Makro-Parameter im Ersatztext doppelt verwendet wird:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define max(a, b) ((a&amp;gt;b) ? (a) : (b))&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
...&lt;br /&gt;
x = max(y, 10);   /* OK */&lt;br /&gt;
x = max(++y, 10); /* ?? */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im zweiten Fall wird die Variable &#039;&#039;y&#039;&#039; u.U. &#039;&#039;zweimal&#039;&#039; inkrementiert - was ohne Kenntnis der Makro-Definition keineswegs offensichtlich ist (&#039;&#039;max&#039;&#039; könnte auch eine echte Funktion sein).&lt;br /&gt;
&lt;br /&gt;
Die Tatsache, dass der C-Präprozessor die Syntax von C/C++ nicht wirklich berücksichtigt, ist allerdings auch nützlich. So lassen sich mit dem C-Präprozessor Datentypen parametrisieren, um systematische Programmteile zu vereinfachen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* GSAWP:&lt;br /&gt;
   generiert Funktionsdefinition zum Vertauschen des Inhalts von zwei Variablen&lt;br /&gt;
*/&lt;br /&gt;
#define GSWAP(n, T)s\&lt;br /&gt;
        void n(T *xp, T *yp) { T tmp = *xp; *xp = *yp; *yp = tmp; }&lt;br /&gt;
...&lt;br /&gt;
GSWAP(iswap, int)&lt;br /&gt;
GSWAP(dswap, double)&lt;br /&gt;
GSWAP(swap_s, struct s)&lt;br /&gt;
...&lt;br /&gt;
int a, b;&lt;br /&gt;
double c, d;&lt;br /&gt;
struct s e, f;&lt;br /&gt;
...&lt;br /&gt;
iswap(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
dswap(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap_s(&amp;amp;e. &amp;amp;f);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele typische Anwendungsfälle des Präprozessors lassen sich allerdings bereits mit Standard-C-Bordmitteln erfolgreich erschlagen:&lt;br /&gt;
* Statt &#039;&#039;#define&#039;&#039; besser mit &#039;&#039;const&#039;&#039; vereinbarte Variablen benutzen. Bei jedem besseren Compiler ergeben sich dank Optimierung keinerlei Nachteile.&lt;br /&gt;
* &#039;&#039;enum&#039;&#039; für Konstantenfelder benutzen. Dabei sollte man allerdings sauber casten, da &#039;&#039;enum&#039;&#039;-Werte in der Regel als &#039;&#039;int&#039;&#039; interpretiert werden.&lt;br /&gt;
* Neuere Versionen des GCC unterstützen &#039;&#039;inline&#039;&#039;, wodurch Makros für Einzeiler überflüssig werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In [[C++]] wurden ergänzend zum C-Präprozessor weitere Mechanismen eingeführt. So erlauben [[Templates (C++)|Templates]] generische Programmierung, womit viele der &amp;quot;Makro-Tricks&amp;quot; wie die obigen überflüssig werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=79709</id>
		<title>C-Präprozessor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=79709"/>
		<updated>2013-11-26T11:13:10Z</updated>

		<summary type="html">&lt;p&gt;Prx: Codesequenz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der erste Verarbeitungsschritt bei der Kompilierung eines [[C]]/[[C++]]-Programmes erfolgt durch den &#039;&#039;&#039;Präprozessor&#039;&#039;&#039;. Dieser verändert den Quelltext, den die späteren Verarbeitungsphasen erhalten, in folgender Hinsicht:&lt;br /&gt;
* Einbeziehen zusätzlicher Dateien ([[Include-Files]])&lt;br /&gt;
* Ersetzen von (parametrisierbaren) [[Makro]]s&lt;br /&gt;
* Entfernen einzelner Abschnitte (= bedingte Kompilierung)&lt;br /&gt;
&lt;br /&gt;
Im Grunde kann man sich den Präprozessor als eine Art Texteditor vorstellen, der die Anweisungen, was er zu tun hat, dem Text entnimmt, den er bearbeitet. In jedem Texteditor gibt es zb. die Funktion &#039;Suchen und Ersetzen&#039;. Auch im Präprozessor gibt es sie, nur heißt sie dort #define. Alle Anweisungen an den Präprozessor beginnen grundsätzlich damit, daß das Zeichen &#039;#&#039; das erste Zeichen in einer Textzeile darstellt. Und umgekehrt: Ist das erste Zeichen in einer Textzeile ein &#039;#&#039;, so handelt es sich um eine Präprozessor-Anweisung.&lt;br /&gt;
&lt;br /&gt;
==#include==&lt;br /&gt;
Die #include weist den Präprozessor an, den Inhalt der angegebenen Datei anstelle der #include Anweisung einzusetzen. Weiter passiert nichts. Bei der Angabe des Dateinamens der einzusetzenden Datei gibt es 2 Formen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Datei1.xyz&amp;quot;&lt;br /&gt;
#include &amp;lt;Datei2.abc&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Unterschied zwischen beiden Formen besteht rein im Aufsuchpfad, den der Präprozessor benutzt, um die Datei zu finden. Per Konvention wird die &amp;lt; &amp;gt;-Form benutzt, um systemweite Includes durchzuführen. Alle mit dem Compiler mitgelieferten Header Files sind zb. solche systemweite-Includes. Bei der Installation des Compilers wurde im System hinterlassen, auf welchem Pfad sie gefunden werden können. Durch Verwendung der &amp;lt; &amp;gt;-Form wird dem Präprozessor mitgeteilt, dass diese damals vereinbarten Pfadangaben zur Aufsuche dieser Datei benutzt werden soll.&lt;br /&gt;
&lt;br /&gt;
==#define==&lt;br /&gt;
Mittels #define wird eine Textersetzung vereinbart.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define ABC xyz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
weist den Präprozessor an, im weiteren Quelltext alle Vorkommen von &#039;ABC&#039; durch den Text &#039;xyz&#039; zu ersetzen. Der Präprozessor macht dies überall, solange&lt;br /&gt;
* es sich an der zu ersetzenden Stelle um keinen String handelt. Mit obigem #define würde also in &amp;quot;Dies ist ABC&amp;quot; keine Textersetzung stattfinden.&lt;br /&gt;
* er den Ursprungstext als &#039;Wort&#039; im Sinne eines C-Wortes handelt. Mit obigem #define würde also in cdABCef = 5; keine Textersetzung stattfinden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist: Der Präprozessor führt eine reine Textersetzung durch! Ob sich durch diese Ersetzung eine Logikänderung im Programm ergibt, interessiert den Präprozessor nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define NR 5&lt;br /&gt;
&lt;br /&gt;
int Werte[NR];&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; NR; i++ )&lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, Werte[i] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bevor der eigentliche Compiler den Quelltext zu Gesicht bekommt, wird er zunächst vom Präprozessor bearbeitet. Dieser führt die Textersetzung durch, indem er alle Vorkommen von NR durch den Text 5 ersetzt. Erst dieses Ergebnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int Werte[5];&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; 5; i++ )&lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, Werte[i] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird dann dem eigentlichen Compiler zur Übersetzung vorgelegt. In diesem Beispiel hat man durch den Einsatz des Präprozessors erreicht, dass die Anzahl der Arrayelemente immer mit dem Maximalwert in der for-Schleife übereinstimmt. Ein Fehler, dass beispielweise die Arraygröße verändert wird, ohne das die for-Schleife angepasst würde, ist durch den Einsatz des Präprozessors wirkungsvoll verhindert worden.&lt;br /&gt;
&lt;br /&gt;
Aber auch hier wieder: Der Präprozessors macht nur eine Textersetzung! Für den Präprozessors ist es völlig unerheblich, ob sich dadurch die Logik des Programms aus Sicht des Programmierers verändert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    3+5&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  y = 4*PART;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Beispiel mag es schon so sein, dass der Programmierer im Sinn hatte, den Ausdruck 4 mal 8 berechnen zu lassen, wobei sich die 8 durch eine Addition von 3 und 5 ergeben. Das interessiert aber den Präprozessor nicht. Der macht eine reine textuelle Ersetzung, indem er den Text &#039;PART&#039; durch den Text &#039;3+5&#039; austauscht, wodurch dieses Ergebnis entsteht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    3+5&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
  y = 4*3+5;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist aber etwas anderes, nämlich &#039;(4*3)+5&#039;, also ursprünglich beabsichtigt war, nämlich &#039;4*(3+5)&#039;.&lt;br /&gt;
&lt;br /&gt;
Schlussfolgerung: Es ist bei komplexeren Makros nicht ungewöhnlich, dass sich in Makros relativ viele Klammern wiederfinden, deren Zweck gerade für einen Neuling nicht auf den ersten Blick zu durchschauen ist.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PART    (3+5)&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
  x = PART;&lt;br /&gt;
  y = 4*PART;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Während die Klammern im Makro bei der Zuweisung an x keine Funktion erfüllen (aber auch nicht störend sind), sind sie bei der Zuweisung an y lebenswichtig um der ganzen Anweisung nach der Textersetzung die beabsichtigte Bedeutung zu geben.&lt;br /&gt;
&lt;br /&gt;
==#define für eine Codesequenz==&lt;br /&gt;
&lt;br /&gt;
Wird ein #define nicht für einen Ausdruck verwendet, sondern für eine Codesequenz wie in &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F(n) { a = n; b = n; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann entsteht ein Problem bei &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) F(1); else F(2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
da hier für den Compiler letztlich&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) { ... }; else { ... };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stehen bleibt, und damit ein überzähliges Semikolon vor dem else. Nun kann man dies natürlich mit &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (...) { F(1); } else { F(2); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
abhandeln. Gelegentlich findet man deshalb aber auch seltsam anmutende Definitionen wie&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F(n) do{ a = n; b = n; }while(0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==#if, #ifdef==&lt;br /&gt;
&lt;br /&gt;
==mögliche Probleme beim Einsatz des Präprozessors==&lt;br /&gt;
Eine am C-Präprozessor häufig geäußerte Kritik ist, dass er (nahezu) ohne Berücksichtigung der eigentlichen Sprachsyntax arbeitet (&amp;quot;The C-Preprocessor doesn&#039;t know about C&amp;quot;). Die Tatsache, dass Makros beispielsweise auf der Basis von Textersatz arbeiten, kann zu Überaschungen führen. So wird in&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define cub(a) a*a*a&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
y = 4;&lt;br /&gt;
x = cub(y+1);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
in x nicht etwa der Wert 125 (5 hoch 3) stehen, sondern der Wert 13, da nach Ersetzen des Makros der folgende Quelltext kompiliert wird ...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
x = y+1*y+1*y+1; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
... und durch die arithmetischen Vorrangregeln, wird dieser Ausdruck so ausgewertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
x = y + (1*y) + (1*y) + 1; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte man jeden Parameter eines Makros bei jeder Verwendung klammern. Damit werden viele Probleme mit Makros gelöst und man erhält für obiges Beispiel folgende Form und damit auch eine korrekte Berechnung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define cub(a) ((a)*(a)*(a))&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
y = 4;&lt;br /&gt;
x = cub(y+1);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein weiteres Problem besteht jedoch, wenn ein Makro-Parameter im Ersatztext doppelt verwendet wird:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define max(a, b) ((a&amp;gt;b) ? (a) : (b))&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
...&lt;br /&gt;
x = max(y, 10);   /* OK */&lt;br /&gt;
x = max(++y, 10); /* ?? */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im zweiten Fall wird die Variable &#039;&#039;y&#039;&#039; u.U. &#039;&#039;zweimal&#039;&#039; inkrementiert - was ohne Kenntnis der Makro-Definition keineswegs offensichtlich ist (&#039;&#039;max&#039;&#039; könnte auch eine echte Funktion sein).&lt;br /&gt;
&lt;br /&gt;
Die Tatsache, dass der C-Präprozessor die Syntax von C/C++ nicht wirklich berücksichtigt, ist allerdings auch nützlich. So lassen sich mit dem C-Präprozessor Datentypen parametrisieren, um systematische Programmteile zu vereinfachen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* GSAWP:&lt;br /&gt;
   generiert Funktionsdefinition zum Vertauschen des Inhalts von zwei Variablen&lt;br /&gt;
*/&lt;br /&gt;
#define GSWAP(n, T)s\&lt;br /&gt;
        void n(T *xp, T *yp) { T tmp = *xp; *xp = *yp; *yp = tmp; }&lt;br /&gt;
...&lt;br /&gt;
GSWAP(iswap, int)&lt;br /&gt;
GSWAP(dswap, double)&lt;br /&gt;
GSWAP(swap_s, struct s)&lt;br /&gt;
...&lt;br /&gt;
int a, b;&lt;br /&gt;
double c, d;&lt;br /&gt;
struct s e, f;&lt;br /&gt;
...&lt;br /&gt;
iswap(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
dswap(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap_s(&amp;amp;e. &amp;amp;f);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele typische Anwendungsfälle des Präprozessors lassen sich allerdings bereits mit Standard-C-Bordmitteln erfolgreich erschlagen:&lt;br /&gt;
* Statt &#039;&#039;#define&#039;&#039; besser mit &#039;&#039;const&#039;&#039; vereinbarte Variablen benutzen. Bei jedem besseren Compiler ergeben sich dank Optimierung keinerlei Nachteile.&lt;br /&gt;
* &#039;&#039;enum&#039;&#039; für Konstantenfelder benutzen. Dabei sollte man allerdings sauber casten, da &#039;&#039;enum&#039;&#039;-Werte in der Regel als &#039;&#039;int&#039;&#039; interpretiert werden.&lt;br /&gt;
* Neuere Versionen des GCC unterstützen &#039;&#039;inline&#039;&#039;, wodurch Makros für Einzeiler überflüssig werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In [[C++]] wurden ergänzend zum C-Präprozessor weitere Mechanismen eingeführt. So erlauben [[Templates (C++)|Templates]] generische Programmierung, womit viele der &amp;quot;Makro-Tricks&amp;quot; wie die obigen überflüssig werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=79140</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=79140"/>
		<updated>2013-10-24T20:31:29Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist ein Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [http://www.arm.com/products/processors/cortex-m/index.php ARM Cortex-M0/M3/M4] CPU. Diese Architektur ist speziell für den Einsatz in Microcontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es sieben STM32-Familien:&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1588.jsp STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1169.jsp STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1575 STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1521.jsp STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295 STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1581 STM32W]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/internet/mcu/class/1734.jsp Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
*  4KB ... 256KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 4KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 36 ... 216 Pins als QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind über &#039;&#039;&#039;250&#039;&#039;&#039; STM32 Derivate/Varianten verfügbar&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle prefetch-hardware bis 120/168 MHz eine Geschwindigkeit erzielen soll, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für 8x40 Punkte (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei STM32F429 / STM32F439&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 140 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 2x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* RNG - Random Number Generator (STM32F2/4xx)&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr . . .&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation: ==&lt;br /&gt;
Die Dokumentation der STM32 ist zwar umfangreicher und komplexer z.B. die der [[AVR]], enthält aber dennoch alle nötigen Informationen. Sie teilt sich auf in mehrere Dokumente.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF164486 STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00191185.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/CD00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403c/index.html ARMv7M Architecture Reference Manual] beschreibt detailliert den Prozessorkern, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/web/en/resource/technical/document/application_note/CD00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier] für den o.g. STM32F103RC.&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
Der GCC (in seinen verschiedenen Binärdistributionen) ist der einzige ARM Compiler der [http://de.wikipedia.org/wiki/C%2B%2B11 C++11] unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [http://gnuarmeclipse.livius.net/blog/ GNU ARM Plug-in] (Bei Verwendung vom GCC-ARM-Embedded als Toolchain &amp;quot;Sourcery G++ Lite&amp;quot; auswählen, dieser sieht für eclipse gleich aus) (Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Turtelizer2 oder andere JTAG Programmieradapter&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows)&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDE&#039;s ====&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition]&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0 / F1 / F4 Hilfreiche Infos gibt es im [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] Forum&lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE die mit dem Segger J-LINK funktioniert.&lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter GDB Debugger, Jlink/ST-Link, System view (Peripherie Register anzeigen) beim Debuggen, Project Wizzard&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/products/itag winIDEAiTag] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag Adapter.&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic] (Lite Version (bis V2.3.0) ohne Code-Limit, auf GCC basierend. Die neueste Version ab V3 hat fast keine Beschränkungen mehr außer jetzt einen Code-Limit von 32kB. Außerdem werden jetzt die meisten ARM Familien unterstützt. )&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend)&lt;br /&gt;
* [http://www.code-red-tech.com Code Red] (GCC basierend)&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
[[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://www.seng.de/downloads/HowTo_ToolChain_STM32_Ubuntu.pdf Ubuntu, eclipse, Code Sourcery, OpenOCD] ([http://www.seng.de/downloads/HowTo_ToolChain_STM32_Ubuntu.odt Das Gleiche im bearbeitbaren ODT-Format])&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html NonComercial] J-LINK-EDU für ca. 60,- zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), Keil, ...&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro]&lt;br /&gt;
* [http://www.st.com/internet/evalboard/product/219866.jsp ST-LINK], [http://www.st.com/internet/evalboard/product/251168.jsp ST-LINK/V2]&lt;br /&gt;
* Jedes STM32 Discovery board hat einen ST-Link für Programmierung/Debugging per SWD on-board, welcher auch für eigene STM32 Target Hardware benutzt werden kann (ca. 12,- bis 19,-€, je nach Typ).&lt;br /&gt;
* [http://www.raisonance.com/~rlink-debugger-programmer__microcontrollers__tool~tool__T018:4cn9ziz4bnx6.html Raisonance RLink]&lt;br /&gt;
* [http://www.amontec.com Amontec]&lt;br /&gt;
* [http://www.hjtag.com H-JTAG] Personal Edition für ca. 60,- zu haben, läuft mit ADS, SDT, IAR, Vision und RVDS &lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50.- bei Amazon zu bestellen, oder als Eigenbau version (offenes Design) läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-Poligen Stecker, den man direkt auf die Demo-Boards, die auch einen 20-Poligen [[JTAG]]-Anschluss haben, einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen seperaten JTAG-Stecker, aber zumindest für das STM32F4 Discovery kann man sich leicht einen Adapter Pinheader-&amp;gt;JTAG Stecker selber bauen.&lt;br /&gt;
&lt;br /&gt;
Andere [[JTAG]] Adapter wie z.B. der ULink von Keil funktionieren nur mit dem Keil Compiler.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/colinkEx.htm unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [http://www.oocdlink.com/ OOCDLink]&lt;br /&gt;
* [https://github.com/texane/stlink Stlink]&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
* [http://capitanio.org/mlink/ Linux Demo Code für die Discovery&#039;s ST-Link Programmierung]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes.&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Austattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen . Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Ausser F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 1000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (nur in bestimmten MCUs mit entsprechender Bootloader-Version und PIN-Anzahl, z.B. STM32F105/107)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.st.com/mcu/files/mcu/1221142709.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20.&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglich effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 168MHz) (Aber NXP hat schon 150MHz angekündigt)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
** =&amp;gt; Daher nicht besonders gut für Mikrcontroller Anfänger/Einsteiger geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISR&#039;s, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokummentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird ([http://www.mikrocontroller.net/topic/312393#new Siehe Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assemblisiert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und dem GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [http://www.hbe-shop.de HBE (Farnell Programm für Private)] &lt;br /&gt;
* [http://www.sander-electronic.de/be00069.html Sander]&lt;br /&gt;
*[http://www.tme.eu/de/katalog/index.phtml#cleanParameters%3D1%26search%3DSTM32F10%26bf_szukaj%3D+ TME] &lt;br /&gt;
*[http://teske-electronics.de/index.php?cPath=3_9_53 Teske electronics]&lt;br /&gt;
*[http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, Mouser, Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
&lt;br /&gt;
* [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=gruppe&amp;amp;id=14 Im Shop von Embedded Projects]&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/ARM/ARM-Cortex-M3 Cortex M3 bei Watterott]&lt;br /&gt;
* [http://www.raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer und Primer2 von Raisonance]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.propox.com/products/t_174.html Propox, Header-Boards für 103R und 103V sowie Trägerplatine dafür]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://olimex.com/dev/index.html STM32 bei Olimex]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [http://www.de.rs-online.com/web/p/products/7458434/ STM32Discovery bei RS-Components] 12,65 € +MwSt.&lt;br /&gt;
* [http://www.segor.de/#Q=STM32 VL DISCOVERY] STM32 Discovery bei Segor&lt;br /&gt;
* [http://www.watterott.com/de/STM32F4Discovery STM32F4DISCOVERY] STM32F4 Cortex M4 Controller mit JTAG-Debugger auf der Platine bei Watterott für 16,66EUR.&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/443910/ STM32F4 Discovery Kit bei Conrad] 17,11 €&lt;br /&gt;
* [http://www.mcu-raisonance.com/~open4-development-platform__microcontrollers__tool~tool__T018:g65gu6ghg2n.html/ Open 4 oder auch genannt Evo-Primer]&lt;br /&gt;
* [http://www.wayengineer.com/index.php?main_page=index&amp;amp;cPath=50_66&amp;amp;page=1&amp;amp;sort=3a WayEngineer]&lt;br /&gt;
* [http://thinkembedded.ch/ST-STMicroelectronics:::24.html Im Thinkembedded Shop] in der Schweiz / DiscoveryF4, div. ETT und Olimex Boarde ab 20,18 CHF / 16,15 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://shop.myavr.de/ARM-Produktlinie/STM32F4-Discovery.htm?sp=article.sp.php&amp;amp;artID=200072 Im myAVR Shop] DiscoveryF4 mit möglichem Zubehör 16,45 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://www.keil.com/boards/cortexm.asp Keil/ARM Demoboards]&lt;br /&gt;
* [http://www.phytec.de Phytec]&lt;br /&gt;
* [http://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=37 verschiedene ARM Produkte und Erweiterungen bei myAVR]&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/173753 Diskussion zum Artikel]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/AllItems.aspx Forum auf der ST Homepage] &lt;br /&gt;
* [http://www.stm32circle.com/hom/index.php STM32 Community] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://www.ebv.com/fileadmin/products/Press_Print/Brochures/Product_Brochures/EBV_Cortex%20Collection_V2.pdf Übersicht der Cortex Prozessoren und deren Hersteller (nicht nur ST, von EBV)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/258652 Tutorial]&lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net STM32F4 Quellcode-Librarys und CooCox-Projekte in Deutsch ]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Bitfelder&amp;diff=78899</id>
		<title>Bitfelder</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Bitfelder&amp;diff=78899"/>
		<updated>2013-10-12T08:27:17Z</updated>

		<summary type="html">&lt;p&gt;Prx: Basistyp und Alignment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beim Programmieren von Mikrocontrollern muss auf jedes Byte oder sogar auf&lt;br /&gt;
jedes Bit geachtet werden. Oft müssen wir in einer Variablen lediglich den&lt;br /&gt;
Zustand 0 oder 1 speichern. Wenn wir nun zur Speicherung eines einzelnen Wertes&lt;br /&gt;
den kleinsten bekannten Datentypen, nämlich &amp;lt;tt&amp;gt;unsigned char&amp;lt;/tt&amp;gt;, nehmen, dann&lt;br /&gt;
verschwenden wir 7 Bits, da ein &amp;lt;tt&amp;gt;unsigned char&amp;lt;/tt&amp;gt; 8 Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
Hier bietet uns die Programmiersprache C ein mächtiges Werkzeug an, mit dessen&lt;br /&gt;
Hilfe wir 8 Bits in eine einzelne Bytevariable zusammenfassen und (fast) wie&lt;br /&gt;
8 einzelne Variablen ansprechen können. Die Rede ist von sogenannten &#039;&#039;&#039;Bitfeldern&#039;&#039;&#039;. Diese werden als Strukturelemente definiert. Sehen wir uns dazu doch am besten gleich ein Beispiel an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct {&lt;br /&gt;
   unsigned bStatus_1:1; // 1 Bit für bStatus_1&lt;br /&gt;
   unsigned bStatus_2:1; // 1 Bit für bStatus_2&lt;br /&gt;
   unsigned bNochNBit:1; // Und hier noch mal ein Bit&lt;br /&gt;
   unsigned b2Bits:2;    // Dieses Feld ist 2 Bits breit&lt;br /&gt;
   // All das hat in einer einzigen Byte-Variable Platz.&lt;br /&gt;
   // die 3 verbleibenden Bits bleiben ungenutzt&lt;br /&gt;
} x;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zugriff auf ein solches Feld erfolgt nun, wie beim Strukturzugriff bekannt,&lt;br /&gt;
über den Punkt- oder den Dereferenzierungs-Operator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
x.bStatus_1 = 1;&lt;br /&gt;
x.bStatus_2 = 0;&lt;br /&gt;
x.b2Bits = 3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitfelder sparen Platz im RAM, zu Lasten von Rechenzeit zum Zerlegen des Bytes in seine einzelnen bits. Besteht also kein triftiger Grund sollten nur Datentypen mit längen die Vielfache von 8bit sind verwendet werden, auch wenn nur ein Bitwert gespeichert werden soll.&lt;br /&gt;
&lt;br /&gt;
Es kann sinnvoll sein, als Basistyp &amp;quot;unsigned char/short&amp;quot; statt &amp;quot;unsigned&amp;quot; zu wählen. Viele Plattformen behandeln ein als &amp;quot;unsigned&amp;quot; deklariertes Bitfeld hinsichtlich Aligment wie ein normales &amp;quot;unsigned&amp;quot;. Ein Array aus der oben definierten Struct würde dann pro Element 2 oder 4 Bytes benötigen.&lt;br /&gt;
&lt;br /&gt;
So wird im ARM ABI&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;struct { unsigned i:1; }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
auf 4 Bytes aligned,&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;struct { unsigned char i:1; }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aber nicht.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cortex-M3&amp;diff=74689</id>
		<title>Cortex-M3</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cortex-M3&amp;diff=74689"/>
		<updated>2013-03-18T15:20:03Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Bit-Band-Aliasing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich fange mal mit der Seite zum [[ARM]] Cortex-M3 an.&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu anderen ARM-Architekturen: ==&lt;br /&gt;
&lt;br /&gt;
=== Statusregister ===&lt;br /&gt;
&lt;br /&gt;
; Anwendungsprogrammstatusregister (Application Program Status)&lt;br /&gt;
::{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;APSR&#039;&#039;&#039;&lt;br /&gt;
! Bit 31 || Bit 30 || Bit 29 || Bit 28 || Bit 27&lt;br /&gt;
|-&lt;br /&gt;
| Negative || Zero || Carry || Overflow || Saturation&lt;br /&gt;
|}&lt;br /&gt;
: Bits für bedingte Ausführung&lt;br /&gt;
:: &amp;lt;b&amp;gt;Negative&amp;lt;/b&amp;gt; Negatives Ergebnis bei letzter Operation&lt;br /&gt;
:: &amp;lt;b&amp;gt;Zero&amp;lt;/b&amp;gt; Nullergebnis bei letzter Operation &lt;br /&gt;
:: &amp;lt;b&amp;gt;Carry&amp;lt;/b&amp;gt; Übertrag bei letzter Operation &lt;br /&gt;
:: &amp;lt;b&amp;gt;Overflow&amp;lt;/b&amp;gt; Überlauf bei letzter Operation &lt;br /&gt;
: Andere Bits&lt;br /&gt;
:: &amp;lt;b&amp;gt;Saturation&amp;lt;/b&amp;gt; Anzeige eines Überlaufs oder Unterlaufs bei Befehlen mit Sättigung&lt;br /&gt;
&lt;br /&gt;
; Ausführungsstatusregister (Execution Status)&lt;br /&gt;
::{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;EPSR&#039;&#039;&#039;&lt;br /&gt;
! Bit 26 - Bit 25 || Bit 24 || Bit 15 - Bit 10&lt;br /&gt;
|-&lt;br /&gt;
| ICI/IT || Thumb  || ICI/IT&lt;br /&gt;
|}&lt;br /&gt;
: &amp;lt;b&amp;gt;ICI/IT&amp;lt;/b&amp;gt; Interner Zwischenspeicher für den Prozessor für Wiederaufnahme eines Multiplen Befehles nach einer Exception oder für Zwischenspeicherung des IT-Befehls&lt;br /&gt;
: &amp;lt;b&amp;gt;Thumb&amp;lt;/b&amp;gt; Thumbcode aktiv, im Falle des Cortex-M3 immer 1&lt;br /&gt;
&lt;br /&gt;
; Ausnahmenstatusregister (Interrupt Program Status)&lt;br /&gt;
::{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;IPSR&#039;&#039;&#039;&lt;br /&gt;
! Bit 8 - 0&lt;br /&gt;
|-&lt;br /&gt;
| Exception number&lt;br /&gt;
|}&lt;br /&gt;
: &amp;lt;b&amp;gt;Exceptionnumber&amp;lt;/b&amp;gt; Beinhaltet die Nummer der Unterbrechung die Auslöste (am sinnvollsten in einer Interrupt-Service-Routine nutzbar)&lt;br /&gt;
&lt;br /&gt;
Zugriff auf APSR und IPSR erhält der Programmierer durch den MRS/MSR-Befehl, abhängig von den aktuellen Privilegien.&lt;br /&gt;
EPSR-Zugriffe über MRS/MSR sind möglich, werden im Falle von ICI/IT ignoriert und bei ungesetztem T-Bit folgt eine UsageFault-Exception.&lt;br /&gt;
&lt;br /&gt;
=== Interrupte und Ausnahmen ===&lt;br /&gt;
&lt;br /&gt;
FIQs werden nicht mehr unterstützt.&lt;br /&gt;
&lt;br /&gt;
Der Cortex-M3 beinhaltet eine [[Interrupt]]verwaltung (Nested Vectored Interrupt Controler) ab Werk und räumt mit den unterschiedlichen Implementierungen unterschiedlicher Hersteller auf.&lt;br /&gt;
Die Interruptverwaltung ermöglicht eine priorisierte Verarbeitung von Interrupten.&lt;br /&gt;
Der Interruptcontroller stellt auch den Systemtick zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
==== Primäres Interruptbit ==== &lt;br /&gt;
&lt;br /&gt;
Die Primäres Interruptbit (PRIMASK) ist ein 1-Bit Register. Wenn es gesetzt ist werden nur NMI- und Hard-Fault-Ausnahmen einen Interrupt auslösen.&lt;br /&gt;
&lt;br /&gt;
==== Fehler-Interruptbit ====&lt;br /&gt;
&lt;br /&gt;
Die Fehler-Interruptbit (FAULTMASK) ist ebenfalls ein 1-Bit-Register. Wenn es gesetzt ist werden nur NMI-Ausnahmen einen Interrupt auslösen.&lt;br /&gt;
&lt;br /&gt;
==== Basispriorität ====&lt;br /&gt;
&lt;br /&gt;
Die Basispriorität (BASEPRI) ist bis zu 8 Bit breit und abhängig von den im Interrupt-Teil unterstützen Prioritäten. Alle Interrupt mit einer Priorität gleich oder kleiner der in BASEPRI eingestellten Priorität werden unterdrückt.&lt;br /&gt;
&lt;br /&gt;
Zugriff auf PRIMASK,FAULTMASK und BASEPRI erhält der Programmierer durch den MRS und MSR-Befehl, abhängig von den aktuellen Privilegien.&lt;br /&gt;
&lt;br /&gt;
==== Vektortabelle ====&lt;br /&gt;
&lt;br /&gt;
Die Vektortabelle beinhaltet echte Sprungadressen.&lt;br /&gt;
Die erste Adresse in der Sprungtabelle ist der Stackpointer, der bei einem Reset geladen wird.&lt;br /&gt;
Die zweite Adresse ist die Resetadresse.&lt;br /&gt;
&lt;br /&gt;
=== Control-Register ===&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;b&amp;gt;Bit 0&amp;lt;/b&amp;gt; Durch ein gesetztes Bit wird der Prozessor in Ausnahmen (Handle-Mode) im Privilegierten Modus laufen und außerhalb (Thread-Mode) im unprivilegierten Modus.&lt;br /&gt;
: &amp;lt;b&amp;gt;Bit 1&amp;lt;/b&amp;gt; Durch ein gesetztes Bit wird der Prozessor in Ausnahmen (Handle-Mode) Main Stack Pointer (MSP) benutzen und im unprivilegierten Modus den Program Stack Pointer (PSP). Andernfall benutzen beide Modis den Main Stack Pointer&lt;br /&gt;
&lt;br /&gt;
Nach einem Reset ist der Cortex-M3 im Privilegierten Modus&lt;br /&gt;
&lt;br /&gt;
=== Stack ===&lt;br /&gt;
&lt;br /&gt;
Es gibt keine Schattenregister für bestimmte Betriebsmodi mehr.&lt;br /&gt;
Der Prozessor führt bei einem Interrupt ein automatisches Sichern des PC (R15), LR (R14), R12 und R0-R3 durch,&lt;br /&gt;
welche nach dem Zurückspringen automatisch wieder vom [[Stack]] geholt werden.&lt;br /&gt;
Der Prozessor hat zwei Stackregister (MSP und PSP), welche in Abhängigkeit von den Control-Registern je nach Betriebsmodus (Privilegierter Modus oder UserMode) im Registerraum eingeblendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Befehlssatz ===&lt;br /&gt;
&lt;br /&gt;
Das Umschalten zwischen ARM-Codes und Thumb-Codes ist nicht möglich, es wird nur Thumb2 ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Es existieren Befehle für [[#Division|Division]] und [[#MAC-Opcodes|kombinierte Addition und Multiplikation]], [[#Sättigung|Befehle mit Sättigung]], [[#Bitreihenfolgenmanipulation|Befehle für Bitreihenfolgenmanipulation]], [[#IT-Opcode für Bedingte Ausführung|bedingte Ausführung]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IT-Opcode&#039;&#039;&#039; Als Ausgleich zu den fehlenden Bedingungsflags des ARM-Codes existiert der [[#IT-Opcode für Bedingte Ausführung|Opcode IT]] (If-True).&lt;br /&gt;
&lt;br /&gt;
=== Speicherbereich ===&lt;br /&gt;
&lt;br /&gt;
Der Adressbereich ist wie bei einem 32-Bit System üblich 4 GiB groß.&lt;br /&gt;
Aufgeteilt ist es in mehrere fest definierte Teile:&lt;br /&gt;
&lt;br /&gt;
::{| {{Tabelle}}&lt;br /&gt;
! Adressbereich || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 – 0x1FFFFFFF ||  Code-Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0x20000000 – 0x3FFFFFFF ||  SRAM-Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0x40000000 – 0x5FFFFFFF ||  Geräte-I/O-Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0x60000000 – 0x9FFFFFFF ||  Externer Speicher&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0000000 – 0xDFFFFFFF ||  Externe Geräte&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0000000 – 0xE00FFFFF ||  Interner und externer Geräte-Bus&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0100000 – 0xFFFFFFFF ||  Herstellerspezifischer Bereich&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit [[#Bit-Band-Aliasing|Bit-Band-Aliasing]] ist bitgenaue Speichermanipulation in bestimmten Speicherbereichen innerhalb eines Befehles möglich.&lt;br /&gt;
&lt;br /&gt;
== Genauere Erläuterungen: ==&lt;br /&gt;
&lt;br /&gt;
=== Befehle ===&lt;br /&gt;
&lt;br /&gt;
==== IT-Opcode für Bedingte Ausführung ====&lt;br /&gt;
&lt;br /&gt;
Diesem Opcode wird eine Bedingung (EQ, GT etc.) übergeben die für den ersten Befehl der folgt erfüllt sein muß.&lt;br /&gt;
Wenn die Bedingung nicht erfüllt ist, wird der Befehl übersprungen.&lt;br /&gt;
Ein IT-Block kann bis zu 4 Befehle beinhalten, wobei der erste Befehl der Kette immer wahr sein muß.&lt;br /&gt;
Die folgenden Befehle werden entsprechend der Angabe ihrer Bedingung, welche die Bedingung im IT-Befehl oder die gegenteilige Bedingung ist, ausgeführt oder übersprungen. &lt;br /&gt;
&lt;br /&gt;
 CMP     R0,R1   ;Vergleich mit Aktualisierung der Statusbits&lt;br /&gt;
 ITETE   LT      ;TRUE-ELSE-TRUE-ELSE LT&lt;br /&gt;
 MOV[LT] R2,R0   ;TRUE Bedingung R0 LT R1&lt;br /&gt;
 MOV[GE] R2,R1   ;ELSE Bedingung !(R0 LT R1)&lt;br /&gt;
 MOV[LT] R3,R0   ;TRUE Bedingung R0 LT R1&lt;br /&gt;
 MOV[GE] R3,R1   ;ELSE Bedingung !(R0 LT R1&lt;br /&gt;
&lt;br /&gt;
Die in eckigen Klammern angegebenen Bedingungen sind der Lesbarkeit halber angegeben.&lt;br /&gt;
Ein bedingter Sprung kann im IT-Block angegeben werden mit der Besonderheit, daß er am Ende des Blocks stehen muß.&lt;br /&gt;
&lt;br /&gt;
==== Division ====&lt;br /&gt;
&lt;br /&gt;
Es existieren zwei 32-Bit-Divisionsbefehle. Beide Befehle speichern keinen Rest und sind auf 32-Bit als Divident begrenzt.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;b&amp;gt;SDIV&amp;lt;/b&amp;gt; Division mit Vorzeichen&lt;br /&gt;
: &amp;lt;b&amp;gt;UDIV&amp;lt;/b&amp;gt; Division ohne Vorzeichen&lt;br /&gt;
&lt;br /&gt;
 SDIV/UDIV R0,R1,R2 führt zum Ergebnis in R0 aus der Division von R1 durch R2&lt;br /&gt;
&lt;br /&gt;
==== Bitreihenfolgenmanipulation ====&lt;br /&gt;
&lt;br /&gt;
Für Bitmanipulation stehen mehrere Befehle zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;b&amp;gt;REV&amp;lt;/b&amp;gt; Die Byte-Anordnung wird umgedreht und bietet Konvertierung von zwischen Big- und Little-Endian innerhalb eines Befehles.&lt;br /&gt;
: &amp;lt;b&amp;gt;REV16&amp;lt;/b&amp;gt; Wechselt die Byte-Anordnung im Oberen und Unteren Wort.&lt;br /&gt;
: &amp;lt;b&amp;gt;REVSH&amp;lt;/b&amp;gt; Konvertiert einen 16 Bit-Wert mit Byte-Anordnungswechsel und folgender Vorzeichenerweiterung in einen 32 Bit-Wert.&lt;br /&gt;
: &amp;lt;b&amp;gt;RBIT&amp;lt;/b&amp;gt; Dreht die Bit-Anordnung um.&lt;br /&gt;
: &amp;lt;b&amp;gt;BFC&amp;lt;/b&amp;gt; Löscht Bits ab einer Bit-Position über eine angegebene Länge.&lt;br /&gt;
: &amp;lt;b&amp;gt;BFI&amp;lt;/b&amp;gt; Kopiert in das Zielregister die Bits des Quellregister ab der angegebenen Bit-Position über die angegebene Länge.&lt;br /&gt;
: &amp;lt;b&amp;gt;SBFX&amp;lt;/b&amp;gt; Extrahiert die Bits ab einer angegebene Position über eine angegebene Länge in das Zielregister ab Bit 0 und erweitert es vorzeichenkorrekt.&lt;br /&gt;
: &amp;lt;b&amp;gt;UBFX&amp;lt;/b&amp;gt; Extrahiert die Bits ab einer angegebene Position über eine angegebene Länge in das Zielregister ab Bit 0 und setzt die andere Bits auf 0.&lt;br /&gt;
: &amp;lt;b&amp;gt;SXTB,SXTH&amp;lt;/b&amp;gt; Erweitert den Byte-Wert (SXTB) oder den Wort-Wert (SXTH) vorzeichenkorrekt auf 32 Bit. Optional kann vor der Korrektur ein ROR ausgeführt werden.&lt;br /&gt;
: &amp;lt;b&amp;gt;UXTB,UXTH&amp;lt;/b&amp;gt; Erweitert den Byte-Wert (SXTB) oder den Wort-Wert (SXTH) vorzeichenlos auf 32 Bit. Optional kann vor der Korrektur ein ROR ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== MAC-Opcodes ====&lt;br /&gt;
&lt;br /&gt;
Kombinierte Multiplikations und Additionsbefehle sind:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;b&amp;gt;MLA&amp;lt;/b&amp;gt; Vorzeichenlose Multiplikation zweier 32 Bit-Werte und Addition der unteren 32 Bit des Ergebnisses der Multiplikation mit einem 32-Bit-Wert.&lt;br /&gt;
: &amp;lt;b&amp;gt;MLS&amp;lt;/b&amp;gt; Vorzeichenlose Multiplikation zweier 32 Bit-Werte und Subtraktion eines 32-Bit-Wert von den unteren 32 Bit des Ergebnisses der Multiplikation. &lt;br /&gt;
: &amp;lt;b&amp;gt;SMLAL&amp;lt;/b&amp;gt; Vorzeichenbehaftete Multiplikation zweier 32 Bit-Werte zu 64 Bit und folgendes Addieren eines 64 Bit-Wertes.&lt;br /&gt;
: &amp;lt;b&amp;gt;UMLAL&amp;lt;/b&amp;gt; Vorzeichenlose Multiplikation zweier 32 Bit-Werte zu 64 Bit und folgendes Addieren eines 64 Bit-Wertes.&lt;br /&gt;
&lt;br /&gt;
==== Sättigung ====&lt;br /&gt;
&lt;br /&gt;
Zwei Befehle sind im Zusammenhang mit dem Q-Flag des APSR nutzbar:&lt;br /&gt;
&lt;br /&gt;
Übersteigt der Wert die Bitgrenze n wird der Maximalwert geliefert, Unterschreitet der Wert den Minimalwert wird der Minimalwert geliefert, andernfalls wird der Wert selbst geliefert.&lt;br /&gt;
Bei Überschreiten einer einer Grenze wird das Q-Flag gesetzt.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;b&amp;gt;SSAT&amp;lt;/b&amp;gt; Sättigungskorrektur mit Vorzeichenbehafteten Werten.&lt;br /&gt;
:: Die Bitgrenze n ist von 1 bis 32&lt;br /&gt;
:: Der Minimalwert ist - 2 ^ (n - 1)&lt;br /&gt;
:: Der Maximalwert ist ( 2 ^ (n - 1) ) - 1&lt;br /&gt;
: &amp;lt;b&amp;gt;USAT&amp;lt;/b&amp;gt; Sättigungskorrektur zu Vorzeichenlosen Werten.&lt;br /&gt;
:: Die Bitgrenze n ist von 0 bis 31&lt;br /&gt;
:: Der Minimalwert ist 0&lt;br /&gt;
:: Der Maximalwert ist ( 2 ^ n ) - 1&lt;br /&gt;
&lt;br /&gt;
Ein optionales Arithmetisches oder Logisches Verschieben nach Rechts vor dem Abarbeiten ist möglich.&lt;br /&gt;
&lt;br /&gt;
=== Speicherzugriff ===&lt;br /&gt;
&lt;br /&gt;
==== Bit-Band-Aliasing ====&lt;br /&gt;
&lt;br /&gt;
Der SRAM und der Gerätespeicher sind im für die ersten 32 MB als &#039;&#039;Bit-band-Alias&#039;&#039; definiert.&lt;br /&gt;
&lt;br /&gt;
Unter &#039;&#039;Bit-Band-Alias&#039;&#039; versteht man einen Speicherbereich, der einen bitgenauen Zugriff auf einen Speicherbereich innerhalb eines Befehles zuläßt.&lt;br /&gt;
So ist es möglich ohne Deaktivierung von Unterbrechungsanforderungen und in einem Befehl ein Bit zu lesen oder ein Bit zu setzen.&lt;br /&gt;
&lt;br /&gt;
z.B.&lt;br /&gt;
Der SRAM-Bereich von 0x20000000-0x200FFFFF kann durch 32-Bit-Zugriffe im Bereich von 0x22000000-0x23FFFFFF bitweise angesprochen werden:&lt;br /&gt;
&lt;br /&gt;
* 0x22000000 entspricht dem Bit 0 von 0x20000000&lt;br /&gt;
* 0x22000004 entspricht dem Bit 1&lt;br /&gt;
* 0x22000008 Bit 2&lt;br /&gt;
* 0x22000020 entspricht dem Bit 0 von 0x20000001&lt;br /&gt;
* usw.&lt;br /&gt;
 Bit-Band-Adresse = Bit-Band-Basis + (Byte-Offset × 32) + (Bit[0-7] × 4)&lt;br /&gt;
 0x22000020       =   0x22000000   +      1 × 32        +     0 × 4&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff zählt nur das unterste Bit im schreibenden und lesenden Zugriff.&lt;br /&gt;
&lt;br /&gt;
Ein Schreiben auf Adresse 0x22000008 mit einem Wert von 1 setzt das 2. Bit in 0x20000000 innerhalb eines Befehls und wird [[atomar]] ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Das Lesen von der Adresse 0x22000008 ergibt je nach Zustand des 2. Bits in 0x20000000 eine 1 oder eine 0 als Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Siehe [[ARM_Bitbanding]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Plattformunabh%C3%A4ngige_Programmierung_in_C&amp;diff=73100</id>
		<title>Diskussion:Plattformunabhängige Programmierung in C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Plattformunabh%C3%A4ngige_Programmierung_in_C&amp;diff=73100"/>
		<updated>2013-02-27T14:57:09Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Was noch fehlt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Was noch fehlt ==&lt;br /&gt;
&lt;br /&gt;
Bei einem Wettbewerbsartikel würde ich zumindest noch folgende Punkte erwarten:&lt;br /&gt;
&lt;br /&gt;
* Verweise auf die entsprechende Kausel im Standard, so dass jeder Interessierte es genau nachlesen kann.&lt;br /&gt;
* Bessere Recherche: &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; ist nicht notwendig signed, sondern kann auch unsigned sein. Dies überlässt der C-Standard der Implementierung (ABI etc.)&lt;br /&gt;
* &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt; wird erst mit C99 eingeführt&lt;br /&gt;
* Ebenso &amp;lt;tt&amp;gt;stdint.h&amp;lt;/tt&amp;gt; das zB &amp;lt;tt&amp;gt;uint8_t&amp;lt;/tt&amp;gt; definiert — und im Artikel noch nichtmal erwähnt wird. Ditto für &amp;lt;tt&amp;gt;inttypes.h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* signed und unsigned-Typen unterscheiden sich auch hinsichtlich des Überlaufverhaltens.&lt;br /&gt;
* −2&amp;lt;sup&amp;gt;&#039;&#039;n&#039;&#039;−1&amp;lt;/sup&amp;gt; als minimaler Wert für eine &#039;&#039;n&#039;&#039;-Bit signed-Variable wird vom Standard &#039;&#039; nicht&#039;&#039; zugesichert.  Ausnahmen sind zwar exotisch, sollten aber Erwähnung finden.&lt;br /&gt;
* Maximal- und Minimalwert erhält man z.B. per &amp;lt;tt&amp;gt;INT_MAX&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;INT8_MIN&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Wie sieht&#039;s mit portierbarer Ausgabe aus, etwa mit &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; et al.?&lt;br /&gt;
* Was ist bei der Portierung von Arithmetik zu beachten? Was kann &amp;lt;tt&amp;gt;stdint.h&amp;lt;/tt&amp;gt; leisten und was nicht? (Die Promotion-Rules werden z.B. &#039;&#039;nicht&#039;&#039; verändert).&lt;br /&gt;
* Was ist bei portabler Zeiger-Arithmetik zu beachten? Was ist mit &amp;lt;tt&amp;gt;sizeof (void*)&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;size_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;ptrdiff_t&amp;lt;/tt&amp;gt; etc.?&lt;br /&gt;
* Wie ist mit Literalen umzugehen, etwa in &amp;lt;tt&amp;gt;x = 1 &amp;lt;&amp;lt; y&amp;lt;/tt&amp;gt;? Welche Möglichkeiten gibt es? Was ist der Unterschied zwischen UINT32_C und einem Cast?&lt;br /&gt;
* Wie sieht es mit Berechnungen im Präprozessor aus, etwa &amp;lt;tt&amp;gt;#if X != 1 &amp;lt;&amp;lt; 16&amp;lt;/tt&amp;gt;. Ist das portierbar? Welchen natürlichen Typ haben die Präprozessor-Literale?&lt;br /&gt;
* Was ist beim Serialisieren / Deserialisieren zu beachten? Bit-, Byte- und Word-Endianess.&lt;br /&gt;
* Wie ist mit unterschiedlichen Alignments umzugehen. Wieder fällt einem Serialisieren / Deserialisieren und Zeiger-Arithmetik ein.&lt;br /&gt;
* Bei Portierbarkeit kann auch das Thema &amp;quot;Bitfelder&amp;quot; nicht ausgespart werden, ebenso verdienen andere Datentypen wie &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; zumindest Erwähnung.&lt;br /&gt;
* Was tun, wenn kein C99 verfügbar ist, wie bei Microsoft-Compilern nicht unüblich?&lt;br /&gt;
* Was ist Für und Wider? Entwicklungszeit, Fehleranfälligkeit, Effizienz des erzeugten Codes, Leserlichkeit des Codes, etc.&lt;br /&gt;
* Welche Teile eines Programmes können als nicht-portierbar angesehen werden? (ISRs, Ausgabe (LCD, UART), ...), wie ist damit umzugehen, und wie sieht die Integration in den portierbaren Teil aus?  Etwa in ein minimales Programm wie folgt, und zwar /ohne/ diese Quelle umzuschreiben und UART- oder LCD-Funktionen rein zu hacken?&lt;br /&gt;
           #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
           #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
           int main (void)&lt;br /&gt;
           {&lt;br /&gt;
              printf (&amp;quot;Hallo Welt!\n&amp;quot;);&lt;br /&gt;
                 &lt;br /&gt;
              return EXIT_SUCCESS; &lt;br /&gt;
           }&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Plattformunabh%C3%A4ngige_Programmierung_in_C&amp;diff=73099</id>
		<title>Diskussion:Plattformunabhängige Programmierung in C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Plattformunabh%C3%A4ngige_Programmierung_in_C&amp;diff=73099"/>
		<updated>2013-02-27T14:56:18Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Was noch fehlt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Was noch fehlt ==&lt;br /&gt;
&lt;br /&gt;
Bei einem Wettbewerbsartikel würde ich zumindest noch folgende Punkte erwarten:&lt;br /&gt;
&lt;br /&gt;
* Verweise auf die entsprechende Kausel im Standard, so dass jeder Interessierte es genau nachlesen kann.&lt;br /&gt;
* Bessere Recherche: &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; ist nicht notwendig signed, sondern kann auch unsigned sein. Dies überlässt der C-Standard der Implementierung (ABI etc.)&lt;br /&gt;
* &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt; wird erst mit C99 eingeführt&lt;br /&gt;
* Ebenso &amp;lt;tt&amp;gt;stdint.h&amp;lt;/tt&amp;gt; das zB &amp;lt;tt&amp;gt;uint8_t&amp;lt;/tt&amp;gt; definiert — und im Artikel noch nichtmal erwähnt wird. Ditto für &amp;lt;tt&amp;gt;inttypes.h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* signed und unsigned-Typen unterscheiden sich auch hinsichtlich des Überlaufverhaltens.&lt;br /&gt;
* −2&amp;lt;sup&amp;gt;&#039;&#039;n&#039;&#039;−1&amp;lt;/sup&amp;gt; als minimaler Wert für eine &#039;&#039;n&#039;&#039;-Bit signed-Variable wird vom Standard &#039;&#039; nicht&#039;&#039; zugesichert.  Ausnahmen sind zwar exotisch, sollten aber Erwähnung finden.&lt;br /&gt;
* Maximal- und Minimalwert erhält man z.B. per &amp;lt;tt&amp;gt;INT_MAX&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;INT8_MIN&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Wie sieht&#039;s mit portierbarer Ausgabe aus, etwa mit &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; et al.?&lt;br /&gt;
* Was ist bei der Portierung von Arithmetik zu beachten? Was kann &amp;lt;tt&amp;gt;stdint.h&amp;lt;/tt&amp;gt; leisten und was nicht? (Die Promotion-Rules werden z.B. &#039;&#039;nicht&#039;&#039; verändert).&lt;br /&gt;
* Was ist bei portabler Zeiger-Arithmetik zu beachten? Was ist mit &amp;lt;tt&amp;gt;sizeof (void*)&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;size_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;ptrdiff_t&amp;lt;/tt&amp;gt; etc.?&lt;br /&gt;
* Wie ist mit Literalen umzugehen, etwa in &amp;lt;tt&amp;gt;x = 1 &amp;lt;&amp;lt; y&amp;lt;/tt&amp;gt;? Welche Möglichkeiten gibt es? Was ist der Unterschied zwischen UINT32_C und einem Cast?&lt;br /&gt;
* Wie sieht es mit Berechnungen im Präprozessor aus, etwa &amp;lt;tt&amp;gt;#if X != 1 &amp;lt;&amp;lt; 16&amp;lt;/tt&amp;gt;. Ist das portierbar? Welchen natürlichen Typ haben die Präprozessor-Literale?&lt;br /&gt;
* Was ist beim Serialisieren / Deserialisieren zu beachten? Bit-, Byte- und Word-Endianess.&lt;br /&gt;
* Wie ist mit unterschiedlichen Alignments umzugehen. Wieder fällt einem Serialisieren / Deserialisieren und Zeiger-Arithmetik ein.&lt;br /&gt;
* Bei Portierbarkeit kann auch das Thema &amp;quot;Bitfelder&amp;quot; nicht ausgespart werden, ebenso verdienen andere Datentypen wie &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; zumindest Erwähnung.&lt;br /&gt;
* Was tun, wenn kein C99 verfügbar ist, wie bei Microsoft-Compilern nicht unüblich?&lt;br /&gt;
* Was ist Für und Wider? Entwicklungszeit, Fehleranfälligkeit, Effizienz des erzeugten Codes, Leserlichkeit des Codes, etc.&lt;br /&gt;
* Welche Teile eines Programmes können als nicht-portierbar angesehen werden? (ISRs, Ausgabe (LCD, UART), ...), wie ist damit umzugehen, und wie sieht die Integration in den portierbaren Teil aus?  Etwa in ein minimales Programm wie folgt, und zwar /ohne/ diese Quelle umzuschreiben und UART- oder LCD-Funktionen rein zu hacken?&lt;br /&gt;
           #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
           #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
           int main (void)&lt;br /&gt;
           {&lt;br /&gt;
              printf (&amp;quot;Hallo Welt!\n&amp;quot;);&lt;br /&gt;
                 &lt;br /&gt;
              return EXIT_SUCCESS; &lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: &amp;quot;long int&amp;quot; ist nicht zwingend ein 32-Bit Typ. Auf 64-Bit System ohne Microsoft-Aufkleber ist es meist 64-Bit breit (LLP64 vs LP64). --[[Benutzer:Prx|Prx]] 14:56, 27. Feb. 2013 (UTC)&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Lock-Free_Algorithmen&amp;diff=72205</id>
		<title>Diskussion:Lock-Free Algorithmen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Lock-Free_Algorithmen&amp;diff=72205"/>
		<updated>2013-02-09T19:31:15Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Da LL/SC schon drin steht würde Transactional Memory auch gut reinpassen, zumindest eine Erwähnung des Prinzips. Gibts ja demnächst von Intel in Haswell. Dazu siehe:&lt;br /&gt;
http://www.realworldtech.com/haswell-tm/&lt;br /&gt;
http://www.realworldtech.com/haswell-tm-alt/&lt;br /&gt;
--[[Benutzer:Prx|Prx]] 19:31, 9. Feb. 2013 (UTC)&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Lock-Free_Algorithmen&amp;diff=72204</id>
		<title>Diskussion:Lock-Free Algorithmen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Lock-Free_Algorithmen&amp;diff=72204"/>
		<updated>2013-02-09T19:30:58Z</updated>

		<summary type="html">&lt;p&gt;Prx: Die Seite wurde neu angelegt: „Da LL/SC schon drin steht würde Transactional Memory auch gut reinpassen, zumindest eine Erwähnung des Prinzips. Gibts ja demnächst von Intel in Haswell. Dazu …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Da LL/SC schon drin steht würde Transactional Memory auch gut reinpassen, zumindest eine Erwähnung des Prinzips. Gibts ja demnächst von Intel in Haswell. Dazu siehe:&lt;br /&gt;
http://www.realworldtech.com/haswell-tm/&lt;br /&gt;
http://www.realworldtech.com/haswell-tm-alt/&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=72055</id>
		<title>ARM Cortex Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=72055"/>
		<updated>2013-02-08T08:09:36Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* ARM Cortex M0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Firma ARM stellt selbst keine Prozessoren/Controller her, sondern entwickelt nur sogenannte &amp;quot;IP-Cores&amp;quot;, die von Herstellern wie Atmel, Infineon, NXP, TI und vielen anderen lizenziert werden. Diese Hersteller ergänzen den Core um Speicher und Peripherie. Der Vorteil dieses Modells ist, dass dadurch sehr viele Prozessoren mit unterschiedlichster Ausstattung verfügbar sind, die alle mit dem selben Befehlssatz (und damit dem selben Compiler) programmierbar sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In diesem Artikel geht es NUR um die ARM Cortex-M Microcontroller, nicht jedoch um ARM [https://www.mikrocontroller.net/articles/Cortex-A Cortex-A] Prozessoren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Befehlssatz ===&lt;br /&gt;
Allen ARM-Cores gemeinsam ist die 32 Bit RISC-Architektur. Manche ARM-Cores besitzen neben dem 32 Bit ARM-Befehlssatz noch einen zusätzlichen, kleineren 16 Bit-Befehlssatz (&#039;&#039;&#039;Thumb&#039;&#039;&#039;-Modus, erkennbar am &#039;&#039;&#039;T&#039;&#039;&#039; in der Bezeichnung, z.&amp;amp;nbsp;B. ARM7&#039;&#039;&#039;T&#039;&#039;&#039;DMI). Der Vorteil des Thumb-Befehlssatzes ist der geringere Platzbedarf des Codes; der Nachteil ist die etwas niedrigere Geschwindigkeit. Die ARMv7M-Architektur (man beachtet das &#039;&#039;&#039;v&#039;&#039;&#039;), also z.&amp;amp;nbsp;B. Controller mit Cortex-M3-Kern, unterstützen ausschließlich den Thumb2-Befehlssatz.&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M ==&lt;br /&gt;
&lt;br /&gt;
Seit wenigen Jahren sind ARM-basierte Mikrocontroller erhältlich, die Aufgrund der vergleichbar einfachen Beschaltung und mit einer &#039;&#039;&#039;deutlich&#039;&#039;&#039; größeren Power eine echte Alternative zu 8-Bit-Controllern darstellen. &lt;br /&gt;
&lt;br /&gt;
Es gibt folgende Varianten dieses Mikrocontroller &amp;quot;Kerns&amp;quot;,&lt;br /&gt;
aufgeführt vom Energieeffizientesten zum Leistungsfähigsten:&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M0 ===&lt;br /&gt;
Als günstigere Variante gibt es die Cortex-M0 Cores mit deutlich kleinerem Befehlssatz, wie z.B. den &#039;&#039;&#039;[[LPC1xxx]]&#039;&#039;&#039;. Diese&lt;br /&gt;
werden beispielsweise in folgenden Controllern eingesetzt:&lt;br /&gt;
&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1588.jsp?WT.ac=fp_may12_stm32f0 STM32F0] von [http://www.st.com STMicro], [https://www.mikrocontroller.net/articles/STM32 &#039;&#039;&#039;interne Seite über STM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://ics.nxp.com/products/lpc1000/lpc11xx/ LPC11xx] von [http://www.nxp.com NXP], [https://www.mikrocontroller.net/articles/LPC1xxx&#039;&#039;&#039;interne Seite über LPC1xxx&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.infineon.com/XMC1000 XMC1000] von [http://www.infineon.com Infineon], [http://www.mikrocontroller.net/articles/XMCxxxx &#039;&#039;&#039;interne Seite über XMCxxxx&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.nuvoton.com/hq/enu/ProductAndSales/ProductLines/IndustrialIC/ARMMicrocontroller/ARMCortexTMM0/Pages/default.aspx NuMicro-Controller] von nuvoton (ex Winbond), laut Datenblatt mit 2.5-5.5V Betriebssspannung!!!&lt;br /&gt;
Für die M0-Familie ist für den LPC1xxx bereits eine &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx#Allgemeine_Informationen_zum_Aufbau_der_Code_Base Code-Base]&#039;&#039;&#039;  und ein preisgünstiges &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso&amp;amp;action=edit Entwicklungskit]&#039;&#039;&#039; vorhanden.&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M0+ ===&lt;br /&gt;
Inzwischen gibt es auch eine optimierte Version des Cortex-M0 - die Cortex-M0+ Cores. Diese können (optional) einige Features der Cortex-M3 Serie beeinhalten, wie z.B eine MPU:&lt;br /&gt;
&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-zero-gecko-microcontroller-family EFM32 Zero Gecko] von [http://www.energymicro.com Energy Micro], [https://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;interne Seite über EFM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers/cortex_m0plus/lpc800/ LPC8xx] von [http://www.nxp.com NXP]&lt;br /&gt;
* [http://www.freescale.com/webapp/sps/site/taxonomy.jsp?code=KINETIS_L_SERIES Kinetis L-Serie] und [http://www.freescale.com/webapp/sps/site/taxonomy.jsp?code=KINETIS_M_SERIES Kinetis M-Serie] von [http://www.freescale.com/ Freescale]&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M3 ===&lt;br /&gt;
Eine sehr aktuelle Variante des ARM ist die Cortex-M3 Familie die &#039;&#039;&#039;[[LPC1xxx]]&#039;&#039;&#039;, als eine echte Konkurrenz zu 8- und 16-Bit Mikrocontrollern wie dem [[AVR]] und [[MSP430]] gedacht ist. Der Cortex-M3 enthält einige Verbesserungen gegenüber dem ARM7TDMI-Kern und ist bereits dabei diesen zu ersetzen. &lt;br /&gt;
Controllerfamilien dieser Klasse sind:&lt;br /&gt;
&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-tiny-gecko-microcontroller-family EFM32 Tiny Gecko],[http://www.energymicro.com/products/efm32-gecko-microcontroller-family EFM32 Gecko] sowie [http://www.energymicro.com/products/efm32-leopard-gecko-microcontroller-family EFM32 Leopard Gecko] von Energy Micro , [https://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;interne Seite über EFM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.nxp.com LPC13xx/LPC17xx/LPC18xx] von NXP oder die inzwischen schon sehr ausführliche, [http://www.mikrocontroller.net/articles/LPC1xxx &#039;&#039;&#039;interne Seite zur Cortex-M3 Familie&#039;&#039;&#039; von LPC]&lt;br /&gt;
* [http://focus.ti.com/general/docs/gencontent.tsp?contentId=54556&amp;amp;DCMP=Luminary&amp;amp;HQS=Other+OT+stellaris Stellaris-Serie] von [http://www.ti.com Texas Instruments] (vormals Luminary Micro)&lt;br /&gt;
* [http://www.atmel.com/products/at91/sam3landing.asp?family_id=605 AT91SAM3] von Atmel&lt;br /&gt;
* [http://www.st.com/internet/mcu/family/141.jsp STM32] Baureihen [http://www.st.com/internet/mcu/subclass/1169.jsp F1]/[http://www.st.com/internet/mcu/subclass/1520.jsp F2]/[http://www.st.com/internet/mcu/subclass/1376.jsp L1]/[http://www.st.com/internet/mcu/subclass/1377.jsp W] von STMicroelectronics , [https://www.mikrocontroller.net/articles/STM32 &#039;&#039;&#039;interne Seite über STM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.toshiba-components.com/microcontroller/TMPM330.html TMPM330] von Toshiba&lt;br /&gt;
* [http://www.fujitsu.com/global/services/microelectronics/product/micom/roadmap/industrial/fm3/ FM3-Serie] von Fujitsu&lt;br /&gt;
* [http://www.infineon.com/XMC4000 XMC4000] von Infineon&lt;br /&gt;
* [https://www.silabs.com/products/mcu/Pages/ARM-32bit-microcontroller.aspx SiM3U1xx] von Silabs&lt;br /&gt;
* [http://www.holtek.com.tw/english/products/32bit_flashmcu.htm HT32] von Holtek Semiconductor&lt;br /&gt;
&lt;br /&gt;
Für den LPC1xxx bereits eine &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx#Allgemeine_Informationen_zum_Aufbau_der_Code_Base Code-Base]&#039;&#039;&#039;  und ein preisgünstiges &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso&amp;amp;action=edit Entwicklungskit]&#039;&#039;&#039; vorhanden.&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M4 ===&lt;br /&gt;
Als hoch performante Variante gibt es dann noch die Cortex-M4 Cores welche teilweise mit einer FPU ausgestattet sind. &lt;br /&gt;
&lt;br /&gt;
Diese werden beispielsweise in folgenden Controllern eingesetzt:&lt;br /&gt;
&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-wonder-gecko-microcontroller-family EFM32-Wonder Gecko] von Energy Micro, [https://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;interne Seite über EFM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.nxp.com LPC43xx] von NXP (Dual Core)&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3] von [http://www.st.com STMicro], [https://www.mikrocontroller.net/articles/STM32 &#039;&#039;&#039;interne Seite über STM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1521.jsp?WT.ac=p2_bn_jun12_stm32f4series STM32F4] von [http://www.st.com STMicro], [https://www.mikrocontroller.net/articles/STM32 &#039;&#039;&#039;interne Seite über STM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/arm_stellaris/m4f_series/products.page LM4F] von [http://www.ti.com Texas Instruments]&lt;br /&gt;
* [http://www.infineon.com/XMC4000 XMC4000] von [http://www.infineon.com Infineon], [http://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;interne Seite über XMCxxxx&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
== ARM7 ==&lt;br /&gt;
Eine schon etwas ältere Controller-Familie ist der &#039;&#039;&#039;ARM7&#039;&#039;&#039;TDMI.  Core. Controllerfamilien dieser Klasse sind:&lt;br /&gt;
* NXP (ehemals Philips) [[LPC2000]] &lt;br /&gt;
* Atmel [[AT91SAM]]7&lt;br /&gt;
* Analog Devices [[ADuC7xxx]]&lt;br /&gt;
* [http://focus.ti.com/mcu/docs/mcuprodoverview.tsp?sectionId=95&amp;amp;tabId=203&amp;amp;familyId=454 Texas Instruments TMS470]&lt;br /&gt;
* SAMSUNG S3C24x0 [http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=229&amp;amp;partnum=S3C2410]&lt;br /&gt;
* STR7xx von ST Microelectronics [http://www.st.com/mcu/inchtml-pages-str7.html]&lt;br /&gt;
* und viele weitere&lt;br /&gt;
&lt;br /&gt;
Mehr Informationen zur ARM-Architektur finden sich in der [http://de.wikipedia.org/wiki/ARM-Architektur Wikipedia], weiterführende Links in der [[Linksammlung#ARM|Linksammlung]].&lt;br /&gt;
&lt;br /&gt;
== Compiler ==&lt;br /&gt;
&lt;br /&gt;
=== GCC ===&lt;br /&gt;
&lt;br /&gt;
Einer der beliebtesten Compiler für ARM-Prozessoren ist der GCC. Er kann sowohl ARM- als auch Thumb-Code erzeugen. Eine unvollständige Liste einiger Distributionen folgt: &lt;br /&gt;
&lt;br /&gt;
==== Fertige GCC Binaries für Windows: ====&lt;br /&gt;
- [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#winarm WinARM] (wird derzeit nicht gepflegt)&lt;br /&gt;
&lt;br /&gt;
- [http://gnuarm.com/ GNUARM] (Linux, Windows, wird derzeit nicht gepflegt), &lt;br /&gt;
&lt;br /&gt;
- [http://www.yagarto.de/ Yagarto] (Windows, mit Eclipse-Integration), &lt;br /&gt;
&lt;br /&gt;
- [http://www.codesourcery.com/gnu_toolchains/arm CodeSourcery CodeBench Lite] &lt;br /&gt;
&lt;br /&gt;
- [https://launchpad.net/gcc-arm-embedded GNU Tools for ARM Embedded Processors] (bereitgestellt von ARM selbst auf launchpad.net).&lt;br /&gt;
&lt;br /&gt;
==== Fertige GCC Binaries für Linux (und MacOS X): ====&lt;br /&gt;
- [[ARM GCC toolchain for Linux and Mac OS X]]&lt;br /&gt;
&lt;br /&gt;
- [http://gnuarm.com/ GNUARM] (Linux, Windows, wird derzeit nicht gepflegt)&lt;br /&gt;
&lt;br /&gt;
- [http://www.codesourcery.com/gnu_toolchains/arm CodeSourcery CodeBench Lite] (alter Name: Codesourcery G++ lite, für Linux, Windows)&lt;br /&gt;
&lt;br /&gt;
- [https://launchpad.net/gcc-arm-embedded GNU Tools for ARM Embedded Processors] (bereitgestellt von ARM selbst auf launchpad.net).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Auswahl der Toolchain sollte beachtet werden, dass es größere Unterschiede bei den bereitgestellten C-Bibliotheken gibt. Die Sourcery Codebench Lite-Edition stellt z.B. keine Bibliotheken mit FPU-Unterstützung bereit, so dass trotz vorhandener FPU beim Cortex-M4 nur suboptimaler Code erzegt werden kann. Siehe [http://wiki.debian.org/ArmHardFloatPort/VfpComparison] für ein kleines Beispiel und eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
Die im Netz häufig anzutreffende summon-arm Toolchain hat einen der seltenen Compiler-Bugs [http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg353473.html] und sollte daher nicht verwendet werden, wenn man floatingpoint-Typen einsetzen möchte. Egal ob mit oder ohne FPU.&lt;br /&gt;
&lt;br /&gt;
Beim Einsatz des gcc in Verbindung mit in C geschriebenem startup-Code bei den Optimierungslevels &amp;quot;-O2&amp;quot; und &amp;quot;-O3&amp;quot; muss zusätzlich &amp;quot;-fno-gcse&amp;quot; gesetzt werden, da ansonsten die von der CPU benötigte NVIC-Tabelle(n) und zugehörige Funktionen u.U. nicht so aussehen wie sie sollten.&lt;br /&gt;
&lt;br /&gt;
=== IDEs ===&lt;br /&gt;
&lt;br /&gt;
Kostenlose Entwicklungsumgebungen:&lt;br /&gt;
* [http://www.coocox.org/CooCox_CoIDE.htm CooCox IDE (Eclipse basierend]&lt;br /&gt;
* Für das MBED Board (mbed NXP LPC1768) ist ein kostenloser Onlinecompiler verfügbar (ARM Realview), der sich durch die Bereitstellung von sehr leistungsfähigen Funktionen (API&#039;s) auszeichnet. Den praktischen Nutzen für eine professionelle Anwendung mag man zu Recht in Frage stellen. Um mal schnell was zu programmieren ist das Ding unschlagbar, es ist faktisch keine Installation oder Einarbeitung in eine IDE nötig.&lt;br /&gt;
* emIDE [http://emide.org]&lt;br /&gt;
&lt;br /&gt;
Kommerzielle Entwicklungsumgebungen (zum Teil kostenlos mit Einschränkungen) für ARM-basierte Mikrocontroller sind z.&amp;amp;nbsp;B. :&lt;br /&gt;
*[http://www.code-red-tech.com/red-suite-4-nxp.php Code-Red (Eclipse basierend)]&lt;br /&gt;
*[http://rowley.co.uk/arm/ Crossworks ARM] (GCC-basiert, Windows, Mac OS und Linux)&lt;br /&gt;
* [http://www.cosmicsoftware.com/download_cortex_64k.php Cosmic Software] 64k free (Windows)&lt;br /&gt;
* [http://www.iar.com/ewarm/ IAR Embedded Workbench for ARM] (Windows)&lt;br /&gt;
* [http://www.keil.com/arm/ MDK-ARM von Keil/ARM] (Windows).&lt;br /&gt;
&lt;br /&gt;
== JTAG/SWD ==&lt;br /&gt;
&lt;br /&gt;
Alle ARM-basierten Prozessoren verwenden ein einheitliches [[JTAG]]-Interface, über das Debugging und Speicherzugriff erfolgen kann. Nicht standardisiert sind allerdings die Verfahren zum Beschreiben des Flash-ROMs, deshalb muss man beachten ob die verwendete JTAG-Software Programmierroutinen für den jeweiligen Controller besitzt.&lt;br /&gt;
&lt;br /&gt;
Es gibt Mikrocontroller (z.B. [[EFM32]] von [https://www.energymicro.com Energy Micro]) welche NUR über SWD (Serial Wire Debugg) programmiert werden können.&lt;br /&gt;
&lt;br /&gt;
=== Günstige Beispiele zum Starten ===&lt;br /&gt;
Ein einfacher JTAG-Adapter für den Parallelport ist der &amp;quot;Wiggler&amp;quot;-kompatible, den man selbst bauen kann oder z.&amp;amp;nbsp;B. im [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=48 Embedded Projects Shop] für &amp;amp;euro; 10,00 bestellen kann. Als Software lässt sich unter Windows und Linux [http://openocd.berlios.de/ OpenOCD] (zusammen mit [[GDB]]) oder [http://rowley.co.uk Crossworks ARM] verwenden. &lt;br /&gt;
&lt;br /&gt;
Für USB gibt es [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=436 hier] einen ebenfalls OpenOCD-kompatiblen JTAG-Adapter zum Preis von ca 45€.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind &amp;lt;u&amp;gt;sehr preiswerte&amp;lt;/u&amp;gt; Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG Programmer und Debugger) erhältlich z.B. &#039;&#039;&#039;[http://www.watterott.com/index.php?page=search&amp;amp;keywords=LPCXpresso&amp;amp;cat=&amp;amp;mnf=&amp;amp;x=0&amp;amp;y=0 Watterott]&#039;&#039;&#039;. Siehe dazu auch die Dokumentation von NXP zu den &#039;&#039;&#039;[http://www.nxp.com/documents/leaflet/75016842.pdf LPCXpresso-Entwicklungskits]&#039;&#039;&#039; (PDF), oder diese &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso Beschreibung]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von ST gibt es günstige Entwicklungskits (ca. 20€), mit integriertem ST-Link (Debugger). Zum Beispiel das [http://www.st.com/stm32f4-discovery STM32F4 Discovery Board] welches z.B. bei [http://thinkembedded.ch/ARM/STM32F4-DISCOVERY-Single-Board::153.html Thinkembedded] erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Von Energymicro gibt es [http://www.energymicro.com/tools/efm32-starter-kits Starter Kits] mit integriertem J-Link (Debugger) ab ca. 50 € z.B. das [http://www.energymicro.com/tools/efm32-tiny-gecko-starter-kit EFM32 Tiny Gecko Starter Kit] bei [http://de.mouser.com/ProductDetail/Energy-Micro/EFM32-TG-STK3300/?Energy-Micro/EFM32-TG-STK3300/&amp;amp;qs=sGAEpiMZZMvFPGEOwQcrYyZeaSbmjQvRx7NKUweLQtQ= Mouser]&lt;br /&gt;
&lt;br /&gt;
Der [http://www.segger.com/cms/jlink.html J-Link]-&amp;quot;Emulator&amp;quot; von Segger wird von vielen Softwarepaketen unterstützt und ist für den nicht-kommerziellen Einsatz zu günstigen Konditionen erhältlich (J-Link-Edu).&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Beschreiben des Flash über JTAG ist oft ein serieller [[Bootloader]] im Controller enthalten.&lt;br /&gt;
&lt;br /&gt;
== CMSIS - ARM Cortex Software Libaries  ==&lt;br /&gt;
&lt;br /&gt;
CMSIS - Cortex Microcontroller Software Interface Standard&lt;br /&gt;
 &lt;br /&gt;
Der ARM Cortex Microcontroller Software Interface Standard (CMSIS) ist ein herstellerunabhängiger Hardware Abstraction Layer für die Cortex-M-Prozessor -Serie. Die CMSIS ermöglicht konsistente und einfache Software-Schnittstellen für den Prozessor und die Peripherie, und vereinfacht damit die Software-Wiederverwendung. &lt;br /&gt;
&lt;br /&gt;
Die CMSIS besteht aus folgenden Komponenten:&lt;br /&gt;
&lt;br /&gt;
* CMSIS-CORE: Bietet eine Schnittstelle zum Cortex-M0, Cortex-M3, Cortex-M4, SC000 und SC300-Prozessoren und Peripherie-Register&lt;br /&gt;
* CMSIS-DSP: DSP-Bibliothek mit über 60 Funktionen in Festkomma-(fractional q7, q15, q31) und single precision floating-point (32-bit)-Implementierung&lt;br /&gt;
* CMSIS-RTOS API: Standardisierte Programmierschnittstelle für Echtzeit-Betriebssysteme für Thread-Steuerung, Ressourcen-und Zeitmanagement&lt;br /&gt;
* CMSIS-SVD: System View Beschreibung -  XML-Dateien, die die Programmiereransicht des kompletten Mikrocontroller-Systems einschließlich Peripheriegeräte enthalten&lt;br /&gt;
&lt;br /&gt;
Der Standard ist für Cortex-M-Mikrocontroller skalierbar: Von der  kleinsten 4 KB MCU bis zu MCUs mit anspruchsvoller Kommunikations-Peripherie wie Ethernet oder USB. Der Speicherbedarf für die Core Peripheral Funktionen bedarf weniger als 1 KB-Code und weniger als 10 Bytes RAM.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* Software Beispiele von [http://www.energymicro.com/downloads/application-notes Energy Micro] basierend auf CMSIS&lt;br /&gt;
&lt;br /&gt;
Mehr Informationen unter:&lt;br /&gt;
&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php ARM CMSIS Webseite]&lt;br /&gt;
&lt;br /&gt;
== Freie Software ==&lt;br /&gt;
&lt;br /&gt;
=== ARM/XSCALE/CORTEX Instruction Set Simulator ===&lt;br /&gt;
&lt;br /&gt;
Die Firma Lauterbach bietet unter der Artikelnummer LA-8809 einen Instruction Set Simulator für ARM Cores an. Die Demoversion ist zur Evaluierung kostenlos. Einschränkungen bestehen in der Anzahl der zu ladenen Debugsymbole. Der Simulator unterstützt alle gängigen ARM Derivate und lädt alle üblichen Debugformate, wie die des RealView,  IAR und TI Compilers, oder der freien GCC Tools.&lt;br /&gt;
&lt;br /&gt;
Zum Simulator gibt es entsprechende zugehörige Debugtools, die allerdings käuflich zu erwerben sind.&lt;br /&gt;
&lt;br /&gt;
Weblinks: &lt;br /&gt;
[[http://www.lauterbach.com/frames.html?dwnload.html Download area mit ARM/XSCALE/CORTEX Simulator]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Linksammlung#ARM|Linksammlung (Abschnitt ARM)]]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/LPC1xxx Beschreibung der LPC1xxx-Familie]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/LPC1xxx_Entwicklungskit_LPCXpresso LPCXpresso-Entwicklungskit]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung zur IDE von Code-Red]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx LPC1xxx Codebase]&lt;br /&gt;
* [[ARM-elf-GCC-Tutorial]]&lt;br /&gt;
* [[AVR32]]&lt;br /&gt;
* [[Blackfin]]&lt;br /&gt;
* [[AT91SAM9260]]&lt;br /&gt;
* [[STM32]]&lt;br /&gt;
* [[JTAG]]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/EFM32 EFM32]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://embdev.net/forum/arm-gcc ARM-GCC Forum] im englischsprachigen &amp;quot;Ableger&amp;quot; von microcontroller.net embdev.net u.a. für WinARM, Yagarto, CS Codebench&lt;br /&gt;
* [http://infocenter.arm.com/help/index.jsp Infocenter von ARM Ltd.]&lt;br /&gt;
* [http://www.open-research.org.uk/ARMuC/ ARMuC ARM microcontroller Wiki]&lt;br /&gt;
* [http://chaosradio.ccc.de/cre151.html Chaosradio Express - Die ARM-Architektur]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
*ARM Systems Developer&#039;s Guide (2004) ISBN 1558608745 [http://books.google.de/books?id=HKKUkDQE17QC&amp;amp;output=html Im Buch blättern] [http://www.mkp.com/companions/defaultindividual.asp?isbn=9781558608740 Programmbeispiele aus dem Buch, u.a. FFT, FIR/IIR-Filter, Division, Wurzel]&lt;br /&gt;
*ARM Assembly Language - an Introduction (2007) ISBN 1847536964 [http://books.google.de/books?id=8KJX5R8mMvsC&amp;amp;output=html Im Buch blättern]   [http://www.lulu.com/content/1172076 Verlagsseite &amp;quot;Book on demand&amp;quot;]&lt;br /&gt;
*ARM Rechnerarchitekturen für System-on-Chip-Design (2002) ISBN 3826608542&lt;br /&gt;
*Co-Verification of Hardware and Software for Arm Soc Design (2004) ISBN 0750677309&lt;br /&gt;
*ARM System-on-Chip Architecture (2000) ISBN 0201675196 [http://books.google.de/books?id=J_Fu_YTVD9gC&amp;amp;printsec=frontcover&amp;amp;output=html&amp;amp;source=gbs_summary_r&amp;amp;cad=0 Im Buch blättern]&lt;br /&gt;
*ARM Architecture Reference Manual ISBN 0201737191 [http://books.google.de/books?id=O5G-6WX1xWsC&amp;amp;printsec=frontcover&amp;amp;output=html&amp;amp;source=gbs_summary_r&amp;amp;cad=0 Im Buch blättern]&lt;br /&gt;
*Messen, Steuern und Regeln mit ARM-Mikrocontrollern ISBN 3772340172 [http://books.google.de/books?id=TKs4kN-zNYQC&amp;amp;output=html im Buch blättern]&lt;br /&gt;
*Programming Arm Microcontrollers: Using C and the Lpc2100 Family (2005? /ab 1. Dezember 2008) ISBN 0321263359&lt;br /&gt;
*Arm Assembly: Fundamentals and Techniques (ab 1. März 2009) ISBN 1439806101&lt;br /&gt;
*Reliable Embedded Systems: Using 8051 and ARM Microcontrollers (2007) ISBN 0321252918 600 Seiten mit CD [http://vig.pearsoned.co.uk/catalog/academic/product/0,1144,0321252918-TOC,00.html Inhaltsverzeichnis]&lt;br /&gt;
* C und C++ für Embedded Systems (u.a. ARM Cortex-M3) mitp-Verlag 2008 ISBN 382665949X&lt;br /&gt;
* The Definitive Guide to the Arm Cortex-M0 (Joseph Yiu) Newnes Verlag ISBN 0123854776&lt;br /&gt;
* The Definitive Guide to the Arm Cortex-M3 (Joseph Yiu) Newnes Verlag ISBN 185617963X&lt;br /&gt;
&lt;br /&gt;
== Artikel aus der Kategorie ARM ==&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;ARM&amp;lt;/ncl&amp;gt;&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;EFM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;XMCxxxx&#039;&#039;&#039;]&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Cortex-A ARM Cortex A]&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM| ]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=72054</id>
		<title>ARM Cortex Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=72054"/>
		<updated>2013-02-08T08:07:12Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Firma ARM stellt selbst keine Prozessoren/Controller her, sondern entwickelt nur sogenannte &amp;quot;IP-Cores&amp;quot;, die von Herstellern wie Atmel, Infineon, NXP, TI und vielen anderen lizenziert werden. Diese Hersteller ergänzen den Core um Speicher und Peripherie. Der Vorteil dieses Modells ist, dass dadurch sehr viele Prozessoren mit unterschiedlichster Ausstattung verfügbar sind, die alle mit dem selben Befehlssatz (und damit dem selben Compiler) programmierbar sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In diesem Artikel geht es NUR um die ARM Cortex-M Microcontroller, nicht jedoch um ARM [https://www.mikrocontroller.net/articles/Cortex-A Cortex-A] Prozessoren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Befehlssatz ===&lt;br /&gt;
Allen ARM-Cores gemeinsam ist die 32 Bit RISC-Architektur. Manche ARM-Cores besitzen neben dem 32 Bit ARM-Befehlssatz noch einen zusätzlichen, kleineren 16 Bit-Befehlssatz (&#039;&#039;&#039;Thumb&#039;&#039;&#039;-Modus, erkennbar am &#039;&#039;&#039;T&#039;&#039;&#039; in der Bezeichnung, z.&amp;amp;nbsp;B. ARM7&#039;&#039;&#039;T&#039;&#039;&#039;DMI). Der Vorteil des Thumb-Befehlssatzes ist der geringere Platzbedarf des Codes; der Nachteil ist die etwas niedrigere Geschwindigkeit. Die ARMv7M-Architektur (man beachtet das &#039;&#039;&#039;v&#039;&#039;&#039;), also z.&amp;amp;nbsp;B. Controller mit Cortex-M3-Kern, unterstützen ausschließlich den Thumb2-Befehlssatz.&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M ==&lt;br /&gt;
&lt;br /&gt;
Seit wenigen Jahren sind ARM-basierte Mikrocontroller erhältlich, die Aufgrund der vergleichbar einfachen Beschaltung und mit einer &#039;&#039;&#039;deutlich&#039;&#039;&#039; größeren Power eine echte Alternative zu 8-Bit-Controllern darstellen. &lt;br /&gt;
&lt;br /&gt;
Es gibt folgende Varianten dieses Mikrocontroller &amp;quot;Kerns&amp;quot;,&lt;br /&gt;
aufgeführt vom Energieeffizientesten zum Leistungsfähigsten:&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M0 ===&lt;br /&gt;
Als günstigere Variante gibt es dann noch die Cortex-M0 Cores, wie z.B. den &#039;&#039;&#039;[[LPC1xxx]]&#039;&#039;&#039;. Diese&lt;br /&gt;
werden beispielsweise in folgenden Controllern eingesetzt:&lt;br /&gt;
&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1588.jsp?WT.ac=fp_may12_stm32f0 STM32F0] von [http://www.st.com STMicro], [https://www.mikrocontroller.net/articles/STM32 &#039;&#039;&#039;interne Seite über STM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://ics.nxp.com/products/lpc1000/lpc11xx/ LPC11xx] von [http://www.nxp.com NXP], [https://www.mikrocontroller.net/articles/LPC1xxx&#039;&#039;&#039;interne Seite über LPC1xxx&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.infineon.com/XMC1000 XMC1000] von [http://www.infineon.com Infineon], [http://www.mikrocontroller.net/articles/XMCxxxx &#039;&#039;&#039;interne Seite über XMCxxxx&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.nuvoton.com/hq/enu/ProductAndSales/ProductLines/IndustrialIC/ARMMicrocontroller/ARMCortexTMM0/Pages/default.aspx NuMicro-Controller] von nuvoton (ex Winbond), laut Datenblatt mit 2.5-5.5V Betriebssspannung!!!&lt;br /&gt;
Für die M0-Familie ist für den LPC1xxx bereits eine &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx#Allgemeine_Informationen_zum_Aufbau_der_Code_Base Code-Base]&#039;&#039;&#039;  und ein preisgünstiges &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso&amp;amp;action=edit Entwicklungskit]&#039;&#039;&#039; vorhanden.&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M0+ ===&lt;br /&gt;
Inzwischen gibt es auch eine optimierte Version des Cortex-M0 - die Cortex-M0+ Cores. Diese können (optional) einige Features der Cortex-M3 Serie beeinhalten, wie z.B eine MPU:&lt;br /&gt;
&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-zero-gecko-microcontroller-family EFM32 Zero Gecko] von [http://www.energymicro.com Energy Micro], [https://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;interne Seite über EFM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers/cortex_m0plus/lpc800/ LPC8xx] von [http://www.nxp.com NXP]&lt;br /&gt;
* [http://www.freescale.com/webapp/sps/site/taxonomy.jsp?code=KINETIS_L_SERIES Kinetis L-Serie] und [http://www.freescale.com/webapp/sps/site/taxonomy.jsp?code=KINETIS_M_SERIES Kinetis M-Serie] von [http://www.freescale.com/ Freescale]&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M3 ===&lt;br /&gt;
Eine sehr aktuelle Variante des ARM ist die Cortex-M3 Familie die &#039;&#039;&#039;[[LPC1xxx]]&#039;&#039;&#039;, als eine echte Konkurrenz zu 8- und 16-Bit Mikrocontrollern wie dem [[AVR]] und [[MSP430]] gedacht ist. Der Cortex-M3 enthält einige Verbesserungen gegenüber dem ARM7TDMI-Kern und ist bereits dabei diesen zu ersetzen. &lt;br /&gt;
Controllerfamilien dieser Klasse sind:&lt;br /&gt;
&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-tiny-gecko-microcontroller-family EFM32 Tiny Gecko],[http://www.energymicro.com/products/efm32-gecko-microcontroller-family EFM32 Gecko] sowie [http://www.energymicro.com/products/efm32-leopard-gecko-microcontroller-family EFM32 Leopard Gecko] von Energy Micro , [https://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;interne Seite über EFM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.nxp.com LPC13xx/LPC17xx/LPC18xx] von NXP oder die inzwischen schon sehr ausführliche, [http://www.mikrocontroller.net/articles/LPC1xxx &#039;&#039;&#039;interne Seite zur Cortex-M3 Familie&#039;&#039;&#039; von LPC]&lt;br /&gt;
* [http://focus.ti.com/general/docs/gencontent.tsp?contentId=54556&amp;amp;DCMP=Luminary&amp;amp;HQS=Other+OT+stellaris Stellaris-Serie] von [http://www.ti.com Texas Instruments] (vormals Luminary Micro)&lt;br /&gt;
* [http://www.atmel.com/products/at91/sam3landing.asp?family_id=605 AT91SAM3] von Atmel&lt;br /&gt;
* [http://www.st.com/internet/mcu/family/141.jsp STM32] Baureihen [http://www.st.com/internet/mcu/subclass/1169.jsp F1]/[http://www.st.com/internet/mcu/subclass/1520.jsp F2]/[http://www.st.com/internet/mcu/subclass/1376.jsp L1]/[http://www.st.com/internet/mcu/subclass/1377.jsp W] von STMicroelectronics , [https://www.mikrocontroller.net/articles/STM32 &#039;&#039;&#039;interne Seite über STM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.toshiba-components.com/microcontroller/TMPM330.html TMPM330] von Toshiba&lt;br /&gt;
* [http://www.fujitsu.com/global/services/microelectronics/product/micom/roadmap/industrial/fm3/ FM3-Serie] von Fujitsu&lt;br /&gt;
* [http://www.infineon.com/XMC4000 XMC4000] von Infineon&lt;br /&gt;
* [https://www.silabs.com/products/mcu/Pages/ARM-32bit-microcontroller.aspx SiM3U1xx] von Silabs&lt;br /&gt;
* [http://www.holtek.com.tw/english/products/32bit_flashmcu.htm HT32] von Holtek Semiconductor&lt;br /&gt;
&lt;br /&gt;
Für den LPC1xxx bereits eine &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx#Allgemeine_Informationen_zum_Aufbau_der_Code_Base Code-Base]&#039;&#039;&#039;  und ein preisgünstiges &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso&amp;amp;action=edit Entwicklungskit]&#039;&#039;&#039; vorhanden.&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M4 ===&lt;br /&gt;
Als hoch performante Variante gibt es dann noch die Cortex-M4 Cores welche teilweise mit einer FPU ausgestattet sind. &lt;br /&gt;
&lt;br /&gt;
Diese werden beispielsweise in folgenden Controllern eingesetzt:&lt;br /&gt;
&lt;br /&gt;
* [http://www.energymicro.com/products/efm32-wonder-gecko-microcontroller-family EFM32-Wonder Gecko] von Energy Micro, [https://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;interne Seite über EFM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.nxp.com LPC43xx] von NXP (Dual Core)&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3] von [http://www.st.com STMicro], [https://www.mikrocontroller.net/articles/STM32 &#039;&#039;&#039;interne Seite über STM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1521.jsp?WT.ac=p2_bn_jun12_stm32f4series STM32F4] von [http://www.st.com STMicro], [https://www.mikrocontroller.net/articles/STM32 &#039;&#039;&#039;interne Seite über STM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/arm_stellaris/m4f_series/products.page LM4F] von [http://www.ti.com Texas Instruments]&lt;br /&gt;
* [http://www.infineon.com/XMC4000 XMC4000] von [http://www.infineon.com Infineon], [http://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;interne Seite über XMCxxxx&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
== ARM7 ==&lt;br /&gt;
Eine schon etwas ältere Controller-Familie ist der &#039;&#039;&#039;ARM7&#039;&#039;&#039;TDMI.  Core. Controllerfamilien dieser Klasse sind:&lt;br /&gt;
* NXP (ehemals Philips) [[LPC2000]] &lt;br /&gt;
* Atmel [[AT91SAM]]7&lt;br /&gt;
* Analog Devices [[ADuC7xxx]]&lt;br /&gt;
* [http://focus.ti.com/mcu/docs/mcuprodoverview.tsp?sectionId=95&amp;amp;tabId=203&amp;amp;familyId=454 Texas Instruments TMS470]&lt;br /&gt;
* SAMSUNG S3C24x0 [http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=229&amp;amp;partnum=S3C2410]&lt;br /&gt;
* STR7xx von ST Microelectronics [http://www.st.com/mcu/inchtml-pages-str7.html]&lt;br /&gt;
* und viele weitere&lt;br /&gt;
&lt;br /&gt;
Mehr Informationen zur ARM-Architektur finden sich in der [http://de.wikipedia.org/wiki/ARM-Architektur Wikipedia], weiterführende Links in der [[Linksammlung#ARM|Linksammlung]].&lt;br /&gt;
&lt;br /&gt;
== Compiler ==&lt;br /&gt;
&lt;br /&gt;
=== GCC ===&lt;br /&gt;
&lt;br /&gt;
Einer der beliebtesten Compiler für ARM-Prozessoren ist der GCC. Er kann sowohl ARM- als auch Thumb-Code erzeugen. Eine unvollständige Liste einiger Distributionen folgt: &lt;br /&gt;
&lt;br /&gt;
==== Fertige GCC Binaries für Windows: ====&lt;br /&gt;
- [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#winarm WinARM] (wird derzeit nicht gepflegt)&lt;br /&gt;
&lt;br /&gt;
- [http://gnuarm.com/ GNUARM] (Linux, Windows, wird derzeit nicht gepflegt), &lt;br /&gt;
&lt;br /&gt;
- [http://www.yagarto.de/ Yagarto] (Windows, mit Eclipse-Integration), &lt;br /&gt;
&lt;br /&gt;
- [http://www.codesourcery.com/gnu_toolchains/arm CodeSourcery CodeBench Lite] &lt;br /&gt;
&lt;br /&gt;
- [https://launchpad.net/gcc-arm-embedded GNU Tools for ARM Embedded Processors] (bereitgestellt von ARM selbst auf launchpad.net).&lt;br /&gt;
&lt;br /&gt;
==== Fertige GCC Binaries für Linux (und MacOS X): ====&lt;br /&gt;
- [[ARM GCC toolchain for Linux and Mac OS X]]&lt;br /&gt;
&lt;br /&gt;
- [http://gnuarm.com/ GNUARM] (Linux, Windows, wird derzeit nicht gepflegt)&lt;br /&gt;
&lt;br /&gt;
- [http://www.codesourcery.com/gnu_toolchains/arm CodeSourcery CodeBench Lite] (alter Name: Codesourcery G++ lite, für Linux, Windows)&lt;br /&gt;
&lt;br /&gt;
- [https://launchpad.net/gcc-arm-embedded GNU Tools for ARM Embedded Processors] (bereitgestellt von ARM selbst auf launchpad.net).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Auswahl der Toolchain sollte beachtet werden, dass es größere Unterschiede bei den bereitgestellten C-Bibliotheken gibt. Die Sourcery Codebench Lite-Edition stellt z.B. keine Bibliotheken mit FPU-Unterstützung bereit, so dass trotz vorhandener FPU beim Cortex-M4 nur suboptimaler Code erzegt werden kann. Siehe [http://wiki.debian.org/ArmHardFloatPort/VfpComparison] für ein kleines Beispiel und eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
Die im Netz häufig anzutreffende summon-arm Toolchain hat einen der seltenen Compiler-Bugs [http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg353473.html] und sollte daher nicht verwendet werden, wenn man floatingpoint-Typen einsetzen möchte. Egal ob mit oder ohne FPU.&lt;br /&gt;
&lt;br /&gt;
Beim Einsatz des gcc in Verbindung mit in C geschriebenem startup-Code bei den Optimierungslevels &amp;quot;-O2&amp;quot; und &amp;quot;-O3&amp;quot; muss zusätzlich &amp;quot;-fno-gcse&amp;quot; gesetzt werden, da ansonsten die von der CPU benötigte NVIC-Tabelle(n) und zugehörige Funktionen u.U. nicht so aussehen wie sie sollten.&lt;br /&gt;
&lt;br /&gt;
=== IDEs ===&lt;br /&gt;
&lt;br /&gt;
Kostenlose Entwicklungsumgebungen:&lt;br /&gt;
* [http://www.coocox.org/CooCox_CoIDE.htm CooCox IDE (Eclipse basierend]&lt;br /&gt;
* Für das MBED Board (mbed NXP LPC1768) ist ein kostenloser Onlinecompiler verfügbar (ARM Realview), der sich durch die Bereitstellung von sehr leistungsfähigen Funktionen (API&#039;s) auszeichnet. Den praktischen Nutzen für eine professionelle Anwendung mag man zu Recht in Frage stellen. Um mal schnell was zu programmieren ist das Ding unschlagbar, es ist faktisch keine Installation oder Einarbeitung in eine IDE nötig.&lt;br /&gt;
* emIDE [http://emide.org]&lt;br /&gt;
&lt;br /&gt;
Kommerzielle Entwicklungsumgebungen (zum Teil kostenlos mit Einschränkungen) für ARM-basierte Mikrocontroller sind z.&amp;amp;nbsp;B. :&lt;br /&gt;
*[http://www.code-red-tech.com/red-suite-4-nxp.php Code-Red (Eclipse basierend)]&lt;br /&gt;
*[http://rowley.co.uk/arm/ Crossworks ARM] (GCC-basiert, Windows, Mac OS und Linux)&lt;br /&gt;
* [http://www.cosmicsoftware.com/download_cortex_64k.php Cosmic Software] 64k free (Windows)&lt;br /&gt;
* [http://www.iar.com/ewarm/ IAR Embedded Workbench for ARM] (Windows)&lt;br /&gt;
* [http://www.keil.com/arm/ MDK-ARM von Keil/ARM] (Windows).&lt;br /&gt;
&lt;br /&gt;
== JTAG/SWD ==&lt;br /&gt;
&lt;br /&gt;
Alle ARM-basierten Prozessoren verwenden ein einheitliches [[JTAG]]-Interface, über das Debugging und Speicherzugriff erfolgen kann. Nicht standardisiert sind allerdings die Verfahren zum Beschreiben des Flash-ROMs, deshalb muss man beachten ob die verwendete JTAG-Software Programmierroutinen für den jeweiligen Controller besitzt.&lt;br /&gt;
&lt;br /&gt;
Es gibt Mikrocontroller (z.B. [[EFM32]] von [https://www.energymicro.com Energy Micro]) welche NUR über SWD (Serial Wire Debugg) programmiert werden können.&lt;br /&gt;
&lt;br /&gt;
=== Günstige Beispiele zum Starten ===&lt;br /&gt;
Ein einfacher JTAG-Adapter für den Parallelport ist der &amp;quot;Wiggler&amp;quot;-kompatible, den man selbst bauen kann oder z.&amp;amp;nbsp;B. im [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=48 Embedded Projects Shop] für &amp;amp;euro; 10,00 bestellen kann. Als Software lässt sich unter Windows und Linux [http://openocd.berlios.de/ OpenOCD] (zusammen mit [[GDB]]) oder [http://rowley.co.uk Crossworks ARM] verwenden. &lt;br /&gt;
&lt;br /&gt;
Für USB gibt es [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=436 hier] einen ebenfalls OpenOCD-kompatiblen JTAG-Adapter zum Preis von ca 45€.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind &amp;lt;u&amp;gt;sehr preiswerte&amp;lt;/u&amp;gt; Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG Programmer und Debugger) erhältlich z.B. &#039;&#039;&#039;[http://www.watterott.com/index.php?page=search&amp;amp;keywords=LPCXpresso&amp;amp;cat=&amp;amp;mnf=&amp;amp;x=0&amp;amp;y=0 Watterott]&#039;&#039;&#039;. Siehe dazu auch die Dokumentation von NXP zu den &#039;&#039;&#039;[http://www.nxp.com/documents/leaflet/75016842.pdf LPCXpresso-Entwicklungskits]&#039;&#039;&#039; (PDF), oder diese &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso Beschreibung]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von ST gibt es günstige Entwicklungskits (ca. 20€), mit integriertem ST-Link (Debugger). Zum Beispiel das [http://www.st.com/stm32f4-discovery STM32F4 Discovery Board] welches z.B. bei [http://thinkembedded.ch/ARM/STM32F4-DISCOVERY-Single-Board::153.html Thinkembedded] erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Von Energymicro gibt es [http://www.energymicro.com/tools/efm32-starter-kits Starter Kits] mit integriertem J-Link (Debugger) ab ca. 50 € z.B. das [http://www.energymicro.com/tools/efm32-tiny-gecko-starter-kit EFM32 Tiny Gecko Starter Kit] bei [http://de.mouser.com/ProductDetail/Energy-Micro/EFM32-TG-STK3300/?Energy-Micro/EFM32-TG-STK3300/&amp;amp;qs=sGAEpiMZZMvFPGEOwQcrYyZeaSbmjQvRx7NKUweLQtQ= Mouser]&lt;br /&gt;
&lt;br /&gt;
Der [http://www.segger.com/cms/jlink.html J-Link]-&amp;quot;Emulator&amp;quot; von Segger wird von vielen Softwarepaketen unterstützt und ist für den nicht-kommerziellen Einsatz zu günstigen Konditionen erhältlich (J-Link-Edu).&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Beschreiben des Flash über JTAG ist oft ein serieller [[Bootloader]] im Controller enthalten.&lt;br /&gt;
&lt;br /&gt;
== CMSIS - ARM Cortex Software Libaries  ==&lt;br /&gt;
&lt;br /&gt;
CMSIS - Cortex Microcontroller Software Interface Standard&lt;br /&gt;
 &lt;br /&gt;
Der ARM Cortex Microcontroller Software Interface Standard (CMSIS) ist ein herstellerunabhängiger Hardware Abstraction Layer für die Cortex-M-Prozessor -Serie. Die CMSIS ermöglicht konsistente und einfache Software-Schnittstellen für den Prozessor und die Peripherie, und vereinfacht damit die Software-Wiederverwendung. &lt;br /&gt;
&lt;br /&gt;
Die CMSIS besteht aus folgenden Komponenten:&lt;br /&gt;
&lt;br /&gt;
* CMSIS-CORE: Bietet eine Schnittstelle zum Cortex-M0, Cortex-M3, Cortex-M4, SC000 und SC300-Prozessoren und Peripherie-Register&lt;br /&gt;
* CMSIS-DSP: DSP-Bibliothek mit über 60 Funktionen in Festkomma-(fractional q7, q15, q31) und single precision floating-point (32-bit)-Implementierung&lt;br /&gt;
* CMSIS-RTOS API: Standardisierte Programmierschnittstelle für Echtzeit-Betriebssysteme für Thread-Steuerung, Ressourcen-und Zeitmanagement&lt;br /&gt;
* CMSIS-SVD: System View Beschreibung -  XML-Dateien, die die Programmiereransicht des kompletten Mikrocontroller-Systems einschließlich Peripheriegeräte enthalten&lt;br /&gt;
&lt;br /&gt;
Der Standard ist für Cortex-M-Mikrocontroller skalierbar: Von der  kleinsten 4 KB MCU bis zu MCUs mit anspruchsvoller Kommunikations-Peripherie wie Ethernet oder USB. Der Speicherbedarf für die Core Peripheral Funktionen bedarf weniger als 1 KB-Code und weniger als 10 Bytes RAM.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* Software Beispiele von [http://www.energymicro.com/downloads/application-notes Energy Micro] basierend auf CMSIS&lt;br /&gt;
&lt;br /&gt;
Mehr Informationen unter:&lt;br /&gt;
&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php ARM CMSIS Webseite]&lt;br /&gt;
&lt;br /&gt;
== Freie Software ==&lt;br /&gt;
&lt;br /&gt;
=== ARM/XSCALE/CORTEX Instruction Set Simulator ===&lt;br /&gt;
&lt;br /&gt;
Die Firma Lauterbach bietet unter der Artikelnummer LA-8809 einen Instruction Set Simulator für ARM Cores an. Die Demoversion ist zur Evaluierung kostenlos. Einschränkungen bestehen in der Anzahl der zu ladenen Debugsymbole. Der Simulator unterstützt alle gängigen ARM Derivate und lädt alle üblichen Debugformate, wie die des RealView,  IAR und TI Compilers, oder der freien GCC Tools.&lt;br /&gt;
&lt;br /&gt;
Zum Simulator gibt es entsprechende zugehörige Debugtools, die allerdings käuflich zu erwerben sind.&lt;br /&gt;
&lt;br /&gt;
Weblinks: &lt;br /&gt;
[[http://www.lauterbach.com/frames.html?dwnload.html Download area mit ARM/XSCALE/CORTEX Simulator]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Linksammlung#ARM|Linksammlung (Abschnitt ARM)]]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/LPC1xxx Beschreibung der LPC1xxx-Familie]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/LPC1xxx_Entwicklungskit_LPCXpresso LPCXpresso-Entwicklungskit]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung zur IDE von Code-Red]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx LPC1xxx Codebase]&lt;br /&gt;
* [[ARM-elf-GCC-Tutorial]]&lt;br /&gt;
* [[AVR32]]&lt;br /&gt;
* [[Blackfin]]&lt;br /&gt;
* [[AT91SAM9260]]&lt;br /&gt;
* [[STM32]]&lt;br /&gt;
* [[JTAG]]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/EFM32 EFM32]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://embdev.net/forum/arm-gcc ARM-GCC Forum] im englischsprachigen &amp;quot;Ableger&amp;quot; von microcontroller.net embdev.net u.a. für WinARM, Yagarto, CS Codebench&lt;br /&gt;
* [http://infocenter.arm.com/help/index.jsp Infocenter von ARM Ltd.]&lt;br /&gt;
* [http://www.open-research.org.uk/ARMuC/ ARMuC ARM microcontroller Wiki]&lt;br /&gt;
* [http://chaosradio.ccc.de/cre151.html Chaosradio Express - Die ARM-Architektur]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
*ARM Systems Developer&#039;s Guide (2004) ISBN 1558608745 [http://books.google.de/books?id=HKKUkDQE17QC&amp;amp;output=html Im Buch blättern] [http://www.mkp.com/companions/defaultindividual.asp?isbn=9781558608740 Programmbeispiele aus dem Buch, u.a. FFT, FIR/IIR-Filter, Division, Wurzel]&lt;br /&gt;
*ARM Assembly Language - an Introduction (2007) ISBN 1847536964 [http://books.google.de/books?id=8KJX5R8mMvsC&amp;amp;output=html Im Buch blättern]   [http://www.lulu.com/content/1172076 Verlagsseite &amp;quot;Book on demand&amp;quot;]&lt;br /&gt;
*ARM Rechnerarchitekturen für System-on-Chip-Design (2002) ISBN 3826608542&lt;br /&gt;
*Co-Verification of Hardware and Software for Arm Soc Design (2004) ISBN 0750677309&lt;br /&gt;
*ARM System-on-Chip Architecture (2000) ISBN 0201675196 [http://books.google.de/books?id=J_Fu_YTVD9gC&amp;amp;printsec=frontcover&amp;amp;output=html&amp;amp;source=gbs_summary_r&amp;amp;cad=0 Im Buch blättern]&lt;br /&gt;
*ARM Architecture Reference Manual ISBN 0201737191 [http://books.google.de/books?id=O5G-6WX1xWsC&amp;amp;printsec=frontcover&amp;amp;output=html&amp;amp;source=gbs_summary_r&amp;amp;cad=0 Im Buch blättern]&lt;br /&gt;
*Messen, Steuern und Regeln mit ARM-Mikrocontrollern ISBN 3772340172 [http://books.google.de/books?id=TKs4kN-zNYQC&amp;amp;output=html im Buch blättern]&lt;br /&gt;
*Programming Arm Microcontrollers: Using C and the Lpc2100 Family (2005? /ab 1. Dezember 2008) ISBN 0321263359&lt;br /&gt;
*Arm Assembly: Fundamentals and Techniques (ab 1. März 2009) ISBN 1439806101&lt;br /&gt;
*Reliable Embedded Systems: Using 8051 and ARM Microcontrollers (2007) ISBN 0321252918 600 Seiten mit CD [http://vig.pearsoned.co.uk/catalog/academic/product/0,1144,0321252918-TOC,00.html Inhaltsverzeichnis]&lt;br /&gt;
* C und C++ für Embedded Systems (u.a. ARM Cortex-M3) mitp-Verlag 2008 ISBN 382665949X&lt;br /&gt;
* The Definitive Guide to the Arm Cortex-M0 (Joseph Yiu) Newnes Verlag ISBN 0123854776&lt;br /&gt;
* The Definitive Guide to the Arm Cortex-M3 (Joseph Yiu) Newnes Verlag ISBN 185617963X&lt;br /&gt;
&lt;br /&gt;
== Artikel aus der Kategorie ARM ==&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;ARM&amp;lt;/ncl&amp;gt;&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;EFM32&#039;&#039;&#039;]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/EFM32 &#039;&#039;&#039;XMCxxxx&#039;&#039;&#039;]&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Cortex-A ARM Cortex A]&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM| ]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Oszilloskop&amp;diff=70418</id>
		<title>Oszilloskop</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Oszilloskop&amp;diff=70418"/>
		<updated>2012-12-31T11:00:50Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Tasköpfe richtig benutzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein &#039;&#039;&#039;Oszilloskop&#039;&#039;&#039; dient zur grafischen Darstellung des Spannungsverlaufs eines oder mehrerer elektischen Signale in einem einstellbaren Zeitfenster. Es ist das wichtigste Werkzeug der Elektotechniker.&lt;br /&gt;
&lt;br /&gt;
== Anfragen bezüglich Kaufberatung im Forum ==&lt;br /&gt;
&lt;br /&gt;
=== Kritik an den Anfragen ===&lt;br /&gt;
Im Forum finden sich regelmäßig Anfragen nach individueller Beratung zum Oszilloskopkauf. Die Anzahl solcher Oszilloskop-Threads hat schon lange die 1000 überschritten. Sie sind langweilig, eine Qual und oft unnütz - besonders dann, wenn sich der Fragesteller offebar nicht mit den Grundlagen eines Oszilloskops und den wichtigsten Kennzahlen bekanntgemacht hat oder nicht einaml weiß, was er überhaupt messen will. Auch, wenn ein Fragesteller ein paar Grundlagen besitzt, hat er anscheinend meistens keine Lust, verständlich darzustellen, was er genau will und lässt sich stattdessen umstädnlich befragen.&lt;br /&gt;
&lt;br /&gt;
Den meisten regelmäßigen Forumsteilnehmern ist daher gründlich die Lust an Oszilloskop-Threads vergangen. Dort &amp;quot;diskutieren&amp;quot; eigentlich nur noch Trolle und anonyme Gäste, die oft genug nur Werbung über Billigangebote über die x-te Ausgabe einer billigen, als Oszilloskop bezeichneten Plastikkiste, einem suupertollen eBay-Schnäppchen oder angeblicher asiatischer Wundertüten.&lt;br /&gt;
&lt;br /&gt;
==== Links für Anfänger ====&lt;br /&gt;
Wer sich ernsthafte Beratung wüsncht und eine &amp;quot;sanfte&amp;quot; Einführung in das Thema sucht, kann sich die englischsprachige YouTube-Videos von AfroTechMods anschauen:&lt;br /&gt;
&lt;br /&gt;
[http://afrotechmods.com/tutorials/2011/11/27/oscilloscope-tutorials/ http://afrotechmods.com/tutorials/2011/11/27/oscilloscope-tutorials]&lt;br /&gt;
&lt;br /&gt;
Dazu passt auch sein Tutorial über Funktionsgeneratoren:&lt;br /&gt;
[http://afrotechmods.com/tutorials/2011/11/27/function-generator-tutorial/ http://afrotechmods.com/tutorials/2011/11/27/function-generator-tutorial].&lt;br /&gt;
&lt;br /&gt;
===Maßgeschneidert?===&lt;br /&gt;
Besonders die immer wiederkehrende Forderung, dass es unbedingt das maßgeschneiderte Oszilloskop zum Superpreis genau für den Fragesteller geben muss, ist sinnlos. Wer mit diesem Anspruch kommt, der wird enttäuscht werden. Das gibt es nicht, und gute Oszilloskope kosten Geld, da qualitativ hochwertige Geräte keine Massenware sind. Lediglich billige Geräte werden in grosser Zahl hergestellt und sind entsprechend preiswert, diese sind jedoch für anspruchsvoll Anweder meist untauglich, da genau an den wichtigen Dingen gespart und nur auf Optik gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
===Gebraucht ist auch keine Lösung===&lt;br /&gt;
Es gibt eine Reihe von gebrauchte Oszilloskopen- vorwiegend im Internet, von den die meisten billig sind. Da niemand per Ferndiagnose oder Blick in eine Glaskugel in ein gebrauchtes Gerät hineinsehen und etwas über den Zustand berichten kann, besteht immer das typische Risiko eines Kaufs asu zweiter Hand, das jeder selber tragen muss. Niemand im Forum kann und wird das jemandem abnehmen. &lt;br /&gt;
&lt;br /&gt;
Was man allgemein sagen kann, ist, dass man besser die Finger von Angeboten lassen sollte, wenn der Verkäufer mit den übliche Phrasen wie, &amp;quot;Dachbodenfund&amp;quot;, &amp;quot;Keine Ahnung davon&amp;quot;, &amp;quot;Keine Möglichkeit zu testen&amp;quot; kommt. Vorsicht ist auch bei dem beliebten Trick &amp;quot;Funktioniert, aber aus rechtlichen Gründen (Garantie) verkaufe ich es als defekt, für Bastler&amp;quot; gegeben. Man muss sich immer vor Augen führen, dass niemand ein gutes und wertvolles Gerät dieser Art zum Billigpreis abgegeben wird und dies schon garnicht über Internetplattformen, wo es kaum einen Markt für Topgeräte gibt. Gute gebrauchte Geräte gibt es von privat daher nur auf Elektronikbörsen zu entsprechenden Preisen.&lt;br /&gt;
&lt;br /&gt;
Es gibt demgemäss natürlich auch Geräte von seriösen Gebrauchthändlern mit Garantie - allerdings ebenso zu derartigen Preisen, dass dagegen der Kauf eines aktuellen Neugeräts ebenfalls attraktiv erscheint.&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen? ===&lt;br /&gt;
Eine Vorgehensweise, von der man auch abraten muss, ist die Frage nach Erfahrungen anderer Mitglieder! Die meisten Antworten kommen von Trollen und Posern, die eigentlich keine Ahnung haben. Die einen wollen als anonymer Gast mal wieder trollen, die anderen wollen nur mitteilen, dass Amateurfunker sowieso die besseren Menschen sind. Andere wiederum haben &amp;quot;zufällig&amp;quot; gerade *das* richtige Oszilloskop zu verkaufen. Dann gibt es noch die, die sich ihr eigenes Oszilloskop schönreden wollen, ihren Vorurteilen oder ihrem Fetisch frönen. Zum Beispiel&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Kauf ja kein Gerät aus Asien!&#039;&#039;&lt;br /&gt;
* &#039;&#039;Unter LeCroy|Agilent|Yokogawa|Tektronix geht gar nichts!&#039;&#039;&lt;br /&gt;
* &#039;&#039;Nur Gebrauchtgeräte lohnen sich!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hinweise wie &#039;&#039;mein vor 30 Jahren gekauftes Markengerät funktioniert noch heute tadellos&#039;&#039; sind ebenfalls ziemlich sinnlos. Der Hersteller wird dieses Gerät gar nicht mehr anbieten und er wird schon gar nicht mehr mit der gleichen Qualität fertigen, wie vor 30 Jahren. Dazu ist der Kostendruck zu hoch und Technologien haben sich geändert. Selten sind die neuen Technologien heute so robust, wie die vor 30 Jahren.&lt;br /&gt;
&lt;br /&gt;
Als Unerfahrener kann man daher aus den Antworten nicht herauslesen, ob sie wirklich auf Erfahrung beruhen. Man braucht also gewissermassen selbst Erfahrung, um die Erfahrungsberichte anderer richtig einzuordnen.&lt;br /&gt;
&lt;br /&gt;
Ein anderer Aspekt aus alten Threads ist, dass viele Fragesteller die Erfahrungen gar nicht zur Kenntnis nehmen wollen, wenn sie der eigenen Wunschvorstellung widersprechen. So etwas nennt man beratungsresistent. Da stellt sich schon mal heraus, dass der Fragesteller schon längst ein Gerät bestellt hat und jetzt gebauchpinselt werden will. Eine Zeitverschwendung für alle.&lt;br /&gt;
&lt;br /&gt;
Erfahrungen mit eigenen Geräten lassen bedingt den Schluss zu, welche&lt;br /&gt;
Marken grundsätzlich empfehlenswert sind, weil dort gegebenenfalls mehr auf Qualität geachtet wird.&lt;br /&gt;
&lt;br /&gt;
=== Zusatzkosten beim Kauf im Ausland ===&lt;br /&gt;
Beim Kauf eines scheinbar preisgünstigen Gerätes im Ausland ist Folgendes zu beachten:&lt;br /&gt;
&lt;br /&gt;
Versandkosten, Einfuhrumsatzsteuer, Zoll, e.v. Gebühr für den Paketdienst und die Gebühren für die  Währungsumrechnung sind Kosten, die bei vielen vermeintlichen Internet-Schnäppchen aus dem Ausland (besonders Nicht-EU) noch hinzukommen und bei plakativen Überschriften gerne &amp;quot;vergessen&amp;quot; oder ignoriert werden. Oft wird sich das Angebot selbst schöngeredet. Zudem sind das nicht einmmal alle Kosten, die man zu tragen hat. Zum Beispiel können für manche Zahlungsweisen weitere Gebühren hinzukommen oder Lagergebühren im Zolllager.&lt;br /&gt;
&lt;br /&gt;
Wer nicht vorher rechnet, hat nachher schnell mehr bezahlt als bei einem lokalen Händler. Siehe auch [http://www.zoll.de Zoll].&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich ist der deutsche Zoll nicht doof. Besonders wenn ein asiatischer Versender auf ein Paket bei der Zollerklärung &amp;quot;Geschenk, Wert $40&amp;quot; schreibt, dann kann man fast sicher sein, dass der deutsche Zoll sich das genauer ansieht. Die Ware landet im Zolllager und man darf den Kaufpreis nachweisen.&lt;br /&gt;
&lt;br /&gt;
Ebenso glaubt der Zoll nicht an kostenlosen Versand und nimmt regelmäßig ziemlich saftige Versandgebühren an, die dann versteuert werden&amp;lt;ref&amp;gt;Passiert das, kann man gegen den Steuerbescheid Widerspruch einlegen. Wie das geht sollte in einer Rechtsbehelfsbelehrung auf dem Steuerbescheid stehen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nochmal zum Mitschreiben, besonders bei Käufen von außerhalb des Zollgebiets der EU sollte man sich vorher mindestens über die folgenden Kosten informieren:&lt;br /&gt;
&lt;br /&gt;
* Versandkosten oder was der Zoll sich bei kostenlosem Versand ausdenkt&lt;br /&gt;
* Versandart (was durch die Post importiert wird, wird vom Zoll anders abgefertigt, als das, was von einem Paketdienst importiert wird)&lt;br /&gt;
* Einfuhrumsatzsteuer&lt;br /&gt;
* Zoll (bei der Warengruppe, in die Oszilloskope gehören, ist der zur Zeit wohl 0%. Das kann sich natürlich ändern)&lt;br /&gt;
* Gebühr Paketdienst. Paketdienste lassen sich die Zollanmeldung und den Papierkrieg zum Teil mit saftigen Gebühren bezahlen. Die sind nicht in den Versandkosten enthalten.&lt;br /&gt;
* Gebühr für Währungsumrechnung&lt;br /&gt;
* Bankgebühr für Zahlung ins Ausland&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Ein Kauf eines PC-basierten Messinstruments mit Oszilloskopfunktion, das in Deutschland nicht erhältlich ist und einen Kaufwert von 719,- US Dollar in Taiwan hatte, wurde aufgrund der Umrechung mit einem Wert von 589,- Euro veranschlagt. An UST kamen 112,- und an Zollgebühren 46,- Euro hinzu. Zusammen mit dem Versand und Bankgebühren kostete das Gerät insgesamt 790,- Euro. Andere Geräte des Herstellers, die in Deutschland zu beschaffen sind, kosten als deutsches Exemplar kaum mehr, dafür hat man die volle Verbrauchergarantie. Diese sind also in der Regel vorzuziehen, wenn das Gerät in Deutschland beschaffbar ist.&lt;br /&gt;
&lt;br /&gt;
===Spielzeuge aller Art===&lt;br /&gt;
Offensichtlich scheint es gerade Mode zu werden, einen schwachbrüstigen Analog-Digital-Konverter hinter eine eher zufällig gewählte, krumme analoge Eingangsschaltung zu klemmen und an einen Mikrocontroller mit Graphik-LCD anzuschließen.  Das ganze wird als digitales Speicheroszilloskop (DSO) zum Sonderpreis verkauft. Je nach Hersteller wird so ein Gerät komplett ohne Gehäuse geliefert, was mit Hinblick auf die Sicherheit sehr fragwürdig ist, oder es kommt in einem lustig aufgemachten Plastikgehäuse in MP3-Player-Format daher, das auch keine großartige Isolation bietet. Hinzu kommen eindruckschindene Namen und Logos, die die Modernität und Qualität suggerieren sollen, oft noch unterstreichen durch die Nutzung von Open-Source-Kompatibiltät.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zu richtigen Oszilloskopen sind dies leider nur Spielzeuge und es nervt, diese Dinger immer wieder im Forum als das &amp;quot;Beste seit Erfindung von geschnitten Brot&amp;quot; vorgestellt zu bekommen. Ein Blick auf die technischen Daten dieser &amp;quot;Oszilloskope&amp;quot; (sofern die Daten überhaupt angegeben werden) reicht, um festzustellen, dass man ein Spielzeug vor sich hat. Schön für den, der spielen will, schlecht für den, der sicher messen will.&lt;br /&gt;
&lt;br /&gt;
Ebenso verrät ein Blick auf die Schaltung des Analogeingangs, ob man Qualität vor sich hat. Fehlende Spannungsfestigkeit und fehlende Frequenzkompensation des Eingangsverstärkers sind sichere Zeichen für Schund. Wenn es eine Verbindung zum PC gibt, aber diese nicht isoliert ist, ist das ein weiteres Zeichen für Scheinqualität.&lt;br /&gt;
&lt;br /&gt;
In [http://welecw2000a.sourceforge.net/docs/Hardware/GW_Instek_GDS-1152A.pdf] kann man das Innenleben eines richtigen DSO bewundern. Man vergleiche dies mit den Innenleben der Spielzeug-&amp;quot;DSO&amp;quot;s.&lt;br /&gt;
&lt;br /&gt;
Ein anderes, sicheres Zeichen eines Spielzeug-&amp;quot;DSOs&amp;quot; ist es, wenn irgendein Ding aus Abgreifklemmen und Klinkenstecker als &amp;quot;Tastkopf&amp;quot; mitgeliefert wird oder die Buchse für den Tastkopf aus einer Klinkenbuchse oder ähnlicher Niederfrequenz-Anschlusstechnik besteht.&lt;br /&gt;
&lt;br /&gt;
Fazit, wer ein Oszilloskop haben möchte, sollte sich das Geld für ein Spielzeug-&amp;quot;DSO&amp;quot; sparen.&lt;br /&gt;
&lt;br /&gt;
== Was messen Oszilloskope? ==&lt;br /&gt;
&lt;br /&gt;
Oszilloskope zeigen einen Spannungsverlauf über einen relativ kurzen Zeitraum an. Je besser das Oszilloskop, desto länger ist dieser kurze Zeitraum, beziehungsweise desto schneller darf das Signal sein. Darüber hinaus lassen sich andere Größen, zum Beispiel Ströme, anzeigen, wenn man zusätzlich entsprechende Wandler einsetzt, um aus ihnen eine Spannung zu erzeugen. Bei Mehrkanal-Oszilloskopen kann man üblicherweise auch eine Spannung über eine Spannung darstellen (XY-Modus).&lt;br /&gt;
&lt;br /&gt;
Als Kanal bezeichnet man bei einem Oszilloskop einen Eingang für eine Spannung. Die an den Kanäle anliegenden Spannungen können vom Oszilloskop einzeln oder gemeinsam angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich bieten moderne Oszilloskope die Möglichkeit, sich gewisse Kenngrößen der Spannungsverläufe anzeigen zu lassen. Gängige sind zum Beispiel die Anzeige von Spitzenspannung und Effektivwert einer Spannung, Frequenz/Periodendauer, Anstiegs- und Abfallzeiten, Tastverhältnis und so weiter. Darüber hinaus bieten gute Oszilloskope Positionsmarken (Cursor), mit denen man, durch eine Linie dargestellt, auf dem Bildschirm Positionen im Spannungsverlauf markieren kann. Zur Position zugehörige Werte (Zeit oder Spannung), sowie die Differenz dieser Werte zwischen zwei Poitionsmarken können abgelesen werden.&lt;br /&gt;
&lt;br /&gt;
Besonders [[#Digitale_Tischoszilloskope|digitale Oszilloskope]] können relativ viele unterschiedliche Kenngrößen anzeigen, da sich viele dieser Größen mit einfachen Algorithmen aus den vom Oszilloskop im Speicher erfassten Daten berechnen lassen. Ebenso sind einfache mathematische Operationen möglich, etwa eine diskrete Fourier-Transformation oder die Summe oder Differenz der Spannungsverläufe von zwei Kanälen. Oszilloskope der Oberklasse bieten darüber hinaus ausgeklügelte Möglichkeiten der Signalanalyse. &lt;br /&gt;
&lt;br /&gt;
Bereits in der Unterklasse digitaler Oszilloskope ist heutzutage eine PC-Schnittstelle üblich. Beim Kauf sollte man darauf achten, dass das Protokoll der Schnittstelle dokumentiert ist. Sonst ist man auf proprietäre PC-Software des Herstellers angewiesen. Bei Oszilloskopen der Unterklasse wird zwar häufig kostenlos PC-Software mitgeliefert, doch leider sind diese Programme durchgehend von erschreckend schlechter Qualität. Bei Oszilloskopen der Oberklasse lassen sich die Hersteller ihre PC-Software gerne zusätzlich sehr teuer bezahlen.&lt;br /&gt;
&lt;br /&gt;
Für spezielle Anwendungen finden sich in manchen Oszilloskopen besondere Messfunktionen. Zum Beispiel go/no-go Messungen, mit denen eine Spannungsverlauf mit einem vorgegebenen Verlauf verglichen wird. Entspricht der Spannungsverlauf hinreichend dem vorgegebenen Verlauf wird ein &amp;quot;go&amp;quot; (alles ist OK) Signal ausgegeben. Weicht der Verlauf zu stark ab, ein &amp;quot;no go&amp;quot; (Spannung stimmt nicht) Signal.&lt;br /&gt;
&lt;br /&gt;
== Analoge Oszilloskope ==&lt;br /&gt;
=== Allgemeines ===&lt;br /&gt;
[[Bild:Oszilloskop.png|thumb|right|300px|Hybrides Analog/Digital Oszilloskop]]&lt;br /&gt;
Bei analogen Oszilloskopen wird das darzustellende Signal nach der Verstärkung direkt zur Ablenkung eines Elektronenstrahls verwendet.&lt;br /&gt;
&lt;br /&gt;
Brauchbare analoge Oszilloskope findet man oft schon für ca. 50 Euro bei Online-Auktionen und Kleinanzeigenmärkten. Für 200-400 Euro bekommt man dort recht gute Profigeräte&amp;lt;ref&amp;gt;Ein Gerät, welche mit dem Attribut &#039;&#039;Profigerät&#039;&#039; beworben wird, ist normalerweise keins.&amp;lt;/ref&amp;gt;  mit 60-200 MHz Bandbreite. Brauchbare Neugeräte fangen bei 600 Euro an. Der Oszilloskopmarkt wird von einigen wenigen Marken dominiert. Im höherpreisigen Segment sind es vor allem HP (Agilent) und Tektronix, sowie Yokogawa und Lecroy. Hameg ist vor allem im mittleren Segment (500-1500 Euro) weit verbreitet. Man findet sie oft in Schule und Ausbildung. Preislich darunter finden sich diverse asiatische oder gelegentlich noch osteuropäische Hersteller von Analogoszilloskopen. Häufig treten diese Hersteller nicht unter eigenem Namen auf, sondern bieten ihre einfachen Geräte als OEM-Produkte an. &lt;br /&gt;
&lt;br /&gt;
Ganz einfache Geräte verfügen nur über einen Kanal&amp;lt;ref&amp;gt;Es gibt, beziehungsweise gab, nochmals einfachere Geräte, nämlich solche ohne Trigger. Die Zeiten solcher Gerät sind allerdings seit rund 50 Jahren vorbei. Daher sollte man den fehlenden Trigger nur bei historischen Gebrauchtgeräten finden.&amp;lt;/ref&amp;gt;. Damit ist es nicht möglich, zwei Signale in zeitliche Beziehung zu setzen. Dies ist jedoch oft wichtig. Deshalb verfügen heutzutage auch einfache Geräte meist über zwei Kanäle.&lt;br /&gt;
&lt;br /&gt;
=== Bandbreite ===&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Bandbreite&#039;&#039;&#039; gibt Auskunft, welche Signal-Frequenzen das Oszilloskop noch verarbeiten kann. Bei angegebener Bandbreite fällt die Verstärkung des Oszilloskops um 3dB ab, ein Sinussignal wird dann nur noch mit ca. 70% der wahren Amplitude angezeigt. Um Signalverläufe noch vernünftig interpretieren zu können, kann man grob sagen, dass man Signale bis 1/10 der Bandbreite dargestellt bekommt. Ein Rechtecksignal nahe der Bandbreite würde z.&amp;amp;nbsp;B. nur noch als Sinus dargestellt werden &amp;lt;ref&amp;gt;Häufig wird von Anfängern bei der Bandbreitenbetrachtung vergessen, dass ein Rechtecksignal nicht aus einer einzigen Sinusschwingung der Frequenz f, sondern aus einer theoretisch unendlichen Summe von Signalen der Frequenzen f, 3 * f, 5 * f ... besteht. Für eine vernünftige Darstellung eines Rechtecksignals sollte die Oszilloskopbandbreite so groß sein, dass zumindest die ersten paar Oberwellen nicht zu stark gedämpft werden. Aus dieser Betrachtung ergeben sich Faustformeln, wie die, dass die Bandbreite eines Oszilloskops zehnmal (oder dreimal, oder fünfmal, je nachdem wie genau man messen möchte) größer sein sollte als die Grundfrequenz des Rechtecks.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beim Messen von Digitalsignalen ist man meist an der &#039;&#039;&#039;Anstiegszeit&#039;&#039;&#039; interessiert. Die Anstiegszeit gibt an, wie lange ein Rechtecksignal von 10-90% benötigt. Die Anstiegszeit des Oszilloskops gibt an, welche Anstiegszeit dargestellt wird, wenn man ein nahezu ideales Rechtecksignal mit annähernd Null Anstiegszeit anlegen würde. Man kann die Anstiegszeit direkt aus der Bandbreite berechnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;t_{Osc} = \frac{0.35}{B}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_A&amp;lt;/math&amp;gt; : Anstiegszeit des Oszilloskops in Sekunden (s)&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, B&amp;lt;/math&amp;gt; : Bandbreite in Hertz (Hz)&lt;br /&gt;
&lt;br /&gt;
Legt man ein reales Rechtecksignal an das Oszilloskop an, dann wird die Anzeige umso mehr verfälscht, je näher die Anstiegszeit des Eingangssignals der Anstiegszeit des Oszilloskops kommt. Dabei gilt folgender Zusammenhang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;t_S = \sqrt{t_{ges}^2-t_{Osc}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_S&amp;lt;/math&amp;gt;: Anstiegszeit des Eingangssignals&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_{ges}&amp;lt;/math&amp;gt;: Angezeigte Anstiegszeit auf dem Oszilloskop&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_{Osc}&amp;lt;/math&amp;gt;: Anstiegszeit des Oszilloskops&lt;br /&gt;
&lt;br /&gt;
=== Tastköpfe richtig benutzen ===&lt;br /&gt;
&lt;br /&gt;
Wenn man wirklich schnelle Signale messen will, spielt auch die Bandbreite des verwendeten Tastkopfes eine wichtige Rolle. Näheres dazu findet man [http://www.sigcon.com/Pubs/straight/probes.htm hier]. Aber der beste Tastkopf nützt nichts, wenn man ihn falsch anschließt. Für schnelle Messung jenseits von ein paar MHz nutzt man praktisch immmer 10:1 Tastköpfe mit 10 MOhm Eingangswiderstand und ca. 8-15pF Eingangskapazität. Je nach Typ erreicht man damit Bandbreiten von 100-500MHz. Danach muss man aber auch den Tastkopf richtig anschließen. Der mitgelieferte Masseanschluß mit Krokodilklemme ist zwar praktisch, für viele hochfrequente Messungen aber unbrauchbar. Ein Rechtecksignal damit zu messen ergibt dann starke Überschwinger, welche real aber gar nicht vorhanden sind, sondern durch die zu lange, induktive Masseleitung im Zusammenspiel mit der Eingangskapazität verursacht werden. Das sieht man z.B. [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975754 hier], den Messaufbau sieht man [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975896 hier].&lt;br /&gt;
&lt;br /&gt;
Für saubere, hochfrequente Messungen muss man die Masseanbindung so kurz wie möglich machen. Dafür haben die Tastköpfe oft eine kleines Zusatzteil, eine Massefeder, beigelegt (engl. [http://www.mikrocontroller.net/attachment/27280/groundspring.png ground spring]). Damit kann man die Masse auf kürzestem Wege anschließen und erhält ein sauberes Messergebnis wie man [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975931 hier] sieht.&lt;br /&gt;
&lt;br /&gt;
=== Triggerung ===&lt;br /&gt;
&lt;br /&gt;
Oszilloskope unterscheiden sich oft stark in den Triggerungsmöglichkeiten. Bei guten Geräten kann man z.&amp;amp;nbsp;B. die Triggerung variabel verzögern. Erst dadurch wird es möglich, dass man sich Signale genauer anschauen kann, die zeitlich weit hinter einem Triggerereignis kommen. Eine weitere Funktion bei höherklassigen Oszilloskopen ist eine zweite Zeitbasis. Mit dieser kann man in einen Ausschnitt des Messsignals hereinzoomen&amp;lt;ref&amp;gt;Die zweite Zeitbasis steuert einen zweiten Strahl (ähnlich wie einen separaten Kanal), der das gleiche Eingangssignal erhält. Die zweite Zeitbasis wird auf eine höhere Horizontalfrequenz eingestellt als die erste. Zusammen mit einer horizontalen Verschiebung der Darstellung kann man nun Ausschnitte des Signals durchfahren und vergrößert betrachten.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mit Analog-Oszilloskopen kann man sich hauptsächlich periodische Signalverläufe anschauen, also solche, die zeitlich immer wiederkehrend sind. Denn nur so kann ein Signal immer wieder auf den Schirm &amp;quot;geschrieben&amp;quot; werden und erscheint als stehendes Bild. Aperiodische Signale, wie z.&amp;amp;nbsp;B. auf Datenübertragungsleitungen, sind damit nicht darstellbar. Sie laufen mit einem Strahldurchgang über den Schirm. In dieser kurzen Zeit ist es jedoch nur selten möglich, sie visuell aufzunehmen. Mit einer Digitalkamera kann man solche Signalverläufe mitunter trotzdem einfangen. Früher sehr hochpreisige, heute nicht mehr übliche Analog-Oszilloskope hatten eine eingebaute Speichermöglichkeit (Speicherröhre) für einmalige Signale. Diese Klasse von Analog-Oszilloskopen wurde durch digitale Speicheroszilloskope (DSOs) abgelöst.&lt;br /&gt;
&lt;br /&gt;
Manche Analog-Oszilloskope bieten eine Möglichkeit, die Triggerung nur zu einem definiertem Zeitpunkt anzustoßen, somit kann auch der Anlaufstrom eines Motors mit einem Analog-Oszilloskop dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
=== Analoge Speicheroszilloskope ===&lt;br /&gt;
Inzwischen eher selten sind analoge Speicheroszilloskope anzutreffen. Diese speichern im Gegensatz zu digitalen Speicheroszilloskopen nicht das Signal selbst, sondern das Bild auf der Röhre. Dies wird mit speziellen speichernden Bildröhren erreicht. Je nach Typ kann es mehrere getrennt betreibbare Bereiche geben, um beispielsweise 2 Bilder eines Signales zu unterschiedlichen Zeitpunkten darstellen zu können (z.B. Tektronix 549).&lt;br /&gt;
&lt;br /&gt;
Einige wenige dieser Oszilloskope waren sogar in der Lage, das aufgezeichnete Bild auf Papier auszugeben (z.B. &amp;quot;HP Model 175A&amp;quot; mit Modul 1784A).&lt;br /&gt;
&lt;br /&gt;
=== Vergleichstabelle Analogoszilloskope ===&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Neugeräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;sortable&amp;quot; id=&amp;quot;analogoszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Röhre [cm]&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| generisches 10 MHz Oszilloskop unter Bezeichnungen wie C1-94, S1-94, OS10, AO-610, ST16, CS10, GOS-310, 72-6602, HUC70, CS1010&lt;br /&gt;
| -&lt;br /&gt;
| 130&lt;br /&gt;
| 1&lt;br /&gt;
| 10&lt;br /&gt;
| 4 − 4,8 × 6&lt;br /&gt;
| Seit Jahrzehnten von vielen No-Name Herstellern in unterschiedlichen Ausführungen und Bauformen im Angebot. Wenig empfehlenswert für µC-Arbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atten.com.cn/english/products/rf_microwave/AT7328_40.htm Atten AT7328], CS-4128 und andere Bezeichnungen wie 100867.&lt;br /&gt;
| Atten&lt;br /&gt;
| 250&lt;br /&gt;
| 2&lt;br /&gt;
| 20&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HM 303-6&lt;br /&gt;
| Hameg&lt;br /&gt;
| 600&lt;br /&gt;
| 2&lt;br /&gt;
| 35&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Digitale Speicheroszilloskope ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:tektronix.jpg|thumb|right|300px|Digitales Speicheroszilloskop vom Anfang des Jahrtausends]]&lt;br /&gt;
Ein digitales Speicheroszilloskop (englisch DSO, &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;torage &#039;&#039;&#039;O&#039;&#039;&#039;scilloscope) digitalisiert das Eingangssignal mit einem Analog-Digital-Wandler und legt die Werte in einem Speicher ab. Der Vorteil daran ist, dass man auf diese Weise Momentaufnahmen eines Signals machen und damit einmalige (transiente) Ereignisse (Spikes, Datenübertragungen) erkennen und darstellen kann, was besonders bei digitalen Schaltungen, z.&amp;amp;nbsp;B. mit Mikrocontrollern, sehr nützlich ist. Weiterhin lässt sich das Signal &amp;quot;vermessen&amp;quot; (z.&amp;amp;nbsp;B. um die Baudrate einer Datenübertragung zu bestimmen), man kann die Frequenz und den Effektivwert anzeigen lassen, das Frequenzspektrum, und je nach Modell noch vieles mehr. Das Signal wird in S/W oder Farbe auf einem LCD dargestellt, lässt sich aber oft auch über einen angeschlossenen Drucker ausdrucken oder an den PC übermitteln.&lt;br /&gt;
&lt;br /&gt;
Der wichtigste Parameter bei digitalen Oszilloskopen ist die &#039;&#039;&#039;Abtastrate&#039;&#039;&#039;, die angibt, mit welcher Geschwindigkeit das Eingangssignal digitalisiert wird. Um ein Signal mit einer bestimmten Frequenz vernünftig darstellen zu können, muss es mindestens mit der 10-fachen Frequenz abgetastet werden&amp;lt;ref&amp;gt;Dieser Anhaltswert liegt über der Nyquist-Frequenz (zweifache Frequenz), da man Abweichungen von der idealen Signalform sehen und beurteilen möchte.&lt;br /&gt;
&lt;br /&gt;
Die zehnfache Abtastfrequenz bedeutet, dass man 10 Messpunkte pro Signalperiode hat, was in einer 1:1 Darstellung auf dem Bildschirm gerade mal 10 nebeneinander liegenden Pixeln entspricht. Das ist immer noch sehr wenig, um ein Signal zu beurteilen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem sind die &#039;&#039;&#039;Speichertiefe&#039;&#039;&#039; und die &#039;&#039;&#039;Wandler-Auflösung&#039;&#039;&#039; interessant. Ein Oszilloskop, das mit acht Bit Auflösung abtastet und 2000*8 Bit Speicher hat, kann 2000 Samples abspeichern, was einer Darstellung von 2000*256 Pixeln entspricht. Acht Bit Auflösung ist heutzutage ein gängiger Wert, auch wenn er niedrig erscheint. Ein normales Oszilloskop ist kein Präzisionsmessgerät und acht Bit sind für die Darstellung auf den Displays normaler Oszilloskope ausreichend.   &lt;br /&gt;
&lt;br /&gt;
Bei der Wandlung und Speicherung gibt es unterschiedliche Verfahren: Ehemals günstige Oszilloskope wie die TDS1000-Serie von Tektronix verwenden &#039;&#039;&#039;CCD-Speicher&#039;&#039;&#039; (Eimerkettenspeicher, ein analoges Schieberegister); die Messwerte werden erst gespeichert, und dann digitalisiert. Nachteile dieser Vorgehensweise sind ein stärkeres Rauschen, die begrenzte Speichertiefe und Totzeiten, während der keine Eingangswerte aufgenommen werden. Diese entstehen, da das Wandeln aller Werte aus dem analogen Zwischenspeicher länger dauert als die Zeit zum Füllen dieses Speichers. Deshalb muss das Gerät bis zum Abschluss der Wandlung warten, bevor es den Speicher erneut füllt.&lt;br /&gt;
&lt;br /&gt;
Früher wandelten nur teurere Modelle in Echtzeit mit schnellen Flash-[[AD-Wandler]]n und speicherten die Messwerte direkt in einem schnellen RAM. Die Speichertiefe ist dabei praktisch unbegrenzt, allerdings sind Wandler sehr teuer, die mehrere GS/s schaffen. Durch einen Trick (mehrere verschachtelte langsame AD-Wandler) setzen sich AD-Wandler bei günstigen Modellen durch. Oszilloskope, die diesen Trick verwenden, erkennt man daran, dass die Abtastfrequenz mit der Anzahl der aktivierten Kanäle sinkt. Zum Beispiel, findet man Vierkanaloszilloskop mit vier Wandlern à 250 MS/s, die bei Benutzung nur eines Kanals 1 GS/s für diesen Kanal erreichen, bei Benutzung von zwei Kanäle 500 MS/s pro Kanal und bei Benutzung von drei oder vier Kanälen 250 MS/s pro Kanal.&lt;br /&gt;
&lt;br /&gt;
In den richtig schnellen Geräten (mehrere GHz Samplerate) ist ein ähnlicher Trick üblich. Dort sind in den verwendeten Wandlerschaltkreisen eine größere Anzahl Sample-and-Hold-Stufen und AD-Wandler integriert. Die Eingangsspannung wird dann zeitversetzt in den Sample-and-Hold-Stufen gespeichert und von den im Vergleich zur Samplerate langsameren AD-Wandlern umgesetzt. Die Ausgangslogik sorgt dann dafür, dass die Daten in der richtigen Reihenfolge ausgegeben werden. Ein Problem bei dieser Vorgehensweise sind unterschiedliche elektrische Eigenschaften der parallelen Wandlerstufen. &lt;br /&gt;
&lt;br /&gt;
Natürlich spielt der Verwendungszweck eine entscheidende Rolle bei der Auswahl. Auf dem Labortisch, wo meist nur kleine Spannungen mit einem gemeinsamen Massebezug vorkommen, werden andere Anforderungen an ein Oszilloskop gestellt, als z.&amp;amp;nbsp;B. im Servicebereich für Industriesteuerungsanlagen, Automatisierungstechnik, usw. Dort sind weniger hohe Abtastraten wichtig, sondern eher eine größere Anzahl Eingangskanäle, die galvanisch voneinander getrennt sind, Spannungsfestigkeit bis min. 500 Volt, sowie speziell bei Störungsanalysen, die Möglichkeit, komplexe Triggermuster einzustellen, und eine integrierte große Festplatte, um einzelne Ereignisse automatisiert über lange Zeiträume hinweg festhalten zu können. Ein Beispiel für so ein hochwertiges Gerät ist ein Yokogawa Scopecorder (DL708). Allerdings sind bei solchen Geräten die Preise nach oben hin offen.&lt;br /&gt;
&lt;br /&gt;
===  Digitale Tischoszilloskope ===&lt;br /&gt;
==== Allgemeines ====&lt;br /&gt;
&lt;br /&gt;
DSO Tischoszilloskope sind die klassischen, in sich abgeschlossenen Geräte, die in der Gestaltung analogen Oszilloskopen ähneln. Daneben gibt es zum Beispiel auch PC DSOs. Viele Tischgeräte sind bereits so klein (geringe Tiefe) und leicht, dass sie zu Recht als tragbare Geräte bezeichnet werden. Beim Neukauf eines Oszilloskops sind diese Geräte die interessantesten.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile ist es üblich, dass man bereits bei Einsteigermodellen eingebaute USB oder RS-232 Schnittstellen findet und eine (häufig sehr simple) Windows-Software zur Bedienung vom PC aus oder zumindest zum Auslesen von Daten auf den PC. Ebenfalls häufig sind USB oder ähnliche Schnittstellen für USB-Memorysticks oder Speicherkarten zum Speichern von Messwerten, Screenshots und Konfigurationen. Ironischerweise sind Schnittstellen und Windows-Software bei Markengeräten häufig gesondert zu erwerben, während sie bei eher unbekannten Marken kostenlos mitgeliefert werden, wenn auch die Qualität der kostenlosen Software häufig zu wünschen übrig lässt. &lt;br /&gt;
&lt;br /&gt;
Beispiele für günstige Einstiegsmodelle sind einige, aber nicht alle, Geräte von Rigol, Hantek, Owon oder Atten. Für wenig Geld erhält man für einfache Anwendungen brauchbares Oszilloskop mit ein paar Highlights aber auch auffälligen Einschränkungen und Fehlern in der Hard- und Software. Viel oder überhaupt Service kann man von diesen Firmen für sein Geld nicht erwarten.&lt;br /&gt;
&lt;br /&gt;
Geräte von [http://www.instek.com/] sind etwas teurer. Geräte aus der GDS-1000A oder GDS-1000U Serie dürften zum Einstieg interessant sein.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel für ein Einstiegsmodell war das [http://www.tek.com/site/ps/0,,40-15314-INTRO_EN,00.html TDS1002] von Tektronix (ca. 1200 Euro). Dazu muss man allerdings sagen, dass Tektronix die aktuelle Entwicklung etwas verschlafen hat. Der nur 2 kByte große Speicher ist einfach nicht mehr zeitgemäß. Geräte der [http://www.home.agilent.com/agilent/product.jspx?nid=-33575.0&amp;amp;cc=DE&amp;amp;lc=ger&amp;amp;pageMode=OV Agilent InfiniiVision 2000X Serie] beginnen in einem ähnlichen Preisbereich aber mit wesentlich mehr Features.&lt;br /&gt;
&lt;br /&gt;
==== Vergleichstabelle digitale Tischoszilloskope ====&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Geräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;sortable&amp;quot; id=&amp;quot;digitaloszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Samplerate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auflösung [Bit]&lt;br /&gt;
! Speichertiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Interface&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=78 DSO5102B]&lt;br /&gt;
| [http://www.hantek.com.cn/english/ Hantek]&lt;br /&gt;
| mit sehr viel Glück auf eBay 390 + Zoll + Umsatzsteuer ... 520&lt;br /&gt;
| 2&lt;br /&gt;
| 500/1000&lt;br /&gt;
| 100&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 800 x 480, 7&amp;quot; (die auch genutzt werden)&lt;br /&gt;
| 1 x USB Geräte- und 1 x USB Host-Schnittstelle&lt;br /&gt;
| Beliebt, da es einen Hack auf 200 MHz gibt. Ebenso diverse Hacks an der Hardware. Für ein Niedrigpreis-Produkt übliche und verzeihbare Hardware- und Firmware-Macken. Auch als Tekway DST1102B oder Protek 3110 im Handel.&lt;br /&gt;
|-&lt;br /&gt;
| DSO3062A||Agilent||800||2||500 ||60||8||4k||320x240||USB||weitgehend baugleich mit Rigol DS5000&lt;br /&gt;
|-&lt;br /&gt;
| InfiniiVision 2000 X Serie||Agilent|| 950 - 2600 (MSO) ||2 - 4||1 G/Kanal. Bei Benutzung der Hälfte aller Kanäle 2G/Kanal|| 70 - 200 || 8 || 100k || 800 x 480, 8,5&amp;quot;|| ||Markengeräte mit exzellentem Preis-Leistungs-Verhältnis. Software-Aufrüstbar (Funktionsgenerator, Protokoll-Dekoder, usw.)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.rigolna.com/products_ds1000d.aspx DS1000 Serie]&lt;br /&gt;
| [http://www.rigolna.com/ Rigol]&lt;br /&gt;
| 600 - 1650&lt;br /&gt;
| 2&lt;br /&gt;
| 400/200&amp;lt;BR/&amp;gt;(1/2 Kanäle)&lt;br /&gt;
| 25-100&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB, seriell&lt;br /&gt;
| optional 16-Kanal Logikanalysator&lt;br /&gt;
|-&lt;br /&gt;
| [[Rigol DS1052E]]&lt;br /&gt;
| [http://www.rigolna.com/ Rigol]&lt;br /&gt;
| ab 260 Euro + Zoll + Umsatzsteuer (ebay China)&lt;br /&gt;
| 2&lt;br /&gt;
| 1000/500&amp;lt;BR/&amp;gt;(1/2 Kanäle)&lt;br /&gt;
| 50 (100=DS1102E)&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB, seriell&lt;br /&gt;
| optional 16-Kanal Logikanalysator = DS1052D (DS1102D). Im Netz kursieren diverse, mehr oder weniger ernst zu nehmende Anleitungen, wie man ein DS1052E per Software auf ein DS1102E umrüsten kann.&lt;br /&gt;
|-&lt;br /&gt;
| Owon PDS Serie&lt;br /&gt;
| Owon, alias Xiamen Lilliput Technology Co., Ltd&lt;br /&gt;
| 299,- (PDS5022S); 495,- (PDS6062T); 570,- (PDS7102T)&lt;br /&gt;
| 2&lt;br /&gt;
| 100 - 500&lt;br /&gt;
| 25 - 100&lt;br /&gt;
| 8&lt;br /&gt;
| 5k pro Kanal&lt;br /&gt;
| 640x480&lt;br /&gt;
| USB, seriell incl.&lt;br /&gt;
| Qualität entspricht Preis. Relativ unausgewogenes Verhältnis von Bandbreite zu Samplingrate. Geräte mit einem &#039;S&#039; am Ende der Typenbezeichnung haben ein STN LCD mit niedriger Qualität.&amp;lt;br&amp;gt;nur Real-Time Sampling&lt;br /&gt;
|-&lt;br /&gt;
| [http://owon.com.cn/eng/smartDS.asp Owon SDS Serie]&lt;br /&gt;
| Owon, alias Xiamen Lilliput Technology Co., Ltd&lt;br /&gt;
| 400 (SDS7102)&lt;br /&gt;
| 2&lt;br /&gt;
| 500 M - 3.2 G&lt;br /&gt;
| 60 - 300&lt;br /&gt;
| 8&lt;br /&gt;
| 10M/Kanal&lt;br /&gt;
| 800 x 600, 8&amp;quot;&lt;br /&gt;
| USB Host und Slave, seriell incl., Ethernet, VGA&lt;br /&gt;
| Deutliche Verbesserung gegenüber der alten PDS-Serie. Beeindruckende Speichertiefe (10M) und Bildschirm (8&amp;quot;). Für ein Niedrigpreis-Produkt übliche Hardware- und Firmware-Macken. Neuere Geräte mit verbessertem Hardwaredesign, Firmware wird regelmäßig aktualisiert, menülastige, gewöhnugsbedürftige Bedienung. Akkubetrieb optional&lt;br /&gt;
|-&lt;br /&gt;
| GW Instek GDS-1000 Serie&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 350 - 550&amp;lt;br&amp;gt;(Conrad: 475 - 950)&lt;br /&gt;
| 2&lt;br /&gt;
| 250&lt;br /&gt;
| 25 - 100&lt;br /&gt;
| 8&lt;br /&gt;
| 4k&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB (Geräte-Modus, kein Host-Modus), SD Kartenslot&lt;br /&gt;
| Von Conrad teurer als DSO-4000 Serie erhältlich.&amp;lt;br&amp;gt;[http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
| GW Instek GDS-1000&#039;&#039;&#039;A&#039;&#039;&#039; Serie&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 500 - ?&lt;br /&gt;
| 2&lt;br /&gt;
| bis 1GS/s&lt;br /&gt;
| 60 - 150&lt;br /&gt;
| 8&lt;br /&gt;
| bis 2M&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB (Geräte-Modus, kein Host-Modus), SD Kartenslot&lt;br /&gt;
| [http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Samplerate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auflösung [Bit]&lt;br /&gt;
! Speichertiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Interface&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.instek.com/html/en/products-l.asp?p1sn=17&amp;amp;p2sn=41 GW Instek GDS-2000 Serie]&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 850 - 1800&lt;br /&gt;
| 2 - 4&lt;br /&gt;
| 1000&lt;br /&gt;
| 60 - 200&lt;br /&gt;
| 8&lt;br /&gt;
| max. 5000 (alle Kanäle benutzt) / 25000 (ein Kanal in Benutzung)&lt;br /&gt;
| 320x234&lt;br /&gt;
| Inkl. USB (Geräte-Modus zum PC, zwei weitere USB-Buchsen Host-Modus für eine Speicherkarte oder Drucker), RS-232&lt;br /&gt;
| Weitgehend baugleich mit Conrad Voltcraft DSO-8000 Serie. Vier-Kanal Versionen haben keinen externen Trigger und weniger Trigger-Funktionen.&amp;lt;br&amp;gt;[http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
| TDS-1002B&lt;br /&gt;
| Tektronix&lt;br /&gt;
| 1100&lt;br /&gt;
| 2&lt;br /&gt;
| 1000&lt;br /&gt;
| 60&lt;br /&gt;
| 8&lt;br /&gt;
| 2.5k&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB inkl.&lt;br /&gt;
| verhältnismäßig starkes Rauschen, siehe Text oben&lt;br /&gt;
|-&lt;br /&gt;
| WaveJet 3xx&lt;br /&gt;
| LeCroy &lt;br /&gt;
| 2800..8000 (brutto)&lt;br /&gt;
| 2 oder 4&lt;br /&gt;
| 1000/2000&lt;br /&gt;
| 100/200/350/500&lt;br /&gt;
| 8&lt;br /&gt;
| 500k&lt;br /&gt;
| 640x480&lt;br /&gt;
| USB inkl.&lt;br /&gt;
| verfügbar z.&amp;amp;nbsp;B. bei Farnell&lt;br /&gt;
|-&lt;br /&gt;
| WaveAce Serie&lt;br /&gt;
| LeCroy &lt;br /&gt;
| 1000 - 3500&lt;br /&gt;
| 2&lt;br /&gt;
| 250 - 2000&lt;br /&gt;
| 60 - 300&lt;br /&gt;
| 8&lt;br /&gt;
| 4k - 8k&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB (Geräte- und Host-Modus), RS-232(?)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.dlm2000.de DLM20XX]&lt;br /&gt;
| YOKOGAWA &lt;br /&gt;
| 3300..8000 (brutto)&lt;br /&gt;
| 2 oder 4 (3+1) wobei 1 wahlweise 8Kanal Digital ist&lt;br /&gt;
| 2500 (1250)&lt;br /&gt;
| 200/350/500&lt;br /&gt;
| 8&lt;br /&gt;
| 12,5MPts&lt;br /&gt;
| 1024x768&lt;br /&gt;
| USB, Ethernet, Browsersteuerung inkl.&lt;br /&gt;
| Vertrieb vom Hersteller direkt!&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.uni-trend.com/UT2025B.html UNI-T UT2025B] / Voltcraft DSO-1022 M&lt;br /&gt;
| [http://www.uni-trend.com/ Uni-Trend Group Limited]&lt;br /&gt;
| 290 - 356&lt;br /&gt;
| 2&lt;br /&gt;
| 250&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 512k/Kanal&amp;lt;ref&amp;gt;Uni-Ts Angaben zur Speichertiefe sind mit Vorsicht zu genießen. Seit Jahren wirbelt die Firma mit Begriffen wie &#039;&#039;memory length&#039;&#039;, &#039;&#039; memory depth&#039;&#039;, &#039;&#039;recording length&#039;&#039; und &#039;&#039;saving depth&#039;&#039; herum - jeweils mit unterschiedlichen Werten für das gleiche Oszilloskop. Dabei vermeidet Uni-T Begriffsdefinitionen zu geben. Im Zweifelsfall sollte man mit dem kleinsten Wert aller Angaben rechnen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| 320x240 (Monochrom)&lt;br /&gt;
| USB, RS-232.&lt;br /&gt;
| Als UT2025&#039;&#039;&#039;C&#039;&#039;&#039; mit Farbdisplay. UT2000 Serie 25-200MHz, 2CH 250MSa/s bis 1GSa/s&amp;lt;br&amp;gt;wenig Rauschen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.uni-trend.com/UTD2052CEL.html UTD2052CEL]&lt;br /&gt;
| [http://www.uni-trend.com/ Uni-Trend Group Limited]&lt;br /&gt;
| 369,-&lt;br /&gt;
| 2&lt;br /&gt;
| 1000&lt;br /&gt;
| 50&lt;br /&gt;
| 8&lt;br /&gt;
| 2x600k &#039;&#039;recording length&#039;&#039;;&amp;lt;br&amp;gt;25k &#039;&#039;saving depth&#039;&#039; ein Kanal;&amp;lt;br&amp;gt;12,5k &#039;&#039;memory depth&#039;&#039; zwei Kanäle&amp;lt;ref&amp;gt;Uni-Ts Angaben zur Speichertiefe sind mit Vorsicht zu genießen. Seit Jahren wirbelt die Firma mit Begriffen wie &#039;&#039;memory length&#039;&#039;, &#039;&#039; memory depth&#039;&#039;, &#039;&#039;recording length&#039;&#039; und &#039;&#039;saving depth&#039;&#039; herum - jeweils mit unterschiedlichen Werten für das gleiche Oszilloskop. Dabei vermeidet Uni-T Begriffsdefinitionen zu geben. Im Zweifelsfall sollte man mit dem kleinsten Wert aller Angaben rechnen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| 800 x 480&amp;lt;br&amp;gt;Der Displaycontroller faßt immer 2x2 Pixel zusammen, dadurch reduziert sich die Auflösung real auf 400 x 240&amp;lt;br&amp;gt;(Menü nimmt relativ viel Platz auf dem Bildschirm ein)&lt;br /&gt;
| USB&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HM2008&lt;br /&gt;
| [http://www.hameg.com Hameg]&lt;br /&gt;
| 2000&lt;br /&gt;
| 2&lt;br /&gt;
| 2GSa/s(1CH)1GSa/s(2CH)&lt;br /&gt;
| 200&lt;br /&gt;
| 8&lt;br /&gt;
| 4048k&lt;br /&gt;
| Röhre 8x10cm&lt;br /&gt;
| USB für Speicherstick (vorne), USB/RS232 für PC (hinten), &lt;br /&gt;
| 4 Logikkanäle nachrüstbar, Ethernet/USB nachrüstbar&lt;br /&gt;
|-&lt;br /&gt;
| PT 1200&lt;br /&gt;
| [http://www.PEAKTECH.de Peaktech]&lt;br /&gt;
| ca. 360&lt;br /&gt;
| 2&lt;br /&gt;
| 100MSa/s(1CH)100MSa/s(2CH)&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 6k pro Kanal&lt;br /&gt;
| Farb LCD 7,8&amp;quot; 640x480&lt;br /&gt;
| USB für PC (hinten) &lt;br /&gt;
| Im Original vermutlich ein Owon PDS5022S. Optional: Akkupack 7,4 V ~ 8000 mA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Marken, die gelegentlich auf dem deutschen Markt auftauchen, häufig über eBay, sind &lt;br /&gt;
&lt;br /&gt;
* GAOtek&lt;br /&gt;
* Hangzhou Jingce (JC)&lt;br /&gt;
* Tonghui&lt;br /&gt;
* Ypioneer&lt;br /&gt;
* Jiangsu Lvyang&lt;br /&gt;
* Siglent (Zweitmarke von Atten)&lt;br /&gt;
&lt;br /&gt;
Über deren Qualität hört man wenig oder gar nichts.&lt;br /&gt;
&lt;br /&gt;
=== PC-Oszilloskope ===&lt;br /&gt;
==== PC-Zusätze ====&lt;br /&gt;
===== Allgemeines &amp;amp; Beachtenswertes =====&lt;br /&gt;
&lt;br /&gt;
PC-Oszilloskope / PC-Zusätze sind im Prinzip digitale Speicheroszilloskope, mit der Besonderheit, dass sie die Daten nicht selbst anzeigen, sondern an einen PC übermitteln. Beim Kauf eines PC-Oszilloskops sollte man besonders vorsichtig sein, da viele Angebote irreführende Informationen enthalten. Sehr beliebt ist z.&amp;amp;nbsp;B. die Werbung mit der Analogbandbreite, also die Bandbreite die der Analogteil der Schaltung (Eingangsverstärker) verarbeiten kann. Wenn hier 100 MHz angegeben sind bedeutet das aber nicht, dass sich auch wirklich Signale bis 100 MHz darstellen lassen; wenn der Wandler nur mit 40 MS/s abtastet ist das Oszilloskop gerade noch bis 4 MHz verwendbar. Ebenso sollte man nur die Echtzeit- oder Realtime-Abtastrate beachten, eine manchmal ebenfalls angegebene &amp;quot;Äquivalent-Abtastrate&amp;quot; ist nur bei periodischen Signalen zu gebrauchen und damit im Umfeld von Mikrocontrollern meist wertlos.&lt;br /&gt;
&lt;br /&gt;
Die Wahl zwischen einem Tischoszilloskop und einem PC-Zusatz ist nicht nur eine Geld-, Leistungs- oder Qualitätsfrage. Ein Tischgerät lässt sich anders bedienen (echte Knöpfe, sicherer Stand) und belegt nicht den PC oder Laptop. Erfahrene Entwickler ziehen ein separates Gerät einem PC-Zusatz vor. Zum Teil ist dies eine Generationsfrage.&lt;br /&gt;
&lt;br /&gt;
Hinzu kommt, dass billige PC-Oszilloskope meist keine galvanische Trennung an ihrer USB-Schnittstelle besitzen. Ein Fehler bei einer Messung kann daher nicht nur das Oszilloskop, sondern gleich den PC mit beschädigen. Das gleiche Problem kann man übrigens auch bei einfachen Tischoszilloskopen mit PC-Schnittstelle haben. Allerdings kann man Tischgeräte auch ohne die PC-Verbindung betreiben, PC-Oszilloskope nicht.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wird geraten, das Oszilloskop, egal ob Tischgerät oder PC-Zusatz, immer über einen &amp;quot;self powered&amp;quot; USB-Hub (einer mit eigenem Netzteil) mit dem PC zu verbinden. Ob ein solcher Hub als Schutzmaßnahme geeignet ist, besonders zum Personenschutz, sei dahingestellt. Schaden sollte er nicht.&lt;br /&gt;
&lt;br /&gt;
Besonders zu beachten ist die PC-Software. Nicht nur, ob sie zum Zeitpunkt des Kaufs wenigstens grundsätzlichen Ansprüchen genügt, sondern auch, ob der Hersteller vermutlich willens und in der Lage ist, die Software über viele Jahre zu warten. Stichwort Investitionssicherheit. Ohne Wartung kann eine Inkompatibilität in der Software zum nächste Windows Service-Pack oder zur nächste Windows-Version das Gerät völlig entwerten.&lt;br /&gt;
&lt;br /&gt;
Leider ist es so, dass es fast keine freie [[Oszilloskop#Software|Oszilloskopsoftware]] gibt. Die Protokolle zwischen Oszilloskop-Vorsätzen und Computer sind meist proprietär, und selten hat sich ein Entwickler freier Software die Mühe gemacht, ein Protokoll zu entschlüsseln. Noch seltener ist es, dass auf dieser Basis eine brauchbare oder gar gute Software geschrieben wurde. So ist ein Ausweichen auf freie Software kaum möglich, sollte der Hersteller die Wartung aufgeben. Man ist im Normalfall auf Gedeih und Verderb dem Hersteller ausgeliefert.&lt;br /&gt;
&lt;br /&gt;
===== Vergleichstabelle PC-Zusätze =====&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Geräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;sortable&amp;quot; id=&amp;quot;pczusatzoszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Sample&amp;amp;shy;rate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Band&amp;amp;shy;breite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auf&amp;amp;shy;lösung [Bit]&lt;br /&gt;
! Speicher&amp;amp;shy;tiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Inter&amp;amp;shy;face&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.elandigitalsystems.com/support/usbtmfaq/software.php USBscope50]&lt;br /&gt;
| Elan Digital Systems / dt. Vertrieb Hacker&lt;br /&gt;
| 249&lt;br /&gt;
| 1 (-4)&lt;br /&gt;
| 50 / 1000&lt;br /&gt;
| 10 / 75&lt;br /&gt;
| 8&lt;br /&gt;
| 3k pro Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| CAT II, 300V galv. Trennung zu USB, OpenSource SDK, Java, Linux, LabView&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope PS 2104&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 185&lt;br /&gt;
| 1&lt;br /&gt;
| 50&lt;br /&gt;
| 10&lt;br /&gt;
| 8&lt;br /&gt;
| 8K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| Spektralanalyse und Voltmeter in Software.&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope PS 2105&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 290&lt;br /&gt;
| 1&lt;br /&gt;
| 100&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 24K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| Spektralanalyse und Voltmeter in Software.&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope 2205&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 350&lt;br /&gt;
| 2&lt;br /&gt;
| 200&lt;br /&gt;
| 25&lt;br /&gt;
| 8 - 12&lt;br /&gt;
| 16K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB &lt;br /&gt;
| Kleiner Arbitrary Waveform Generator eingebaut.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=62 DSO-2090 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.&lt;br /&gt;
| 200&lt;br /&gt;
| 2&lt;br /&gt;
| 1 Kanal: 100 / 2 Kanäle: 50&lt;br /&gt;
| 40&lt;br /&gt;
| 8&lt;br /&gt;
| 1 Kanal: 64K / 2 Kanäle: 32K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB &lt;br /&gt;
| Wenige Vorteile gegenüber einem Tischgerät. Analogbandbreite bei der Samplingrate nicht ausnutzbar. Kleiner Eingangsspannungsbereich. Unter diversen anderen Namen erhältlich.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=63 DSO-2150 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.&lt;br /&gt;
| 200&lt;br /&gt;
| 2&lt;br /&gt;
| max. 150&lt;br /&gt;
| 60&lt;br /&gt;
| 8&lt;br /&gt;
| 10K-32K/Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| .&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=64 DSO-2250 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.  &lt;br /&gt;
| 220&lt;br /&gt;
| 2&lt;br /&gt;
| max. 250&lt;br /&gt;
| 100&lt;br /&gt;
| 8&lt;br /&gt;
| 10K-512K/Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| .&lt;br /&gt;
|-&lt;br /&gt;
| Mephisto Scope 1 (UM202)&lt;br /&gt;
| Meilhaus&lt;br /&gt;
| 333&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 16&lt;br /&gt;
| 256K&lt;br /&gt;
| ..&lt;br /&gt;
| USB&lt;br /&gt;
| 5 in 1,&lt;br /&gt;
Oszilloskop,&lt;br /&gt;
Logik-Analysator,&lt;br /&gt;
Voltmeter,&lt;br /&gt;
Datenlogger analog und digital,&lt;br /&gt;
Digital-I/O&lt;br /&gt;
|-&lt;br /&gt;
| MSO-19&lt;br /&gt;
| Link Instruments Inc.&lt;br /&gt;
| 172&lt;br /&gt;
| 1&lt;br /&gt;
| 200&lt;br /&gt;
| 60&lt;br /&gt;
| ??&lt;br /&gt;
| 1K&lt;br /&gt;
| ..&lt;br /&gt;
| USB&lt;br /&gt;
|&lt;br /&gt;
Oszilloskop,&lt;br /&gt;
Logik-Analysator,&lt;br /&gt;
Pattern Generator,&lt;br /&gt;
TDR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Soundkarten-Oszilloskope ====&lt;br /&gt;
[[Bild:Soundoszi.JPG|thumb|right|300px|Soundkarten Oszilloskop]]&lt;br /&gt;
Wem ein wirklich einfaches Oszilloskop für kleine Frequenzen (bis etwa 20 kHz) ausreicht, bspw. um die Kommunikation am I2C-Bus zu analysieren, kann dazu die Soundkarte des PC benutzen.&lt;br /&gt;
Allerdings eignet sich eine Soundkarte nicht dazu, Gleichspannungen zu messen, zu niederfrequente Signale können daher nicht damit erfasst werden: Im Screenshot nebenan erkennt man das z.&amp;amp;nbsp;B. an der fallenden Gerade am Schluss (obwohl der tatsächliche Signalpegel konstant oben bleibt). Auch ist hier besondere Vorsicht geboten, da Soundkarten nur für geringe Spannungen ausgelegt sind und bei einer zu hohen Eingangsspannung möglicherweise der ganze PC beschädigt wird. Daher ist eine Vorschaltung mit Spannungsbegrenzung (ca 0,7V) nötig. &lt;br /&gt;
&lt;br /&gt;
Der Vorteil der Soundkartennutzung ist, dass es sich dank des PCs um eine Art  Speicheroszilloskop handelt und die Daten zum Beispiel in Excel analysiert werden können.&lt;br /&gt;
&lt;br /&gt;
* [http://www.scheidig.de/Deutsch/Download/SpekOszi/info.htm Hardy u. Karola Scheidig] verschiedene Programme zum Messen mit der Soundkarte.&lt;br /&gt;
* [http://www.sillanumsoft.org/ Visual Analyser] von Alfredo Accattatis und der University of Rome Tor Vergata, &amp;quot;Donateware&amp;quot; &lt;br /&gt;
* [http://www.zeitnitz.de/Christian/scope_en Soundcard Oscilloscope für Windows] von Christian Zeitnitz, kostenlos für Privatanwendung&lt;br /&gt;
* [http://www.qsl.net/dl4yhf/spectra1.html Spectrum Lab von DL4YHF]&lt;br /&gt;
* [http://w5big.com/spectrogram.htm Spectrogram] von R.S. Horne, ältere Version kostenlos&lt;br /&gt;
* [http://www.audiotester.de/ Audiotester 30-Tage-Version kostenlos]&lt;br /&gt;
* [http://www.dasylab.com/ DasyLab] Eingeschränkte Version (Soundkarte und serielle Schnittstelle) als Beilage zum Buch &amp;quot;Signale-Prozesse-Systeme&amp;quot; ISBN 9783642018633&lt;br /&gt;
* [http://www.zelscope.com/ Zelscope] von Constantin Zeldovich 14-Tage Evaluationsversion&lt;br /&gt;
* [http://www.dxzone.com/catalog/Software/Spectrum_analyzers/ Linksammlung]&lt;br /&gt;
==== Grafikkarten-Oszilloskope ====&lt;br /&gt;
Videokarten, die über einen analogen Input verfügen, stellen ebenfalls eine Alternative zu käuflichen Oszilloskopen dar, da sie 3kanalig Frequenzen bis rund 180 MHz verarbeiten können. Die digitale Auflösung liegt meist bei 8 Bit maximal, was für einfache Anzeigen jedoch reicht, wenn die Aussteuerung entsprechend ist. Durch Übersampeln lässt sich die Auflösung wie gehabt steigern, indem man z.B. je 4 Werte softwareseitig zusammenfasst und damit bis zu 2 Bit an Auflösung gewinnt. Bei 16 werten kann man in der Regel statistische 2-3 Bit erwarten und erhält eine Güte von ca 10 Bit bei 10MHz.&lt;br /&gt;
&lt;br /&gt;
=== Selbstbau ===&lt;br /&gt;
&lt;br /&gt;
Selbstbau eines solchen Gerätes erspart wie fast immer in solchen Fällen kein Geld, sofern man nicht eine Spezialfunktion benötigt, die im Markt nicht beschaffbar ist. Der Spaß liegt als wieder im Bauen selbst.&lt;br /&gt;
&lt;br /&gt;
Es gibt diverse preiswerte Bausätze für Spielzeug-Oszilloskope. Die Ergebnisse nach dem Zusammenbau sind als Oszilloskop wenig brauchbar. &lt;br /&gt;
&lt;br /&gt;
Daneben findet man nur sehr wenige Selbstbau-Projekte deren Ergebnisse überzeugen. Einige interessante Projekte sind [http://www.mikrocontroller.net/topic/228997?goto=new#2308320]n und [http://www.ssalewski.de/DAD.html.de]. Dazu sei allerdings gesagt, dass der Aufwand an Material und Messmitteln schnell die Kosten für ein fertiges Oszilloskop überschreitet.&lt;br /&gt;
&lt;br /&gt;
=== Umbau ===&lt;br /&gt;
Sofern man tatsächlich etwas benötigt, was nicht käuflich zu erwerben ist, kann der Kauf und Umbau eines verhandenen Gerätes sinnvoll sein. &lt;br /&gt;
&lt;br /&gt;
Auf eBay werden immer noch die Oszilloskope der früheren Firma Wittig (heute Welec), wie zum Beispiel das W2012A, angeboten. Als Alternative zu der fehlerträchtigen Orginalfirmware ist mittlerweile eine Open-Source Variante verfügbar die kontinuierlich weiterentwickelt wird. Ebenfalls wird an Hardware Erweiterungen gearbeitet die die Qualität des Oszilloskops deutlich steigern. Wer sich nicht sicher ist ob das Gerät seinen Ansprüchen genügt sollte bei den Entwicklern nachfragen. [http://sourceforge.net/apps/trac/welecw2000a/wiki] Auch hier ist der Weg das Ziel.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR_Softwarepool#Oszilloskop|AVR Softwarepool: Oszilloskop]]&lt;br /&gt;
* [[Einfaches Oszilloskop mit Bascom-AVR]]&lt;br /&gt;
* [[USB_Oszilloskop]]&lt;br /&gt;
* [[Logic_Analyzer]]&lt;br /&gt;
* [[LCS-1M - Ein einfaches, preiswertes, mikrokontrollergesteuertes Zweikanal-Oszilloskop zum Selberbauen]] ([[Picaxe]])&lt;br /&gt;
&lt;br /&gt;
== Links &amp;amp; Literatur ==&lt;br /&gt;
* [http://www.elektronikpraxis.vogel.de/index.cfm?pid=9681 Online-Dossier Grundlagen digitaler Oszilloskope. ] Veröffentlicht auf Elektronikpraxis online&lt;br /&gt;
* [http://www.tek.com/Measurement/App_Notes/XYZs/03W_8605_3.pdf XYZs of Oscilloscopes Primer]. Tektronix 03W-8605-3. 20091. Grundlagen digitaler Oszilloskope und das messen mit ihnen, wobei die Tektronix-Produktpalette im Vordergrund steht.  &lt;br /&gt;
* [http://www.tek.com/Measurement/App_Notes/ABCsProbes/60W_6053_9.pdf ABCs of Probes Primer]. Tektronix 60W-6053-9. 2009. Die Grundlagen von Tastköpfen, natürlich am Beispiel von Tektronixs Tastköpfen.&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/1?filter=oszi*+-oszillator Forum-Beiträge zum Thema Oszilloskop] (Kaufberatung, Anwendung)&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/3?filter=oszi*+-oszillator Beiträge im Markt-Forum]&lt;br /&gt;
* [http://www.virtuelles-oszilloskop.de/ Ein virtuelles interaktives Oszilloskop] ala HAMEG HM203-6 20 MHz zum Üben (Seite auf [http://www.virtuelles-oszilloskop.com Englisch])&lt;br /&gt;
* [http://www.eosystems.ro/eoscope/eoscope_en.htm Selbstbau-DSO 40MSPS]&lt;br /&gt;
* [http://www.sigcon.com/Pubs/straight/probes.htm Probing High-Speed Digital Designs], Originally published in [http://www.elecdesign.com/ Electronic Design Magazine], March, 1997&lt;br /&gt;
* [http://hackedgadgets.com/2007/12/10/oscilloscope-tutorials/ Oscilloscope Tutorials] Linkliste bei hackedgadgets.com&lt;br /&gt;
* [http://www.eevblog.com/2011/03/30/eevblog-159-oscilloscope-trigger-holdoff-tutorial/ EEVBlog #159] Videotutorial von Dave Jones zu &#039;&#039;&#039;Trigger Holdoff&#039;&#039;&#039;, (engl.)&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/167705#1602827 WinXP Software für OsziFox/ProbeScope] von  Micha B. (chameo)&lt;br /&gt;
&lt;br /&gt;
* [http://users.physik.fu-berlin.de/~jtt/fsc2.phtml fsc2] is a program running under GNU/Linux for controlling spectrometers. Supported devices include digitizing oscilloscopes too:&lt;br /&gt;
** Tektronix Digitizing Oscilloscope TDS520, TDS520A, TDS520C, TDS540, TDS744A and TDS754A&lt;br /&gt;
** LeCroy Digitizing Oscilloscope 9400, 9410, 9420, 9424, 9424e and 9450(A)&lt;br /&gt;
** LeCroy Digitizing Oscilloscope Waverunner and Waverunner-2 (LT224, LT 262, LT264, LT342, LT344, LT354, LT362, LT364, LT372, LT374, LT584, 44(M)Xi, 62X1, 64(M)Xi, 104(M)Xi, 204(M)Xi)&lt;br /&gt;
** LeCroy Digitizing Oscilloscope WaveSurfer (422, 424, 432, 434, 452 and 454)&lt;br /&gt;
&lt;br /&gt;
* [http://xoscope.sourceforge.net/ xoscope, oscope] is a digital oscilloscope using input from a sound card or EsounD and/or a ProbeScope/osziFOX and Bitscope hardware. Includes 8 signal displays, variable time scale, math,memory, measurements, and file save/load. (Linux, GPL)&lt;br /&gt;
&lt;br /&gt;
* [http://www.mtoussaint.de/qtdso.html QtDSO] is a frontend for the Velleman PCS64i digital oscilloscope (Anm.: Velleman nicht mehr unterstützt) It provides a fully featured oscillocope mode (including XY  plot and math) and a highly configurable spectrum analyzer mode. Für &#039;&#039;&#039;Digitalmultimeter&#039;&#039;&#039; gibt es vom gleichen Autor [http://www.mtoussaint.de/qtdmm.html QtDMM] und [http://www.mtoussaint.de/qtdmm2.html QtDMM2].&lt;br /&gt;
&lt;br /&gt;
* [http://www.eig.ch/fr/laboratoires/systemes-numeriques/projets/osqoop-l-oscilloscope-libre/index.html Osqoop] est un oscilloscope logiciel sous licence libre. Il permet de travailler sur un nombre arbitraire de canaux et des acquisitions de longue durée. Wiki description: [http://gitorious.org/osqoop Osqoop] is a multi-platform open source software oscilloscope based on Qt 4. It connects to various hardware data sources such as the sound input or a dedicated USB board.&lt;br /&gt;
&lt;br /&gt;
*[http://code.google.com/p/gds2000tools/ gds2000tools] ist eine Linux-Software für GW-Instek GDS-2000 und andere GW-Instek Oszilloskope.&lt;br /&gt;
&lt;br /&gt;
* [https://code.google.com/p/xoscillo/ Xoscillo] - A software oscilloscope that acquires data using an Arduino or a Parallax (more platforms to come). (Lizenz: CC-BY-NC-SA 3.0; Windows and Linux (needs mono))&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/oscope2100/ Oscope 2100] Linux software für Hantek DSO-2100.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/openhantek/ OpenHantek] Linux Software für Hantek (Voltcraft/Darkwire/Protek/Acetech) DSO-2090.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/dsoda/ Digital Soda] DSO-2250 Software.&lt;br /&gt;
&lt;br /&gt;
* [http://owondriver.sourceforge.net/ Owon Driver, Ownon Dump] Linux-Treiber für Owon-Oszilloskope.&lt;br /&gt;
&lt;br /&gt;
* [http://foss.doredevelopment.dk/wiki/Lxi-control Lxi-Control] Kommandozeilen-Applikation zur Fernsteuerung von Geräten mit LXI-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://gpib-utils.sourceforge.net/ gpib-util] Linux Kommandozeilen-Applikation, unterstützt diverse Oszilloskope (und andere Geräte) mit GPIB-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://optics.eee.nottingham.ac.uk/vxi11/ VXI11] Bibliothek und Programme für Geräte mit VXI-11 Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/wfmreader/ Linux WFM Datenformat-Leser].&lt;br /&gt;
&lt;br /&gt;
=== Datenauswertung ===&lt;br /&gt;
&lt;br /&gt;
Bei Oszilloskopen (DSOs), die es erlauben, die gemessenen Daten zu einem PC zu übertragen, kann man die Messwerte auf dem PC weiter auswerten. Zum Beispiel ein Signal demodulieren, filtern oder dekodieren. Grundsätzlich ist die Auswertung in jeder Programmiersprache möglich. Programmiersprachen für numerische Berechnungen eignen sich jedoch besonders.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mathworks.com Matlab] und Clones wie [http://www.scilab.org/ SciLab] oder [http://www.gnu.org/software/octave/ GNU Octave]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mathworks.com/matlabcentral/fileexchange/?term=Oscilloscope Matlabcentral Fileexchange, Suche nach &#039;&#039;Oscilloscope&#039;&#039;] Auf Matlabcentral Fileexchange finden sich auch MatLab Lese- und Auswertungsfunktionen für diverse Oszilloskope. Hinweis: Die von MatLab für die Kommunikation mit einem Oszilloskop verwendeten Toolboxen und Funktionen fehlen häufig bei den Clones wie GNU Octave. Man ist hier auf das original MatLab angewiesen.&lt;br /&gt;
&lt;br /&gt;
* Eines Ingenieurs angeblich unwürdig&amp;lt;ref&amp;gt;Es ist sehr einfach Fehler in Tabellenkalkulationen zu machen, die typischerweise lange unentdeckt bleiben. [http://www.eusprig.org/ Untersuchungen] haben gezeigt, dass bereits dann bis zu 90% aller Tabellenkalkulationsblätter fehlerhaft sind, wenn es nur um einfache mathematische Grundoperationen (Addieren, Subtrahieren, Multiplizieren, Dividieren) geht.&amp;lt;/ref&amp;gt; sind Microsoft Excel oder andere Tabellenkalkulationen. Trotzdem sind sie zur Datenauswertung populär und auch geeignet, wenn sie richtig gehandhabt werden.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Oszilloskope und Analyzer| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Oszilloskop&amp;diff=70416</id>
		<title>Oszilloskop</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Oszilloskop&amp;diff=70416"/>
		<updated>2012-12-31T10:15:19Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Tasköpfe richtig benutzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein &#039;&#039;&#039;Oszilloskop&#039;&#039;&#039; dient zur grafischen Darstellung des Spannungsverlaufs eines oder mehrerer elektischen Signale in einem einstellbaren Zeitfenster. Es ist das wichtigste Werkzeug der Elektotechniker.&lt;br /&gt;
&lt;br /&gt;
== Anfragen bezüglich Kaufberatung im Forum ==&lt;br /&gt;
&lt;br /&gt;
=== Kritik an den Anfragen ===&lt;br /&gt;
Im Forum finden sich regelmäßig Anfragen nach individueller Beratung zum Oszilloskopkauf. Die Anzahl solcher Oszilloskop-Threads hat schon lange die 1000 überschritten. Sie sind langweilig, eine Qual und oft unnütz - besonders dann, wenn sich der Fragesteller offebar nicht mit den Grundlagen eines Oszilloskops und den wichtigsten Kennzahlen bekanntgemacht hat oder nicht einaml weiß, was er überhaupt messen will. Auch, wenn ein Fragesteller ein paar Grundlagen besitzt, hat er anscheinend meistens keine Lust, verständlich darzustellen, was er genau will und lässt sich stattdessen umstädnlich befragen.&lt;br /&gt;
&lt;br /&gt;
Den meisten regelmäßigen Forumsteilnehmern ist daher gründlich die Lust an Oszilloskop-Threads vergangen. Dort &amp;quot;diskutieren&amp;quot; eigentlich nur noch Trolle und anonyme Gäste, die oft genug nur Werbung über Billigangebote über die x-te Ausgabe einer billigen, als Oszilloskop bezeichneten Plastikkiste, einem suupertollen eBay-Schnäppchen oder angeblicher asiatischer Wundertüten.&lt;br /&gt;
&lt;br /&gt;
==== Links für Anfänger ====&lt;br /&gt;
Wer sich ernsthafte Beratung wüsncht und eine &amp;quot;sanfte&amp;quot; Einführung in das Thema sucht, kann sich die englischsprachige YouTube-Videos von AfroTechMods anschauen:&lt;br /&gt;
&lt;br /&gt;
[http://afrotechmods.com/tutorials/2011/11/27/oscilloscope-tutorials/ http://afrotechmods.com/tutorials/2011/11/27/oscilloscope-tutorials]&lt;br /&gt;
&lt;br /&gt;
Dazu passt auch sein Tutorial über Funktionsgeneratoren:&lt;br /&gt;
[http://afrotechmods.com/tutorials/2011/11/27/function-generator-tutorial/ http://afrotechmods.com/tutorials/2011/11/27/function-generator-tutorial].&lt;br /&gt;
&lt;br /&gt;
===Maßgeschneidert?===&lt;br /&gt;
Besonders die immer wiederkehrende Forderung, dass es unbedingt das maßgeschneiderte Oszilloskop zum Superpreis genau für den Fragesteller geben muss, ist sinnlos. Wer mit diesem Anspruch kommt, der wird enttäuscht werden. Das gibt es nicht, und gute Oszilloskope kosten Geld, da qualitativ hochwertige Geräte keine Massenware sind. Lediglich billige Geräte werden in grosser Zahl hergestellt und sind entsprechend preiswert, diese sind jedoch für anspruchsvoll Anweder meist untauglich, da genau an den wichtigen Dingen gespart und nur auf Optik gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
===Gebraucht ist auch keine Lösung===&lt;br /&gt;
Es gibt eine Reihe von gebrauchte Oszilloskopen- vorwiegend im Internet, von den die meisten billig sind. Da niemand per Ferndiagnose oder Blick in eine Glaskugel in ein gebrauchtes Gerät hineinsehen und etwas über den Zustand berichten kann, besteht immer das typische Risiko eines Kaufs asu zweiter Hand, das jeder selber tragen muss. Niemand im Forum kann und wird das jemandem abnehmen. &lt;br /&gt;
&lt;br /&gt;
Was man allgemein sagen kann, ist, dass man besser die Finger von Angeboten lassen sollte, wenn der Verkäufer mit den übliche Phrasen wie, &amp;quot;Dachbodenfund&amp;quot;, &amp;quot;Keine Ahnung davon&amp;quot;, &amp;quot;Keine Möglichkeit zu testen&amp;quot; kommt. Vorsicht ist auch bei dem beliebten Trick &amp;quot;Funktioniert, aber aus rechtlichen Gründen (Garantie) verkaufe ich es als defekt, für Bastler&amp;quot; gegeben. Man muss sich immer vor Augen führen, dass niemand ein gutes und wertvolles Gerät dieser Art zum Billigpreis abgegeben wird und dies schon garnicht über Internetplattformen, wo es kaum einen Markt für Topgeräte gibt. Gute gebrauchte Geräte gibt es von privat daher nur auf Elektronikbörsen zu entsprechenden Preisen.&lt;br /&gt;
&lt;br /&gt;
Es gibt demgemäss natürlich auch Geräte von seriösen Gebrauchthändlern mit Garantie - allerdings ebenso zu derartigen Preisen, dass dagegen der Kauf eines aktuellen Neugeräts ebenfalls attraktiv erscheint.&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen? ===&lt;br /&gt;
Eine Vorgehensweise, von der man auch abraten muss, ist die Frage nach Erfahrungen anderer Mitglieder! Die meisten Antworten kommen von Trollen und Posern, die eigentlich keine Ahnung haben. Die einen wollen als anonymer Gast mal wieder trollen, die anderen wollen nur mitteilen, dass Amateurfunker sowieso die besseren Menschen sind. Andere wiederum haben &amp;quot;zufällig&amp;quot; gerade *das* richtige Oszilloskop zu verkaufen. Dann gibt es noch die, die sich ihr eigenes Oszilloskop schönreden wollen, ihren Vorurteilen oder ihrem Fetisch frönen. Zum Beispiel&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Kauf ja kein Gerät aus Asien!&#039;&#039;&lt;br /&gt;
* &#039;&#039;Unter LeCroy|Agilent|Yokogawa|Tektronix geht gar nichts!&#039;&#039;&lt;br /&gt;
* &#039;&#039;Nur Gebrauchtgeräte lohnen sich!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hinweise wie &#039;&#039;mein vor 30 Jahren gekauftes Markengerät funktioniert noch heute tadellos&#039;&#039; sind ebenfalls ziemlich sinnlos. Der Hersteller wird dieses Gerät gar nicht mehr anbieten und er wird schon gar nicht mehr mit der gleichen Qualität fertigen, wie vor 30 Jahren. Dazu ist der Kostendruck zu hoch und Technologien haben sich geändert. Selten sind die neuen Technologien heute so robust, wie die vor 30 Jahren.&lt;br /&gt;
&lt;br /&gt;
Als Unerfahrener kann man daher aus den Antworten nicht herauslesen, ob sie wirklich auf Erfahrung beruhen. Man braucht also gewissermassen selbst Erfahrung, um die Erfahrungsberichte anderer richtig einzuordnen.&lt;br /&gt;
&lt;br /&gt;
Ein anderer Aspekt aus alten Threads ist, dass viele Fragesteller die Erfahrungen gar nicht zur Kenntnis nehmen wollen, wenn sie der eigenen Wunschvorstellung widersprechen. So etwas nennt man beratungsresistent. Da stellt sich schon mal heraus, dass der Fragesteller schon längst ein Gerät bestellt hat und jetzt gebauchpinselt werden will. Eine Zeitverschwendung für alle.&lt;br /&gt;
&lt;br /&gt;
Erfahrungen mit eigenen Geräten lassen bedingt den Schluss zu, welche&lt;br /&gt;
Marken grundsätzlich empfehlenswert sind, weil dort gegebenenfalls mehr auf Qualität geachtet wird.&lt;br /&gt;
&lt;br /&gt;
=== Zusatzkosten beim Kauf im Ausland ===&lt;br /&gt;
Beim Kauf eines scheinbar preisgünstigen Gerätes im Ausland ist Folgendes zu beachten:&lt;br /&gt;
&lt;br /&gt;
Versandkosten, Einfuhrumsatzsteuer, Zoll, e.v. Gebühr für den Paketdienst und die Gebühren für die  Währungsumrechnung sind Kosten, die bei vielen vermeintlichen Internet-Schnäppchen aus dem Ausland (besonders Nicht-EU) noch hinzukommen und bei plakativen Überschriften gerne &amp;quot;vergessen&amp;quot; oder ignoriert werden. Oft wird sich das Angebot selbst schöngeredet. Zudem sind das nicht einmmal alle Kosten, die man zu tragen hat. Zum Beispiel können für manche Zahlungsweisen weitere Gebühren hinzukommen oder Lagergebühren im Zolllager.&lt;br /&gt;
&lt;br /&gt;
Wer nicht vorher rechnet, hat nachher schnell mehr bezahlt als bei einem lokalen Händler. Siehe auch [http://www.zoll.de Zoll].&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich ist der deutsche Zoll nicht doof. Besonders wenn ein asiatischer Versender auf ein Paket bei der Zollerklärung &amp;quot;Geschenk, Wert $40&amp;quot; schreibt, dann kann man fast sicher sein, dass der deutsche Zoll sich das genauer ansieht. Die Ware landet im Zolllager und man darf den Kaufpreis nachweisen.&lt;br /&gt;
&lt;br /&gt;
Ebenso glaubt der Zoll nicht an kostenlosen Versand und nimmt regelmäßig ziemlich saftige Versandgebühren an, die dann versteuert werden&amp;lt;ref&amp;gt;Passiert das, kann man gegen den Steuerbescheid Widerspruch einlegen. Wie das geht sollte in einer Rechtsbehelfsbelehrung auf dem Steuerbescheid stehen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nochmal zum Mitschreiben, besonders bei Käufen von außerhalb des Zollgebiets der EU sollte man sich vorher mindestens über die folgenden Kosten informieren:&lt;br /&gt;
&lt;br /&gt;
* Versandkosten oder was der Zoll sich bei kostenlosem Versand ausdenkt&lt;br /&gt;
* Versandart (was durch die Post importiert wird, wird vom Zoll anders abgefertigt, als das, was von einem Paketdienst importiert wird)&lt;br /&gt;
* Einfuhrumsatzsteuer&lt;br /&gt;
* Zoll (bei der Warengruppe, in die Oszilloskope gehören, ist der zur Zeit wohl 0%. Das kann sich natürlich ändern)&lt;br /&gt;
* Gebühr Paketdienst. Paketdienste lassen sich die Zollanmeldung und den Papierkrieg zum Teil mit saftigen Gebühren bezahlen. Die sind nicht in den Versandkosten enthalten.&lt;br /&gt;
* Gebühr für Währungsumrechnung&lt;br /&gt;
* Bankgebühr für Zahlung ins Ausland&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Ein Kauf eines PC-basierten Messinstruments mit Oszilloskopfunktion, das in Deutschland nicht erhältlich ist und einen Kaufwert von 719,- US Dollar in Taiwan hatte, wurde aufgrund der Umrechung mit einem Wert von 589,- Euro veranschlagt. An UST kamen 112,- und an Zollgebühren 46,- Euro hinzu. Zusammen mit dem Versand und Bankgebühren kostete das Gerät insgesamt 790,- Euro. Andere Geräte des Herstellers, die in Deutschland zu beschaffen sind, kosten als deutsches Exemplar kaum mehr, dafür hat man die volle Verbrauchergarantie. Diese sind also in der Regel vorzuziehen, wenn das Gerät in Deutschland beschaffbar ist.&lt;br /&gt;
&lt;br /&gt;
===Spielzeuge aller Art===&lt;br /&gt;
Offensichtlich scheint es gerade Mode zu werden, einen schwachbrüstigen Analog-Digital-Konverter hinter eine eher zufällig gewählte, krumme analoge Eingangsschaltung zu klemmen und an einen Mikrocontroller mit Graphik-LCD anzuschließen.  Das ganze wird als digitales Speicheroszilloskop (DSO) zum Sonderpreis verkauft. Je nach Hersteller wird so ein Gerät komplett ohne Gehäuse geliefert, was mit Hinblick auf die Sicherheit sehr fragwürdig ist, oder es kommt in einem lustig aufgemachten Plastikgehäuse in MP3-Player-Format daher, das auch keine großartige Isolation bietet. Hinzu kommen eindruckschindene Namen und Logos, die die Modernität und Qualität suggerieren sollen, oft noch unterstreichen durch die Nutzung von Open-Source-Kompatibiltät.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zu richtigen Oszilloskopen sind dies leider nur Spielzeuge und es nervt, diese Dinger immer wieder im Forum als das &amp;quot;Beste seit Erfindung von geschnitten Brot&amp;quot; vorgestellt zu bekommen. Ein Blick auf die technischen Daten dieser &amp;quot;Oszilloskope&amp;quot; (sofern die Daten überhaupt angegeben werden) reicht, um festzustellen, dass man ein Spielzeug vor sich hat. Schön für den, der spielen will, schlecht für den, der sicher messen will.&lt;br /&gt;
&lt;br /&gt;
Ebenso verrät ein Blick auf die Schaltung des Analogeingangs, ob man Qualität vor sich hat. Fehlende Spannungsfestigkeit und fehlende Frequenzkompensation des Eingangsverstärkers sind sichere Zeichen für Schund. Wenn es eine Verbindung zum PC gibt, aber diese nicht isoliert ist, ist das ein weiteres Zeichen für Scheinqualität.&lt;br /&gt;
&lt;br /&gt;
In [http://welecw2000a.sourceforge.net/docs/Hardware/GW_Instek_GDS-1152A.pdf] kann man das Innenleben eines richtigen DSO bewundern. Man vergleiche dies mit den Innenleben der Spielzeug-&amp;quot;DSO&amp;quot;s.&lt;br /&gt;
&lt;br /&gt;
Ein anderes, sicheres Zeichen eines Spielzeug-&amp;quot;DSOs&amp;quot; ist es, wenn irgendein Ding aus Abgreifklemmen und Klinkenstecker als &amp;quot;Tastkopf&amp;quot; mitgeliefert wird oder die Buchse für den Tastkopf aus einer Klinkenbuchse oder ähnlicher Niederfrequenz-Anschlusstechnik besteht.&lt;br /&gt;
&lt;br /&gt;
Fazit, wer ein Oszilloskop haben möchte, sollte sich das Geld für ein Spielzeug-&amp;quot;DSO&amp;quot; sparen.&lt;br /&gt;
&lt;br /&gt;
== Was messen Oszilloskope? ==&lt;br /&gt;
&lt;br /&gt;
Oszilloskope zeigen einen Spannungsverlauf über einen relativ kurzen Zeitraum an. Je besser das Oszilloskop, desto länger ist dieser kurze Zeitraum, beziehungsweise desto schneller darf das Signal sein. Darüber hinaus lassen sich andere Größen, zum Beispiel Ströme, anzeigen, wenn man zusätzlich entsprechende Wandler einsetzt, um aus ihnen eine Spannung zu erzeugen. Bei Mehrkanal-Oszilloskopen kann man üblicherweise auch eine Spannung über eine Spannung darstellen (XY-Modus).&lt;br /&gt;
&lt;br /&gt;
Als Kanal bezeichnet man bei einem Oszilloskop einen Eingang für eine Spannung. Die an den Kanäle anliegenden Spannungen können vom Oszilloskop einzeln oder gemeinsam angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich bieten moderne Oszilloskope die Möglichkeit, sich gewisse Kenngrößen der Spannungsverläufe anzeigen zu lassen. Gängige sind zum Beispiel die Anzeige von Spitzenspannung und Effektivwert einer Spannung, Frequenz/Periodendauer, Anstiegs- und Abfallzeiten, Tastverhältnis und so weiter. Darüber hinaus bieten gute Oszilloskope Positionsmarken (Cursor), mit denen man, durch eine Linie dargestellt, auf dem Bildschirm Positionen im Spannungsverlauf markieren kann. Zur Position zugehörige Werte (Zeit oder Spannung), sowie die Differenz dieser Werte zwischen zwei Poitionsmarken können abgelesen werden.&lt;br /&gt;
&lt;br /&gt;
Besonders [[#Digitale_Tischoszilloskope|digitale Oszilloskope]] können relativ viele unterschiedliche Kenngrößen anzeigen, da sich viele dieser Größen mit einfachen Algorithmen aus den vom Oszilloskop im Speicher erfassten Daten berechnen lassen. Ebenso sind einfache mathematische Operationen möglich, etwa eine diskrete Fourier-Transformation oder die Summe oder Differenz der Spannungsverläufe von zwei Kanälen. Oszilloskope der Oberklasse bieten darüber hinaus ausgeklügelte Möglichkeiten der Signalanalyse. &lt;br /&gt;
&lt;br /&gt;
Bereits in der Unterklasse digitaler Oszilloskope ist heutzutage eine PC-Schnittstelle üblich. Beim Kauf sollte man darauf achten, dass das Protokoll der Schnittstelle dokumentiert ist. Sonst ist man auf proprietäre PC-Software des Herstellers angewiesen. Bei Oszilloskopen der Unterklasse wird zwar häufig kostenlos PC-Software mitgeliefert, doch leider sind diese Programme durchgehend von erschreckend schlechter Qualität. Bei Oszilloskopen der Oberklasse lassen sich die Hersteller ihre PC-Software gerne zusätzlich sehr teuer bezahlen.&lt;br /&gt;
&lt;br /&gt;
Für spezielle Anwendungen finden sich in manchen Oszilloskopen besondere Messfunktionen. Zum Beispiel go/no-go Messungen, mit denen eine Spannungsverlauf mit einem vorgegebenen Verlauf verglichen wird. Entspricht der Spannungsverlauf hinreichend dem vorgegebenen Verlauf wird ein &amp;quot;go&amp;quot; (alles ist OK) Signal ausgegeben. Weicht der Verlauf zu stark ab, ein &amp;quot;no go&amp;quot; (Spannung stimmt nicht) Signal.&lt;br /&gt;
&lt;br /&gt;
== Analoge Oszilloskope ==&lt;br /&gt;
=== Allgemeines ===&lt;br /&gt;
[[Bild:Oszilloskop.png|thumb|right|300px|Hybrides Analog/Digital Oszilloskop]]&lt;br /&gt;
Bei analogen Oszilloskopen wird das darzustellende Signal nach der Verstärkung direkt zur Ablenkung eines Elektronenstrahls verwendet.&lt;br /&gt;
&lt;br /&gt;
Brauchbare analoge Oszilloskope findet man oft schon für ca. 50 Euro bei Online-Auktionen und Kleinanzeigenmärkten. Für 200-400 Euro bekommt man dort recht gute Profigeräte&amp;lt;ref&amp;gt;Ein Gerät, welche mit dem Attribut &#039;&#039;Profigerät&#039;&#039; beworben wird, ist normalerweise keins.&amp;lt;/ref&amp;gt;  mit 60-200 MHz Bandbreite. Brauchbare Neugeräte fangen bei 600 Euro an. Der Oszilloskopmarkt wird von einigen wenigen Marken dominiert. Im höherpreisigen Segment sind es vor allem HP (Agilent) und Tektronix, sowie Yokogawa und Lecroy. Hameg ist vor allem im mittleren Segment (500-1500 Euro) weit verbreitet. Man findet sie oft in Schule und Ausbildung. Preislich darunter finden sich diverse asiatische oder gelegentlich noch osteuropäische Hersteller von Analogoszilloskopen. Häufig treten diese Hersteller nicht unter eigenem Namen auf, sondern bieten ihre einfachen Geräte als OEM-Produkte an. &lt;br /&gt;
&lt;br /&gt;
Ganz einfache Geräte verfügen nur über einen Kanal&amp;lt;ref&amp;gt;Es gibt, beziehungsweise gab, nochmals einfachere Geräte, nämlich solche ohne Trigger. Die Zeiten solcher Gerät sind allerdings seit rund 50 Jahren vorbei. Daher sollte man den fehlenden Trigger nur bei historischen Gebrauchtgeräten finden.&amp;lt;/ref&amp;gt;. Damit ist es nicht möglich, zwei Signale in zeitliche Beziehung zu setzen. Dies ist jedoch oft wichtig. Deshalb verfügen heutzutage auch einfache Geräte meist über zwei Kanäle.&lt;br /&gt;
&lt;br /&gt;
=== Bandbreite ===&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Bandbreite&#039;&#039;&#039; gibt Auskunft, welche Signal-Frequenzen das Oszilloskop noch verarbeiten kann. Bei angegebener Bandbreite fällt die Verstärkung des Oszilloskops um 3dB ab, ein Sinussignal wird dann nur noch mit ca. 70% der wahren Amplitude angezeigt. Um Signalverläufe noch vernünftig interpretieren zu können, kann man grob sagen, dass man Signale bis 1/10 der Bandbreite dargestellt bekommt. Ein Rechtecksignal nahe der Bandbreite würde z.&amp;amp;nbsp;B. nur noch als Sinus dargestellt werden &amp;lt;ref&amp;gt;Häufig wird von Anfängern bei der Bandbreitenbetrachtung vergessen, dass ein Rechtecksignal nicht aus einer einzigen Sinusschwingung der Frequenz f, sondern aus einer theoretisch unendlichen Summe von Signalen der Frequenzen f, 3 * f, 5 * f ... besteht. Für eine vernünftige Darstellung eines Rechtecksignals sollte die Oszilloskopbandbreite so groß sein, dass zumindest die ersten paar Oberwellen nicht zu stark gedämpft werden. Aus dieser Betrachtung ergeben sich Faustformeln, wie die, dass die Bandbreite eines Oszilloskops zehnmal (oder dreimal, oder fünfmal, je nachdem wie genau man messen möchte) größer sein sollte als die Grundfrequenz des Rechtecks.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beim Messen von Digitalsignalen ist man meist an der &#039;&#039;&#039;Anstiegszeit&#039;&#039;&#039; interessiert. Die Anstiegszeit gibt an, wie lange ein Rechtecksignal von 10-90% benötigt. Die Anstiegszeit des Oszilloskops gibt an, welche Anstiegszeit dargestellt wird, wenn man ein nahezu ideales Rechtecksignal mit annähernd Null Anstiegszeit anlegen würde. Man kann die Anstiegszeit direkt aus der Bandbreite berechnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;t_{Osc} = \frac{0.35}{B}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_A&amp;lt;/math&amp;gt; : Anstiegszeit des Oszilloskops in Sekunden (s)&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, B&amp;lt;/math&amp;gt; : Bandbreite in Hertz (Hz)&lt;br /&gt;
&lt;br /&gt;
Legt man ein reales Rechtecksignal an das Oszilloskop an, dann wird die Anzeige umso mehr verfälscht, je näher die Anstiegszeit des Eingangssignals der Anstiegszeit des Oszilloskops kommt. Dabei gilt folgender Zusammenhang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;t_S = \sqrt{t_{ges}^2-t_{Osc}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_S&amp;lt;/math&amp;gt;: Anstiegszeit des Eingangssignals&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_{ges}&amp;lt;/math&amp;gt;: Angezeigte Anstiegszeit auf dem Oszilloskop&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_{Osc}&amp;lt;/math&amp;gt;: Anstiegszeit des Oszilloskops&lt;br /&gt;
&lt;br /&gt;
=== Tasköpfe richtig benutzen ===&lt;br /&gt;
&lt;br /&gt;
Wenn man wirklich schnelle Signale messen will, spielt auch die Bandbreite des verwendeten Tastkopfes eine wichtige Rolle. Näheres dazu findet man [http://www.sigcon.com/Pubs/straight/probes.htm hier]. Aber der beste Tastkopf nützt nichts, wenn man ihn falsch anschließt. Für schnelle Messung jenseits von ein paar MHz nutzt man praktisch immmer 10:1 Tastköpfe mit 10 MOhm Eingangswiderstand und ca. 8-15pF Eingangskapazität. Je nach Typ erreicht man damit Bandbreiten von 100-500MHz. Danach muss man aber auch den Tastkopf richtig anschließen. Der mitgelieferte Massesanschluß mit Krokodilklemme ist zwar praktisch, für viele hochfrequente Messungen aber unbrauchbar. Ein Rechtecksignal damit zu messen ergibt dann starke Überschwinger, welche real aber gar nicht vorhanden sind, sondern durch die zu lange, induktive Masseleitung im Zusammenspiel mit der Eingangskapazität verursacht werden. Das sieht man z.B. [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975754 hier], den Messaufbau sieht man [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975896 hier].&lt;br /&gt;
&lt;br /&gt;
Für saubere, hochfrequente Messungen muss man die Masseanbindung so kurz wie möglich machen. Dafür haben die Tastköpfe eine kleines Zusatzteil, eine Massefeder, beigelegt (engl. [http://www.mikrocontroller.net/attachment/27280/groundspring.png ground spring]). Damit kann man die Masse auf kürzestem Wege anschließen und erhält ein sauberes Messergebnis wie man [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975931 hier] sieht.&lt;br /&gt;
&lt;br /&gt;
=== Triggerung ===&lt;br /&gt;
&lt;br /&gt;
Oszilloskope unterscheiden sich oft stark in den Triggerungsmöglichkeiten. Bei guten Geräten kann man z.&amp;amp;nbsp;B. die Triggerung variabel verzögern. Erst dadurch wird es möglich, dass man sich Signale genauer anschauen kann, die zeitlich weit hinter einem Triggerereignis kommen. Eine weitere Funktion bei höherklassigen Oszilloskopen ist eine zweite Zeitbasis. Mit dieser kann man in einen Ausschnitt des Messsignals hereinzoomen&amp;lt;ref&amp;gt;Die zweite Zeitbasis steuert einen zweiten Strahl (ähnlich wie einen separaten Kanal), der das gleiche Eingangssignal erhält. Die zweite Zeitbasis wird auf eine höhere Horizontalfrequenz eingestellt als die erste. Zusammen mit einer horizontalen Verschiebung der Darstellung kann man nun Ausschnitte des Signals durchfahren und vergrößert betrachten.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mit Analog-Oszilloskopen kann man sich hauptsächlich periodische Signalverläufe anschauen, also solche, die zeitlich immer wiederkehrend sind. Denn nur so kann ein Signal immer wieder auf den Schirm &amp;quot;geschrieben&amp;quot; werden und erscheint als stehendes Bild. Aperiodische Signale, wie z.&amp;amp;nbsp;B. auf Datenübertragungsleitungen, sind damit nicht darstellbar. Sie laufen mit einem Strahldurchgang über den Schirm. In dieser kurzen Zeit ist es jedoch nur selten möglich, sie visuell aufzunehmen. Mit einer Digitalkamera kann man solche Signalverläufe mitunter trotzdem einfangen. Früher sehr hochpreisige, heute nicht mehr übliche Analog-Oszilloskope hatten eine eingebaute Speichermöglichkeit (Speicherröhre) für einmalige Signale. Diese Klasse von Analog-Oszilloskopen wurde durch digitale Speicheroszilloskope (DSOs) abgelöst.&lt;br /&gt;
&lt;br /&gt;
Manche Analog-Oszilloskope bieten eine Möglichkeit, die Triggerung nur zu einem definiertem Zeitpunkt anzustoßen, somit kann auch der Anlaufstrom eines Motors mit einem Analog-Oszilloskop dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
=== Analoge Speicheroszilloskope ===&lt;br /&gt;
Inzwischen eher selten sind analoge Speicheroszilloskope anzutreffen. Diese speichern im Gegensatz zu digitalen Speicheroszilloskopen nicht das Signal selbst, sondern das Bild auf der Röhre. Dies wird mit speziellen speichernden Bildröhren erreicht. Je nach Typ kann es mehrere getrennt betreibbare Bereiche geben, um beispielsweise 2 Bilder eines Signales zu unterschiedlichen Zeitpunkten darstellen zu können (z.B. Tektronix 549).&lt;br /&gt;
&lt;br /&gt;
Einige wenige dieser Oszilloskope waren sogar in der Lage, das aufgezeichnete Bild auf Papier auszugeben (z.B. &amp;quot;HP Model 175A&amp;quot; mit Modul 1784A).&lt;br /&gt;
&lt;br /&gt;
=== Vergleichstabelle Analogoszilloskope ===&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Neugeräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;sortable&amp;quot; id=&amp;quot;analogoszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Röhre [cm]&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| generisches 10 MHz Oszilloskop unter Bezeichnungen wie C1-94, S1-94, OS10, AO-610, ST16, CS10, GOS-310, 72-6602, HUC70, CS1010&lt;br /&gt;
| -&lt;br /&gt;
| 130&lt;br /&gt;
| 1&lt;br /&gt;
| 10&lt;br /&gt;
| 4 − 4,8 × 6&lt;br /&gt;
| Seit Jahrzehnten von vielen No-Name Herstellern in unterschiedlichen Ausführungen und Bauformen im Angebot. Wenig empfehlenswert für µC-Arbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atten.com.cn/english/products/rf_microwave/AT7328_40.htm Atten AT7328], CS-4128 und andere Bezeichnungen wie 100867.&lt;br /&gt;
| Atten&lt;br /&gt;
| 250&lt;br /&gt;
| 2&lt;br /&gt;
| 20&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HM 303-6&lt;br /&gt;
| Hameg&lt;br /&gt;
| 600&lt;br /&gt;
| 2&lt;br /&gt;
| 35&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Digitale Speicheroszilloskope ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:tektronix.jpg|thumb|right|300px|Digitales Speicheroszilloskop vom Anfang des Jahrtausends]]&lt;br /&gt;
Ein digitales Speicheroszilloskop (englisch DSO, &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;torage &#039;&#039;&#039;O&#039;&#039;&#039;scilloscope) digitalisiert das Eingangssignal mit einem Analog-Digital-Wandler und legt die Werte in einem Speicher ab. Der Vorteil daran ist, dass man auf diese Weise Momentaufnahmen eines Signals machen und damit einmalige (transiente) Ereignisse (Spikes, Datenübertragungen) erkennen und darstellen kann, was besonders bei digitalen Schaltungen, z.&amp;amp;nbsp;B. mit Mikrocontrollern, sehr nützlich ist. Weiterhin lässt sich das Signal &amp;quot;vermessen&amp;quot; (z.&amp;amp;nbsp;B. um die Baudrate einer Datenübertragung zu bestimmen), man kann die Frequenz und den Effektivwert anzeigen lassen, das Frequenzspektrum, und je nach Modell noch vieles mehr. Das Signal wird in S/W oder Farbe auf einem LCD dargestellt, lässt sich aber oft auch über einen angeschlossenen Drucker ausdrucken oder an den PC übermitteln.&lt;br /&gt;
&lt;br /&gt;
Der wichtigste Parameter bei digitalen Oszilloskopen ist die &#039;&#039;&#039;Abtastrate&#039;&#039;&#039;, die angibt, mit welcher Geschwindigkeit das Eingangssignal digitalisiert wird. Um ein Signal mit einer bestimmten Frequenz vernünftig darstellen zu können, muss es mindestens mit der 10-fachen Frequenz abgetastet werden&amp;lt;ref&amp;gt;Dieser Anhaltswert liegt über der Nyquist-Frequenz (zweifache Frequenz), da man Abweichungen von der idealen Signalform sehen und beurteilen möchte.&lt;br /&gt;
&lt;br /&gt;
Die zehnfache Abtastfrequenz bedeutet, dass man 10 Messpunkte pro Signalperiode hat, was in einer 1:1 Darstellung auf dem Bildschirm gerade mal 10 nebeneinander liegenden Pixeln entspricht. Das ist immer noch sehr wenig, um ein Signal zu beurteilen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem sind die &#039;&#039;&#039;Speichertiefe&#039;&#039;&#039; und die &#039;&#039;&#039;Wandler-Auflösung&#039;&#039;&#039; interessant. Ein Oszilloskop, das mit acht Bit Auflösung abtastet und 2000*8 Bit Speicher hat, kann 2000 Samples abspeichern, was einer Darstellung von 2000*256 Pixeln entspricht. Acht Bit Auflösung ist heutzutage ein gängiger Wert, auch wenn er niedrig erscheint. Ein normales Oszilloskop ist kein Präzisionsmessgerät und acht Bit sind für die Darstellung auf den Displays normaler Oszilloskope ausreichend.   &lt;br /&gt;
&lt;br /&gt;
Bei der Wandlung und Speicherung gibt es unterschiedliche Verfahren: Ehemals günstige Oszilloskope wie die TDS1000-Serie von Tektronix verwenden &#039;&#039;&#039;CCD-Speicher&#039;&#039;&#039; (Eimerkettenspeicher, ein analoges Schieberegister); die Messwerte werden erst gespeichert, und dann digitalisiert. Nachteile dieser Vorgehensweise sind ein stärkeres Rauschen, die begrenzte Speichertiefe und Totzeiten, während der keine Eingangswerte aufgenommen werden. Diese entstehen, da das Wandeln aller Werte aus dem analogen Zwischenspeicher länger dauert als die Zeit zum Füllen dieses Speichers. Deshalb muss das Gerät bis zum Abschluss der Wandlung warten, bevor es den Speicher erneut füllt.&lt;br /&gt;
&lt;br /&gt;
Früher wandelten nur teurere Modelle in Echtzeit mit schnellen Flash-[[AD-Wandler]]n und speicherten die Messwerte direkt in einem schnellen RAM. Die Speichertiefe ist dabei praktisch unbegrenzt, allerdings sind Wandler sehr teuer, die mehrere GS/s schaffen. Durch einen Trick (mehrere verschachtelte langsame AD-Wandler) setzen sich AD-Wandler bei günstigen Modellen durch. Oszilloskope, die diesen Trick verwenden, erkennt man daran, dass die Abtastfrequenz mit der Anzahl der aktivierten Kanäle sinkt. Zum Beispiel, findet man Vierkanaloszilloskop mit vier Wandlern à 250 MS/s, die bei Benutzung nur eines Kanals 1 GS/s für diesen Kanal erreichen, bei Benutzung von zwei Kanäle 500 MS/s pro Kanal und bei Benutzung von drei oder vier Kanälen 250 MS/s pro Kanal.&lt;br /&gt;
&lt;br /&gt;
In den richtig schnellen Geräten (mehrere GHz Samplerate) ist ein ähnlicher Trick üblich. Dort sind in den verwendeten Wandlerschaltkreisen eine größere Anzahl Sample-and-Hold-Stufen und AD-Wandler integriert. Die Eingangsspannung wird dann zeitversetzt in den Sample-and-Hold-Stufen gespeichert und von den im Vergleich zur Samplerate langsameren AD-Wandlern umgesetzt. Die Ausgangslogik sorgt dann dafür, dass die Daten in der richtigen Reihenfolge ausgegeben werden. Ein Problem bei dieser Vorgehensweise sind unterschiedliche elektrische Eigenschaften der parallelen Wandlerstufen. &lt;br /&gt;
&lt;br /&gt;
Natürlich spielt der Verwendungszweck eine entscheidende Rolle bei der Auswahl. Auf dem Labortisch, wo meist nur kleine Spannungen mit einem gemeinsamen Massebezug vorkommen, werden andere Anforderungen an ein Oszilloskop gestellt, als z.&amp;amp;nbsp;B. im Servicebereich für Industriesteuerungsanlagen, Automatisierungstechnik, usw. Dort sind weniger hohe Abtastraten wichtig, sondern eher eine größere Anzahl Eingangskanäle, die galvanisch voneinander getrennt sind, Spannungsfestigkeit bis min. 500 Volt, sowie speziell bei Störungsanalysen, die Möglichkeit, komplexe Triggermuster einzustellen, und eine integrierte große Festplatte, um einzelne Ereignisse automatisiert über lange Zeiträume hinweg festhalten zu können. Ein Beispiel für so ein hochwertiges Gerät ist ein Yokogawa Scopecorder (DL708). Allerdings sind bei solchen Geräten die Preise nach oben hin offen.&lt;br /&gt;
&lt;br /&gt;
===  Digitale Tischoszilloskope ===&lt;br /&gt;
==== Allgemeines ====&lt;br /&gt;
&lt;br /&gt;
DSO Tischoszilloskope sind die klassischen, in sich abgeschlossenen Geräte, die in der Gestaltung analogen Oszilloskopen ähneln. Daneben gibt es zum Beispiel auch PC DSOs. Viele Tischgeräte sind bereits so klein (geringe Tiefe) und leicht, dass sie zu Recht als tragbare Geräte bezeichnet werden. Beim Neukauf eines Oszilloskops sind diese Geräte die interessantesten.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile ist es üblich, dass man bereits bei Einsteigermodellen eingebaute USB oder RS-232 Schnittstellen findet und eine (häufig sehr simple) Windows-Software zur Bedienung vom PC aus oder zumindest zum Auslesen von Daten auf den PC. Ebenfalls häufig sind USB oder ähnliche Schnittstellen für USB-Memorysticks oder Speicherkarten zum Speichern von Messwerten, Screenshots und Konfigurationen. Ironischerweise sind Schnittstellen und Windows-Software bei Markengeräten häufig gesondert zu erwerben, während sie bei eher unbekannten Marken kostenlos mitgeliefert werden, wenn auch die Qualität der kostenlosen Software häufig zu wünschen übrig lässt. &lt;br /&gt;
&lt;br /&gt;
Beispiele für günstige Einstiegsmodelle sind einige, aber nicht alle, Geräte von Rigol, Hantek, Owon oder Atten. Für wenig Geld erhält man für einfache Anwendungen brauchbares Oszilloskop mit ein paar Highlights aber auch auffälligen Einschränkungen und Fehlern in der Hard- und Software. Viel oder überhaupt Service kann man von diesen Firmen für sein Geld nicht erwarten.&lt;br /&gt;
&lt;br /&gt;
Geräte von [http://www.instek.com/] sind etwas teurer. Geräte aus der GDS-1000A oder GDS-1000U Serie dürften zum Einstieg interessant sein.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel für ein Einstiegsmodell war das [http://www.tek.com/site/ps/0,,40-15314-INTRO_EN,00.html TDS1002] von Tektronix (ca. 1200 Euro). Dazu muss man allerdings sagen, dass Tektronix die aktuelle Entwicklung etwas verschlafen hat. Der nur 2 kByte große Speicher ist einfach nicht mehr zeitgemäß. Geräte der [http://www.home.agilent.com/agilent/product.jspx?nid=-33575.0&amp;amp;cc=DE&amp;amp;lc=ger&amp;amp;pageMode=OV Agilent InfiniiVision 2000X Serie] beginnen in einem ähnlichen Preisbereich aber mit wesentlich mehr Features.&lt;br /&gt;
&lt;br /&gt;
==== Vergleichstabelle digitale Tischoszilloskope ====&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Geräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;sortable&amp;quot; id=&amp;quot;digitaloszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Samplerate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auflösung [Bit]&lt;br /&gt;
! Speichertiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Interface&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=78 DSO5102B]&lt;br /&gt;
| [http://www.hantek.com.cn/english/ Hantek]&lt;br /&gt;
| mit sehr viel Glück auf eBay 390 + Zoll + Umsatzsteuer ... 520&lt;br /&gt;
| 2&lt;br /&gt;
| 500/1000&lt;br /&gt;
| 100&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 800 x 480, 7&amp;quot; (die auch genutzt werden)&lt;br /&gt;
| 1 x USB Geräte- und 1 x USB Host-Schnittstelle&lt;br /&gt;
| Beliebt, da es einen Hack auf 200 MHz gibt. Ebenso diverse Hacks an der Hardware. Für ein Niedrigpreis-Produkt übliche und verzeihbare Hardware- und Firmware-Macken. Auch als Tekway DST1102B oder Protek 3110 im Handel.&lt;br /&gt;
|-&lt;br /&gt;
| DSO3062A||Agilent||800||2||500 ||60||8||4k||320x240||USB||weitgehend baugleich mit Rigol DS5000&lt;br /&gt;
|-&lt;br /&gt;
| InfiniiVision 2000 X Serie||Agilent|| 950 - 2600 (MSO) ||2 - 4||1 G/Kanal. Bei Benutzung der Hälfte aller Kanäle 2G/Kanal|| 70 - 200 || 8 || 100k || 800 x 480, 8,5&amp;quot;|| ||Markengeräte mit exzellentem Preis-Leistungs-Verhältnis. Software-Aufrüstbar (Funktionsgenerator, Protokoll-Dekoder, usw.)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.rigolna.com/products_ds1000d.aspx DS1000 Serie]&lt;br /&gt;
| [http://www.rigolna.com/ Rigol]&lt;br /&gt;
| 600 - 1650&lt;br /&gt;
| 2&lt;br /&gt;
| 400/200&amp;lt;BR/&amp;gt;(1/2 Kanäle)&lt;br /&gt;
| 25-100&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB, seriell&lt;br /&gt;
| optional 16-Kanal Logikanalysator&lt;br /&gt;
|-&lt;br /&gt;
| [[Rigol DS1052E]]&lt;br /&gt;
| [http://www.rigolna.com/ Rigol]&lt;br /&gt;
| ab 260 Euro + Zoll + Umsatzsteuer (ebay China)&lt;br /&gt;
| 2&lt;br /&gt;
| 1000/500&amp;lt;BR/&amp;gt;(1/2 Kanäle)&lt;br /&gt;
| 50 (100=DS1102E)&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB, seriell&lt;br /&gt;
| optional 16-Kanal Logikanalysator = DS1052D (DS1102D). Im Netz kursieren diverse, mehr oder weniger ernst zu nehmende Anleitungen, wie man ein DS1052E per Software auf ein DS1102E umrüsten kann.&lt;br /&gt;
|-&lt;br /&gt;
| Owon PDS Serie&lt;br /&gt;
| Owon, alias Xiamen Lilliput Technology Co., Ltd&lt;br /&gt;
| 299,- (PDS5022S); 495,- (PDS6062T); 570,- (PDS7102T)&lt;br /&gt;
| 2&lt;br /&gt;
| 100 - 500&lt;br /&gt;
| 25 - 100&lt;br /&gt;
| 8&lt;br /&gt;
| 5k pro Kanal&lt;br /&gt;
| 640x480&lt;br /&gt;
| USB, seriell incl.&lt;br /&gt;
| Qualität entspricht Preis. Relativ unausgewogenes Verhältnis von Bandbreite zu Samplingrate. Geräte mit einem &#039;S&#039; am Ende der Typenbezeichnung haben ein STN LCD mit niedriger Qualität.&amp;lt;br&amp;gt;nur Real-Time Sampling&lt;br /&gt;
|-&lt;br /&gt;
| [http://owon.com.cn/eng/smartDS.asp Owon SDS Serie]&lt;br /&gt;
| Owon, alias Xiamen Lilliput Technology Co., Ltd&lt;br /&gt;
| 400 (SDS7102)&lt;br /&gt;
| 2&lt;br /&gt;
| 500 M - 3.2 G&lt;br /&gt;
| 60 - 300&lt;br /&gt;
| 8&lt;br /&gt;
| 10M/Kanal&lt;br /&gt;
| 800 x 600, 8&amp;quot;&lt;br /&gt;
| USB Host und Slave, seriell incl., Ethernet, VGA&lt;br /&gt;
| Deutliche Verbesserung gegenüber der alten PDS-Serie. Beeindruckende Speichertiefe (10M) und Bildschirm (8&amp;quot;). Für ein Niedrigpreis-Produkt übliche Hardware- und Firmware-Macken. Neuere Geräte mit verbessertem Hardwaredesign, Firmware wird regelmäßig aktualisiert, menülastige, gewöhnugsbedürftige Bedienung. Akkubetrieb optional&lt;br /&gt;
|-&lt;br /&gt;
| GW Instek GDS-1000 Serie&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 350 - 550&amp;lt;br&amp;gt;(Conrad: 475 - 950)&lt;br /&gt;
| 2&lt;br /&gt;
| 250&lt;br /&gt;
| 25 - 100&lt;br /&gt;
| 8&lt;br /&gt;
| 4k&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB (Geräte-Modus, kein Host-Modus), SD Kartenslot&lt;br /&gt;
| Von Conrad teurer als DSO-4000 Serie erhältlich.&amp;lt;br&amp;gt;[http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
| GW Instek GDS-1000&#039;&#039;&#039;A&#039;&#039;&#039; Serie&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 500 - ?&lt;br /&gt;
| 2&lt;br /&gt;
| bis 1GS/s&lt;br /&gt;
| 60 - 150&lt;br /&gt;
| 8&lt;br /&gt;
| bis 2M&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB (Geräte-Modus, kein Host-Modus), SD Kartenslot&lt;br /&gt;
| [http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Samplerate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auflösung [Bit]&lt;br /&gt;
! Speichertiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Interface&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.instek.com/html/en/products-l.asp?p1sn=17&amp;amp;p2sn=41 GW Instek GDS-2000 Serie]&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 850 - 1800&lt;br /&gt;
| 2 - 4&lt;br /&gt;
| 1000&lt;br /&gt;
| 60 - 200&lt;br /&gt;
| 8&lt;br /&gt;
| max. 5000 (alle Kanäle benutzt) / 25000 (ein Kanal in Benutzung)&lt;br /&gt;
| 320x234&lt;br /&gt;
| Inkl. USB (Geräte-Modus zum PC, zwei weitere USB-Buchsen Host-Modus für eine Speicherkarte oder Drucker), RS-232&lt;br /&gt;
| Weitgehend baugleich mit Conrad Voltcraft DSO-8000 Serie. Vier-Kanal Versionen haben keinen externen Trigger und weniger Trigger-Funktionen.&amp;lt;br&amp;gt;[http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
| TDS-1002B&lt;br /&gt;
| Tektronix&lt;br /&gt;
| 1100&lt;br /&gt;
| 2&lt;br /&gt;
| 1000&lt;br /&gt;
| 60&lt;br /&gt;
| 8&lt;br /&gt;
| 2.5k&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB inkl.&lt;br /&gt;
| verhältnismäßig starkes Rauschen, siehe Text oben&lt;br /&gt;
|-&lt;br /&gt;
| WaveJet 3xx&lt;br /&gt;
| LeCroy &lt;br /&gt;
| 2800..8000 (brutto)&lt;br /&gt;
| 2 oder 4&lt;br /&gt;
| 1000/2000&lt;br /&gt;
| 100/200/350/500&lt;br /&gt;
| 8&lt;br /&gt;
| 500k&lt;br /&gt;
| 640x480&lt;br /&gt;
| USB inkl.&lt;br /&gt;
| verfügbar z.&amp;amp;nbsp;B. bei Farnell&lt;br /&gt;
|-&lt;br /&gt;
| WaveAce Serie&lt;br /&gt;
| LeCroy &lt;br /&gt;
| 1000 - 3500&lt;br /&gt;
| 2&lt;br /&gt;
| 250 - 2000&lt;br /&gt;
| 60 - 300&lt;br /&gt;
| 8&lt;br /&gt;
| 4k - 8k&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB (Geräte- und Host-Modus), RS-232(?)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.dlm2000.de DLM20XX]&lt;br /&gt;
| YOKOGAWA &lt;br /&gt;
| 3300..8000 (brutto)&lt;br /&gt;
| 2 oder 4 (3+1) wobei 1 wahlweise 8Kanal Digital ist&lt;br /&gt;
| 2500 (1250)&lt;br /&gt;
| 200/350/500&lt;br /&gt;
| 8&lt;br /&gt;
| 12,5MPts&lt;br /&gt;
| 1024x768&lt;br /&gt;
| USB, Ethernet, Browsersteuerung inkl.&lt;br /&gt;
| Vertrieb vom Hersteller direkt!&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.uni-trend.com/UT2025B.html UNI-T UT2025B] / Voltcraft DSO-1022 M&lt;br /&gt;
| [http://www.uni-trend.com/ Uni-Trend Group Limited]&lt;br /&gt;
| 290 - 356&lt;br /&gt;
| 2&lt;br /&gt;
| 250&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 512k/Kanal&amp;lt;ref&amp;gt;Uni-Ts Angaben zur Speichertiefe sind mit Vorsicht zu genießen. Seit Jahren wirbelt die Firma mit Begriffen wie &#039;&#039;memory length&#039;&#039;, &#039;&#039; memory depth&#039;&#039;, &#039;&#039;recording length&#039;&#039; und &#039;&#039;saving depth&#039;&#039; herum - jeweils mit unterschiedlichen Werten für das gleiche Oszilloskop. Dabei vermeidet Uni-T Begriffsdefinitionen zu geben. Im Zweifelsfall sollte man mit dem kleinsten Wert aller Angaben rechnen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| 320x240 (Monochrom)&lt;br /&gt;
| USB, RS-232.&lt;br /&gt;
| Als UT2025&#039;&#039;&#039;C&#039;&#039;&#039; mit Farbdisplay. UT2000 Serie 25-200MHz, 2CH 250MSa/s bis 1GSa/s&amp;lt;br&amp;gt;wenig Rauschen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.uni-trend.com/UTD2052CEL.html UTD2052CEL]&lt;br /&gt;
| [http://www.uni-trend.com/ Uni-Trend Group Limited]&lt;br /&gt;
| 369,-&lt;br /&gt;
| 2&lt;br /&gt;
| 1000&lt;br /&gt;
| 50&lt;br /&gt;
| 8&lt;br /&gt;
| 2x600k &#039;&#039;recording length&#039;&#039;;&amp;lt;br&amp;gt;25k &#039;&#039;saving depth&#039;&#039; ein Kanal;&amp;lt;br&amp;gt;12,5k &#039;&#039;memory depth&#039;&#039; zwei Kanäle&amp;lt;ref&amp;gt;Uni-Ts Angaben zur Speichertiefe sind mit Vorsicht zu genießen. Seit Jahren wirbelt die Firma mit Begriffen wie &#039;&#039;memory length&#039;&#039;, &#039;&#039; memory depth&#039;&#039;, &#039;&#039;recording length&#039;&#039; und &#039;&#039;saving depth&#039;&#039; herum - jeweils mit unterschiedlichen Werten für das gleiche Oszilloskop. Dabei vermeidet Uni-T Begriffsdefinitionen zu geben. Im Zweifelsfall sollte man mit dem kleinsten Wert aller Angaben rechnen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| 800 x 480&amp;lt;br&amp;gt;Der Displaycontroller faßt immer 2x2 Pixel zusammen, dadurch reduziert sich die Auflösung real auf 400 x 240&amp;lt;br&amp;gt;(Menü nimmt relativ viel Platz auf dem Bildschirm ein)&lt;br /&gt;
| USB&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HM2008&lt;br /&gt;
| [http://www.hameg.com Hameg]&lt;br /&gt;
| 2000&lt;br /&gt;
| 2&lt;br /&gt;
| 2GSa/s(1CH)1GSa/s(2CH)&lt;br /&gt;
| 200&lt;br /&gt;
| 8&lt;br /&gt;
| 4048k&lt;br /&gt;
| Röhre 8x10cm&lt;br /&gt;
| USB für Speicherstick (vorne), USB/RS232 für PC (hinten), &lt;br /&gt;
| 4 Logikkanäle nachrüstbar, Ethernet/USB nachrüstbar&lt;br /&gt;
|-&lt;br /&gt;
| PT 1200&lt;br /&gt;
| [http://www.PEAKTECH.de Peaktech]&lt;br /&gt;
| ca. 360&lt;br /&gt;
| 2&lt;br /&gt;
| 100MSa/s(1CH)100MSa/s(2CH)&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 6k pro Kanal&lt;br /&gt;
| Farb LCD 7,8&amp;quot; 640x480&lt;br /&gt;
| USB für PC (hinten) &lt;br /&gt;
| Im Original vermutlich ein Owon PDS5022S. Optional: Akkupack 7,4 V ~ 8000 mA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Marken, die gelegentlich auf dem deutschen Markt auftauchen, häufig über eBay, sind &lt;br /&gt;
&lt;br /&gt;
* GAOtek&lt;br /&gt;
* Hangzhou Jingce (JC)&lt;br /&gt;
* Tonghui&lt;br /&gt;
* Ypioneer&lt;br /&gt;
* Jiangsu Lvyang&lt;br /&gt;
* Siglent (Zweitmarke von Atten)&lt;br /&gt;
&lt;br /&gt;
Über deren Qualität hört man wenig oder gar nichts.&lt;br /&gt;
&lt;br /&gt;
=== PC-Oszilloskope ===&lt;br /&gt;
==== PC-Zusätze ====&lt;br /&gt;
===== Allgemeines &amp;amp; Beachtenswertes =====&lt;br /&gt;
&lt;br /&gt;
PC-Oszilloskope / PC-Zusätze sind im Prinzip digitale Speicheroszilloskope, mit der Besonderheit, dass sie die Daten nicht selbst anzeigen, sondern an einen PC übermitteln. Beim Kauf eines PC-Oszilloskops sollte man besonders vorsichtig sein, da viele Angebote irreführende Informationen enthalten. Sehr beliebt ist z.&amp;amp;nbsp;B. die Werbung mit der Analogbandbreite, also die Bandbreite die der Analogteil der Schaltung (Eingangsverstärker) verarbeiten kann. Wenn hier 100 MHz angegeben sind bedeutet das aber nicht, dass sich auch wirklich Signale bis 100 MHz darstellen lassen; wenn der Wandler nur mit 40 MS/s abtastet ist das Oszilloskop gerade noch bis 4 MHz verwendbar. Ebenso sollte man nur die Echtzeit- oder Realtime-Abtastrate beachten, eine manchmal ebenfalls angegebene &amp;quot;Äquivalent-Abtastrate&amp;quot; ist nur bei periodischen Signalen zu gebrauchen und damit im Umfeld von Mikrocontrollern meist wertlos.&lt;br /&gt;
&lt;br /&gt;
Die Wahl zwischen einem Tischoszilloskop und einem PC-Zusatz ist nicht nur eine Geld-, Leistungs- oder Qualitätsfrage. Ein Tischgerät lässt sich anders bedienen (echte Knöpfe, sicherer Stand) und belegt nicht den PC oder Laptop. Erfahrene Entwickler ziehen ein separates Gerät einem PC-Zusatz vor. Zum Teil ist dies eine Generationsfrage.&lt;br /&gt;
&lt;br /&gt;
Hinzu kommt, dass billige PC-Oszilloskope meist keine galvanische Trennung an ihrer USB-Schnittstelle besitzen. Ein Fehler bei einer Messung kann daher nicht nur das Oszilloskop, sondern gleich den PC mit beschädigen. Das gleiche Problem kann man übrigens auch bei einfachen Tischoszilloskopen mit PC-Schnittstelle haben. Allerdings kann man Tischgeräte auch ohne die PC-Verbindung betreiben, PC-Oszilloskope nicht.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wird geraten, das Oszilloskop, egal ob Tischgerät oder PC-Zusatz, immer über einen &amp;quot;self powered&amp;quot; USB-Hub (einer mit eigenem Netzteil) mit dem PC zu verbinden. Ob ein solcher Hub als Schutzmaßnahme geeignet ist, besonders zum Personenschutz, sei dahingestellt. Schaden sollte er nicht.&lt;br /&gt;
&lt;br /&gt;
Besonders zu beachten ist die PC-Software. Nicht nur, ob sie zum Zeitpunkt des Kaufs wenigstens grundsätzlichen Ansprüchen genügt, sondern auch, ob der Hersteller vermutlich willens und in der Lage ist, die Software über viele Jahre zu warten. Stichwort Investitionssicherheit. Ohne Wartung kann eine Inkompatibilität in der Software zum nächste Windows Service-Pack oder zur nächste Windows-Version das Gerät völlig entwerten.&lt;br /&gt;
&lt;br /&gt;
Leider ist es so, dass es fast keine freie [[Oszilloskop#Software|Oszilloskopsoftware]] gibt. Die Protokolle zwischen Oszilloskop-Vorsätzen und Computer sind meist proprietär, und selten hat sich ein Entwickler freier Software die Mühe gemacht, ein Protokoll zu entschlüsseln. Noch seltener ist es, dass auf dieser Basis eine brauchbare oder gar gute Software geschrieben wurde. So ist ein Ausweichen auf freie Software kaum möglich, sollte der Hersteller die Wartung aufgeben. Man ist im Normalfall auf Gedeih und Verderb dem Hersteller ausgeliefert.&lt;br /&gt;
&lt;br /&gt;
===== Vergleichstabelle PC-Zusätze =====&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Geräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;sortable&amp;quot; id=&amp;quot;pczusatzoszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Sample&amp;amp;shy;rate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Band&amp;amp;shy;breite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auf&amp;amp;shy;lösung [Bit]&lt;br /&gt;
! Speicher&amp;amp;shy;tiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Inter&amp;amp;shy;face&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.elandigitalsystems.com/support/usbtmfaq/software.php USBscope50]&lt;br /&gt;
| Elan Digital Systems / dt. Vertrieb Hacker&lt;br /&gt;
| 249&lt;br /&gt;
| 1 (-4)&lt;br /&gt;
| 50 / 1000&lt;br /&gt;
| 10 / 75&lt;br /&gt;
| 8&lt;br /&gt;
| 3k pro Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| CAT II, 300V galv. Trennung zu USB, OpenSource SDK, Java, Linux, LabView&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope PS 2104&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 185&lt;br /&gt;
| 1&lt;br /&gt;
| 50&lt;br /&gt;
| 10&lt;br /&gt;
| 8&lt;br /&gt;
| 8K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| Spektralanalyse und Voltmeter in Software.&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope PS 2105&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 290&lt;br /&gt;
| 1&lt;br /&gt;
| 100&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 24K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| Spektralanalyse und Voltmeter in Software.&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope 2205&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 350&lt;br /&gt;
| 2&lt;br /&gt;
| 200&lt;br /&gt;
| 25&lt;br /&gt;
| 8 - 12&lt;br /&gt;
| 16K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB &lt;br /&gt;
| Kleiner Arbitrary Waveform Generator eingebaut.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=62 DSO-2090 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.&lt;br /&gt;
| 200&lt;br /&gt;
| 2&lt;br /&gt;
| 1 Kanal: 100 / 2 Kanäle: 50&lt;br /&gt;
| 40&lt;br /&gt;
| 8&lt;br /&gt;
| 1 Kanal: 64K / 2 Kanäle: 32K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB &lt;br /&gt;
| Wenige Vorteile gegenüber einem Tischgerät. Analogbandbreite bei der Samplingrate nicht ausnutzbar. Kleiner Eingangsspannungsbereich. Unter diversen anderen Namen erhältlich.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=63 DSO-2150 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.&lt;br /&gt;
| 200&lt;br /&gt;
| 2&lt;br /&gt;
| max. 150&lt;br /&gt;
| 60&lt;br /&gt;
| 8&lt;br /&gt;
| 10K-32K/Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| .&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=64 DSO-2250 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.  &lt;br /&gt;
| 220&lt;br /&gt;
| 2&lt;br /&gt;
| max. 250&lt;br /&gt;
| 100&lt;br /&gt;
| 8&lt;br /&gt;
| 10K-512K/Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| .&lt;br /&gt;
|-&lt;br /&gt;
| Mephisto Scope 1 (UM202)&lt;br /&gt;
| Meilhaus&lt;br /&gt;
| 333&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 16&lt;br /&gt;
| 256K&lt;br /&gt;
| ..&lt;br /&gt;
| USB&lt;br /&gt;
| 5 in 1,&lt;br /&gt;
Oszilloskop,&lt;br /&gt;
Logik-Analysator,&lt;br /&gt;
Voltmeter,&lt;br /&gt;
Datenlogger analog und digital,&lt;br /&gt;
Digital-I/O&lt;br /&gt;
|-&lt;br /&gt;
| MSO-19&lt;br /&gt;
| Link Instruments Inc.&lt;br /&gt;
| 172&lt;br /&gt;
| 1&lt;br /&gt;
| 200&lt;br /&gt;
| 60&lt;br /&gt;
| ??&lt;br /&gt;
| 1K&lt;br /&gt;
| ..&lt;br /&gt;
| USB&lt;br /&gt;
|&lt;br /&gt;
Oszilloskop,&lt;br /&gt;
Logik-Analysator,&lt;br /&gt;
Pattern Generator,&lt;br /&gt;
TDR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Soundkarten-Oszilloskope ====&lt;br /&gt;
[[Bild:Soundoszi.JPG|thumb|right|300px|Soundkarten Oszilloskop]]&lt;br /&gt;
Wem ein wirklich einfaches Oszilloskop für kleine Frequenzen (bis etwa 20 kHz) ausreicht, bspw. um die Kommunikation am I2C-Bus zu analysieren, kann dazu die Soundkarte des PC benutzen.&lt;br /&gt;
Allerdings eignet sich eine Soundkarte nicht dazu, Gleichspannungen zu messen, zu niederfrequente Signale können daher nicht damit erfasst werden: Im Screenshot nebenan erkennt man das z.&amp;amp;nbsp;B. an der fallenden Gerade am Schluss (obwohl der tatsächliche Signalpegel konstant oben bleibt). Auch ist hier besondere Vorsicht geboten, da Soundkarten nur für geringe Spannungen ausgelegt sind und bei einer zu hohen Eingangsspannung möglicherweise der ganze PC beschädigt wird. Daher ist eine Vorschaltung mit Spannungsbegrenzung (ca 0,7V) nötig. &lt;br /&gt;
&lt;br /&gt;
Der Vorteil der Soundkartennutzung ist, dass es sich dank des PCs um eine Art  Speicheroszilloskop handelt und die Daten zum Beispiel in Excel analysiert werden können.&lt;br /&gt;
&lt;br /&gt;
* [http://www.scheidig.de/Deutsch/Download/SpekOszi/info.htm Hardy u. Karola Scheidig] verschiedene Programme zum Messen mit der Soundkarte.&lt;br /&gt;
* [http://www.sillanumsoft.org/ Visual Analyser] von Alfredo Accattatis und der University of Rome Tor Vergata, &amp;quot;Donateware&amp;quot; &lt;br /&gt;
* [http://www.zeitnitz.de/Christian/scope_en Soundcard Oscilloscope für Windows] von Christian Zeitnitz, kostenlos für Privatanwendung&lt;br /&gt;
* [http://www.qsl.net/dl4yhf/spectra1.html Spectrum Lab von DL4YHF]&lt;br /&gt;
* [http://w5big.com/spectrogram.htm Spectrogram] von R.S. Horne, ältere Version kostenlos&lt;br /&gt;
* [http://www.audiotester.de/ Audiotester 30-Tage-Version kostenlos]&lt;br /&gt;
* [http://www.dasylab.com/ DasyLab] Eingeschränkte Version (Soundkarte und serielle Schnittstelle) als Beilage zum Buch &amp;quot;Signale-Prozesse-Systeme&amp;quot; ISBN 9783642018633&lt;br /&gt;
* [http://www.zelscope.com/ Zelscope] von Constantin Zeldovich 14-Tage Evaluationsversion&lt;br /&gt;
* [http://www.dxzone.com/catalog/Software/Spectrum_analyzers/ Linksammlung]&lt;br /&gt;
==== Grafikkarten-Oszilloskope ====&lt;br /&gt;
Videokarten, die über einen analogen Input verfügen, stellen ebenfalls eine Alternative zu käuflichen Oszilloskopen dar, da sie 3kanalig Frequenzen bis rund 180 MHz verarbeiten können. Die digitale Auflösung liegt meist bei 8 Bit maximal, was für einfache Anzeigen jedoch reicht, wenn die Aussteuerung entsprechend ist. Durch Übersampeln lässt sich die Auflösung wie gehabt steigern, indem man z.B. je 4 Werte softwareseitig zusammenfasst und damit bis zu 2 Bit an Auflösung gewinnt. Bei 16 werten kann man in der Regel statistische 2-3 Bit erwarten und erhält eine Güte von ca 10 Bit bei 10MHz.&lt;br /&gt;
&lt;br /&gt;
=== Selbstbau ===&lt;br /&gt;
&lt;br /&gt;
Selbstbau eines solchen Gerätes erspart wie fast immer in solchen Fällen kein Geld, sofern man nicht eine Spezialfunktion benötigt, die im Markt nicht beschaffbar ist. Der Spaß liegt als wieder im Bauen selbst.&lt;br /&gt;
&lt;br /&gt;
Es gibt diverse preiswerte Bausätze für Spielzeug-Oszilloskope. Die Ergebnisse nach dem Zusammenbau sind als Oszilloskop wenig brauchbar. &lt;br /&gt;
&lt;br /&gt;
Daneben findet man nur sehr wenige Selbstbau-Projekte deren Ergebnisse überzeugen. Einige interessante Projekte sind [http://www.mikrocontroller.net/topic/228997?goto=new#2308320]n und [http://www.ssalewski.de/DAD.html.de]. Dazu sei allerdings gesagt, dass der Aufwand an Material und Messmitteln schnell die Kosten für ein fertiges Oszilloskop überschreitet.&lt;br /&gt;
&lt;br /&gt;
=== Umbau ===&lt;br /&gt;
Sofern man tatsächlich etwas benötigt, was nicht käuflich zu erwerben ist, kann der Kauf und Umbau eines verhandenen Gerätes sinnvoll sein. &lt;br /&gt;
&lt;br /&gt;
Auf eBay werden immer noch die Oszilloskope der früheren Firma Wittig (heute Welec), wie zum Beispiel das W2012A, angeboten. Als Alternative zu der fehlerträchtigen Orginalfirmware ist mittlerweile eine Open-Source Variante verfügbar die kontinuierlich weiterentwickelt wird. Ebenfalls wird an Hardware Erweiterungen gearbeitet die die Qualität des Oszilloskops deutlich steigern. Wer sich nicht sicher ist ob das Gerät seinen Ansprüchen genügt sollte bei den Entwicklern nachfragen. [http://sourceforge.net/apps/trac/welecw2000a/wiki] Auch hier ist der Weg das Ziel.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR_Softwarepool#Oszilloskop|AVR Softwarepool: Oszilloskop]]&lt;br /&gt;
* [[Einfaches Oszilloskop mit Bascom-AVR]]&lt;br /&gt;
* [[USB_Oszilloskop]]&lt;br /&gt;
* [[Logic_Analyzer]]&lt;br /&gt;
* [[LCS-1M - Ein einfaches, preiswertes, mikrokontrollergesteuertes Zweikanal-Oszilloskop zum Selberbauen]] ([[Picaxe]])&lt;br /&gt;
&lt;br /&gt;
== Links &amp;amp; Literatur ==&lt;br /&gt;
* [http://www.elektronikpraxis.vogel.de/index.cfm?pid=9681 Online-Dossier Grundlagen digitaler Oszilloskope. ] Veröffentlicht auf Elektronikpraxis online&lt;br /&gt;
* [http://www.tek.com/Measurement/App_Notes/XYZs/03W_8605_3.pdf XYZs of Oscilloscopes Primer]. Tektronix 03W-8605-3. 20091. Grundlagen digitaler Oszilloskope und das messen mit ihnen, wobei die Tektronix-Produktpalette im Vordergrund steht.  &lt;br /&gt;
* [http://www.tek.com/Measurement/App_Notes/ABCsProbes/60W_6053_9.pdf ABCs of Probes Primer]. Tektronix 60W-6053-9. 2009. Die Grundlagen von Tastköpfen, natürlich am Beispiel von Tektronixs Tastköpfen.&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/1?filter=oszi*+-oszillator Forum-Beiträge zum Thema Oszilloskop] (Kaufberatung, Anwendung)&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/3?filter=oszi*+-oszillator Beiträge im Markt-Forum]&lt;br /&gt;
* [http://www.virtuelles-oszilloskop.de/ Ein virtuelles interaktives Oszilloskop] ala HAMEG HM203-6 20 MHz zum Üben (Seite auf [http://www.virtuelles-oszilloskop.com Englisch])&lt;br /&gt;
* [http://www.eosystems.ro/eoscope/eoscope_en.htm Selbstbau-DSO 40MSPS]&lt;br /&gt;
* [http://www.sigcon.com/Pubs/straight/probes.htm Probing High-Speed Digital Designs], Originally published in [http://www.elecdesign.com/ Electronic Design Magazine], March, 1997&lt;br /&gt;
* [http://hackedgadgets.com/2007/12/10/oscilloscope-tutorials/ Oscilloscope Tutorials] Linkliste bei hackedgadgets.com&lt;br /&gt;
* [http://www.eevblog.com/2011/03/30/eevblog-159-oscilloscope-trigger-holdoff-tutorial/ EEVBlog #159] Videotutorial von Dave Jones zu &#039;&#039;&#039;Trigger Holdoff&#039;&#039;&#039;, (engl.)&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/167705#1602827 WinXP Software für OsziFox/ProbeScope] von  Micha B. (chameo)&lt;br /&gt;
&lt;br /&gt;
* [http://users.physik.fu-berlin.de/~jtt/fsc2.phtml fsc2] is a program running under GNU/Linux for controlling spectrometers. Supported devices include digitizing oscilloscopes too:&lt;br /&gt;
** Tektronix Digitizing Oscilloscope TDS520, TDS520A, TDS520C, TDS540, TDS744A and TDS754A&lt;br /&gt;
** LeCroy Digitizing Oscilloscope 9400, 9410, 9420, 9424, 9424e and 9450(A)&lt;br /&gt;
** LeCroy Digitizing Oscilloscope Waverunner and Waverunner-2 (LT224, LT 262, LT264, LT342, LT344, LT354, LT362, LT364, LT372, LT374, LT584, 44(M)Xi, 62X1, 64(M)Xi, 104(M)Xi, 204(M)Xi)&lt;br /&gt;
** LeCroy Digitizing Oscilloscope WaveSurfer (422, 424, 432, 434, 452 and 454)&lt;br /&gt;
&lt;br /&gt;
* [http://xoscope.sourceforge.net/ xoscope, oscope] is a digital oscilloscope using input from a sound card or EsounD and/or a ProbeScope/osziFOX and Bitscope hardware. Includes 8 signal displays, variable time scale, math,memory, measurements, and file save/load. (Linux, GPL)&lt;br /&gt;
&lt;br /&gt;
* [http://www.mtoussaint.de/qtdso.html QtDSO] is a frontend for the Velleman PCS64i digital oscilloscope (Anm.: Velleman nicht mehr unterstützt) It provides a fully featured oscillocope mode (including XY  plot and math) and a highly configurable spectrum analyzer mode. Für &#039;&#039;&#039;Digitalmultimeter&#039;&#039;&#039; gibt es vom gleichen Autor [http://www.mtoussaint.de/qtdmm.html QtDMM] und [http://www.mtoussaint.de/qtdmm2.html QtDMM2].&lt;br /&gt;
&lt;br /&gt;
* [http://www.eig.ch/fr/laboratoires/systemes-numeriques/projets/osqoop-l-oscilloscope-libre/index.html Osqoop] est un oscilloscope logiciel sous licence libre. Il permet de travailler sur un nombre arbitraire de canaux et des acquisitions de longue durée. Wiki description: [http://gitorious.org/osqoop Osqoop] is a multi-platform open source software oscilloscope based on Qt 4. It connects to various hardware data sources such as the sound input or a dedicated USB board.&lt;br /&gt;
&lt;br /&gt;
*[http://code.google.com/p/gds2000tools/ gds2000tools] ist eine Linux-Software für GW-Instek GDS-2000 und andere GW-Instek Oszilloskope.&lt;br /&gt;
&lt;br /&gt;
* [https://code.google.com/p/xoscillo/ Xoscillo] - A software oscilloscope that acquires data using an Arduino or a Parallax (more platforms to come). (Lizenz: CC-BY-NC-SA 3.0; Windows and Linux (needs mono))&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/oscope2100/ Oscope 2100] Linux software für Hantek DSO-2100.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/openhantek/ OpenHantek] Linux Software für Hantek (Voltcraft/Darkwire/Protek/Acetech) DSO-2090.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/dsoda/ Digital Soda] DSO-2250 Software.&lt;br /&gt;
&lt;br /&gt;
* [http://owondriver.sourceforge.net/ Owon Driver, Ownon Dump] Linux-Treiber für Owon-Oszilloskope.&lt;br /&gt;
&lt;br /&gt;
* [http://foss.doredevelopment.dk/wiki/Lxi-control Lxi-Control] Kommandozeilen-Applikation zur Fernsteuerung von Geräten mit LXI-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://gpib-utils.sourceforge.net/ gpib-util] Linux Kommandozeilen-Applikation, unterstützt diverse Oszilloskope (und andere Geräte) mit GPIB-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://optics.eee.nottingham.ac.uk/vxi11/ VXI11] Bibliothek und Programme für Geräte mit VXI-11 Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/wfmreader/ Linux WFM Datenformat-Leser].&lt;br /&gt;
&lt;br /&gt;
=== Datenauswertung ===&lt;br /&gt;
&lt;br /&gt;
Bei Oszilloskopen (DSOs), die es erlauben, die gemessenen Daten zu einem PC zu übertragen, kann man die Messwerte auf dem PC weiter auswerten. Zum Beispiel ein Signal demodulieren, filtern oder dekodieren. Grundsätzlich ist die Auswertung in jeder Programmiersprache möglich. Programmiersprachen für numerische Berechnungen eignen sich jedoch besonders.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mathworks.com Matlab] und Clones wie [http://www.scilab.org/ SciLab] oder [http://www.gnu.org/software/octave/ GNU Octave]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mathworks.com/matlabcentral/fileexchange/?term=Oscilloscope Matlabcentral Fileexchange, Suche nach &#039;&#039;Oscilloscope&#039;&#039;] Auf Matlabcentral Fileexchange finden sich auch MatLab Lese- und Auswertungsfunktionen für diverse Oszilloskope. Hinweis: Die von MatLab für die Kommunikation mit einem Oszilloskop verwendeten Toolboxen und Funktionen fehlen häufig bei den Clones wie GNU Octave. Man ist hier auf das original MatLab angewiesen.&lt;br /&gt;
&lt;br /&gt;
* Eines Ingenieurs angeblich unwürdig&amp;lt;ref&amp;gt;Es ist sehr einfach Fehler in Tabellenkalkulationen zu machen, die typischerweise lange unentdeckt bleiben. [http://www.eusprig.org/ Untersuchungen] haben gezeigt, dass bereits dann bis zu 90% aller Tabellenkalkulationsblätter fehlerhaft sind, wenn es nur um einfache mathematische Grundoperationen (Addieren, Subtrahieren, Multiplizieren, Dividieren) geht.&amp;lt;/ref&amp;gt; sind Microsoft Excel oder andere Tabellenkalkulationen. Trotzdem sind sie zur Datenauswertung populär und auch geeignet, wenn sie richtig gehandhabt werden.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Oszilloskope und Analyzer| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=68940</id>
		<title>Cortex-A</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=68940"/>
		<updated>2012-11-02T14:18:52Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* ARM Cortex A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ARM Cortex A =&lt;br /&gt;
&lt;br /&gt;
ARM Cortex A sind von ARM konstruierte Mikroprozessorkerne, wie sie zusammen mit dem Vorläufer ARM11 und einigen unabhängigen Implementierungen der ARM Architektur in nahezu jedem Smartphone und Tablet verbaut sind.&lt;br /&gt;
&lt;br /&gt;
Sie sind deutlich leistungsstärker als ARM Cortex M Mikroprozessoren, daher werden Sie eher im Application-Bereich, sprich mit Betriebsystemen Linux (z.B. Android), Windows Mobile etc. eingesetzt. &lt;br /&gt;
&lt;br /&gt;
ARM bezeichnet die Prozessoren auch so:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Embedded Processors&#039;&#039;&#039; &lt;br /&gt;
*Cortex-M Series - Cost-sensitive solutions for deterministic microcontroller applications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Real-time Embedded Processors&#039;&#039;&#039;&lt;br /&gt;
*Cortex-R Series - Exceptional performance for real-time applications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Application Processors&#039;&#039;&#039;&lt;br /&gt;
*Cortex™-A and Cortex-A50 Series - High performance processors for open Operating Systems&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Linux_Boards Linux Boards (grösstenteils auf ARM basierte)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
*Quelle: http://arm.com/products/processors/index.php&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=68939</id>
		<title>Cortex-A</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=68939"/>
		<updated>2012-11-02T14:17:33Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* ARM Cortex A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ARM Cortex A =&lt;br /&gt;
&lt;br /&gt;
ARM Cortex A sind von ARM konstruierte Mikroprozessorkerne, wie sie zusammen mit dem Vorläufer ARM11 und einigen eigenständigen Implementierungen anderer Hersteller in nahezu jedem Smartphone und Tablet verbaut sind.&lt;br /&gt;
&lt;br /&gt;
Sie sind deutlich leistungsstärker als ARM Cortex M Mikroprozessoren, daher werden Sie eher im Application-Bereich, sprich mit Betriebsystemen Linux (z.B. Android), Windows Mobile etc. eingesetzt. &lt;br /&gt;
&lt;br /&gt;
ARM bezeichnet die Prozessoren auch so:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Embedded Processors&#039;&#039;&#039; &lt;br /&gt;
*Cortex-M Series - Cost-sensitive solutions for deterministic microcontroller applications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Real-time Embedded Processors&#039;&#039;&#039;&lt;br /&gt;
*Cortex-R Series - Exceptional performance for real-time applications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Application Processors&#039;&#039;&#039;&lt;br /&gt;
*Cortex™-A and Cortex-A50 Series - High performance processors for open Operating Systems&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Linux_Boards Linux Boards (grösstenteils auf ARM basierte)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
*Quelle: http://arm.com/products/processors/index.php&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=68938</id>
		<title>Cortex-A</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=68938"/>
		<updated>2012-11-02T14:13:41Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* ARM Cortex A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ARM Cortex A =&lt;br /&gt;
&lt;br /&gt;
ARM Cortex A sind Mikroprozessoren, wie sie als Nachfolger der ebenfalls noch im unteren Preissegment eingesetzten ARM11 Prozessoren in nahezu jedem Smartphone und Tablet verbaut sind.&lt;br /&gt;
&lt;br /&gt;
Sie sind deutlich leistungsstärker als ARM Cortex M Mikroprozessoren, daher werden Sie eher im Application-Bereich, sprich mit Betriebsystemen Linux (z.B. Android), Windows Mobile etc. eingesetzt. &lt;br /&gt;
&lt;br /&gt;
ARM bezeichnet die Prozessoren auch so:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Embedded Processors&#039;&#039;&#039; &lt;br /&gt;
*Cortex-M Series - Cost-sensitive solutions for deterministic microcontroller applications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Real-time Embedded Processors&#039;&#039;&#039;&lt;br /&gt;
*Cortex-R Series - Exceptional performance for real-time applications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Application Processors&#039;&#039;&#039;&lt;br /&gt;
*Cortex™-A and Cortex-A50 Series - High performance processors for open Operating Systems&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Linux_Boards Linux Boards (grösstenteils auf ARM basierte)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
*Quelle: http://arm.com/products/processors/index.php&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=68937</id>
		<title>Cortex-A</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=68937"/>
		<updated>2012-11-02T14:10:10Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* ARM Cortex A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ARM Cortex A =&lt;br /&gt;
&lt;br /&gt;
ARM Cortex A sind Mikroprozessoren, wie sie in nahe zu jedem Smartphone und Tablet verbaut sind. &lt;br /&gt;
&lt;br /&gt;
Sie sind deutlich leistungsstärker als ARM Cortex M Mikroprozessoren, daher werden Sie eher im Application-Bereich, sprich mit Betriebsystemen Linux (z.B. Android), Windows Mobile etc. eingesetzt. &lt;br /&gt;
&lt;br /&gt;
ARM bezeichnet die Prozessoren auch so:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Embedded Processors&#039;&#039;&#039; &lt;br /&gt;
*Cortex-M Series - Cost-sensitive solutions for deterministic microcontroller applications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Real-time Embedded Processors&#039;&#039;&#039;&lt;br /&gt;
*Cortex-R Series - Exceptional performance for real-time applications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM Cortex Application Processors&#039;&#039;&#039;&lt;br /&gt;
*Cortex™-A and Cortex-A50 Series - High performance processors for open Operating Systems&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Linux_Boards Linux Boards (grösstenteils auf ARM basierte)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
*Quelle: http://arm.com/products/processors/index.php&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Bitbanding&amp;diff=67888</id>
		<title>ARM Bitbanding</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_Bitbanding&amp;diff=67888"/>
		<updated>2012-08-13T18:54:55Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Hintergrund */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hintergrund =&lt;br /&gt;
&lt;br /&gt;
Eine RISC Architektur wie die der ARM Prozessoren besitzt oft keine&lt;br /&gt;
Befehle, um einzelne Bits im Speicher zu manipulieren. Um ein&lt;br /&gt;
einzelnes Bit in einem Peripherieregister zu setzen ist daher eine Folge&lt;br /&gt;
mehrerer Befehle erforderlich, wie beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
ldr     r0, =0x40012C0C&lt;br /&gt;
ldrh    r1, [r0]&lt;br /&gt;
orr     r1, #1&amp;lt;&amp;lt;9&lt;br /&gt;
strh    r1, [r0]&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
oder in C formuliert&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint16_t temp = TIM1.DIER;&lt;br /&gt;
temp |= 1&amp;lt;&amp;lt;9;&lt;br /&gt;
TIM1.DIER = temp;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine solche Befehlssequenz im Hauptprogramm steht und in einem&lt;br /&gt;
Interrupt Handler ein anderes Bit des gleichen Peripherieregisters verändert&lt;br /&gt;
wird, dann kann es vorkommen, dass der Handler zwischen dem Load- und&lt;br /&gt;
dem Store-Befehl dieser Sequenz ausgeführt wird. In diesem Fall geht&lt;br /&gt;
die Änderung im Handler mit dem Store-Befehl verloren, der seinen Wert&lt;br /&gt;
aus dem Zustand vor dem Aufruf des Handlers ableitet.&lt;br /&gt;
&lt;br /&gt;
Nun kann man natürlich die Befehlssequenz dagegen absichern, indem man&lt;br /&gt;
sie mit abgeschalteten Interrupts ausführt. Das ist aber recht&lt;br /&gt;
umständlich und verlängert zudem die Reaktionszeit von Interrupts.&lt;br /&gt;
&lt;br /&gt;
ARM Controller mit den Cores Cortex-M3 und -M4 sowie auch manche&lt;br /&gt;
Cortex M0+ besitzen jedoch die Fähigkeit, einzelne Bits im RAM und im&lt;br /&gt;
Peripheriebereich direkt adressieren zu können. Dazu existiert für den&lt;br /&gt;
Peripheriebereich 0x40000000-0x400FFFFF ein weiterer Adressbereich&lt;br /&gt;
0x42000000-0x43FFFFFF und für den RAM-Bereich 0x20000000-0x200FFFFF&lt;br /&gt;
der Bereich 0x22000000-0x23FFFFFF. Das sogenannte &#039;&#039;&#039;Bitbanding&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Arbeitsweise =&lt;br /&gt;
&lt;br /&gt;
In der Bitbanding-Region wird aus den Adressbits 5..24 die Byteadresse&lt;br /&gt;
abgeleitet, indem diese Bits um 5 Bits nach rechts verschoben zur&lt;br /&gt;
Basisadresse der normalen Region addiert werden. Die Adressbits 2..4&lt;br /&gt;
geben die Bitnummer im Byte an. Die Adressbits 0..1 besitzen keine&lt;br /&gt;
Funktion und sollten 0 enthalten.&lt;br /&gt;
&lt;br /&gt;
Ladebefehle in einer Bitbanding-Region laden den Wert 1, wenn das&lt;br /&gt;
adressierte Bit gesetzt ist, sonst 0. Speicherbefehle speichern Bit 0&lt;br /&gt;
des Wertes ins adressierte Bit.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Bitbanding1.png|Adressierung]]&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die obige Sequenz nun zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
ldr     r0, =0x422581A4&lt;br /&gt;
mov     r1, #1&lt;br /&gt;
strh    r1, [r0]&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
oder in C&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
*(volatile uint16_t *)0x422581A4 = 1;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skizzierte Problem mit Interrupt-Handlern kann hier nicht mehr&lt;br /&gt;
auftreten, da die Bitmodifikation als ununterbrechbarer Teil des&lt;br /&gt;
Store-Befehls ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
= Zu beachten =&lt;br /&gt;
&lt;br /&gt;
== Interner Ablauf ==&lt;br /&gt;
&lt;br /&gt;
Es handelt sich bei einer Bitmodifikation weiterhin um eine Abfolge von drei getrennten Operationen:&lt;br /&gt;
* Wert aus dem RAM/Peripherieregister laden,&lt;br /&gt;
* Bit setzen,&lt;br /&gt;
* Wert wieder speichern.&lt;br /&gt;
Nur wird diese Sequenz vom Core im Store-Befehl ausgeführt.&lt;br /&gt;
Die Bitbanding-Operation ist also nicht exakt äquivalent zu speziellen&lt;br /&gt;
Peripherieregistern mit Setzen/Löschen Funktion, wie sie insbesondere&lt;br /&gt;
bei GPIO Ports nicht selten zu finden sind. Diese speziellen Register&lt;br /&gt;
führen wirklich nur eine Bitoperation durch, während es sich beim&lt;br /&gt;
Bitbanding technisch um Operationen auf das gesamte Register handelt.&lt;br /&gt;
&lt;br /&gt;
Siehe: [http://www.mikrocontroller.net/topic/267654 Wo Bitbanding nicht funktioniert]&lt;br /&gt;
&lt;br /&gt;
== Wortbreite ==&lt;br /&gt;
&lt;br /&gt;
Der Core verwendet bei den Bitbanding-Operationen intern die&lt;br /&gt;
Zugriffsbreite genau so, wie sie im Befehl angegeben wird. Ports die&lt;br /&gt;
nur nur wortweise angesprochen werden dürfen, müssen also auch beim&lt;br /&gt;
Bitbanding wortweise angesprochen werden. Halbwort- oder Bytebefehle&lt;br /&gt;
sind dann nicht zulässig.&lt;br /&gt;
&lt;br /&gt;
== Aliasing ==&lt;br /&gt;
&lt;br /&gt;
Der C Compiler weiss nicht, dass es sich bei den verschiedenen&lt;br /&gt;
Adressen für die normalen Daten und deren Bitbanding-Adressen in&lt;br /&gt;
Wirklichkeit um die gleiche Speicherstelle handelt. Es kann also&lt;br /&gt;
sogenanntes Aliasing auftreten.&lt;br /&gt;
&lt;br /&gt;
Damit der Optimizer des Compilers keinen Strich durch die Rechnung&lt;br /&gt;
macht sollten alle Daten, die per Bitbanding angesprochen werden, als&lt;br /&gt;
&amp;quot;volatile&amp;quot; deklariert werden. Das gilt sowohl für die Daten selbst,&lt;br /&gt;
als auch für deren Spiegelbereich in der Bitbanding-Region.&lt;br /&gt;
&lt;br /&gt;
Dies betrifft in der Praxis hauptsächlich Bitbanding im RAM-Bereich, da&lt;br /&gt;
die Peripherieregister ohnehin als &amp;quot;volatile&amp;quot; deklariert sind.&lt;br /&gt;
&lt;br /&gt;
= Makros =&lt;br /&gt;
&lt;br /&gt;
Um die Adressrechnung vom Bitbanding zu vereinfachen wird man&lt;br /&gt;
sinnvollerweise Makros einsetzen. Wer C++ verwendet kann natürlich&lt;br /&gt;
auch Templates nutzen.&lt;br /&gt;
&lt;br /&gt;
==GCC==&lt;br /&gt;
&lt;br /&gt;
Beim GNU Compiler kann man für den Peripheriebereich beispielsweise diese Makros verwenden, die auf den Definitionen und der Konvention von ARM CMSIS aufsetzen und Besonderheiten des GNU Compilers nutzen:&lt;br /&gt;
&lt;br /&gt;
===Direkte Adressierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Access bitbanded peripheral register by direct address.&lt;br /&gt;
#define BBPeriphBit(perReg, bit)   (*(__typeof__(perReg)*) ((PERIPH_BB_BASE + (((unsigned)&amp;amp;(perReg) - PERIPH_BASE) &amp;lt;&amp;lt; 5) + ((bit) &amp;lt;&amp;lt; 2))))&lt;br /&gt;
#define BBPeriphMask(perReg, mask) BBPeriphBit(perReg, BBitOfMask(mask))&lt;br /&gt;
#define BBitOfMask(mask)           (31 - __builtin_clz(mask))&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich direkt adressierte Peripherieregister ansprechen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
BBPeriphBit(TIM1-&amp;gt;DIER, 9) = 1;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Makro BBPeriphMask erwartet keine Bitnummer, sondern eine&lt;br /&gt;
Bitmaske, da die Definitionen in den Include-Files der Hersteller die&lt;br /&gt;
Bits u.U. nur als Maske zur Verfügung stellen. Die Umrechnung einer konstanten&lt;br /&gt;
Maske in eine Bitnummer erfolgt durch den Compiler.&lt;br /&gt;
&lt;br /&gt;
Die Adressrechnung erfolgt bei konstanten Adressen durch den Compiler. Über einen Pointer adressierte Register sollten so nicht verwendet werden, jedenfalls nicht wenn man über diesen Pointer mehrere Zugriffe in der Funktion durchführt, da dann die Adressrechnung zur Laufzeit erfolgt und man sehr von der Intelligenz des Optimizers abhängt.&lt;br /&gt;
&lt;br /&gt;
===Indirekte Adressierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Convert regular base address of a peripheral to bitbanded base address.&lt;br /&gt;
// perPtr: base address of peripheral, typed as pointer to peripheral_TypeDef &lt;br /&gt;
#define BBaseOfPeriph(perPtr)		((__typeof__(*(perPtr))*) (PERIPH_BB_BASE + (((unsigned)(perPtr) - PERIPH_BASE) &amp;lt;&amp;lt; 5)))&lt;br /&gt;
&lt;br /&gt;
// Access bitbanded peripheral register by bitbanded base address and register offset.&lt;br /&gt;
// perBB: bitbanded base address of peripheral, typed as pointer to peripheral_TypeDef &lt;br /&gt;
// member: member name of peripheral_TypeDef&lt;br /&gt;
#define BBOffset(perBB, member)         (__builtin_offsetof(__typeof__(*(perBB)), member) &amp;lt;&amp;lt; 5)&lt;br /&gt;
#define BBasedBit(perBB, member, bit)   (*(__typeof__((perBB)-&amp;gt;member)*) (((unsigned)(perBB) + BBOffset(perBB, member) + ((bit) &amp;lt;&amp;lt; 2))))&lt;br /&gt;
#define BBasedMask(perBB, member, mask) BBasedBit(perBB, member, BBitOfMask(mask))&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
extern TIM_TypeDef *timer;&lt;br /&gt;
TIM_TypeDef *timer_bbptr = BBaseOfPeriph(timer);&lt;br /&gt;
BBasedMask(timer_bbptr, DIER, TIM_DIER_CC1DE) = 1;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Adressrechnung erfolgt hier zur Laufzeit in BBaseOfPeriph(). Bei konstanter Bitnummer erfolgt die Berechnung des Offsets relativ zum Pointer durch den Compiler, beim Zugriff entsteht dann also kein Zusatzaufwand. Der Bitbanding-Pointer timer_bbptr lässt sich für alle Register des Timers verwenden.&lt;br /&gt;
&lt;br /&gt;
===Portierung auf andere Compiler===&lt;br /&gt;
&lt;br /&gt;
Es wird der Maschinenbefehl CLZ (Count Leading Zeroes) verwendet, um eine Bitmaske in eine Bitnummer zu übersetzen. Alternativ kann dies auch per ?: Kaskade realisiert werden, nur übersetzt sich dies bei nicht-konstanter Maske in hässlich viel Code. GCC berechnet bei konstanter Maske die CLZ Operation bereits selbst.&lt;br /&gt;
&lt;br /&gt;
Mit __typeof__ wird erreicht, dass die Zugriffe automatisch mit der richtigen Breite durchgeführt werden. Ein in Halbwortbreite deklariertes Register wird auch mit Halbwortbefehlen angesprochen.&lt;br /&gt;
&lt;br /&gt;
Das Konstrukt __builtin_offsetof__ existiert auch als offsetof.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Bitbanding&amp;diff=67885</id>
		<title>ARM Bitbanding</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_Bitbanding&amp;diff=67885"/>
		<updated>2012-08-13T10:10:04Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Interner Ablauf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hintergrund =&lt;br /&gt;
&lt;br /&gt;
Ein RISC Architektur wie die der ARM Prozessoren besitzt oft keine&lt;br /&gt;
Befehle, um einzelne Bits im Speicher zu manipulieren. Um ein&lt;br /&gt;
einzelnes Bit in einem Peripherieregister zu setzen ist daher eine Folge&lt;br /&gt;
mehrerer Befehle erforderlich, wie beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
ldr     r0, =0x40012C0C&lt;br /&gt;
ldrh    r1, [r0]&lt;br /&gt;
orr     r1, #1&amp;lt;&amp;lt;9&lt;br /&gt;
strh    r1, [r0]&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
oder in C formuliert&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint16_t temp = TIM1.DIER;&lt;br /&gt;
temp |= 1&amp;lt;&amp;lt;9;&lt;br /&gt;
TIM1.DIER = temp;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine solche Befehlssequenz im Hauptprogramm steht und in einem&lt;br /&gt;
Interrupt Handler ein anderes Bit des gleichen Peripherieregisters verändert&lt;br /&gt;
wird, dann kann es vorkommen, dass der Handler zwischen dem Load- und&lt;br /&gt;
dem Store-Befehl dieser Sequenz ausgeführt wird. In diesem Fall geht&lt;br /&gt;
die Änderung im Handler mit dem Store-Befehl verloren, der seinen Wert&lt;br /&gt;
aus dem Zustand vor dem Aufruf des Handlers ableitet.&lt;br /&gt;
&lt;br /&gt;
Nun kann man natürlich die Befehlssequenz dagegen absichern, indem man&lt;br /&gt;
sie mit abgeschalteten Interrupts ausführt. Das ist aber recht&lt;br /&gt;
umständlich und verlängert zudem die Reaktionszeit von Interrupts.&lt;br /&gt;
&lt;br /&gt;
ARM Controller mit den Cores Cortex-M3 und -M4 sowie auch manche&lt;br /&gt;
Cortex M0+ besitzen jedoch die Fähigkeit, einzelne Bits im RAM und im&lt;br /&gt;
Peripheriebereich direkt adressieren zu können. Dazu existiert für den&lt;br /&gt;
Peripheriebereich 0x40000000-0x400FFFFF ein weiterer Adressbereich&lt;br /&gt;
0x42000000-0x43FFFFFF und für den RAM-Bereich 0x20000000-0x200FFFFF&lt;br /&gt;
der Bereich 0x22000000-0x23FFFFFF. Das sogenannte &#039;&#039;&#039;Bitbanding&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Arbeitsweise =&lt;br /&gt;
&lt;br /&gt;
In der Bitbanding-Region wird aus den Adressbits 5..24 die Byteadresse&lt;br /&gt;
abgeleitet, indem diese Bits um 5 Bits nach rechts verschoben zur&lt;br /&gt;
Basisadresse der normalen Region addiert werden. Die Adressbits 2..4&lt;br /&gt;
geben die Bitnummer im Byte an. Die Adressbits 0..1 besitzen keine&lt;br /&gt;
Funktion und sollten 0 enthalten.&lt;br /&gt;
&lt;br /&gt;
Ladebefehle in einer Bitbanding-Region laden den Wert 1, wenn das&lt;br /&gt;
adressierte Bit gesetzt ist, sonst 0. Speicherbefehle speichern Bit 0&lt;br /&gt;
des Wertes ins adressierte Bit.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Bitbanding1.png|Adressierung]]&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die obige Sequenz nun zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
ldr     r0, =0x422581A4&lt;br /&gt;
mov     r1, #1&lt;br /&gt;
strh    r1, [r0]&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
oder in C&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
*(volatile uint16_t *)0x422581A4 = 1;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skizzierte Problem mit Interrupt-Handlern kann hier nicht mehr&lt;br /&gt;
auftreten, da die Bitmodifikation als ununterbrechbarer Teil des&lt;br /&gt;
Store-Befehls ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
= Zu beachten =&lt;br /&gt;
&lt;br /&gt;
== Interner Ablauf ==&lt;br /&gt;
&lt;br /&gt;
Es handelt sich bei einer Bitmodifikation weiterhin um eine Abfolge von drei getrennten Operationen:&lt;br /&gt;
* Wert aus dem RAM/Peripherieregister laden,&lt;br /&gt;
* Bit setzen,&lt;br /&gt;
* Wert wieder speichern.&lt;br /&gt;
Nur wird diese Sequenz vom Core im Store-Befehl ausgeführt.&lt;br /&gt;
Die Bitbanding-Operation ist also nicht exakt äquivalent zu speziellen&lt;br /&gt;
Peripherieregistern mit Setzen/Löschen Funktion, wie sie insbesondere&lt;br /&gt;
bei GPIO Ports nicht selten zu finden sind. Diese speziellen Register&lt;br /&gt;
führen wirklich nur eine Bitoperation durch, während es sich beim&lt;br /&gt;
Bitbanding technisch um Operationen auf das gesamte Register handelt.&lt;br /&gt;
&lt;br /&gt;
Siehe: [http://www.mikrocontroller.net/topic/267654 Wo Bitbanding nicht funktioniert]&lt;br /&gt;
&lt;br /&gt;
== Wortbreite ==&lt;br /&gt;
&lt;br /&gt;
Der Core verwendet bei den Bitbanding-Operationen intern die&lt;br /&gt;
Zugriffsbreite genau so, wie sie im Befehl angegeben wird. Ports die&lt;br /&gt;
nur nur wortweise angesprochen werden dürfen, müssen also auch beim&lt;br /&gt;
Bitbanding wortweise angesprochen werden. Halbwort- oder Bytebefehle&lt;br /&gt;
sind dann nicht zulässig.&lt;br /&gt;
&lt;br /&gt;
== Aliasing ==&lt;br /&gt;
&lt;br /&gt;
Der C Compiler weiss nicht, dass es sich bei den verschiedenen&lt;br /&gt;
Adressen für die normalen Daten und deren Bitbanding-Adressen in&lt;br /&gt;
Wirklichkeit um die gleiche Speicherstelle handelt. Es kann also&lt;br /&gt;
sogenanntes Aliasing auftreten.&lt;br /&gt;
&lt;br /&gt;
Damit der Optimizer des Compilers keinen Strich durch die Rechnung&lt;br /&gt;
macht sollten alle Daten, die per Bitbanding angesprochen werden, als&lt;br /&gt;
&amp;quot;volatile&amp;quot; deklariert werden. Das gilt sowohl für die Daten selbst,&lt;br /&gt;
als auch für deren Spiegelbereich in der Bitbanding-Region.&lt;br /&gt;
&lt;br /&gt;
Dies betrifft in der Praxis hauptsächlich Bitbanding im RAM-Bereich, da&lt;br /&gt;
die Peripherieregister ohnehin als &amp;quot;volatile&amp;quot; deklariert sind.&lt;br /&gt;
&lt;br /&gt;
= Makros =&lt;br /&gt;
&lt;br /&gt;
Um die Adressrechnung vom Bitbanding zu vereinfachen wird man&lt;br /&gt;
sinnvollerweise Makros einsetzen. Wer C++ verwendet kann natürlich&lt;br /&gt;
auch Templates nutzen.&lt;br /&gt;
&lt;br /&gt;
==GCC==&lt;br /&gt;
&lt;br /&gt;
Beim GNU Compiler kann man für den Peripheriebereich beispielsweise diese Makros verwenden, die auf den Definitionen und der Konvention von ARM CMSIS aufsetzen und Besonderheiten des GNU Compilers nutzen:&lt;br /&gt;
&lt;br /&gt;
===Direkte Adressierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Access bitbanded peripheral register by direct address.&lt;br /&gt;
#define BBPeriphBit(perReg, bit)   (*(__typeof__(perReg)*) ((PERIPH_BB_BASE + (((unsigned)&amp;amp;(perReg) - PERIPH_BASE) &amp;lt;&amp;lt; 5) + ((bit) &amp;lt;&amp;lt; 2))))&lt;br /&gt;
#define BBPeriphMask(perReg, mask) BBPeriphBit(perReg, BBitOfMask(mask))&lt;br /&gt;
#define BBitOfMask(mask)           (31 - __builtin_clz(mask))&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich direkt adressierte Peripherieregister ansprechen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
BBPeriphBit(TIM1-&amp;gt;DIER, 9) = 1;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Makro BBPeriphMask erwartet keine Bitnummer, sondern eine&lt;br /&gt;
Bitmaske, da die Definitionen in den Include-Files der Hersteller die&lt;br /&gt;
Bits u.U. nur als Maske zur Verfügung stellen. Die Umrechnung einer konstanten&lt;br /&gt;
Maske in eine Bitnummer erfolgt durch den Compiler.&lt;br /&gt;
&lt;br /&gt;
Die Adressrechnung erfolgt bei konstanten Adressen durch den Compiler. Über einen Pointer adressierte Register sollten so nicht verwendet werden, jedenfalls nicht wenn man über diesen Pointer mehrere Zugriffe in der Funktion durchführt, da dann die Adressrechnung zur Laufzeit erfolgt und man sehr von der Intelligenz des Optimizers abhängt.&lt;br /&gt;
&lt;br /&gt;
===Indirekte Adressierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Convert regular base address of a peripheral to bitbanded base address.&lt;br /&gt;
// perPtr: base address of peripheral, typed as pointer to peripheral_TypeDef &lt;br /&gt;
#define BBaseOfPeriph(perPtr)		((__typeof__(*(perPtr))*) (PERIPH_BB_BASE + (((unsigned)(perPtr) - PERIPH_BASE) &amp;lt;&amp;lt; 5)))&lt;br /&gt;
&lt;br /&gt;
// Access bitbanded peripheral register by bitbanded base address and register offset.&lt;br /&gt;
// perBB: bitbanded base address of peripheral, typed as pointer to peripheral_TypeDef &lt;br /&gt;
// member: member name of peripheral_TypeDef&lt;br /&gt;
#define BBOffset(perBB, member)         (__builtin_offsetof(__typeof__(*(perBB)), member) &amp;lt;&amp;lt; 5)&lt;br /&gt;
#define BBasedBit(perBB, member, bit)   (*(__typeof__((perBB)-&amp;gt;member)*) (((unsigned)(perBB) + BBOffset(perBB, member) + ((bit) &amp;lt;&amp;lt; 2))))&lt;br /&gt;
#define BBasedMask(perBB, member, mask) BBasedBit(perBB, member, BBitOfMask(mask))&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
extern TIM_TypeDef *timer;&lt;br /&gt;
TIM_TypeDef *timer_bbptr = BBaseOfPeriph(timer);&lt;br /&gt;
BBasedMask(timer_bbptr, DIER, TIM_DIER_CC1DE) = 1;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Adressrechnung erfolgt hier zur Laufzeit in BBaseOfPeriph(). Bei konstanter Bitnummer erfolgt die Berechnung des Offsets relativ zum Pointer durch den Compiler, beim Zugriff entsteht dann also kein Zusatzaufwand. Der Bitbanding-Pointer timer_bbptr lässt sich für alle Register des Timers verwenden.&lt;br /&gt;
&lt;br /&gt;
===Portierung auf andere Compiler===&lt;br /&gt;
&lt;br /&gt;
Es wird der Maschinenbefehl CLZ (Count Leading Zeroes) verwendet, um eine Bitmaske in eine Bitnummer zu übersetzen. Alternativ kann dies auch per ?: Kaskade realisiert werden, nur übersetzt sich dies bei nicht-konstanter Maske in hässlich viel Code. GCC berechnet bei konstanter Maske die CLZ Operation bereits selbst.&lt;br /&gt;
&lt;br /&gt;
Mit __typeof__ wird erreicht, dass die Zugriffe automatisch mit der richtigen Breite durchgeführt werden. Ein in Halbwortbreite deklariertes Register wird auch mit Halbwortbefehlen angesprochen.&lt;br /&gt;
&lt;br /&gt;
Das Konstrukt __builtin_offsetof__ existiert auch als offsetof.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=67787</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=67787"/>
		<updated>2012-08-04T21:26:25Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Welche Datentypen haben Konstante? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Verzeichnis von im Forum oft gestellten und immer wieder beantworteten Fragen und den zugehörigen Antworten:&lt;br /&gt;
&lt;br /&gt;
=Wie kann ich Zahlen auf [[LCD]]/[[UART]] ausgeben?=&lt;br /&gt;
&lt;br /&gt;
Aber die Bibliothek, die du benutzt, stellt nur eine Funktion zur Verfügung, mit der man einen String ausgeben kann... Was tun? &lt;br /&gt;
&lt;br /&gt;
In den folgenden Beispielen wird eine selbstgeschriebene Funktion zur Stringausgabe auf LCD - die Funktion lcd_string() - aus dem [[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Teil des AVR-GCC-Tutorials]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
lcd_string( &amp;quot;Hallo Welt&amp;quot; );  // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um also eine Zahl (numerische Konstante oder Variableninhalt) auszugeben, muss von dieser Zahl zunächst ihre String-Repräsentation ermittelt werden. Hier geht es aber nur darum, zu zeigen wie man diese String Repräsenation erzeugen kann. Was man dann mit diesem String weiter macht, ob das dann eine LCD-Ausgabe oder eine UART-Übertragung oder das Abspeichern auf SD-Karte oder ... ist, spielt eine untergeordnete Rolle.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, sich die Stringrepräsentation zu erzeugen:&lt;br /&gt;
&lt;br /&gt;
===itoa() (utoa(), ltoa(), ultoa(), ftoa() )===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; ist keine C-Standardfunktion (wohl aber ihre Umkehrung &amp;lt;b&amp;gt;atoi()&amp;lt;/b&amp;gt; ). Auf manchen Compilern heisst diese Funktion dann folgerichtig &amp;lt;b&amp;gt;_itoa()&amp;lt;/b&amp;gt;, wobei der führende _ eben anzeigt, dass es sich um eine Erweiterung des C-Standards handelt. Bei [[WinAVR]] ist itoa() Bestandteil der mitgelieferten Library avr-libc, in der Libary [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html&#039;&#039;stdlib.h&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  itoa( i, Buffer, 10 );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa( i, Buffer, 10 );&amp;lt;/b&amp;gt; - Die Zahl i wird nach ASCII gewandelt und die String Repräsentierung davon wird in Buffer abgelegt. Die Basis, in der diese Wandlung erfolgt, ist das 10-er System. Wird das dritte Argument von 10 in zb. 2 oder auch 16 abgewandelt, erhält man die binäre oder eben eine hexadezimale Repräsentierung des Wertes. Auch wenn 10, 2 und 16 die häufigsten Angaben an dieser Stelle sind, kann itoa aber grundsätzlich in jedes beliebige Zahlensystem wandlen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, darauf zu achten, dass das Array &amp;lt;i&amp;gt;Buffer&amp;lt;/i&amp;gt; groß genug dimensioniert wird, um alle Zeichen der Textrepräsentation der Zahl aufzunehmen - inklusive der 0, die den String abschließt, sowie ein mögliches Vorzeichen.&lt;br /&gt;
&lt;br /&gt;
Anzumerken bleibt weiter, dass es normalerweise für alle Datentypen entsprechende Umwandlungsfunktionen gibt, wenn es sie für einen Datentyp gibt. Die Namensgebung lehnt sich an das Schema an: &#039;&#039;Kürzel_für_den_Datentyp to a&#039;&#039;. Eine Funktion die einen unsigned int wandelt, heißt dann utoa (oder _utoa), Floating Point heißt dann ftoa (oder _ftoa), etc.&lt;br /&gt;
&lt;br /&gt;
===sprintf()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;%d&amp;quot;, i );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode funktioniert auch bei long oder float Werten. Unbedingt beachtet werden muss allerdings, dass die Typkennzeichnungen im sog. Format-String (hier &amp;quot;%d&amp;quot;) mit den tatsächlichen Typen der auszugebenden Werten übereinstimmt. Und dass der Buffer, der den Text aufnimmt, auch groß genug dimensioniert wird. Dabei sollte die 0, die den String terminiert, nicht vergessen werden.&lt;br /&gt;
&lt;br /&gt;
Mit sprintf() hat man dieselben Möglichkeiten zur Formatierung wie bei &amp;lt;b&amp;gt;printf()&amp;lt;/b&amp;gt; (siehe unten). Insbesondere gibt es natürlich die Möglichkeit die Zahl gleich in einen umgebenden Text einzubetten bzw. Formatierungen anzugeben:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;Anzahl: %d Stueck&amp;quot;, i );&lt;br /&gt;
  lcd_out( Buffer );&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Haken&amp;quot; an der mächtigen Funktion sprintf() ist, daß sie auch bei minimalisierter Konfiguration verhältnismäßig viel Programmspeicher (Flash-ROM) belegt und relativ viel Prozesszeit benötigt. Daher sollte man sprintf() nur verwenden, wenn kein Speicher- und Prozesszeitmangel besteht. Sonst sollte itoa() oder eine eigene, auf die Bedürfnisse optimierte Implementierung auf jeden Fall vorgezogen werden.&lt;br /&gt;
&lt;br /&gt;
====Formatierungen mit printf====&lt;br /&gt;
&lt;br /&gt;
Für jedes auszugebende Argument muss es im Formatstring einen entsprechenden Formatbezeichner geben. Der Aufbau eines Formatbezeichners ist immer&lt;br /&gt;
&lt;br /&gt;
  %[Modifizierer][Feldbreite][.Präzision]Typ&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Typ&amp;lt;/b&amp;gt; ist dabei eine Kennung, der mit dem Datentyp des jeweiligen auszugebenden Argumentes übereinstimmen muss. Einige oft benutzte Kennungen, ohne Anspruch auf Vollständigkeit, sind:&lt;br /&gt;
  &amp;lt;b&amp;gt;c&amp;lt;/b&amp;gt;    char&lt;br /&gt;
  &amp;lt;b&amp;gt;d&amp;lt;/b&amp;gt;    int&lt;br /&gt;
  &amp;lt;b&amp;gt;f&amp;lt;/b&amp;gt;    float, double&lt;br /&gt;
  &amp;lt;b&amp;gt;ld&amp;lt;/b&amp;gt;   long&lt;br /&gt;
  &amp;lt;b&amp;gt;u&amp;lt;/b&amp;gt;    unsigned int&lt;br /&gt;
  &amp;lt;b&amp;gt;lu&amp;lt;/b&amp;gt;   unsigned long&lt;br /&gt;
  &amp;lt;b&amp;gt;p&amp;lt;/b&amp;gt;    pointer&lt;br /&gt;
  &amp;lt;b&amp;gt;s&amp;lt;/b&amp;gt;    string&lt;br /&gt;
  &amp;lt;b&amp;gt;x&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl&lt;br /&gt;
  &amp;lt;b&amp;gt;X&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl, wobei Grossbuchstaben verwendet werden&lt;br /&gt;
&lt;br /&gt;
Der&#039;&#039;Modifizierer&#039;&#039; bestimmt, wie und womit nicht benutzte Felder des Ausgabefeldes gefüllt werden sollen, wie die Ausrichtung innerhalb des Feldes erfolgen soll und ob ein Vorzeichen auch dann ausgegeben werden soll wenn die auszugebende Zahl positiv ist. Wird kein Modifizierer angegeben, so werden nicht benutzte Felder mit einem Leerzeichen gefüllt, positive Vorzeichen unterdrückt und die Ausgabe im Feld rechts ausgerichtet.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;b&amp;gt;+&amp;lt;/b&amp;gt;    Vorzeichen wird immer ausgegeben&lt;br /&gt;
  &amp;lt;b&amp;gt;-&amp;lt;/b&amp;gt;    Die Ausgabe wird im Ausgabefeld linksbündig ausgerichtet&lt;br /&gt;
  &amp;lt;b&amp;gt;0&amp;lt;/b&amp;gt;    anstelle von Leerzeichen werden führende 0-en ausgegeben&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Feldbreite&#039;&#039; gibt die Breite des Ausgabefeldes an, in die die Ausgabe durchgeführt werden soll. Reicht die angegebene Feldbreite nicht aus, so vergrößert printf diese Breite eigenmächtig. Die Feldbreite muß nicht angegeben werden. In diesem Fall bestimmt printf selbst die Feldbreite, so dass die Ausgabe darin Platz findet. Mit der Feldbreite hat man eine simple Möglichkeit dafür zu sorgen, dass der erzeugte String immer eine konstante Länge hat, selbst wenn die auszugebende Zahl diese Länge gar nicht benötigen würde (wichtig zb. bei Tabellen).&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Präzision&#039;&#039; kommt nur bei float oder double Zahlen zum Einsatz. Sie legt fest, wieviele Positionen der kompletten Feldbreite für die Ausgabe von Nachkommastellen reserviert werden sollen. Auch sie muss wiederrum nicht angegeben werden und printf benutzt in so einem Fall Standardvorgaben.&lt;br /&gt;
&lt;br /&gt;
===== Beispiele =====&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%05d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite, wobei das Feld links mit führenden Nullen auf 5 Zeichen aufgefüllt wird&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%-5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite. Die Zahl wird linksbündig in das Feld gestellt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%6.3f&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines float (oder double). Die Ausgabe erfolgt in einem Feld mit 6 Zeichen Breite, wobei 3 Nachkommastellen ausgegeben werden. Achtung: In der Feldbreite ist auch ein eventuelles Vorzeichen sowie der Dezimalpunkt enthalten. Bei einer Feldbreite von 6 Zeichen und 3 Nachkommastellen, bleiben bei einer positiven Zahl daher nur 2 Positionen für den Vorkommaanteil, bei negativen sogar nur 1 Stelle (6 - 3 Nachkommastellen - 1 Dezimalpunkt - 1 Vorzeichen = 1)&lt;br /&gt;
&lt;br /&gt;
===Eigene Umwandlungsfunktionen===&lt;br /&gt;
&lt;br /&gt;
Möchte man &amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; nicht benutzen oder hat es gar auf seinem System nicht zur Verfügung, dann ist es auch nicht schwer, sich selbst eine Funktion dafür zu schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void ItoA( int z, char* Buffer )&lt;br /&gt;
{&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  int j;&lt;br /&gt;
  char tmp;&lt;br /&gt;
  unsigned u;    // In u bearbeiten wir den Absolutbetrag von z.&lt;br /&gt;
  &lt;br /&gt;
    // ist die Zahl negativ?&lt;br /&gt;
    // gleich mal ein - hinterlassen und die Zahl positiv machen&lt;br /&gt;
    if( z &amp;lt; 0 ) {&lt;br /&gt;
      Buffer[0] = &#039;-&#039;;&lt;br /&gt;
      Buffer++;&lt;br /&gt;
      // -INT_MIN ist idR. größer als INT_MAX und nicht mehr &lt;br /&gt;
      // als int darstellbar! Man muss daher bei der Bildung &lt;br /&gt;
      // des Absolutbetrages aufpassen.&lt;br /&gt;
      u = ( (unsigned)-(z+1) ) + 1; &lt;br /&gt;
    }&lt;br /&gt;
    else { &lt;br /&gt;
      u = (unsigned)z;&lt;br /&gt;
    }&lt;br /&gt;
    // die einzelnen Stellen der Zahl berechnen&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&lt;br /&gt;
    // den String in sich spiegeln&lt;br /&gt;
    for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
      tmp = Buffer[j];&lt;br /&gt;
      Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
      Buffer[i-j-1] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    Buffer[i] = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Grundprinzip ist einfach:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Ermittlung der einzelnen Stellen erfolgt in der zentralen Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch fortgesetzte Division durch 10 und Restbildung.&lt;br /&gt;
&lt;br /&gt;
    8392&lt;br /&gt;
&lt;br /&gt;
    8392 % 10           -&amp;gt; &amp;lt;b&amp;gt;2&amp;lt;/b&amp;gt;&lt;br /&gt;
    8392 / 10  -&amp;gt; 839&lt;br /&gt;
&lt;br /&gt;
     839 % 10           -&amp;gt; &amp;lt;b&amp;gt;9&amp;lt;/b&amp;gt;&lt;br /&gt;
     839 / 10  -&amp;gt; 83&lt;br /&gt;
&lt;br /&gt;
      83 % 10           -&amp;gt; &amp;lt;b&amp;gt;3&amp;lt;/b&amp;gt;&lt;br /&gt;
      83 / 10  -&amp;gt; 8&lt;br /&gt;
&lt;br /&gt;
       8 % 10           -&amp;gt; &amp;lt;b&amp;gt;8&amp;lt;/b&amp;gt;&lt;br /&gt;
       8 / 10  -&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nur leider erhält man dadurch die einzelnen Ziffern der Zahl in umgekehrter Reihenfolge im String (&#039;2&#039; &#039;9&#039; &#039;3&#039; &#039;8&#039; anstelle von &#039;8&#039; &#039;3&#039; &#039;9&#039; &#039;2&#039;). Dies ist aber kein Problem, die nachfolgende Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
    tmp = Buffer[j];&lt;br /&gt;
    Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
    Buffer[i-j-1] = tmp;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
spiegelt den String in sich, sodass danach der String eine korrekte Repräsentation der ursprünglichen Zahl darstellt. Der Funktionsteil vor der &#039;Zerlegeschleife&#039; behandelt den Sonderfall daß die Zahl negativ ist. Negative Zahlen werden behandelt indem im Endergebnis ein &#039;-&#039; vermerkt wird und danach die Zahl positiv gemacht wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/67405#541885 Integer-Zahl in String mit bestimmter Zeichenlänge]&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/84005#704736 (Resourcenschonend) Wert einer Variable am LCD ausgeben] von Niels Hüsken &lt;br /&gt;
* [[Festkommaarithmetik]]&lt;br /&gt;
&lt;br /&gt;
=Datentypen in Operationen=&lt;br /&gt;
Ein häufiges Problem betrifft die Auswertung von Ausdrücken. Konkret die Frage nach den beteiligten Datentypen.&lt;br /&gt;
zb&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
int j, k;&lt;br /&gt;
&lt;br /&gt;
i = j / k;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Frage lautet dann: Warum erhalte ich keine Kommastellen, ich weise doch das Ergebnis einem double zu?&lt;br /&gt;
&lt;br /&gt;
Dazu ist zu sagen, dass C nicht so funktioniert. Die Tatsache dass i eine double Variable ist, ist für die Auswahl der Operation, welche die Division durchführt, völlig irrelevant. C orientiert sich ausschliesslich an den &lt;br /&gt;
Datentypen der beteiligten Operanden, um zu entscheiden ob die Division als Integer- oder als Gleitkommadivision durchzuführen ist. Und da sowohl j als auch k ein Integer sind, wird die Division als Integerdivision durchgeführt&lt;br /&gt;
unabhängig davon, was mit dem Ergebnis weiter passiert. Erst nach der Division wird das Ergebnis in einen double überführt, um es an i zuweisen zu können. Zu diesem Zeitpunkt gibt es aber keine Kommastellen mehr, eine Integerdivision erzeugt keine. Und damit tauchen klarerweise auch im Ergebnis keine auf.&lt;br /&gt;
&lt;br /&gt;
Aus genau diesem Grund ist zb das Ergebnis von&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5 / 8;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
eine glatte 0 und nicht 0.625. Die Division 5 / 8 wird als Integer Division gemacht und liefert als solche keine Nachkommastellen. Wird das Ergebnis der Division in einen double umgewandelt, um es an i zuweisen zu können, ist das Kind schon in den Brunnen gefallen: Die Nachkommastellen sind schon längst weg bzw. waren nie vorhanden.&lt;br /&gt;
&lt;br /&gt;
Will man den Compiler dazu zwingen, die Division als Gleitkommadivision durchzuführen, so muss man daher dafür sorgen, dass mindestens einer der beteiligten Operanden ein double Wert ist. Dann bleibt dem Compiler nichts anderes übrig, als auch den zweiten Operanden ebenfalls zu einem double zu machen und die Operation als Gleitkommaoperation durchzuführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5.0 / 8.0;&lt;br /&gt;
&lt;br /&gt;
i = (double)j / k;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell implementiert der Compiler eine Operation immer im &#039;höchsten&#039; Datentyp, der in dieser Operation vorkommenden Operanden. Operanden in einem &#039;niedrigeren&#039; Datentyp werden automatisch immer in diesen &#039;höchsten&#039; Datentyp umgewandelt, zumindest aber int. Die Reihung orientiert sich dabei an der Regel: Ein &#039;höherer&#039; Datentyp kann alle Werte eines &#039;niedrigeren&#039; Datentyps aufnehmen.&lt;br /&gt;
&lt;br /&gt;
    int&lt;br /&gt;
    unsigned int&lt;br /&gt;
    long&lt;br /&gt;
    unsigned long&lt;br /&gt;
    long long&lt;br /&gt;
    unsigned long long&lt;br /&gt;
    double&lt;br /&gt;
    &lt;br /&gt;
float kommt in dieser Tabelle gar nicht vor, da Gleitkommaoperationen grundsätzlich immer als double-Operationen durchgeführt werden. Wohl kann es aber sein, dass double und float dieselbe Anzahl an Bits benutzen. Damit reduziert sich eine double Operation effektiv auf eine float Operation. (Anmerkung: mit dem C99-Standard hat sich dieses geändert. Dort gibt es dann auch echte float Operationen)&lt;br /&gt;
&lt;br /&gt;
Hat man also in einer Operation 2 Operanden der Datentypen int und long, so wird der int implizit zu einem long gemacht und die Operation als long Operation durchgeführt. Das Ergebnis hat dann den Datentyp long.&lt;br /&gt;
&lt;br /&gt;
==Welche Datentypen haben Konstante?==&lt;br /&gt;
&lt;br /&gt;
Auch Zahlenkonstante besitzen einen Datentyp, der selbstverständlich vom Compiler bei der Auswahl der Operation berücksichtigt wird. Hier gilt die Regel: Benutzt wird der Datentyp, der die Zahl gerade noch aufnehmen kann. Eine Zahlenkonstante 5 hat daher den Datentyp int. Die Zahl 32767 passt gerade noch in einen int, und hat daher den Datentyp int. 32768 ist für einen int bereits zu groß und hat daher den Datentyp long. 5.0 ist hingegem immer eine double-Konstante. Der Dezimalpunkt erzwingt dieses.&lt;br /&gt;
&lt;br /&gt;
Eine kleine Feinheit gibt es noch zu beachten. Konstanten in dezimaler Schreibweise haben immer einen signed Datentyp, während Konstanten in hexadezimaler bzw. oktaler Schreibweise je nach Wert einen signed oder einen unsigned Datentyp haben können.&lt;br /&gt;
&lt;br /&gt;
Möchte man einer Konstanten einen bestimmten Datentyp aufzwingen, so gibt es dazu 2 (ein halb) Möglichkeiten:&lt;br /&gt;
* Entweder man castet die Konstante in den gewünschten Datentyp&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   (long)5&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* oder man benutzt die in C dafür vorgesehene Schreibweise, indem man der Konstanten einen Suffix anhängt, der den gewünschten Datentyp beschreibt&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    5L&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Beides ergibt eine dezimale 5, die vom Datentyp long ist.&lt;br /&gt;
&lt;br /&gt;
* eine Zahl in mit einem Dezimalkomma&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    5.0&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
ist immer eine double Zahl. Es sei denn sie hat explizit eien Suffix&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    5.0F&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
dann hat man es mit einer float Zahl zu tun.&lt;br /&gt;
&lt;br /&gt;
Die gültigen Suffixe für Zahlen sind U, L, UL und F:&lt;br /&gt;
&lt;br /&gt;
* U wie unsigned; dabei wird zuerst int angenommen. Es erfolgt eine automatische Ausweitung auf long, wenn die Zahl den Wertebereich eines unsigned int überschreitet. &lt;br /&gt;
* L wie long; die Zahl selbst kann int oder double sein.&lt;br /&gt;
* UL wie unsigned long. Eigentlich eine Zusammensetzung aus U und L&lt;br /&gt;
* F wie float.&lt;br /&gt;
&lt;br /&gt;
=Aktivieren der Floating Point Version von sprintf beim WinAVR mit AVR-Studio=&lt;br /&gt;
[[Bild:AVR_Studio_float1.gif|thumb|right|300px|Project → Configuration Options  → Libraries → Available Link Objects]]&lt;br /&gt;
[[Bild:AVR_Studio_float2.gif|thumb|right|300px|Custom Options → Custom Compilation Options → Linker Options]]&lt;br /&gt;
Beim WinAVR/AVR-Studio wird standardmässig eine Version der printf-Bibliothek verwendet, die keine Floatingpoint-Verarbeitung unterstützt. Die meisten Programme benötigen keine Floatingpoint-Unterstützung, so dass dadurch wertvoller Programmspeicherplatz gespart werden kann.&lt;br /&gt;
&lt;br /&gt;
Benutzt man allerdings eine printf-Variante für die Ausgabe von Floatingpoint-Zahlen, so erscheint an Stelle der korrekt formatierten Zahl lediglich ein &#039;?&#039;. Dies ist ein Indiz dafür, dass die Floatingpoint-Verarbeitung im Projekt aktiviert werden muss.&lt;br /&gt;
&lt;br /&gt;
Um die Floatingpoint-Verarbeitung zu aktivieren, geht man im &#039;&#039;&#039;AVR Studio 4&#039;&#039;&#039; wie folgt vor: &lt;br /&gt;
* Menüpunkt: &#039;&#039;Project → Configuration Options&#039;&#039;&lt;br /&gt;
* Im sich öffnenden Dialog wird in der linken Navigationsleiste der Eintrag &#039;&#039;Libraries&#039;&#039; ausgewählt.&lt;br /&gt;
* Unter &#039;&#039;Available Link Objects&#039;&#039; werden Bibliotheken angeboten. Für die Aktivierung der Floatingpoint-Unterstützung sind 2 interessant&amp;lt;ref&amp;gt;&amp;lt;tt&amp;gt;libc.a&amp;lt;/tt&amp;gt; sollte nicht zu den Bibliotheken hinzugefügt werden, da sie automatisch eingebunden wird. Etwas Hintergrundinformationen gibt es in [http://www.mikrocontroller.net/topic/173630 diesem Thread.]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** &amp;lt;tt&amp;gt;libprintf_flt.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;libm.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Beide Bibliotheken werden durch Aktivieren und einen Druck auf &#039;&#039;Add Library → &#039;&#039; in die rechte Spalte übernommen.&lt;br /&gt;
* Danach wählt man in der Navigationsleiste den Eintrag &#039;&#039;Custom Options&#039;&#039;.&lt;br /&gt;
* Unter &#039;&#039;Custom Compilation Options&#039;&#039; wird &#039;&#039;Linker Options&#039;&#039; ausgewählt und in das Textfeld rechts/unten folgender Text eingetragen:&lt;br /&gt;
         -Wl,-u,vfprintf&lt;br /&gt;
* Ein Druck auf &#039;&#039;Add&#039;&#039; befördert die Zeile in das Listenfeld darüber, welches Optionen für den Linker enthält.&lt;br /&gt;
* Mit &#039;&#039;OK&#039;&#039; wird die Konfiguration abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;AVR Studio 5&#039;&#039;&#039; trägt man die Optionen an anderen Stellen ein ([http://www.mikrocontroller.net/topic/221583#2219612 Beitrag von Hal Smith]): &lt;br /&gt;
*&#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Libraries&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Libraries&#039;&#039; &amp;lt;tt&amp;gt;(-WI, -I), libprintf_flt.a libm.a&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
* &#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Miscellaneous&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Other Linker Flags&#039;&#039; &amp;lt;tt&amp;gt;-Wl,-u,vfprintf&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
= Wie funktioniert String-Verarbeitung in C? =&lt;br /&gt;
: → Siehe: &#039;&#039;[[String-Verarbeitung in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Funktionszeiger =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Funktionszeiger in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Header File, wie geht das? =&lt;br /&gt;
&lt;br /&gt;
Ein Header File ist im Grunde nichts anderes als eine Sammlung aller Informationen, die ein &#039;Aussenstehender&#039; benötigt, um die in einem C-File gesammlten Funktionen benutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Trotzdem gibt es immer wieder Schwierigkeiten, wie sich die Sache mit Header Files und/oder #include verhält und wie man eine derartige Lösung aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
Gegeben sei ein System bestehend aus 3 Funktionen&lt;br /&gt;
* main()&lt;br /&gt;
* functionA()&lt;br /&gt;
* functionB()&lt;br /&gt;
und einigen globalen Variablen. Für dieses System soll eine Aufteilung erfolgen, so dass funtionA samt seinen zugehörigen globalen Variablen in einer eigenen C-Datei residiert (FileA.c), functionB in einem eigenen File residiert (FileB.c) und main() als Hautpfunktion seine eigens C-File (Main.c) darstellt und jeweils die entsprechenden Header Files existieren.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man in vielen Fällen einfach so vorgehen:&lt;br /&gt;
Man schreibt erst mal den C-Code der Funktion, die man implementieren möchte. Zb fängt man an mit FileA.c&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionIntA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt geht man das File, so wie es auch der Compiler macht, von oben nach unten durch schaut den Code durch. Damit functionB aufgerufen werden kann, ist ein Prototyp dafür notwendig. Der kommt aus einem Header File, welches noch nicht existiert, aber im Laufe des Prozesses entstehen und FileB.h heissen wird. Also wird in FileA.C erst mal so getan, als ob es dieses Header File schon geben würde und ein entsprechender #include ergänzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gut. Die Variable VarExtB wird ebenfalls über den include hereingezogen&lt;br /&gt;
werden. Damit ist FileA.c erst mal vollständig. Da fehlt jetzt erst mal nichts mehr. Alles was in FileA.c vorkommt sind entweder C-Schlüsselwörter, durch FileA.c selbst definiert oder kommt über den #include herein.&lt;br /&gt;
&lt;br /&gt;
Der nächste Schritt ist die Überlegung: Was von dem Zeugs in FileA.C soll con anderer Stelle (von anderen C-Files aus) benutzt und verwendet werden können.&lt;br /&gt;
Welche Dinge muss FileA von sich preis geben.&lt;br /&gt;
&lt;br /&gt;
Da sind zu erst mal die beiden Variablen. Was soll mit denen geschehen?&lt;br /&gt;
VarExtA soll von aussen zugreifbar sein, VarIntA nicht. Und dann&lt;br /&gt;
natürlich die Funktion, die aufrufbar sein soll.&lt;br /&gt;
&lt;br /&gt;
Also beginnt man ein Header File für FileA.c zu schreiben, in das all das&lt;br /&gt;
reinkommt, was FileA.c nach aussen sichtbar machen will.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileA.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtA;&lt;br /&gt;
&lt;br /&gt;
int functionA( void );&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable kriegt ein extern davor (und wird damit zu einer Deklaration), bei der Funktion wird einfach die Implementierung weggenommen und die somit zu einer Deklaration veränderte Zeile mit einem ; abgeschlossen. Wenn man möchte kann man den so geschaffenen Prototypen auch mit einem extern einleiten. Notwendig ist es aber nicht.&lt;br /&gt;
&lt;br /&gt;
Erneuter Blick aufs Header File. Kommt da irgendwas vor, was nicht&lt;br /&gt;
Standard C Schlüsselwort ist? Nein. Nichts.&lt;br /&gt;
Also ist dieses Header File somit ebenfalls in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Zur Sicherheit wird in FileA.c noch einen Include auf das&lt;br /&gt;
eigene Header File hinzugefügt, denn dann kann der Compiler überprüfen ob die&lt;br /&gt;
Angaben im Header File mit der tatsächlichen Implementierung&lt;br /&gt;
übereinstimmen. Und da VarIntA von aussen nicht sichtbar sein soll (auch&lt;br /&gt;
nicht durch Tricks), wird sie static gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
static int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe für FileB.c. Erst mal einfach runterschreiben&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit functionA aufgerufen werden kann, braucht es wieder einen Prototypen. Den&lt;br /&gt;
kriegt man über von FileA.h, welches daher includiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was noch? VarExtA. Diese Variable wird aber ebenfalls durch den #include als extern Deklaration ins FileB.c hereingezogen und ist somit bei der Übersetzung von FileB.c bekannt. Kommt sonst noch etwas vor? MeinePrivateFunktion. Diese Funktion soll nur in FileB.c benutzt werden und ist für jemanden ausserhalb FileB.c völlig uninteressant. Nichts destotrotz gilt die Regel: compiliert wird von oben nach unten und verwendet werden kann nur etwas, was auch bekannt ist. D.h. bevor der Aufruf der Funktion in functionB gemacht werden kann, muss es einen Protoypen der Funktion geben. Da diese Funktion aber nicht nach &#039;aussen&#039; exportiert wird, macht man den Protoypen gleich in das C-File mit hinein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Würde man die Funktion vorziehen, so dass der Funktionskörper vor der ersten Verwendung steht, dann würde man auch keinen Protoypen benötigen. Eine Funktionsdefinition fungiert als ihr eigener Protoyp.&lt;br /&gt;
&lt;br /&gt;
Kommt sonst noch etwas vor? Nix mehr. In FileB.c wird sonst nix mehr verwendet was nicht entweder C Schlüsselwort oder im File selber oder durch einen #include reinkommt.&lt;br /&gt;
&lt;br /&gt;
Dann wieder: das Header File für B schreiben. Dabei einfach nur überlegen: was soll von FileB.c nach aussen getragen werden?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileB.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtB;&lt;br /&gt;
&lt;br /&gt;
int functionB( void );&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und zur Sicherheit wieder ins eigene C-File includen und alle Variablen&lt;br /&gt;
(oder auch Funktionen), die von aussen nicht sichtbar sein sollen, als&lt;br /&gt;
static markieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
static int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
static void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit bleibt nur noch main.c. Auch dieses wird erst mal einfach runtergeschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionA aufgerufen werden kann, braucht es einen Prototypen. Woher kommt er? Aus FileA.h. Also gleich mal includen&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionB aufgerufen werden kann, braucht es einen Prototypen. Wo&lt;br /&gt;
kommt der her? Aus FileB.h. Also noch ein #include&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt noch was? VarExtA ist durch den #include von FileA.h bereits&lt;br /&gt;
abgedeckt und VarExtB ist durch den #include von FileB.h bereits&lt;br /&gt;
abgedeckt. Also fehlt nix mehr. Auch in main.c sind damit alle Sachen&lt;br /&gt;
abgedeckt und es ist in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Das ist der Standardmechanismus:&lt;br /&gt;
* Implementierung der Funktionen im C File schreiben&lt;br /&gt;
* Überlegen, was von dieser Implementierung von aussen sichtbar sein soll.&lt;br /&gt;
* Dasjenige kommt als Deklaration ins Header File, alles andere am besten static machen.&lt;br /&gt;
* Für alles im C-File, das seinerseits woanders herkommt, gibt es einen #include, der das jeweils notwendige Header File einbindet.&lt;br /&gt;
* Werden im Header File Dinge von woanders benutzt, dann enthält das Header File einen entsprechenden #include&lt;br /&gt;
&lt;br /&gt;
= Ich hab da mehrere *.c und *.h Dateien. Was mache ich damit? =&lt;br /&gt;
&lt;br /&gt;
[[Bild:c-flow.svg|right|thumb|260px|C-Programmierung: Workflow]]&lt;br /&gt;
Zunächst ist es wichtig, sich zu vergegenwärtigen, wie C-Compiler und Linker zusammenarbeiten. Ein komplettes Programmier-Projekt kann und wird im Normalfall aus mehreren Quelldateien bestehen, die alle zusammengenommen das komplette Programm bilden.&lt;br /&gt;
&lt;br /&gt;
Der Prozess des Erstellens des Programmes geschieht in mehrerern Schritten:&lt;br /&gt;
;Compilieren: zunächst werden alle Einzelteile (jede *.c Datei) für sich &#039;&#039;compiliert&#039;&#039;. Dabei ensteht aus jeder c-Datei eine sogenannte Object-Datei, in der bereits der Maschinencode für die im c-File programmierten Funktionen enthalten ist&lt;br /&gt;
;Linken: die einzelnen Object-Dateien werdenmit zusätzlichen Bibliotheken und dem Startup-Code zum fertigen Programm &#039;&#039;gelinkt&#039;&#039;.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
Angenommen, das komplette Projekt besteht aus 2 Dateien:&lt;br /&gt;
&lt;br /&gt;
;main.c:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int twice (int);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  twice (5);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;func.c:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int twice (int number)&lt;br /&gt;
{&lt;br /&gt;
  return 2 * number;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.c&amp;lt;/tt&amp;gt; &#039;&#039;unabhängig&#039;&#039; voneinander compiliert. Als Ergebnis erhält man die Dateien &amp;lt;tt&amp;gt;main.o&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.o&amp;lt;/tt&amp;gt;, die den besagten Object-Code enthalten.&lt;br /&gt;
Diese beiden Zwischenergebnisse werden dann zusammen mit Bibliotheken zum fertigen Programm gebunden (gelinkt), das dann ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Bekommt man also von irgendwo bereits fertige *.c (und zugehörige *.h) Dateien, so genügt es, die *.c Dateien in das Projekt mit aufzunehmen. Dadurch wird das entsprechende C-File compiliert und das Ergebnis davon, das Object-file, wird dann in das fertige Programm mit eingelinkt.&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da jede der C-Dateien unabhängig von allen anderen compiliert wird, bedeutet das auch, dass jede der C-Dateien in sich vollständig sein muss!&lt;br /&gt;
&lt;br /&gt;
Wie eine C-Datei in das Projekt mit aufgenommen wird, hängt im wesentlichen von der benutzten Entwicklungsumgebung ab.&lt;br /&gt;
&lt;br /&gt;
== Makefile ==&lt;br /&gt;
&lt;br /&gt;
Die zusätzliche *.c Datei wird in die SRC Zeile im makefile eingetragen.&lt;br /&gt;
&lt;br /&gt;
== AVR-Studio ==&lt;br /&gt;
&lt;br /&gt;
Hier ist es besonders einfach, eine Datei in das Projekt mit aufzunehmen. Dazu wird im Projektbaum der Knoten &amp;quot;Source Files&amp;quot; aktiviert und mit der rechten Maustaste das Kontextmenü geöffnet. Im Menü wird der Punkt &amp;quot;Add existing Source File(s)&amp;quot; ausgewählt, und anschliessend zeigt man AVR-Studio das zusätzliche C-File. AVR-Studio berücksicht dann diese Datei bei der Projekterzeugung, compiliert es und sorgt dafür, daß es zum fertigen Programm dazugelinkt wird.&lt;br /&gt;
&lt;br /&gt;
=Globale Variablen über mehrere Dateien=&lt;br /&gt;
Ein häufiger Problemkreis in der C Programmierung sind auch globale Variablen, die von mehreren *.c Dateien aus benutzt werden sollen. Was hat es damit auf sich?&lt;br /&gt;
&lt;br /&gt;
Zunächst mal muß man bei der Vereinbarung von Variablen zwischen &#039;&#039;Definition&#039;&#039; und &#039;&#039;Deklaration&#039;&#039; unterscheiden:&lt;br /&gt;
;Definition: Mit einer Definition wird der Compiler angewiesen, eine Variable tatsächlich zu erzeugen. Damit er das kann, muß ihm selbstverständlich der exakte Datentyp und auch der Name der Variablen zur Verfügung stehen. Eine Definition sorgt also dafür, dass im späteren Programm Speicherplatz für diese Variable reserviert wird&lt;br /&gt;
;Deklaration: Mit einer Deklaration teilt man dem Compiler lediglich mit, dass eine Variable existiert. An dieser Stelle soll der Compiler also keinen Speicherplatz reservieren, sondern der Compiler soll einfach nur zur Kenntniss nehmen, daß es eine Variable mit einem bestimmten Namen gibt und von welchem Datentyp sie ist.&lt;br /&gt;
&lt;br /&gt;
Aus obigem folgt sofort, dass eine Definition auch immer eine Deklaration ist. Denn dadurch, daß der Compiler angewiesen wird eine Variable auch tatsächlich zu erzeugen, folgt, dass er dazu auch dieselben Informationen benötigt, die auch in einer Deklaration angegeben werden müssen. Der einzige Unterschied: Bei einer Deklaration trägt der Compiler nur in seinen internen Tabellen ein, dass es diese Variable tatsächlich gibt, während er bei einer Definition zusätzlich auch noch dafür sorgt, dass im fertigen Programm auch Speicher für diese Variable bereitgestellt wird.&lt;br /&gt;
&lt;br /&gt;
Warum ist diese Unterscheidung wichtig?&lt;br /&gt;
&lt;br /&gt;
Weil es in C die sog. &#039;&#039;One Definition Rule&#039;&#039; (ODR). Sie besagt, dass in einem vollständigen Programm, also über alle *.c Dateien gesehen, es für eine Variable nur &amp;lt;b&amp;gt;eine&amp;lt;/b&amp;gt; Definition geben darf. Es darf allerdings beliebig viele Deklarationen geben, solange diese Deklarationen alle im Datentyp übereinstimmen. Kurz gesagt: Man darf den Compiler nur einmal auffordern, eine Variable zu erzeugen (Definition), kann sich aber beliebig oft auf diese eine Variable beziehen (Deklarationen). Aber Vorsicht! Da der Compiler jede einzelne *.c Datei für sich alleine übersetzt und dabei kein Wissen von ausserhalb benutzt, obliegt es der Verantwortung des Programmierers dafür zu sorgen, dass alle Deklarationen im Datentyp übereinstimmen. Der Compiler kann diese Einhaltung prinzipbedingt nicht überwachen!&lt;br /&gt;
&lt;br /&gt;
Woran erkennt man eine Definition bzw. Deklaration?&lt;br /&gt;
&lt;br /&gt;
Eine Definition einer globalen Variable steht immer ausserhalb eines Funktionsblocks. Zb.&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
int  MyData;         // Globale Variable namens MyData. Sie ist vom Typ int&lt;br /&gt;
char Name[30];       // Globales Array&lt;br /&gt;
long NrElements = 5; // Globale Variable, die auch noch initialisiert wird&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Deklaration unterscheidet sich von einer Definition in 2 Punkten&lt;br /&gt;
* Es wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; vorangestellt.&lt;br /&gt;
* Es kann keine Initialisierung geben. Sobald eine Initialisierung vorhanden ist, wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; ignoriert und aus der Deklaration wird eine Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiele für Deklarationen&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
extern int  MyData;&lt;br /&gt;
extern char Name[30];&lt;br /&gt;
extern long NrElements;&lt;br /&gt;
extern long NrElements = 5;  // Achtung: Dies ist eine Definition!&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt man also 2 *.c Dateien, main.c und helpers.c, und sollen sich diese beiden Dateien eine globale Variable teilen, so muss in eine Datei eine Definition hinein, während in die andere Datei eine Deklaration derselben Variablen erfolgen muß. Traditionell werden die Definitionen in der *.c-Datei gemacht, die als Hauptdatei des Moduls fungiert, zu der diese Variable konzeptionell gehört. Im Zweifel ist das die *.c Datei, in der main() enthalten ist. Das muss nicht so sein, ist aber eine Konvention, die oft Sinn macht. Alternativ wird auch gerne oft eine eigene *.c Datei (zb. globals.c) gemacht, die einzig und alleine die Defintionen der globalen Variablen enthält.&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
int  AnzahlElemente;        // Dies ist die Definition. Hier wird die globale&lt;br /&gt;
                            // Variable AnzahlElemente tatsächlich erzeugt.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  AnzahlElemente = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
helpers.c&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
extern int AnzahlElemente;   // Dies ist die Deklaration die auf die globale&lt;br /&gt;
                             // Variable AnzahlElemente in main.c verweist.&lt;br /&gt;
                             // Wichtig: Der Datentyp muss mit dem in main.c&lt;br /&gt;
                             // angegebenen übereinstimmen&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
  j = AnzahlElemente;&lt;br /&gt;
  AnzahlElemente = 9;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Praktische Durchführung==&lt;br /&gt;
Besteht ein vollständiges Programm aus mehreren *.c Dateien, dann kann man sich vorstellen, daß es mühsam ist, alle Deklarationen immer auf gleich zu halten. Hier bietet sich der Einsatz eines Header Files an, in der die Deklarationen stehen und welches in die jeweiligen *.c Dateien inkludiert wird&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int Anzahl;      // auch wenn Global.h inkludiert wurde, so muss es eine&lt;br /&gt;
                 // Definition der Variablen geben. In Global.h sind ja nur&lt;br /&gt;
                 // Deklarationen.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bar.c&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void bar()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  j = Anzahl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Art kann man erreichen, dass zumindest alle Deklarationen ein und derselben Variablen in einem Programm übereinstimmen. Die Datei Global.h wird auch in main.c inkludiert, obwohl man das eigentlich nicht müsste, denn dort wird die Variable ja definiert. Durch die Inclusion ermöglicht man aber dem Compiler die Überprüfung ob die Deklaration auch tatsächlich mit der Definition übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
Solange kein Initialisierungen der globalen Variablen notwendig sind, gibt es noch einen weiteren Trick, um sich selbst das Leben und die Verwaltung der globalen Variablen zu erleichtern.&lt;br /&gt;
Worin besteht das Problem?&lt;br /&gt;
Das Problem besteht darin, dass man bei Einführung einer neuen globalen Variablen an 2 Stellen erweitern muss: Zum einen in der Header-Datei, die die &#039;extern&#039;-Deklaration der Variablen enthält, zum anderen muss in einer C-Datei die Definition der Variablen erfolgen. Das kann man sich mit etwas Präprozessorarbeit auch einfacher machen:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
#ifndef EXTERN&lt;br /&gt;
#define EXTERN extern&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie funktioniert das Ganze? Im Grunde muss man nur dafür sorgen, dass der Compiler an &#039;&#039;einer&#039;&#039; Stelle das Schlüsselwort &#039;&#039;&#039;extern&#039;&#039;&#039; ignoriert (hier in main.c) und bei allen anderen Inclusionen beibehält. Dadurch das ein Präprozessor-ifndef benutzt wird, kann dieses erreicht werden. Wird das Header File includiert und ist zu diesem Zeitpunkt das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; noch nicht definiert, so wird innerhalb des Header Files &#039;&#039;&#039;EXTERN&#039;&#039;&#039; zu &#039;&#039;&#039;extern&#039;&#039;&#039; definiert und damit in weiterer Folge im Quelltext &#039;&#039;&#039;EXTERN&#039;&#039;&#039; durch &#039;&#039;&#039;extern&#039;&#039;&#039; ersetzt. Wenn daher foo.c das Header File inkludiert, wird die Zeile&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
vom Präprozessor zu&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
In main.c hingegen sieht die Include-Sequenz so aus&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
Wenn Global.h bearbeitet wird, existiert bereits ein Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039;, das auf einen leeren Text expandiert. Dadurch wird verhindert, dass innerhalb von Global.h das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; mit dem Text &#039;&#039;&#039;extern&#039;&#039;&#039; belegt wird und&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
wird daher vom Präprozessor zu&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
int Anzahl;&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
erweitert, genau wie es benötigt wird.&lt;br /&gt;
&lt;br /&gt;
= Was hat es mit volatile auf sich =&lt;br /&gt;
Immer wieder hört man im Forum die pauschale Aussage &amp;quot;Variablen die in einer ISR verwendet werden, müssen volatile sein&amp;quot;. Nun, das ist so nicht ganz richtig.&lt;br /&gt;
Welches Problem löst denn eigentlich volatile? Was ist denn das eigentliche Problem, das einer Lösung bedarf?&lt;br /&gt;
&lt;br /&gt;
Das Problem findet sich diesmal im Optimierer eines C Compilers. C Compiler übersetzen, wenn sie optimieren dürfen, den C Code nicht direkt so, wie ihn der Programmierer geschrieben hat, sondern sie versuchen Ressourcen einzusparen. Das kann sowohl Programmspeicher als auch Laufzeit, häufig auch beides gemeinsam sein. Zu diesem Zweck untersuchen sie das Programm und versuchen in der funktional gleichwertigen, in Maschinensprache übersetzen Version, Anweisungen einzusparen. Das dürfen sie auch. Der C-Standard erlaubt Optimierungen, solange die &#039;As-If&#039;-Regel eingehalten wird. Das bedeutet: Der Compiler darf das Programm umstellen und verändern, solange die Programmergebnisse dieselben bleiben. Eben &amp;quot;As-if&amp;quot; die Optimierung nie stattgefunden hätte.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir ein Beispiel&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
&lt;br /&gt;
  if( i == 5 )&lt;br /&gt;
    j = 8;&lt;br /&gt;
  else&lt;br /&gt;
    j = 6;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
In diesem Programmausschnitt darf der Compiler seine Kenntnisse ausnutzen. Er weiß an dieser Stelle, dass i den Wert 2 hat. Damit ist aber auch klar, dass die Bedingung niemals wahr sein kann, denn 2 kann niemals gleich 5 sein. Wenn die Bedingung aber niemals wahr sein kann, dann kann auch die Zuweisung von 8 an j niemals ausgeführt werden. Der Compiler kann also diesen Programmtext zu diesem hier kürzen&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
  j = 6;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
ohne das sich an den Programmergebnissen etwas ändert. Die zweite Version ist aber kürzer und wird, wegen des Wegfalles des Vergleiches, auch schneller ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Eine andere Form der Optimierung betrifft die Verwaltung von µC-Ressourcen und da wieder ganz speziell die Register. Variablen werden ja erst mal im SRAM-Speicher des µC angelegt. Um mit den Werten von Variablen arbeiten zu können, müssen diese Wert aber vom SRAM-Speicher in µC-Register überführt werden (Register kann man sich wie Speicherstellen in der eigentlichen CPU vorstellen). Nur dort können diese Werte mittels Maschinenbefehlen manipuliert werden.&lt;br /&gt;
Jetzt haben aber µC nicht beliebig viele Register. Das bedeutet aber auch, der Compiler muss darüber Buch führen, welche Werte (welche Variablen) gerade in welchen Registern liegen und wenn alle Register belegt sind, muss ein anderes Register freigeräumt werden, in dem der Wert aus dem Register wieder ins SRAM zurück übertragen wird.&lt;br /&gt;
Allerdings kostet das auch Zeit. Der Compiler wird daher versuchen, Variablen, die in einem Programmstück oft benötigt werden, für längere Zeit in den Registern zu halten, um das Registerladen bzw. -zurückschreiben einzusparen. Die Grundannahme lautet dabei immer: In Anweisungen, in denen eine Variable nicht vorkommt, kann diese Variable auch nicht verändert werden. Im Programmstück&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
gibt es für i keine Möglichkeit, verändert zu werden. Der Compiler kann daher entscheiden, dass er diese Variable, *an dieser Stelle*, gar nicht aus dem SRAM laden muss, sondern sich den entsprechenden Wert in einem Register vorhält und dieses Register ausschließlich dafür reserviert. (Er könnte auch entscheiden, dass der Code nie ausgeführt werden kann, aber das ist eine andere Geschichte)&lt;br /&gt;
&lt;br /&gt;
Der springende Punkt ist nun, dass der Compiler hier eine zu kleine Sicht der Dinge hat. Betrachtet man nur dieses Code Stück, dann gibt es tatsächlich für i keine Möglichkeit, seinen Wert zu verändern. Aber die Dinge ändern sich, wenn Interrupts ins Spiel kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Jetzt gibt es plötzlich eine Möglichkeit, wie i seinen Wert ändern kann: Wenn der entsprechende Interrupt ausgelöst wird, dann wird i auf den Wert 5 gesetzt. i, das ist aber nichts anderes als ein bestimmter Speicherbereich im SRAM. D.h. im SRAM wird die Variable tatsächlich korrekt auf den Wert 5 gesetzt. Nur: Als der Compiler die while-Schleife übersetzt hat, wusste er nichts davon, dass diese Möglichkeit existiert. Er hat entschieden, dass er an dieser Stelle den Wert der Variablen in einem CPU-Register halten wird, um Zugriffe einzusparen. Nur wird diese Kopie des Wertes im Register natürlich nicht verändert, wenn in der ISR das Original von i im SRAM verändert wird.&lt;br /&gt;
Fazit: Obwohl die ISR die Variable tatsächlich verändert, kriegt das der Code im while nicht mit, weil der Compiler es mit der Optimierung an dieser Stelle übertrieben hat. In der while-Schleife wird mit einer Kopie des Wertes von i in einem Register gearbeitet und nicht mit dem originalen Wert von i im SRAM.&lt;br /&gt;
&lt;br /&gt;
Und an dieser Stelle kommt jetzt volatile ins Spiel.&lt;br /&gt;
&lt;br /&gt;
volatile teilt dem Compiler mit, dass ausnahmslos alle Zugriffe auf eine Variable auch tatsächlich auszuführen sind und keine Optimierungen gemacht werden dürfen, weil eine Variable auf Wegen benutzt werden kann, die für den Compiler prinzipiell nicht einsichtig sind. Im obigen Beispiel könnte man argumentieren, dass der Compiler ja wohl die ISR bemerken könne und daher feststellen könnte, dass i tatsächlich verändert wird. Aber das stimmt so in der allgemeinen Form nicht. Niemand sagt, dass der Compiler die ISR überhaupt zu Gesicht bekommen muss, die könnte ja auch in einem ganz anderen C File stecken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
volatile uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
wird i volatile gemacht, so verbietet man damit dem Compiler explizit, Annahmen über den Datenfluss von i zu treffen. Innerhalb der Schleife muss also tatsächlich jedes Mal wieder erneut i aus dem SRAM geholt werden und mit 5 verglichen werden. Abkürzungen durch Mehrfachverwendung von Registern oder sonstigen Optimierungstricks sind nicht erlaubt. Und damit ist das Problem gelöst. Wird i in der ISR verändert, so bekommt das auch die Abfrage mit, weil ja jetzt auf jeden Fall auf das Original im SRAM zurückgegriffen wird.&lt;br /&gt;
&lt;br /&gt;
Das Gleiche gilt auch ebenso &amp;quot;in die andere Richtung&amp;quot;, wenn also i in der Schleife geändert und in der ISR nur gelesen wird. Auch hier könnte die Optimierung negativ zuschlagen und den Schreibzugriff nur auf eine lokale Kopie der Variable in einem Register durchführen (oder gar ganz wegfallen) lassen, weil der Lesezugriff außerhalb des direkten Programmflusses (in der ISR) für den Compiler nicht ersichtlich ist.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Problem (das ebenfalls mittels volatile gelöst wird) sind Variablen, die tatsächlich im Code überhaupt nie aktiv verändert werden, sondern es sich um Zusatzhardware handelt, die so verschaltet ist, dass sie im Programm in Form einer Variablen auftaucht, z.B. ein Uhren-IC (oder auch ganz banal: Portpins). In diesem Fall wird z.B. die Variable für Sekunden vom Programm gar nicht vom Programm selber verändert, ändert aber trotzdem ihren Inhalt. Die Zusatzhardware selbst macht das. Aus Programmsicht handelt es sich um Speicherzellen, die magisch selbsttätig ihren Wert ändern. Und damit dürfen selbstverständlich auch hier keinerlei Annahmen über den Inhalt der Variablen getroffen werden. Eine derart angebundene externe Hardware nennt man übrigens &amp;quot;memory-mapped&amp;quot;, weil sie ihre Werte ins Memory (=Hauptspeicher) mapped (=einblendet).&lt;br /&gt;
&lt;br /&gt;
= Konstanten an fester Flash-Adresse =&lt;br /&gt;
&lt;br /&gt;
Wie kann man eine Konstante an entsprechender Adresse im Flash ablegen?&lt;br /&gt;
&lt;br /&gt;
Mehmet Kendi hat eine Lösung für [[AVR Studio]] &amp;amp; [[WinAVR]] in &lt;br /&gt;
[http://www.mikrocontroller.net/topic/142704#1453079] angegeben.&lt;br /&gt;
&lt;br /&gt;
= Timer =&lt;br /&gt;
== Was macht ein Timer? ==&lt;br /&gt;
Oft hört man im Forum die Aussage: Timer sind so kompliziert!&lt;br /&gt;
&lt;br /&gt;
Aber eigentlich stimmt das nicht. Ganz im Gegenteil, Timer sind eigentlich eine sehr einfache Sache. Was genau macht eigentlich ein Timer? Die Antwort lautet: er zählt unabhängig vom restlichen Programmfluss vor sich hin. Und? Was macht er noch? Nichts. Das wars schon. Im Kern ist genau das auch schon alles was ein Timer macht.&lt;br /&gt;
[[Bild:Timer_Basis.gif|framed|center|ein 8-Bit Timer bei der Arbeit]]&lt;br /&gt;
&lt;br /&gt;
== Wie schnell macht er es? ==&lt;br /&gt;
Aber so einfach ist die Sache dann doch wieder nicht. Da erhebt sich zunächst mal die Frage: wie schnell zählt denn eigentlich so ein Timer? Normalerweise ist der Timer mit der Taktfrequenz des Prozessors gekoppelt, so dass zb bei einer Taktfrequnz von 1Mhz der Timer auch genau so schnell zählt. In 1 Sekunde zählt ein Timer also von 0 bis 1000000, also 1 Mio Zählschritte. Nun kann aber ein beispielsweise 8-Bit Timer nicht bis 1000000 zählen, dazu ist er nicht groß genug. Mit 8 Bit kann man bis 255 zählen. Zählt man da dann noch 1 dazu, dann läuft der Timer über und beginnt wieder bei 0. Man kann daher ruhigen Gewissens sagen: In 1 Sekunde zählt dieser Timer 3906 mal den Bereich von 0 bis 255 (und weiter auf 0) durch (das sind 256 Zählschritte) und zuätzlich schafft er es danach noch bis 64 zu zählen. Denn 3906 * 256 + 64 = 1000000 und wir haben wieder die 1 Mio Zählschritte, die der Timer in 1 Sekunde erledigt.&lt;br /&gt;
&lt;br /&gt;
Das ist ganz schön schnell. Und weil das oft zu schnell ist, hat jeder Timer noch die Möglichkeit sogenannte Vorteiler (Prescaler) vor den Zähltakt zu schalten. Zb einen Vorteiler von 8. Anstelle von 1Mhz bekommt der Timer dann eine Frequenz von 1Mhz / 8 (= 125kHz) präsentiert. Und dementsprechend würde er in 1 Sekunde dann nur noch von 0 bis 125000 (= 1.000.000 / 8) zählen. Als 8 Bit Timer bedeutet das, dass er in 1 Sekunde jetzt nur noch 488 komplette Zyklen 0 bis 255 schafft und dann noch bis 72 zählen kann. Denn 488 * 256 + 72 = 125000&lt;br /&gt;
&lt;br /&gt;
== Das kann aber nicht alles gewesen sein? ==&lt;br /&gt;
Bis jetzt ist das alles noch unspektakulär und man fragt sich: Was hab ich jetzt davon, wenn der Timer vor sich hinzählt? Nun, die Situation ändert sich, wenn man weiß, dass man bei bestimmten Ereignissen und/oder Zählerständen etwas auslösen lassen kann. So ist zb. dieser Überlauf von 255 auf 0 so ein Ereignis. Mittels eines Interrupts kann man auf dieses Ereignis reagieren lassen und als Folge davon wird eine Funktion vollautomatisch aufgerufen. Und zwar unabhängig davon, was der µC gerade sonst so tut. Und das ist schon recht cool, denn es bedeutet, dass man regelmässig zu erfolgende Dinge in so eine ISR (Interrupt Service Routine, die Funktion die aufgerufen wird) stecken kann und der Timer sorgt ganz von alleine dafür, dass diese Funktionalität auch tatsächlich regelmässig ausgeführt wird. Regelmässig bedeutet in diesem Fall dann auch wirklich regelmässig. Denn der Timer zählt ja losgelöst von den restlichen Arbeiten, die der µC sonst so erledigt, vor sich hin. Es spielt keine Rolle, ob der µC gerade mitten in einer komplizierten Berechnung steckt oder nicht. Der Timer zählt vor sich hin, und wenn das entsprechende Ereignis eintritt, wird der Interrupt ausgelöst.&lt;br /&gt;
[[Bild:Timer_ISR.gif|framed|center|ein 8-Bit Timer löst durch seinen Overflow regelmässige ISR Aufrufe aus]]&lt;br /&gt;
Gut, beispielsweise 488 mal in der Sekunde mag für so manchen Zweck zu oft sein, aber es gibt ja auch noch andere Vorteiler (welche steht im Datenblatt) und dann kann man ja auch innerhalb der ISR in einer lokalen Variablen mitzählen und zb nur bei jedem 2.ten Aufruf eine Aktion machen, die dann nur noch 244 mal in der Sekunde ausgeführt wird. Hier gibt es also mehrere Möglichkeiten, wie man die Aufrufhäufigkeit weiter herunterteilen kann, so dass man sich der Zahl annähert, die man benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// der Timer wird mit 1Mhz getaktet. Vorteiler ist 8&lt;br /&gt;
// d.h. der Timer läuft mit 125kHz und würde daher in 1 Sekunde&lt;br /&gt;
// von 0 bis 124999 zaehlen.&lt;br /&gt;
// Aber nach jeweils 256 Zaehlungen erfolgt ein Overflow.&lt;br /&gt;
// Daher werden in 1 Sekunde 125000 / 256 = 488.28125 Overflows erzeugt&lt;br /&gt;
// Oder anders ausgedrückt:  1 / 488.2815 = 0.002048&lt;br /&gt;
// alle 0.002048 Sekunden erfolgt ein Overflow&lt;br /&gt;
//&lt;br /&gt;
ISR( TIMER0_OVF_vect )       // Overflow Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
&lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {    // nur bei jedem 200.ten Aufruf. Effektiv teilt dieses die&lt;br /&gt;
                             // die Aufruffrequenz des nachfolgenden Codes nochmal um&lt;br /&gt;
    swTeiler = 0;            // einen Faktor 200. Der nachfolgende Code wird daher nicht&lt;br /&gt;
                             // alle 0.002 Sekunden sondern alle 0.4096 Sekunden ausgeführt.&lt;br /&gt;
                             // Das reicht, dass man eine LED am Port schon blinken sieht.&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;    // alle Bits am Port umdrehen, einfach damit sich was tut&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, jetzt zählt der Timer bereits&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);  // den Overflow Interrupt des Timers freigeben&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmässig aufgerufen wird&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CTC Modus ==&lt;br /&gt;
Manchmal reicht das aber nicht. Benötigt man zb nicht 488 sondern möglichst genau 500 ISR Aufrufe in der Sekunde, so wird man weder mit Vorteiler noch durch Softwaremässiges Weiterteilen in der ISR zum Ziel kommen. Man kann natürlich die Taktfrequenz des kompletten Systems soweit umstellen, dass sich das alles ausgeht, aber oft ist das einfach nicht möglich. Was tun?&lt;br /&gt;
&lt;br /&gt;
Die Sache wäre einfacher, wenn man dem Timer vorschreiben könnte, nicht einfach nur von 0 bis 255 zu zählen, sondern wenn man ihm eine Obergrenze vorgeben könnte. Denn dann könnte man sich eine Obergrenze so bestimmen, dass dieser neue Zählbereich in 1 Sekunde ganz genau so oft durchlaufen werden kann, wie man es benötigt. Und hier kommt der sog. &amp;lt;b&amp;gt;CTC&amp;lt;/b&amp;gt; Modus ins Spiel. Denn genau darin besteht sein Wesen: Man gibt dem Timer eine Obergrenze vor. Erreicht seine Zählung diesen Wert, so wird der Timer auf 0 zurückgesetzt und beginnt wieder von vorne. Genau das was wir benötigen. Wollen wir exakt 500 ISR Ausfrufe in der Sekunde haben (bei 1 Mhz Systemtakt), dann wählen wir einen Vorteiler von 8 und setzen die Obergrenze auf 250-1 (nicht vergessen: wir brauchen 250 Zählschritte, das bedeutet der Timer muss von 0 bis 249 zählen, denn auch der Überlauf von 249 zurück auf 0 ist ein Zählschritt). Der Timer taktet dann mit 1Mhz / 8 = 125kHz und da nach jeweils 250 Zählschritten die Obergrenze erreicht ist, wird diese Obergrenze in 1 Sekunde 125000 / 250 = 500 mal erreicht. Genau so wie wir das wollten.&lt;br /&gt;
Wie wird dem Timer nun mitgeteilt, dass er eine spezielle Obergrenze benutzen soll? Nun, jeder Timer hat verschiedene Modi. Welche das bei einem konkreten µC und bei einem konkreten Timer genau sind, findet sich im Datenblatt im Abschnitt über die Timer. Normalerweise ist immer eines der letzteren Abschnitte eines jeden Kapitels im Datenblatt das interessantere: &amp;quot;Register Summary&amp;quot; oder &amp;quot;Register Description&amp;quot; genannt (die Datenblätter sind da nicht ganz einheitlich). So auch hier.&lt;br /&gt;
[[Bild:FAQ_Datenblatt_Timer_Mega16.png|framed|center|Auszug aus dem Atmel Datenblatt für den Mega16 - Suche im Datenblatt]]&lt;br /&gt;
In jedem Atmel Datenblatt findet sich bei jedem Timer immer auch besagter Abschnitt (im Inhaltsverzeichnis beim Kapitel über den jeweiligen Timer suchen. Im Datenblatt-PDF daher immer das Inhaltsverzeichnis anzeigen lassen!), und in diesem Abschnitt gibt es eine Tabelle, aus der hervorgeht, welche Modi es gibt, welche Bits dazu in den Konfigurationsregistern gesetzt werden müssen, wie sich dann die Obergrenze des Timer-Zählbereichs zusammensetzt und noch ein paar Angaben mehr. Beim Mega16 findet sich diese Tabelle für den Timer 0 zb auf Seite 83 und dort ist es die Tabelle 14.2. Diese Tabelle sieht im Datenblatt so aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} &lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Mode || WGM01 || WGM00 || Timer/Counter || TOP || Update of || TOV0 Flag&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!      || (CTC0) || (PWM0) || Mode of Operation || || OCR0 || Set-on&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || Normal || 0xFF || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || PWM, Phase Correct || 0xFF || TOP|| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 || 0 || CTC || OCR0 || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1 || 1 || Fast PWM || 0xFF || BOTTOM || MAX&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort beginnt man mit der Recherche und sucht sich die Bits für den gewünschten Modus raus. Mit diesen Bits sieht man dann in den Konfigurationsregistern nach, welches Bit zu welchem Register gehört und setzt es ganz einfach. In unserem Fall möchten wir den CTC Modus, also den Modus 2. Dazu muss das Bit WGM01 gesetzt werden und WGM00 muss auf 0 bleiben. Im Datenblatt ein wenig zurückscrollen bringt ans Licht, dass das Bit WGM01 im Konfigurationsregister TCCR0 angesiedelt ist. Weiters entnehmen wir der Tabelle, dass der Timer bis zum Wert in OCR0 zählen wird (die Spalte &amp;lt;b&amp;gt;TOP&amp;lt;/b&amp;gt;). Dort hinein müssen also die 250-1 als Obergrenze geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch noch: Dieser Spezialmodus CTC löst keinen Overflow Interrupt aus, sondern einen sog. Compare Match Interrupt. Dies deshalb, weil die gewünschte Obergrenze ja laut Datenblatt in eines der sog. Compare Match Register geschrieben werden muss (OCR0). Das sind Spezialregister, die nach jedem Zählvorgang mit dem Zählregister verglichen werden. Stimmt ihr Inhalt mit dem des Zählregisters überein, so hat man einen Compare-Match und kann daran wieder eine Aktion (ISR) knüpfen. In diesem speziellen Fall des CTC Modus beinhaltet dieser Compare Match dann auch noch das automatische Rücksetzen des Timers auf 0.&lt;br /&gt;
&lt;br /&gt;
Und natürlich können auch mehrere Techniken kombiniert werden. Z. B. CTC Modus und zusätzliches weiteres softwaremässiges Herunterteilen in der ISR sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
ISR( TIMER0_COMP_vect )    // Compare Match Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
 &lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {&lt;br /&gt;
    swTeiler = 0;&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
 &lt;br /&gt;
  TIMSK = (1&amp;lt;&amp;lt;OCIE0);               // den Output Compare Interrupt des Timers freigeben&lt;br /&gt;
  OCR0  = 250 - 1;                    // nach 250 Zaehlschritten -&amp;gt; Interrupt und Timer auf 0&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, CTC Modus&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmässig aufgerufen wird &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fast PWM ==&lt;br /&gt;
&lt;br /&gt;
Aber der Timer kann noch mehr. Wenn der Timer so vor sich hinzählt, dann kann man bestimmte Output-Pins des µC an diesen Timer koppeln. Der Timer kann dann diesen Pin bei erreichen von bestimmten Zählerständen ganz von alleine wahlweise auf 0 schalten, auf 1 schalten oder umdrehen.&lt;br /&gt;
&lt;br /&gt;
Was passiert da genau? Im folgenden sei von der einfachsten Form der PWM auf einem Mega16 ausgegangen: Wenn der Timer in seiner Zählerei bei 0 ist, dann schaltet er den Pin auf 1, bei einem bestimmten Zählerstand soll er den Pin wieder auf 0 zurücksetzen und ansonsten soll der Timer wie gewohnt laufend von 0 bis 255 durchzählen.&lt;br /&gt;
Es ist die Rede vom Timer-Modus 3, siehe die vorhergehende Tabelle aus dem Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Der Tabelle entnehmen wir wieder: Die Bits WGM01 und WGM00 müssen auf 1 gestellt werden. Der TOP Wert (also der Wert, bis zu dem der Timer zählt) ist 0xFF (also 255) und das OCR0 Register steuert, bei welchem Zählerstand die Timerhardware den Pin wieder auf 0 zurück schaltet. Das Einschalten auf 1 ist vorgegeben (auch das kann man ändern, dazu später mehr).&lt;br /&gt;
&lt;br /&gt;
Stellt man also genau diese Konfiguration her und schreibt in das Register OCR0 beispielsweise den Wert 253, dann beginnt der Timer bei 0 zu zählen, wobei der den Ausgangspin auf 1 schaltet. Wird der Zählerstand 253 erreicht, dann schaltet der Timer den Pin wieder auf 0 zurück und zählt weiter bis 255 um dann wieder erneut bei 0 zu beginnen (und den Ausgansg-Pin wieder auf 1 zu schalten). Der Ausgangspin ist in diesem Fall also die meiste Zeit auf 1 und nur ganz kurz (während der Timer von 253 bis 255 zählt) auf 0.&lt;br /&gt;
&lt;br /&gt;
Schreibt am auf der anderen Seite in das Register OCR0 den Wert 3, dann passiert konzeptionell genau dasselbe nur mit anderen Zahlenwerten. Der Timer beginnt bei 0 zu zählen und schaltet den Ausgansgpin auf 1. Aber diesmal ist es bereits beim Zählerstand 3 so weit: Der Zählerstand stimmt mit dem Wert in OCR0 überein und als Folge davon wird der Ausgangspin wieder auf 0 gestellt. Der Timer zählt natürlich wie immer weiter bis 255 ehe dann das ganze Spiel wieder von vorne beginnt. In diesem Fall war also der Ausgangspin nur ganz kurze Zeit auf 1 (nämich in der Zeit, die der Timer benötigt um von 0 bis 3 zu zählen) und dann die meiste Zeit auf 0. Und genau darum geht es bei PWM: Mit dem Register OCR0 lässt sich daher der zeitliche Anteil steuern, in dem der Pin auf 1 liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB3);       // PB3 auf Ausgang stellen. Dieser Pin&lt;br /&gt;
                          // trägt auch die Bezeichnung OC0 und ist der Pin&lt;br /&gt;
                          // an dem der Timer 0 seine PWM ausgibt&lt;br /&gt;
&lt;br /&gt;
  OCR0  = 250;&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;WGM00) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, Fast PWM 8 Bit&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;COM01); &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
                        // der Timer selbst sorgt dafür, dass die PWM läuft&lt;br /&gt;
                        // wir wollen aber ein wenig Action haben.&lt;br /&gt;
                        // Also setzen wir das OCR0 Register auf verschiedene&lt;br /&gt;
                        // Werte, damit eine angeschlossene LED unterschiedliche&lt;br /&gt;
                        // Helligkeiten zeigt&lt;br /&gt;
    OCR0 = 30;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
    OCR0 = 200;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
&lt;br /&gt;
    for( i = 0; i &amp;lt; 255; ++i ) {&lt;br /&gt;
      OCR0 = i;&lt;br /&gt;
      _delay_ms( 10 );&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bleibt noch das gesetzte Bit COM01. Was hat es damit auf sich? Bisher war immer die Rede davon, das der Ausganspin bei einem Zählerstand von 0 auf 1 geschaltet wird usw. Das regelt genau dieses Bit. Im Datenblatt findet sich die Tabelle 14.4 auf der Seite 83, die genau regelt welche Bedeutung die Bits COM01 bzw COM00 haben, wenn der Timer Modus auf Fast-PWM eingestellt ist. Achtung: Je nach Timer-Modus haben diese Bits andere Bedeutungen! Man muss sich also immer die zum jeweiligen Timer-Modus gehörende Tabelle im Datenblatt suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66501</id>
		<title>Prozessorarchitekturen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66501"/>
		<updated>2012-05-24T07:45:58Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Kritik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Von-Neumann-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Die Von-Neumann-Architektur zeichnet sich dadurch aus, dass Code und Daten über die &#039;&#039;&#039;gleichen&#039;&#039;&#039; [[Bus|Busse]] übertragen werden. Dadurch gibt es erstmal keine Unterscheidung zwischen Code- und Datenbereichen und Code kann auch im Datenbereich ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Bekannte Vertreter dieser Architektur sind z.&amp;amp;nbsp;B. die 6502, [[68HC08]] Familien und die [[x86]]-Familie (Pentium, Athlon usw.).&lt;br /&gt;
&lt;br /&gt;
== Harvard-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Das Hauptmerkmal der Harvard-Architektur ist, dass Programm- und Datenspeicher über &#039;&#039;&#039;getrennte&#039;&#039;&#039; [[Bus]]se angesteuert werden. Daraus ergibt sich der Vorteil, dass auf Daten- und Programmspeicher gleichzeitig zugegriffen werden kann. Es bedeutet aber auch, dass echter Code im Datenspeicher nicht ausgeführt werden kann. Dazu muss er erst in den Codespeicher übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Benutzt wird die Harvard-Architektur z.&amp;amp;nbsp;B. von den [[AVR]]s und den meisten [[DSP]]s.&lt;br /&gt;
&lt;br /&gt;
== Kritik ==&lt;br /&gt;
&lt;br /&gt;
Es gibt Implementierungen, bei denen mehrere getrennte Adressräume über den gleichen Bus angesprochen werden. Beispielsweise betrifft das den I/O-Adressraum von 8080 und infolgedessen x86, der physikalisch den normalen Datenbus verwendet. Andererseits gibt es Implementierungen, bei denen separate Busse für Befehle und Daten vorliegen, obwohl sich alles im gleichen Adressraum befindet. Beispielsweise im Zusammenhang mit Caches, auch externen Caches.&lt;br /&gt;
&lt;br /&gt;
In der Literatur und in diesem Artikel wird die Unterscheidung zwischen Harvard und von-Neumann meist an den Bussen festgemacht. Man kann das aber auch über die Adressräume differenzieren: Ob Programm- und Datenspeicher in einem gemeinsamen Adressraum liegen, oder getrennt adressiert werden. Denn ob die Busse selbst getrennt oder gemeinsam sind, ist für den Programmierer unsichtbar, das hat nur auf die Geschwindigkeit Einfluss. Getrennte Adressräume beeinflussen jedoch die ganze Programmierung einschliesslich Hochsprache, zumal die üblicherweise verwendete Sprache C mit Daten, die in einem getrennten Programmadressraum liegen (Flash-ROM), von Haus aus nicht umgehen kann und daher Spracherweiterungen notwendig sind (im GCC nicht möglich).&lt;br /&gt;
&lt;br /&gt;
So sind sowohl PC-Prozessoren als auch die verbreiteten [[ARM]]-Versionen hinsichtlich der Busse mal dies mal jenes, je nach verwendetem Core (ARM7: von Neumann, ARM9 Harvard, bis 486: von Neumann, ab Pentium: Harvard). Wodurch das Kriterium &amp;quot;Busse&amp;quot; ziemlich sinnlos wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66500</id>
		<title>Prozessorarchitekturen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66500"/>
		<updated>2012-05-24T07:43:51Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Kritik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Von-Neumann-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Die Von-Neumann-Architektur zeichnet sich dadurch aus, dass Code und Daten über die &#039;&#039;&#039;gleichen&#039;&#039;&#039; [[Bus|Busse]] übertragen werden. Dadurch gibt es erstmal keine Unterscheidung zwischen Code- und Datenbereichen und Code kann auch im Datenbereich ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Bekannte Vertreter dieser Architektur sind z.&amp;amp;nbsp;B. die 6502, [[68HC08]] Familien und die [[x86]]-Familie (Pentium, Athlon usw.).&lt;br /&gt;
&lt;br /&gt;
== Harvard-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Das Hauptmerkmal der Harvard-Architektur ist, dass Programm- und Datenspeicher über &#039;&#039;&#039;getrennte&#039;&#039;&#039; [[Bus]]se angesteuert werden. Daraus ergibt sich der Vorteil, dass auf Daten- und Programmspeicher gleichzeitig zugegriffen werden kann. Es bedeutet aber auch, dass echter Code im Datenspeicher nicht ausgeführt werden kann. Dazu muss er erst in den Codespeicher übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Benutzt wird die Harvard-Architektur z.&amp;amp;nbsp;B. von den [[AVR]]s und den meisten [[DSP]]s.&lt;br /&gt;
&lt;br /&gt;
== Kritik ==&lt;br /&gt;
&lt;br /&gt;
Es gibt Implementierungen, bei denen mehrere getrennte Adressräume über den gleichen Bus angesprochen werden. Beispielsweise betrifft das den I/O-Adressraum von 8080 und infolgedessen x86, der physikalisch den normalen Datenbus verwendet. Andererseits gibt es Implementierungen, bei denen separate Busse für Befehle und Daten vorliegen, obwohl sich alles im gleichen Adressraum befindet. Beispielsweise im Zusammenhang mit Caches, auch externen Caches.&lt;br /&gt;
&lt;br /&gt;
In der Literatur und in diesem Artikel wird die Unterscheidung zwischen Harvard und von-Neumann meist an den Bussen festgemacht. Man kann das aber auch über die Adressräume differenzieren: Ob Programm- und Datenspeicher in einem gemeinsamen Adressraum liegen, oder getrennt adressiert werden. Denn ob die Busse selbst getrennt oder gemeinsam sind, ist für den Programmierer unsichtbar, das hat nur auf die Geschwindigkeit Einfluss. Getrennte Adressräume beeinflussen jedoch die ganze Programmierung einschliesslich Hochsprache, zumal die üblicherweise verwendete Sprache C mit Daten, die in einem getrennten Programmadressraum liegen (Flash-ROM), von Haus aus nicht umgehen kann und daher Spracherweiterungen notwendig sind (im GCC nicht möglich).&lt;br /&gt;
&lt;br /&gt;
So sind sowohl PC-Prozessoren als auch verbreiteten [[ARM]]-Versionen hinsichtlich der Busse mal dies mal jenes, je nach verwendetem Core (ARM7: von Neumann, ARM9 Harvard, bis 486: von Neumann, ab Pentium: Harvard). Wodurch das Kriterium &amp;quot;Busse&amp;quot; ziemlich sinnlos wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66499</id>
		<title>Prozessorarchitekturen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66499"/>
		<updated>2012-05-24T07:41:00Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Kritik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Von-Neumann-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Die Von-Neumann-Architektur zeichnet sich dadurch aus, dass Code und Daten über die &#039;&#039;&#039;gleichen&#039;&#039;&#039; [[Bus|Busse]] übertragen werden. Dadurch gibt es erstmal keine Unterscheidung zwischen Code- und Datenbereichen und Code kann auch im Datenbereich ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Bekannte Vertreter dieser Architektur sind z.&amp;amp;nbsp;B. die 6502, [[68HC08]] Familien und die [[x86]]-Familie (Pentium, Athlon usw.).&lt;br /&gt;
&lt;br /&gt;
== Harvard-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Das Hauptmerkmal der Harvard-Architektur ist, dass Programm- und Datenspeicher über &#039;&#039;&#039;getrennte&#039;&#039;&#039; [[Bus]]se angesteuert werden. Daraus ergibt sich der Vorteil, dass auf Daten- und Programmspeicher gleichzeitig zugegriffen werden kann. Es bedeutet aber auch, dass echter Code im Datenspeicher nicht ausgeführt werden kann. Dazu muss er erst in den Codespeicher übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Benutzt wird die Harvard-Architektur z.&amp;amp;nbsp;B. von den [[AVR]]s und den meisten [[DSP]]s.&lt;br /&gt;
&lt;br /&gt;
== Kritik ==&lt;br /&gt;
&lt;br /&gt;
Es gibt Implementierungen, bei denen mehrere getrennte Adressräume über den gleichen Bus angesprochen werden. Beispielsweise 8080 und infolgedessen x86. Andererseits gibt es Implementierungen, bei denen separate Busse für Befehle und Daten vorliegen, obwohl sich alles im gleichen Adressraum befindet. Beispielsweise im Zusammenhang mit Caches, auch externen Caches.&lt;br /&gt;
&lt;br /&gt;
In der Literatur und in diesem Artikel wird die Unterscheidung zwischen Harvard und von-Neumann meist an den Bussen festgemacht. Man kann das aber auch über die Adressräume differenzieren: Ob Programm- und Datenspeicher in einem gemeinsamen Adressraum liegen, oder getrennt adressiert werden. Denn ob die Busse selbst getrennt oder gemeinsam sind, ist für den Programmierer unsichtbar, das hat nur auf die Geschwindigkeit Einfluss. Getrennte Adressräume beeinflussen jedoch die ganze Programmierung einschliesslich Hochsprache, zumal die üblicherweise verwendete Sprache C mit Daten, die in einem getrennten Programmadressraum liegen (Flash-ROM), von Haus aus nicht umgehen kann und daher Spracherweiterungen notwendig sind (im GCC nicht möglich).&lt;br /&gt;
&lt;br /&gt;
So sind sowohl PC-Prozessoren als auch verbreiteten [[ARM]]-Versionen hinsichtlich der Busse mal dies mal jenes, je nach verwendetem Core (ARM7: von Neumann, ARM9 Harvard, bis 486: von Neumann, ab Pentium: Harvard). Wodurch das Kriterium &amp;quot;Busse&amp;quot; ziemlich sinnlos wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66498</id>
		<title>Prozessorarchitekturen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66498"/>
		<updated>2012-05-24T07:39:53Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Kritik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Von-Neumann-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Die Von-Neumann-Architektur zeichnet sich dadurch aus, dass Code und Daten über die &#039;&#039;&#039;gleichen&#039;&#039;&#039; [[Bus|Busse]] übertragen werden. Dadurch gibt es erstmal keine Unterscheidung zwischen Code- und Datenbereichen und Code kann auch im Datenbereich ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Bekannte Vertreter dieser Architektur sind z.&amp;amp;nbsp;B. die 6502, [[68HC08]] Familien und die [[x86]]-Familie (Pentium, Athlon usw.).&lt;br /&gt;
&lt;br /&gt;
== Harvard-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Das Hauptmerkmal der Harvard-Architektur ist, dass Programm- und Datenspeicher über &#039;&#039;&#039;getrennte&#039;&#039;&#039; [[Bus]]se angesteuert werden. Daraus ergibt sich der Vorteil, dass auf Daten- und Programmspeicher gleichzeitig zugegriffen werden kann. Es bedeutet aber auch, dass echter Code im Datenspeicher nicht ausgeführt werden kann. Dazu muss er erst in den Codespeicher übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Benutzt wird die Harvard-Architektur z.&amp;amp;nbsp;B. von den [[AVR]]s und den meisten [[DSP]]s.&lt;br /&gt;
&lt;br /&gt;
== Kritik ==&lt;br /&gt;
&lt;br /&gt;
Es gibt Implementierungen, bei denen mehrere getrennte Adressräume über den gleichen Bus angesprochen werden. Beispielsweise 8080 und infolgedessen x86. Andererseits gibt es Implementierungen, bei denen separate Busse für Befehle und Daten vorliegen, obwohl sich alles im gleichen Adressraum befindet. Beispielsweise im Zusammenhang mit Caches, auch externen Caches.&lt;br /&gt;
&lt;br /&gt;
In der Literatur und in diesem Artikel wird die Unterscheidung zwischen Harvard und von-Neumann an des Bussen festgemacht. Man kann das aber auch über die Adressräume differenzieren: Ob Programm- und Datenspeicher in einem gemeinsamen Adressraum liegen, oder getrennt adressiert werden. Denn ob die Busse selbst getrennt oder gemeinsam sind, ist für den Programmierer unsichtbar, das hat nur auf die Geschwindigkeit Einfluss. Getrennte Adressräume beeinflussen jedoch die ganze Programmierung einschliesslich Hochsprache, zumal die üblicherweise verwendete Sprache C mit Daten, die in einem getrennten Programmadressraum liegen (Flash-ROM), von Haus aus nicht umgehen kann und daher Spracherweiterungen notwendig sind (im GCC nicht möglich).&lt;br /&gt;
&lt;br /&gt;
So sind sowohl PC-Prozessoren als auch verbreiteten [[ARM]]-Versionen hinsichtlich der Busse mal dies mal jenes, je nach verwendetem Core (ARM7: von Neumann, ARM9 Harvard, bis 486: von Neumann, ab Pentium: Harvard). Wodurch das Kriterium &amp;quot;Busse&amp;quot; ziemlich sinnlos wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66497</id>
		<title>Prozessorarchitekturen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66497"/>
		<updated>2012-05-24T07:39:25Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Kritik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Von-Neumann-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Die Von-Neumann-Architektur zeichnet sich dadurch aus, dass Code und Daten über die &#039;&#039;&#039;gleichen&#039;&#039;&#039; [[Bus|Busse]] übertragen werden. Dadurch gibt es erstmal keine Unterscheidung zwischen Code- und Datenbereichen und Code kann auch im Datenbereich ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Bekannte Vertreter dieser Architektur sind z.&amp;amp;nbsp;B. die 6502, [[68HC08]] Familien und die [[x86]]-Familie (Pentium, Athlon usw.).&lt;br /&gt;
&lt;br /&gt;
== Harvard-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Das Hauptmerkmal der Harvard-Architektur ist, dass Programm- und Datenspeicher über &#039;&#039;&#039;getrennte&#039;&#039;&#039; [[Bus]]se angesteuert werden. Daraus ergibt sich der Vorteil, dass auf Daten- und Programmspeicher gleichzeitig zugegriffen werden kann. Es bedeutet aber auch, dass echter Code im Datenspeicher nicht ausgeführt werden kann. Dazu muss er erst in den Codespeicher übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Benutzt wird die Harvard-Architektur z.&amp;amp;nbsp;B. von den [[AVR]]s und den meisten [[DSP]]s.&lt;br /&gt;
&lt;br /&gt;
== Kritik ==&lt;br /&gt;
&lt;br /&gt;
Es gibt Implementierungen, bei denen mehrere getrennte Adressräume über den gleichen Bus angesprochen werden. Beispielsweise 8080 und infolgedessen x86. Andererseits gibt es Architekturen, bei denen separate Busse für Befehle und Daten vorliegen, obwohl sich alles im gleichen Adressraum befindet. Beispielsweise im Zusammenhang mit Caches, auch externen Caches.&lt;br /&gt;
&lt;br /&gt;
In der Literatur und in diesem Artikel wird die Unterscheidung zwischen Harvard und von-Neumann an des Bussen festgemacht. Man kann das aber auch über die Adressräume differenzieren: Ob Programm- und Datenspeicher in einem gemeinsamen Adressraum liegen, oder getrennt adressiert werden. Denn ob die Busse selbst getrennt oder gemeinsam sind, ist für den Programmierer unsichtbar, das hat nur auf die Geschwindigkeit Einfluss. Getrennte Adressräume beeinflussen jedoch die ganze Programmierung einschliesslich Hochsprache, zumal die üblicherweise verwendete Sprache C mit Daten, die in einem getrennten Programmadressraum liegen (Flash-ROM), von Haus aus nicht umgehen kann und daher Spracherweiterungen notwendig sind (im GCC nicht möglich).&lt;br /&gt;
&lt;br /&gt;
So sind sowohl PC-Prozessoren als auch verbreiteten [[ARM]]-Versionen hinsichtlich der Busse mal dies mal jenes, je nach verwendetem Core (ARM7: von Neumann, ARM9 Harvard, bis 486: von Neumann, ab Pentium: Harvard). Wodurch das Kriterium &amp;quot;Busse&amp;quot; ziemlich sinnlos wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66496</id>
		<title>Prozessorarchitekturen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=66496"/>
		<updated>2012-05-24T07:37:21Z</updated>

		<summary type="html">&lt;p&gt;Prx: /* Kritik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Von-Neumann-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Die Von-Neumann-Architektur zeichnet sich dadurch aus, dass Code und Daten über die &#039;&#039;&#039;gleichen&#039;&#039;&#039; [[Bus|Busse]] übertragen werden. Dadurch gibt es erstmal keine Unterscheidung zwischen Code- und Datenbereichen und Code kann auch im Datenbereich ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Bekannte Vertreter dieser Architektur sind z.&amp;amp;nbsp;B. die 6502, [[68HC08]] Familien und die [[x86]]-Familie (Pentium, Athlon usw.).&lt;br /&gt;
&lt;br /&gt;
== Harvard-Architektur ==&lt;br /&gt;
&lt;br /&gt;
Das Hauptmerkmal der Harvard-Architektur ist, dass Programm- und Datenspeicher über &#039;&#039;&#039;getrennte&#039;&#039;&#039; [[Bus]]se angesteuert werden. Daraus ergibt sich der Vorteil, dass auf Daten- und Programmspeicher gleichzeitig zugegriffen werden kann. Es bedeutet aber auch, dass echter Code im Datenspeicher nicht ausgeführt werden kann. Dazu muss er erst in den Codespeicher übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Benutzt wird die Harvard-Architektur z.&amp;amp;nbsp;B. von den [[AVR]]s und den meisten [[DSP]]s.&lt;br /&gt;
&lt;br /&gt;
== Kritik ==&lt;br /&gt;
&lt;br /&gt;
Es gibt Architekturen, bei denen mehrere getrennte Adressräume über den gleichen Bus angesprochen werden. Beispielsweise 8080 und infolgedessen x86. Andererseits gibt es Architekturen, bei denen separate Busse für Befehle und Daten vorliegen, obwohl sich alles im gleichen Adressraum befindet. Beispielsweise im Zusammenhang mit Caches, auch externen Caches.&lt;br /&gt;
&lt;br /&gt;
In der Literatur und in diesem Artikel wird die Unterscheidung zwischen Harvard und von-Neumann an des Bussen festgemacht. Man kann das aber auch über die Adressräume differenzieren: Ob Programm- und Datenspeicher in einem gemeinsamen Adressraum liegen, oder getrennt adressiert werden. Denn ob die Busse selbst getrennt oder gemeinsam sind, ist für den Programmierer unsichtbar, das hat nur auf die Geschwindigkeit Einfluss. Getrennte Adressräume beeinflussen jedoch die ganze Programmierung einschliesslich Hochsprache, zumal die üblicherweise verwendete Sprache C mit Daten, die in einem getrennten Programmadressraum liegen (Flash-ROM), von Haus aus nicht umgehen kann und daher Spracherweiterungen notwendig sind (im GCC nicht möglich).&lt;br /&gt;
&lt;br /&gt;
So sind sowohl PC-Prozessoren als auch verbreiteten [[ARM]]-Versionen hinsichtlich der Busse mal dies mal jenes, je nach verwendetem Core (ARM7: von Neumann, ARM9 Harvard, bis 486: von Neumann, ab Pentium: Harvard). Wodurch das Kriterium &amp;quot;Busse&amp;quot; ziemlich sinnlos wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller| ]]&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Prozessorarchitekturen&amp;diff=66495</id>
		<title>Diskussion:Prozessorarchitekturen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Prozessorarchitekturen&amp;diff=66495"/>
		<updated>2012-05-24T07:29:55Z</updated>

		<summary type="html">&lt;p&gt;Prx: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Abschnitt &amp;quot;Kritik&amp;quot; sollte meines Erachtens komplett wegfallen, da er zu stark verallgemeinert oder gar falsch ist:&lt;br /&gt;
&lt;br /&gt;
* Es ist für den Programmierer unter Umständen sehr wohl sichtbar, weil er sich damit beschäftigen muss, wo z.B. Konstanten liegen (Flash oder RAM, z.B. auf AVRs)&lt;br /&gt;
* Das hat keinen zwingenden Einfluss auf die Geschwindigkeit der Speicherzugriffe.&lt;br /&gt;
* die x86 Prozessoren waren noch nie Harvard. Sie unterstützen allerdings sowohl memory mapped I/O sowie auch I/O über einen separaten Bus.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Tomm|Tomm]] 20:50, 12. Apr. 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
In der Kritik ging es mir vorrangig darum, in dieser Frage den Unterschied zwischen &amp;quot;Bus&amp;quot; und &amp;quot;Adressraum&amp;quot; zu beleuchten.&lt;br /&gt;
&lt;br /&gt;
* Implementierungen werden leider oft bereits dann als vom Harvard Typ bezeichnet, wenn sie getrennte Befehls- und Datencaches besitzen, auch wenn sich beide im gleichen Adressraum befinden. 486 hatte einen gemeinsamen Cache, Pentium getrennte.&lt;br /&gt;
&lt;br /&gt;
* Die x86 Prozessoren besitzen zwar einen getrennten I/O-Adressraum, aber keinen getrennten I/O-Bus.&lt;br /&gt;
&lt;br /&gt;
* Der Programmierer muss sich nur dann mit Konstanten befassen, wenn die Konstanten in einem separaten Adressraum liegen. Ob der über einen gemeinsamen oder getrennten Bus angesprochen wird ist hingegen ohne Belang.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Prx|Prx]] 07:26, 24. Mai 2012 (UTC)--&lt;/div&gt;</summary>
		<author><name>Prx</name></author>
	</entry>
</feed>