<?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=Newgeneration</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=Newgeneration"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Newgeneration"/>
	<updated>2026-04-11T09:17:21Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=96635</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=96635"/>
		<updated>2017-06-18T20:15:18Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Beschreibung erweitert&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, ST, 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;
Allen ARM-Cores gemeinsam ist die 32 Bit RISC-Architektur. Um Speicherplatz zu sparen hat ARM zusätzlich zum ARM-Befehlssatz (32bit-Instruktion) den Thumb-Befehlssatz entwickelt, der bis auf einige Ausnahmen alle Befehle in 16bit codiert[http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf]. Den Vorteil des gesparten Speichers erkauft sich das Instruction-Set allerdings durch eine etwas langsame Ausführungsgeschwindigkeit. Die Cortex-M Controller können ausschließlich Thumb-Instruktionen ausführen. Die Vorgänger der Cortex-Serie sind die ARM7-Mikrocontroller, die entweder nur den ARM-Befehlssatz kennen oder beide. Thumb-fähige Controller sind erkennbar am &#039;&#039;&#039;T&#039;&#039;&#039; in der Bezeichnung, z.B. ARM7&#039;&#039;&#039;T&#039;&#039;&#039;DMI. &lt;br /&gt;
&lt;br /&gt;
Die ARM-Cortex-Mikrocontroller sind aufgrund der vergleichbar einfachen Beschaltung und niedrigem Stromverbrauch eine echte Alternative zu 8-Bit-Controllern wie dem [[AVR]], die auch noch eine höhere Leistungsfähigkeit besitzen. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In diesem Artikel geht es primär um die ARM Cortex-M Mikrocontroller, weniger um ARM [[Cortex-A]] Prozessoren, welche in Smartphones, [[Raspberry Pi]] u.ä. eingesetzt werden.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es gibt folgende Varianten des Cortex-M Mikrocontroller-Kerns, aufgeführt vom energieeffizientesten zum leistungsfähigsten (Liste nicht unbedingt aktuell! Am besten immer die Herstellerseiten bemühen).&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
ARM hat zur Zeit diese Cores im Programm:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 15% | Core !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M0  || Als günstigste und Energie-effizienteste Variante gibt es den Cortex-M0 Core mit deutlich kleinerem Befehlssatz als z.B. Cortex-M3. Dieser ist der kleinster Prozessor der Serie und tritt in Konkurrenz zu 8-Bit-Controllern&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M0+ || Der M0+ ist die optimierte Variante des Cortex-M0 und vollständig kompatibel zu diesem, erweitert ihn aber zum Beispiel mit einem Single-Cycle-I/O-Port und optionalen Features des Cortex-M3, z.B. einer [[MPU]]&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M23 || Dieser Core ist der zuletzt erschienene mit ARMv8-M-Befehlssatz und der Trustzone-Erweiterung (z.B. für IoT) und ist vergleichbar mit dem Cortex-M3&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M3  || Der erste Cortex-Mikrocontroller und der Allrounder unter den Cortex-Ms. Die Leistung ist etwa mit der seiner Vorgänger, den ARM7TDMI, vergleichbar&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M33 || Der Controller ist Vergleichbar mit dem Cortex-M4, hat allerdings den neueren ARMv8-M-Befehlssatz und die Trustzone-Erweiterung (z.B. für IoT) und ist vergleichbar mit dem Cortex-M4&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M4  || Ein hochperformanter Cortex-M3 mit [[DSP]]-Erweiterungen und einer optionalen single-precision [[FPU]]&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M7  || Der leistungsfähigste Controller der Serie, der viele Features besitzt, die früher nur Anwendungs-Prozessoren hatten, unter anderem eine double-precision-[[FPU]], Instruktions- und Daten-Caches und einer 6-stufigen Pipeline mit Sprung-Vorhersage&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Die Liste ist nach Leistungsfähigkeit sortiert. Programme sind binär-kompatibel zu &amp;quot;größeren&amp;quot; Cores, ein für einen Cortex-M0 kompiliertes Programm kann also auch von einem Cortex-M7 ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Hersteller ==&lt;br /&gt;
=== ARM Cortex M0 ===&lt;br /&gt;
* [http://www.st.com/en/microcontrollers/stm32f0-series.html STM32F0] von [http://www.st.com STMicro], siehe [[STM32|STM32 hier im Wiki]]&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc1100-cortex-m0-plus-m0 LCP1100] und [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc1200-cortex-m0 LPC1200] von [http://www.nxp.com NXP], siehe [[LPC-Mikrocontroller|LPC-Mikrocontroller hier im Wiki]]. Für diese Controller gibt es bereits eine [[Codebase für LPC1xxx|Codebase hier im Wiki]].&lt;br /&gt;
* [http://www.infineon.com/XMC1000 XMC1000] von [http://www.infineon.com Infineon], siehe [[XMCxxxx|XMCxxxx hier im Wiki]]&lt;br /&gt;
* [http://www.nuvoton.com/NuvotonMOSS/Community/ProductInfo.aspx?tp_GUID=5dbf7d7a-b6df-4fe1-91c9-063449500ce7 NuMicro-Controller] von Nuvoton (ex Winbond), laut Datenblatt mit 2.5-5.5V Betriebsspannung!&lt;br /&gt;
* [http://www.cypress.com/PSOC4  PSOC4 Familie] von [http://www.cypress.com  Cypress]&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M0+ ===&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-zero-gecko/pages/efm32-zero-gecko.aspx EFM32 Zero Gecko] und [http://www.silabs.com/products/mcu/32-bit/efm32-happy-gecko/pages/efm32-happy-gecko.aspx EFM32 Happy Gecko] von [http://www.silabs.com Silicon Labs], siehe [[EFM32|EFM32 hier im Wiki]]&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc800-series-cortex-m0-plus-mcus LPC800] von [http://www.nxp.com NXP]. Für diese Controller gibt es bereits eine [[Codebase für LPC1xxx|Codebase hier im Wiki]].&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;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/e-series-5v-robust-m0-plus-m4:KINETIS_E_SERIES Kinetis E-Serie] (5V Versorgungsspannung) von [http://www.nxp.com/ NXP (Freescale)]&lt;br /&gt;
* [http://www.fujitsu-fm-family.com/products/fm0.html angekündigte FM0+ Familie] von [http://www.fujitsu.com/emea/services/microelectronics Fujitsu]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1817?icmp=ss1817_pron_pr_feb2014 angekündigte M0+ Familie] von [http://st.com  STMicroelectronics]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-C.aspx  SAM C Familie] von [http://www.atmel.com/default.aspx  Atmel] (5V Versorgungsspannung, nicht nur 5V-tolerant)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-D.aspx  SAM D Familie] von [http://www.atmel.com/default.aspx  Atmel]&lt;br /&gt;
* [http://www.cypress.com/PSOC4  PSOC4 Familie] von [http://www.cypress.com  Cypress]&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M3 ===&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-tiny-gecko/pages/efm32-tiny-gecko.aspx EFM32 Tiny Gecko], [http://www.silabs.com/products/mcu/32-bit/efm32-gecko/pages/efm32-gecko.aspx EFM32 Gecko], [http://www.silabs.com/products/mcu/32-bit/efm32-leopard-gecko/pages/efm32-leopard-gecko.aspx EFM32 Leopard Gecko] sowie [http://www.silabs.com/products/mcu/32-bit/efm32-giant-gecko/pages/efm32-giant-gecko.aspx EFM32 Giant Gecko] von [http://www.silabs.com Silicon Labs] , siehe [[EFM32|EFM32 hier im Wiki]]&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus:LPC-ARM-CORTEX-M-MCUS LPC13xx/LPC15xx/LPC17xx/LPC18xx] von NXP oder die inzwischen schon sehr ausführliche, siehe [[LPC1xxx|LPC1xxx hier im Wiki]]. Für diese Controller gibt es bereits eine [[Codebase für LPC1xxx|Codebase]].&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/tm4c_arm_cortex-m4/overview.page TIVA] von [http://www.ti.com Texas Instruments] (vormals Stellaris, vormals Luminary Micro)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/default.aspx SAM3N, SAM3S,SAM3U, SAM3A und SAM3X Serien] von [http://www.atmel.com/default.aspx 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 , siehe [[STM32|STM32 hier im Wiki]]&lt;br /&gt;
* [http://www.toshiba-components.com/microcontroller/TMPM330.html TMPM330] von Toshiba&lt;br /&gt;
* [http://www.spansion.com/Products/microcontrollers/32-bit-ARM-Core/fm3/Pages/FM3-family.aspx FM3] von [http://www.spansion.com Spansion] (vormals Fujitsu)&lt;br /&gt;
* [http://www.holtek.com.tw/english/products/32bit_flashmcu.htm HT32] von Holtek Semiconductor&lt;br /&gt;
* [http://www.cypress.com/PSOC5 PSOC5] von Cypress&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M4 ===&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus:KINETIS Kinetis Series] von Freescale (jetzt NXP)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc4300-cortex-m4-m0:MC_1403790133078 LPC43xx] von [http://www.nxp.com/ NXP] (Dual Core: M4F + bis zu 2 Cortex-M0)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc54000-low-power-cortex-m4:MC_1414576688124 LPC54xxx] von [http://www.nxp.com/ NXP] (Dual Core: M4F + bis zu einem Cortex-M0+)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc4000-cortex-m4:MC_1403790399405 LPC4xxx] von [http://www.nxp.com/ NXP]&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-wonder-gecko/pages/efm32-wonder-gecko.aspx EFM32-Wonder Gecko] von [http://www.silabs.com Silicon Labs], siehe [[EFM32|EFM32 hier im Wiki]]&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3] von [http://www.st.com STMicro], siehe [[STM32|STM32 hier im Wiki]]&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], siehe [[STM32|STM32 hier im Wiki]]&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/tm4c_arm_cortex-m4/overview.page Tiva C Series, TM4C] von [http://www.ti.com Texas Instruments]. Früher nannte Texas Instruments diese Controller &#039;&#039;Stellaris LM4F Series&#039;&#039;. 2013 begann TI mit einer große Umbenennung, bei der sogar neue Typenbezeichnung vergeben wurden. So wurde zum Beispiel aus dem LM4F230H5QR der TM4C123GH6PM. Gleichzeitig begann TI die Bezeichnung &#039;&#039;Stellaris&#039;&#039; aus Datenblättern, Software-Bibliotheken und Ähnlichem zu entfernen und durch &#039;&#039;Tiva&#039;&#039; zu ersetzen. Siehe auch [http://www.ti.com/lit/an/spma050a/spma050a.pdf].&lt;br /&gt;
* [http://www.infineon.com/XMC4000 XMC4000] von [http://www.infineon.com Infineon],  siehe [[XMCxxxx|XMCxxxx hier im Wiki]], [[XMC4500|Artikel zum XMC4500]]&lt;br /&gt;
* [http://www.spansion.com/Products/microcontrollers/32-bit-ARM-Core/fm4/Pages/default.aspx FM4] von [http://www.spansion.com Spansion] (vormals Fujitsu)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/sam4l.aspx SAML], [http://www.atmel.com/products/microcontrollers/arm/sam4e.aspx SAME], [http://www.atmel.com/products/microcontrollers/arm/sam4n.aspx SAMN] und [http://www.atmel.com/products/microcontrollers/arm/sam4s.aspx SAMS] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M7 ===&lt;br /&gt;
Die neueste Variante der Cortex M-Reihe ist der M7, bei dem gegenüber dem M4 zahlreiche Features hinzukommen die die Brücke zu Anwendungsprozessoren schlagen: eine double precision-FPU, Code- und Daten-Cache, eine 6-stufige Pipeline mit Sprungvorhersage, und unterm Strich eine deutlich höhere Rechenleistung. Controller basierend auf dem Cortex M7 sind u.a. von Atmel, NXP und ST erhältlich. &lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-E.aspx SAME] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-S.aspx SAMS] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-V.aspx SAMV] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/sam7s_se.aspx SAM7S/SE] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/sam7x_xc.aspx SAM7X/XC] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/SC1169/SS1858 Produktseite der STM32F7-Serie von ST]&lt;br /&gt;
&lt;br /&gt;
=== ARM7TDMI ===&lt;br /&gt;
Der Vorgänger der Cortex-M-Cores ist der &#039;&#039;&#039;ARM7&#039;&#039;&#039;TDMI. Controllerfamilien dieser Klasse sind immer noch weit verbreitet:&lt;br /&gt;
* [[LPC2000]] von NXP&lt;br /&gt;
* [[AT91SAM]] von Atmel&lt;br /&gt;
* [[ADuC7xxx]] von Analog Devices&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;
* S3C24x0 [http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=229&amp;amp;partnum=S3C2410] von SAMSUNG&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 &amp;amp; Software ==&lt;br /&gt;
=== [[ARM_GCC|GCC]] ===&lt;br /&gt;
Einer der beliebtesten Compiler für ARM-Prozessoren ist der GCC. Er kann sowohl ARM- als auch Thumb-Code erzeugen. Mehr dazu unter [[ARM GCC]].&lt;br /&gt;
&lt;br /&gt;
=== C/C++ IDEs ===&lt;br /&gt;
Kostenlose Entwicklungsumgebungen (überwiegend GCC-basiert):&lt;br /&gt;
* [http://www.coocox.org/software.html CooCox IDE] (Eclipse basierend)&lt;br /&gt;
* [https://gnuarmeclipse.github.io GNU ARM Eclipse] (Eclipse Plugin)&lt;br /&gt;
* [http://www.emblocks.org/web/ EmBlocks IDE] (Basiert auf Code::Blocks)&lt;br /&gt;
** Compiler: GNU ARM-GCC (in der Installation enthalten), RealView und IAR &lt;br /&gt;
** Hardware: STlink (mit &amp;quot;Live data&amp;quot;), openOCD, Jlink. &lt;br /&gt;
** Project Import: CoIDE, uVision, Atmel studio, MplabX, Mplab 8&lt;br /&gt;
** OS aware debugging &lt;br /&gt;
***FreeRTOS&lt;br /&gt;
***ChibiOS/RT  &lt;br /&gt;
** Unterstützt sehr viele Controller(-Hersteller):&lt;br /&gt;
***Atmel-ARM&lt;br /&gt;
***NXP-ARM&lt;br /&gt;
***STMicro-ARM&lt;br /&gt;
***EnergyMicro-ARM&lt;br /&gt;
**Keine Beschränkungen&lt;br /&gt;
**Hier gehts zum &#039;&#039;[http://www.emblocks.org/web/downloads-main Download]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.emide.org/ emIDE] Windows, komplette Visual Studio artige Entwicklungsumgebung (basierend auf Code::Blocks) mit GCC und Debugger (Unterstützung für Adapter von Segger) &amp;lt;!-- Projekt eines Segger Mitarbeiters --&amp;gt;&lt;br /&gt;
* [https://mbed.org mbed]: eine kostenlose Online-Entwicklungsumgebung basierend auf dem ARM Realview-Compiler, mit einer umfangreichen C++-Bibliothek für die Controllerfunktionen, integrierter Versionsverwaltung, und vielen Beispielprogrammen. Projekte lassen sich für Keil/IAR/GCC exportieren und offline weiterbearbeiten; die Bibliotheksfunktionen sind Open Source und auch kommerziell einsetzbar.&lt;br /&gt;
* [http://www.isystem.com/products/software/winidea-open winIDEAOpen]Die Fa. iSystem stellt mit der winIDEAOpen nun eine kostenlose Entwicklungsumgebung für alle Cortex-M Bauteile zur Verfügung. Als Compiler wird der GNU GCC verwendet und auch gleich mitinstalliert. Die IDE ist recht intuitiv und mit einer umfangreichen Hilfe ausgestattet. Das Ganze funktioniert mit dem &amp;lt;u&amp;gt;GCC ohne Codesize Limit&amp;lt;/u&amp;gt; und auch ein Testwerkzeug (testIDEA) ist mit integriert. Hardwareseitig werden neben dem iSystem iTag50 [http://www.isystem.com/products/hardware/cortex-debugger/itag] auch die Segger J-Link Debug Probes sowie der ST-Link von ST unterstützt. Auf der Webseite von iSystem sind auch einige schöne Beispielprojekte für diverse Boards zu finden [http://www.isystem.com/download/winideaopen]. Demnächst soll noch die Unterstützung für die ARM und IAR Compiler hinzuzkommen. Hier gehts zum &#039;&#039;[http://www.isystem.com/download/winideaopen Download]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Infineon&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;XMC&#039;&#039;&#039; Prozessorfamilien auch eine kostenlose, professionell gepflegte C/C++ Entwicklungsumgebung an, ohne Einschränkungen auf bestimmte Typen oder Speichergrößen - &amp;lt;u&amp;gt;alle erhältlichen XMC 1000er und 4000er Prozessoren werden unterstützt&amp;lt;/u&amp;gt;. Wenn man sich dazu noch eines der günstigen XMC Evaluierungsboards besorgt (XMC 1100 Bootkit, XMC 4500 Relax (lite) Kit o.ä.), hat man ein erstes Entwicklungssystem inklusive wiederverwendbaren HW-Debugger zur Verfügung. Die Entwicklungsumgebung basiert auf Eclipse, besitzt aber zahlreiche Erweiterungen samt Codegenerierung (sogenannte Apps), die gerade am Anfang viele Dinge abnehmen kann, da man die Peripherals damit einfach grafisch konfigurieren kann. Das ist bei Prozessoren, dessen User Manual einige hundert Seiten ausmacht (oder auch für Umsteiger von 8bitter oder anderen 32bittern), nicht unwichtig. Der generierte Code ist template-basiert, gut lesbar und kann später - wenn man mehr Erfahrung hat, für eigene Entwicklungen weiter nutzen und optimieren. Damit verliert man dann allerdings die Möglichkeit, Updates der generierten Codes aus den Apps zu bekommen, die Infineon ebenfalls kostenfrei zur Verfügung stellt. Die Software nennt sich &#039;&#039;Digital Application Virtual Engineer&#039;&#039; ([http://www.infineon.com/dave DAVE]) und kann nach Registrierung kostenlos für Windows heruntergeladen werden. Innerhalb von Dave kann man dann Apps und viele Beispiele (ohne weitere Anmeldung und Kosten) komplett oder selektiv (für bestimmte Prozessoren) herunterladen. Die aktuell stabile Version ist v3. Es ist eine neue DAVE Umgebung v4 in Arbeit, eine Betaversion kann heruntergeladen werden. Diese neue v4 Variante wird auch ein separates SDK besitzen, um Apps für Dave selbst schreiben zu können (z.B. Bauteilhersteller, die die Anbindung an den XMC für Kunden vereinfachen wollen). Einsteiger sollten aber mit v3 beginnen, um nicht über Bugs der Beta v4 zu stolpern (siehe auch im [http://www.infineonforums.com/forums/8-XMC-Forum XMC-Forum]).&lt;br /&gt;
* &#039;&#039;&#039;NXP&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;LPC&#039;&#039;&#039; Prozessorfamilien eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; C/C++ Entwicklungsumgebung an. Die auf Eclipse basierende Entwicklungsumgebung ([http://www.lpcware.com/lpcxpresso LPCXpresso]) ist nach der Installation bis 8kB freigeschaltet und nach einer einfachen und kostenlosen Registrierung für 256kB. [http://www.lpcware.com/lpcxpresso LPCXpresso] steht für Windows, Linux und Mac zur Verfügung.&lt;br /&gt;
* &#039;&#039;&#039;ST&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;STM32&#039;&#039;&#039; Prozessorfamilie eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; C/C++ Entwicklungsumgebung an. Die auf Eclipse basierende Entwicklungsumgebung kann nach Registrierung auf der Homepage heruntergeladen werden. [http://www.openstm32.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://timor.atollic.com/truestudio/ Atollic TrueStudio] (Windows), Eclipse-basierend inkl. Compiler und Linker für fast alle ARMs, jetzt auch kostenlos mit vielen Beispielen und ohne Codesize-Limitierung, dafür mit anderen Einschränkungen&lt;br /&gt;
* [http://www.cosmicsoftware.com/download_cortex_64k.php Cosmic Software] (Windows), bis 64kB kostenlos&lt;br /&gt;
* [http://rowley.co.uk/arm/ Crossworks ARM] (inkl. Toolchains basierend auf GCC und Clang, für Windows, Mac OS und Linux)&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), Lite-Version bis 32kB kostenlos,&lt;br /&gt;
* [http://www2.keil.com/stmicroelectronics-stm32/mdk MDK-STM32 von KEIL] Speziell für STM32x0 kostenlos ohne Beschränkung &lt;br /&gt;
* [http://www.sisy.de/ SiSy MC++] (Windows), Demo-Version, keine Code-Begrenzung&lt;br /&gt;
&lt;br /&gt;
=== Compiler für sonstige Programmiersprachen ===&lt;br /&gt;
* Basic: http://www.mikroe.com/mikrobasic/arm/&lt;br /&gt;
* Pascal: http://www.mikroe.com/mikropascal/arm/&lt;br /&gt;
&lt;br /&gt;
=== Interpreter ===&lt;br /&gt;
* Forth: https://github.com/ekoeppen/CoreForth&lt;br /&gt;
* JavaScript: http://www.espruino.com/&lt;br /&gt;
* Lua: http://www.eluaproject.net/&lt;br /&gt;
&lt;br /&gt;
=== ARM/XSCALE/CORTEX Instruction Set Simulator ===&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 ladenden 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. Zum Simulator gibt es entsprechende zugehörige Debugtools, die allerdings käuflich zu erwerben sind.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lauterbach.com/frames.html?dwnload.html Download ARM/XSCALE/CORTEX Simulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Programmierschnittstellen (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;
SWD (Serial Wire Debug) ist eine neue mit den Cortex-Mikrocontrollern eingeführte Debug- und Programmierschnittstelle, die weniger Pins benötigt als JTAG. Hier wird Debug-Bandbreite bzw. Speed gegen mehr verfügbare Pins für in-circuit Debugging &amp;quot;getauscht&amp;quot;. Die meisten Controller der Cortex-M0 &amp;amp; M3 Serie können sowohl mittels JTAG als auch mittels SWD programmiert werden, es gibt allerdings auch Exemplare (z.B. [[EFM32]] von [https://www.silabs.com Silicon Labs], XMC1100 von [http://www.infineon.com/xmc Infineon]) welche nur SWD unterstützen.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die empfohlenen Steckerbelegungen für JTAG und SWD gibt ein [http://infocenter.arm.com/help/topic/com.arm.doc.faqs/attached/13634/cortex_debug_connectors.pdf Dokument von ARM].&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus gibt es noch herstellerspezifische Schnittstellen wie SPD (Single Pin Debug) von Infineon, oder vorinstallierte serielle Bootloader, z.B. beim [[STM32]] oder auch bei den [[Infineon XMC]], die dann z.B. über ein eigenes [http://www.infineon.com/cms/de/product/microcontroller/development-tools-software-and-kits/c166/xc166-development-tools-software-and-kits/software-downloads/channel.html?channel=ff80808112ab681d0112ab6b50fe07c9 Tool] ohne weitere Hardware - abgesehen von einem handelsüblichen seriellen Schnittstellenadapter - programmiert werden können. &lt;br /&gt;
&lt;br /&gt;
Viele Entwicklungsboards enthalten auch einen On-Board-Debugadapter zum direkten Anschluss an USB, so dass kein externer SWD- oder JTAG-Adapter notwendig ist. Manche erlauben auch, diesen Adapter abzubrechen und für eigene Entwicklungen weiterzuverwenden, somit ist nach dem Kauf eines Eval-Kits nicht nötig, einen weiteren Adapter später nachzukaufen.&lt;br /&gt;
&lt;br /&gt;
=== Günstige Beispiele zum Einstieg ===&lt;br /&gt;
Ein einfacher JTAG-Adapter für den Parallelport ist der &amp;quot;Wiggler&amp;quot;-kompatible, den man auch einfach selbst bauen 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.  Für USB gibt es ebenfalls OpenOCD-kompatible JTAG-Adapter.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind preiswerte Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG-/-SWD-Programer 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 MBED/Arduino kompatible Nucleo Entwicklungskits (ca. 12€) z.B. &#039;&#039;&#039;[http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF260320?s_searchtype=partnumber]&#039;&#039;&#039;. Der integrierte ST-Link Debugger kann mittels SWD und OpenOCD als Software auch andere Chip programmieren. Die etwas teuereren Discoveryboards, z.B. &#039;&#039;&#039;[http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF260946?s_searchtype=partnumber]&#039;&#039;&#039;, haben mehr externe Bauteile on-board, während die Nucleo Board über Shields erweiterbar sind. Nur bei Nucleo Boards ist eine UART Schnittstelle als Standard über USB zu erreichen, bei Discovery Boards mit ST-Link V2-1 müssen Lötbrücken gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Auch Infineon bietet Arduino-kompatible Boards+Shields mit dem XMC1100 Prozessor und angeflanschtem Debugger an (ab ca. 16€). Weiters gibt es günstige XMC4500 Kits, die auch Ethernet, SPI-Flash und SDCard-Slot Optionen bieten. Am unteren Ende gibt es ein XMC1100 Kit samt Debugger ab ca. 5€, dieses Board für den Schlüsselbund sozusagen nennt sich treffend &amp;quot;XMC 2 Go&amp;quot;. Die Preise können je nach Distributor stark variieren.&lt;br /&gt;
Siehe auch hier &#039;&#039;&#039;[http://www.infineon.com/cms/de/product/microcontroller/32-bit-industrial-microcontroller-based-on-arm-registered-cortex-registered-m/xmc-development-tools-kits-and-boards/channel.html?channel=db3a30433580b3710135a07902883872 XMC-Starter-Kits]&#039;&#039;&#039;.&lt;br /&gt;
Des weiteren werden auch schon Kits in Verbindung mit Sensoren zum Evaluieren angeboten, wie das &amp;quot;3D 2 Go&amp;quot; Board mit einem XMC1100 Prozessor und dem neuen 3D-Magnetfeldsensor von Infineon, um ein Beispiel zu nennen: &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/sensor-ics/magnetic-sensors/3d-magnetic-sensor/channel.html?channel=5546d4624c9e0f0e014c9e105a8a001c 3D-Sensorkit]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von Silicon Labs gibt es [https://www.silabs.com/products/mcu/Pages/32-bit-microcontroller-tools.aspx Starter Kits] mit integriertem J-Link (Debugger) ab ca. 25 € z.B. das [https://www.silabs.com/products/mcu/lowpower/Pages/efm32tg-stk3300.aspx EFM32 Tiny Gecko Starter Kit] bei [http://www.mouser.de/ProductDetail/Silicon-Laboratories/EFM32TG-STK3300/?qs=%2fha2pyFadujBGJvO8YBq9JikBLXQGi%2fjwmF17imXuts5383tWpQKFA%3d%3d 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 &amp;quot;nicht-kommerziellen&amp;quot; Einsatz von Studenten, Funkamateuren und Hobby-Bastler für ca. €50.- erhältlich (J-Link-Edu). Sein Umfang ist auf das Flashen des Speichers und das Debuggen beschränkt. Bonus: Neben den im Prozessor limitiert vorhandenen Hardware-Breakpoints (Anzahl ist MCU abhängig) sind zusätzliche Flash-Breakpoints möglich (müssen aber von der verwendeten Debug-IDE unterstüzt werden). Die sehr gut geplegte Debugger-Software unterstützt nahezu alle ARM Prozessoren. Die Trace-Option wie sie bei der PRO-Variante zur Verfügung steht, ist nicht vorhanden. Für den Preis bekommt man jedoch ein ausgewachsenes Werkzeug mit breiter Unterstützung und der Möglichkeit sowohl SWD als auch JTAG in einem Gerät vereint zu haben. Wenn man aber plant, ein oben genanntes Kit von ST, NXP, Infineon oder ähnlich zu kaufen kann man für ähnliche Kosten auch gleich ein CPU-Board dazubekommen - daher ist es sinnvoll, sich die Dokumentationen der Evalkits voher genau durchzusehen. &lt;br /&gt;
&lt;br /&gt;
Der ULINK2 von Keil/ARM ist ebenfalls ein wirklich gutes Gerät. Leider ist er nicht ganz so günstig und seine Zusammenarbeit beschränkt sich auf die Arm/Keil IDE µVision. Er benötigt jedoch keine speziellen USB-Treiber sondern nutzt geschickt die Funktionalität der HID-Treiber des Betriebssystems. Das macht ihn sofort auf jedem Windows-Betriebssystem einsatzbereit.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Beschreiben des Flash über JTAG ist oft ein serieller [[Bootloader]] im Controller enthalten. Bei ST werden sie über einen speziellen Pin der MPU aktiviert und sind dank Kompression und das intelligente entfernen redundanter Information, bei der Übertragung genauso schnell wie JTAG/SWD Adapter.&lt;br /&gt;
&lt;br /&gt;
== CMSIS - ARM Cortex Software Libraries  ==&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. Dieser 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;
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-Prozessorkern und Peripherie-Registern.&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. Implementierungen gibt es z.B. von Keil ([http://www.keil.com/pack/doc/cmsis_rtx/index.html RTX])&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. Die &amp;quot;Core Peripheral Funktionen&amp;quot; benötigt beispielsweise weniger als 1 KB-Code und weniger als 10 Bytes RAM.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&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 auf der [http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php ARM CMSIS Webseite].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Linksammlung#ARM|Linksammlung (Abschnitt ARM)]]&lt;br /&gt;
* [[LPC1xxx]]&lt;br /&gt;
* [[LPC1xxx_Entwicklungskit_LPCXpresso]]&lt;br /&gt;
* [[Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red]]&lt;br /&gt;
* [[Codebase_f%C3%BCr_LPC1xxx]]&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;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.mySTM32.de Online Tutorial für den STM32]&lt;br /&gt;
* [http://www.myXMC.de Online Tutorial für den XMC von Infineon]&lt;br /&gt;
* [http://www.myUGL.de Online Tutorial für freie Grafikbibliothek, STM32, STM32F429, TFT, Touch]&lt;br /&gt;
* [http://embdev.net/forum/arm-gcc ARM-GCC Forum] im englischsprachigen &amp;quot;Ableger&amp;quot; von mikrocontroller.net embdev.net u.a. für WinARM, Yagarto, CS Codebench&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-m/index.php Cortex-M Produktseite von ARM]&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://booksite.elsevier.com/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;
[[Category:ARM| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=96627</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=96627"/>
		<updated>2017-06-16T19:24:09Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Aktualisierung des Artikels&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, ST, 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;
Allen ARM-Cores gemeinsam ist die 32 Bit RISC-Architektur. Um Speicherplatz zu sparen hat ARM zusätzlich zum ARM-Befehlssatz (32bit-Instruktion) den Thumb-Befehlssatz entwickelt, der bis auf einige Ausnahmen alle Befehle in 16bit codiert[http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf]. Den Vorteil des gesparten Speichers erkauft sich das Instruction-Set allerdings durch eine etwas langsame Ausführungsgeschwindigkeit. Die Cortex-M Controller können ausschließlich Thumb-Instruktionen ausführen. Die Vorgänger der Cortex-Serie sind die ARM7-Mikrocontroller, die entweder nur den ARM-Befehlssatz kennen oder beide. Thumb-fähige Controller sind erkennbar am &#039;&#039;&#039;T&#039;&#039;&#039; in der Bezeichnung, z.B. ARM7&#039;&#039;&#039;T&#039;&#039;&#039;DMI. &lt;br /&gt;
&lt;br /&gt;
Die ARM-Cortex-Mikrocontroller sind aufgrund der vergleichbar einfachen Beschaltung und niedrigem Stromverbrauch eine echte Alternative zu 8-Bit-Controllern wie dem [[AVR]], die auch noch eine höhere Leistungsfähigkeit besitzen. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In diesem Artikel geht es primär um die ARM Cortex-M Mikrocontroller, weniger um ARM [[Cortex-A]] Prozessoren, welche in Smartphones, [[Raspberry Pi]] u.ä. eingesetzt werden.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es gibt folgende Varianten des Cortex-M Mikrocontroller-Kerns, aufgeführt vom energieeffizientesten zum leistungsfähigsten (Liste nicht unbedingt aktuell! Am besten immer die Herstellerseiten bemühen).&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
ARM hat zur Zeit diese Cores im Programm:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 15% | Core !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M0  || Kleinster Prozessor der Serie als Konkurrent zu dem 8-Bit-Controllern und geringem Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M0+ || Der M0+ ist vollständig kompatibel zum M0, erweitert ihn aber zum Beispiel mit einem Single-Cycle-I/O-Port und optionalen Features des Cortex-M3&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M23 || Dieser Core ist der zuletzt erschienene mit ARMv8-M-Befehlssatz und der Trustzone-Erweiterung&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M3  || Der erste Cortex-Mikrocontroller und der Allrounder unter den Cortex-Ms. Die Leistung ist etwa mit der der ARM7TDMI vergleichbar&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M33 || Der Controller ist Vergleichbar mit dem Cortex-M4, hat allerdings den neueren ARMv8-M-Befehlssatz und die Trustzone-Erweiterung&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M4  || Ein hochperformanter Cortex-M3 mit [[DSP]]-Erweiterungen und einer optionalen [[FPU]]&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M7  || Der leistungsfähigste Controller der Serie, der viele Features besitzt, die früher nur Anwendungs-Prozessoren hatten&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hersteller ==&lt;br /&gt;
=== ARM Cortex M0 ===&lt;br /&gt;
* [http://www.st.com/en/microcontrollers/stm32f0-series.html STM32F0] von [http://www.st.com STMicro], siehe [[STM32|STM32 hier im Wiki]]&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc1100-cortex-m0-plus-m0 LCP1100] und [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc1200-cortex-m0 LPC1200] von [http://www.nxp.com NXP], siehe [[LPC-Mikrocontroller|LPC-Mikrocontroller hier im Wiki]]. Für diese Controller gibt es bereits eine [[Codebase für LPC1xxx|Codebase hier im Wiki]].&lt;br /&gt;
* [http://www.infineon.com/XMC1000 XMC1000] von [http://www.infineon.com Infineon], siehe [[XMCxxxx|XMCxxxx hier im Wiki]]&lt;br /&gt;
* [http://www.nuvoton.com/NuvotonMOSS/Community/ProductInfo.aspx?tp_GUID=5dbf7d7a-b6df-4fe1-91c9-063449500ce7 NuMicro-Controller] von Nuvoton (ex Winbond), laut Datenblatt mit 2.5-5.5V Betriebsspannung!&lt;br /&gt;
* [http://www.cypress.com/PSOC4  PSOC4 Familie] von [http://www.cypress.com  Cypress]&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M0+ ===&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-zero-gecko/pages/efm32-zero-gecko.aspx EFM32 Zero Gecko] und [http://www.silabs.com/products/mcu/32-bit/efm32-happy-gecko/pages/efm32-happy-gecko.aspx EFM32 Happy Gecko] von [http://www.silabs.com Silicon Labs], siehe [[EFM32|EFM32 hier im Wiki]]&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc800-series-cortex-m0-plus-mcus LPC800] von [http://www.nxp.com NXP]. Für diese Controller gibt es bereits eine [[Codebase für LPC1xxx|Codebase hier im Wiki]].&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;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/e-series-5v-robust-m0-plus-m4:KINETIS_E_SERIES Kinetis E-Serie] (5V Versorgungsspannung) von [http://www.nxp.com/ NXP (Freescale)]&lt;br /&gt;
* [http://www.fujitsu-fm-family.com/products/fm0.html angekündigte FM0+ Familie] von [http://www.fujitsu.com/emea/services/microelectronics Fujitsu]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1817?icmp=ss1817_pron_pr_feb2014 angekündigte M0+ Familie] von [http://st.com  STMicroelectronics]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-C.aspx  SAM C Familie] von [http://www.atmel.com/default.aspx  Atmel] (5V Versorgungsspannung, nicht nur 5V-tolerant)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-D.aspx  SAM D Familie] von [http://www.atmel.com/default.aspx  Atmel]&lt;br /&gt;
* [http://www.cypress.com/PSOC4  PSOC4 Familie] von [http://www.cypress.com  Cypress]&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M3 ===&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-tiny-gecko/pages/efm32-tiny-gecko.aspx EFM32 Tiny Gecko], [http://www.silabs.com/products/mcu/32-bit/efm32-gecko/pages/efm32-gecko.aspx EFM32 Gecko], [http://www.silabs.com/products/mcu/32-bit/efm32-leopard-gecko/pages/efm32-leopard-gecko.aspx EFM32 Leopard Gecko] sowie [http://www.silabs.com/products/mcu/32-bit/efm32-giant-gecko/pages/efm32-giant-gecko.aspx EFM32 Giant Gecko] von [http://www.silabs.com Silicon Labs] , siehe [[EFM32|EFM32 hier im Wiki]]&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus:LPC-ARM-CORTEX-M-MCUS LPC13xx/LPC15xx/LPC17xx/LPC18xx] von NXP oder die inzwischen schon sehr ausführliche, siehe [[LPC1xxx|LPC1xxx hier im Wiki]]. Für diese Controller gibt es bereits eine [[Codebase für LPC1xxx|Codebase]].&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/tm4c_arm_cortex-m4/overview.page TIVA] von [http://www.ti.com Texas Instruments] (vormals Stellaris, vormals Luminary Micro)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/default.aspx SAM3N, SAM3S,SAM3U, SAM3A und SAM3X Serien] von [http://www.atmel.com/default.aspx 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 , siehe [[STM32|STM32 hier im Wiki]]&lt;br /&gt;
* [http://www.toshiba-components.com/microcontroller/TMPM330.html TMPM330] von Toshiba&lt;br /&gt;
* [http://www.spansion.com/Products/microcontrollers/32-bit-ARM-Core/fm3/Pages/FM3-family.aspx FM3] von [http://www.spansion.com Spansion] (vormals Fujitsu)&lt;br /&gt;
* [http://www.holtek.com.tw/english/products/32bit_flashmcu.htm HT32] von Holtek Semiconductor&lt;br /&gt;
* [http://www.cypress.com/PSOC5 PSOC5] von Cypress&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M4 ===&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus:KINETIS Kinetis Series] von Freescale (jetzt NXP)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc4300-cortex-m4-m0:MC_1403790133078 LPC43xx] von [http://www.nxp.com/ NXP] (Dual Core: M4F + bis zu 2 Cortex-M0)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc54000-low-power-cortex-m4:MC_1414576688124 LPC54xxx] von [http://www.nxp.com/ NXP] (Dual Core: M4F + bis zu einem Cortex-M0+)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc4000-cortex-m4:MC_1403790399405 LPC4xxx] von [http://www.nxp.com/ NXP]&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-wonder-gecko/pages/efm32-wonder-gecko.aspx EFM32-Wonder Gecko] von [http://www.silabs.com Silicon Labs], siehe [[EFM32|EFM32 hier im Wiki]]&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3] von [http://www.st.com STMicro], siehe [[STM32|STM32 hier im Wiki]]&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], siehe [[STM32|STM32 hier im Wiki]]&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/tm4c_arm_cortex-m4/overview.page Tiva C Series, TM4C] von [http://www.ti.com Texas Instruments]. Früher nannte Texas Instruments diese Controller &#039;&#039;Stellaris LM4F Series&#039;&#039;. 2013 begann TI mit einer große Umbenennung, bei der sogar neue Typenbezeichnung vergeben wurden. So wurde zum Beispiel aus dem LM4F230H5QR der TM4C123GH6PM. Gleichzeitig begann TI die Bezeichnung &#039;&#039;Stellaris&#039;&#039; aus Datenblättern, Software-Bibliotheken und Ähnlichem zu entfernen und durch &#039;&#039;Tiva&#039;&#039; zu ersetzen. Siehe auch [http://www.ti.com/lit/an/spma050a/spma050a.pdf].&lt;br /&gt;
* [http://www.infineon.com/XMC4000 XMC4000] von [http://www.infineon.com Infineon],  siehe [[XMCxxxx|XMCxxxx hier im Wiki]], [[XMC4500|Artikel zum XMC4500]]&lt;br /&gt;
* [http://www.spansion.com/Products/microcontrollers/32-bit-ARM-Core/fm4/Pages/default.aspx FM4] von [http://www.spansion.com Spansion] (vormals Fujitsu)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/sam4l.aspx SAML], [http://www.atmel.com/products/microcontrollers/arm/sam4e.aspx SAME], [http://www.atmel.com/products/microcontrollers/arm/sam4n.aspx SAMN] und [http://www.atmel.com/products/microcontrollers/arm/sam4s.aspx SAMS] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M7 ===&lt;br /&gt;
Die neueste Variante der Cortex M-Reihe ist der M7, bei dem gegenüber dem M4 zahlreiche Features hinzukommen die die Brücke zu Anwendungsprozessoren schlagen: eine double precision-FPU, Code- und Daten-Cache, eine 6-stufige Pipeline mit Sprungvorhersage, und unterm Strich eine deutlich höhere Rechenleistung. Controller basierend auf dem Cortex M7 sind u.a. von Atmel, NXP und ST erhältlich. &lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-E.aspx SAME] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-S.aspx SAMS] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-V.aspx SAMV] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/sam7s_se.aspx SAM7S/SE] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/sam7x_xc.aspx SAM7X/XC] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/SC1169/SS1858 Produktseite der STM32F7-Serie von ST]&lt;br /&gt;
&lt;br /&gt;
=== ARM7TDMI ===&lt;br /&gt;
Der Vorgänger der Cortex-M-Cores ist der &#039;&#039;&#039;ARM7&#039;&#039;&#039;TDMI. Controllerfamilien dieser Klasse sind immer noch weit verbreitet:&lt;br /&gt;
* [[LPC2000]] von NXP&lt;br /&gt;
* [[AT91SAM]] von Atmel&lt;br /&gt;
* [[ADuC7xxx]] von Analog Devices&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;
* S3C24x0 [http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=229&amp;amp;partnum=S3C2410] von SAMSUNG&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 &amp;amp; Software ==&lt;br /&gt;
=== [[ARM_GCC|GCC]] ===&lt;br /&gt;
Einer der beliebtesten Compiler für ARM-Prozessoren ist der GCC. Er kann sowohl ARM- als auch Thumb-Code erzeugen. Mehr dazu unter [[ARM GCC]].&lt;br /&gt;
&lt;br /&gt;
=== C/C++ IDEs ===&lt;br /&gt;
Kostenlose Entwicklungsumgebungen (überwiegend GCC-basiert):&lt;br /&gt;
* [http://www.coocox.org/software.html CooCox IDE] (Eclipse basierend)&lt;br /&gt;
* [https://gnuarmeclipse.github.io GNU ARM Eclipse] (Eclipse Plugin)&lt;br /&gt;
* [http://www.emblocks.org/web/ EmBlocks IDE] (Basiert auf Code::Blocks)&lt;br /&gt;
** Compiler: GNU ARM-GCC (in der Installation enthalten), RealView und IAR &lt;br /&gt;
** Hardware: STlink (mit &amp;quot;Live data&amp;quot;), openOCD, Jlink. &lt;br /&gt;
** Project Import: CoIDE, uVision, Atmel studio, MplabX, Mplab 8&lt;br /&gt;
** OS aware debugging &lt;br /&gt;
***FreeRTOS&lt;br /&gt;
***ChibiOS/RT  &lt;br /&gt;
** Unterstützt sehr viele Controller(-Hersteller):&lt;br /&gt;
***Atmel-ARM&lt;br /&gt;
***NXP-ARM&lt;br /&gt;
***STMicro-ARM&lt;br /&gt;
***EnergyMicro-ARM&lt;br /&gt;
**Keine Beschränkungen&lt;br /&gt;
**Hier gehts zum &#039;&#039;[http://www.emblocks.org/web/downloads-main Download]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.emide.org/ emIDE] Windows, komplette Visual Studio artige Entwicklungsumgebung (basierend auf Code::Blocks) mit GCC und Debugger (Unterstützung für Adapter von Segger) &amp;lt;!-- Projekt eines Segger Mitarbeiters --&amp;gt;&lt;br /&gt;
* [https://mbed.org mbed]: eine kostenlose Online-Entwicklungsumgebung basierend auf dem ARM Realview-Compiler, mit einer umfangreichen C++-Bibliothek für die Controllerfunktionen, integrierter Versionsverwaltung, und vielen Beispielprogrammen. Projekte lassen sich für Keil/IAR/GCC exportieren und offline weiterbearbeiten; die Bibliotheksfunktionen sind Open Source und auch kommerziell einsetzbar.&lt;br /&gt;
* [http://www.isystem.com/products/software/winidea-open winIDEAOpen]Die Fa. iSystem stellt mit der winIDEAOpen nun eine kostenlose Entwicklungsumgebung für alle Cortex-M Bauteile zur Verfügung. Als Compiler wird der GNU GCC verwendet und auch gleich mitinstalliert. Die IDE ist recht intuitiv und mit einer umfangreichen Hilfe ausgestattet. Das Ganze funktioniert mit dem &amp;lt;u&amp;gt;GCC ohne Codesize Limit&amp;lt;/u&amp;gt; und auch ein Testwerkzeug (testIDEA) ist mit integriert. Hardwareseitig werden neben dem iSystem iTag50 [http://www.isystem.com/products/hardware/cortex-debugger/itag] auch die Segger J-Link Debug Probes sowie der ST-Link von ST unterstützt. Auf der Webseite von iSystem sind auch einige schöne Beispielprojekte für diverse Boards zu finden [http://www.isystem.com/download/winideaopen]. Demnächst soll noch die Unterstützung für die ARM und IAR Compiler hinzuzkommen. Hier gehts zum &#039;&#039;[http://www.isystem.com/download/winideaopen Download]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Infineon&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;XMC&#039;&#039;&#039; Prozessorfamilien auch eine kostenlose, professionell gepflegte C/C++ Entwicklungsumgebung an, ohne Einschränkungen auf bestimmte Typen oder Speichergrößen - &amp;lt;u&amp;gt;alle erhältlichen XMC 1000er und 4000er Prozessoren werden unterstützt&amp;lt;/u&amp;gt;. Wenn man sich dazu noch eines der günstigen XMC Evaluierungsboards besorgt (XMC 1100 Bootkit, XMC 4500 Relax (lite) Kit o.ä.), hat man ein erstes Entwicklungssystem inklusive wiederverwendbaren HW-Debugger zur Verfügung. Die Entwicklungsumgebung basiert auf Eclipse, besitzt aber zahlreiche Erweiterungen samt Codegenerierung (sogenannte Apps), die gerade am Anfang viele Dinge abnehmen kann, da man die Peripherals damit einfach grafisch konfigurieren kann. Das ist bei Prozessoren, dessen User Manual einige hundert Seiten ausmacht (oder auch für Umsteiger von 8bitter oder anderen 32bittern), nicht unwichtig. Der generierte Code ist template-basiert, gut lesbar und kann später - wenn man mehr Erfahrung hat, für eigene Entwicklungen weiter nutzen und optimieren. Damit verliert man dann allerdings die Möglichkeit, Updates der generierten Codes aus den Apps zu bekommen, die Infineon ebenfalls kostenfrei zur Verfügung stellt. Die Software nennt sich &#039;&#039;Digital Application Virtual Engineer&#039;&#039; ([http://www.infineon.com/dave DAVE]) und kann nach Registrierung kostenlos für Windows heruntergeladen werden. Innerhalb von Dave kann man dann Apps und viele Beispiele (ohne weitere Anmeldung und Kosten) komplett oder selektiv (für bestimmte Prozessoren) herunterladen. Die aktuell stabile Version ist v3. Es ist eine neue DAVE Umgebung v4 in Arbeit, eine Betaversion kann heruntergeladen werden. Diese neue v4 Variante wird auch ein separates SDK besitzen, um Apps für Dave selbst schreiben zu können (z.B. Bauteilhersteller, die die Anbindung an den XMC für Kunden vereinfachen wollen). Einsteiger sollten aber mit v3 beginnen, um nicht über Bugs der Beta v4 zu stolpern (siehe auch im [http://www.infineonforums.com/forums/8-XMC-Forum XMC-Forum]).&lt;br /&gt;
* &#039;&#039;&#039;NXP&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;LPC&#039;&#039;&#039; Prozessorfamilien eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; C/C++ Entwicklungsumgebung an. Die auf Eclipse basierende Entwicklungsumgebung ([http://www.lpcware.com/lpcxpresso LPCXpresso]) ist nach der Installation bis 8kB freigeschaltet und nach einer einfachen und kostenlosen Registrierung für 256kB. [http://www.lpcware.com/lpcxpresso LPCXpresso] steht für Windows, Linux und Mac zur Verfügung.&lt;br /&gt;
* &#039;&#039;&#039;ST&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;STM32&#039;&#039;&#039; Prozessorfamilie eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; C/C++ Entwicklungsumgebung an. Die auf Eclipse basierende Entwicklungsumgebung kann nach Registrierung auf der Homepage heruntergeladen werden. [http://www.openstm32.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://timor.atollic.com/truestudio/ Atollic TrueStudio] (Windows), Eclipse-basierend inkl. Compiler und Linker für fast alle ARMs, jetzt auch kostenlos mit vielen Beispielen und ohne Codesize-Limitierung, dafür mit anderen Einschränkungen&lt;br /&gt;
* [http://www.cosmicsoftware.com/download_cortex_64k.php Cosmic Software] (Windows), bis 64kB kostenlos&lt;br /&gt;
* [http://rowley.co.uk/arm/ Crossworks ARM] (inkl. Toolchains basierend auf GCC und Clang, für Windows, Mac OS und Linux)&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), Lite-Version bis 32kB kostenlos,&lt;br /&gt;
* [http://www2.keil.com/stmicroelectronics-stm32/mdk MDK-STM32 von KEIL] Speziell für STM32x0 kostenlos ohne Beschränkung &lt;br /&gt;
* [http://www.sisy.de/ SiSy MC++] (Windows), Demo-Version, keine Code-Begrenzung&lt;br /&gt;
&lt;br /&gt;
=== Compiler für sonstige Programmiersprachen ===&lt;br /&gt;
* Basic: http://www.mikroe.com/mikrobasic/arm/&lt;br /&gt;
* Pascal: http://www.mikroe.com/mikropascal/arm/&lt;br /&gt;
&lt;br /&gt;
=== Interpreter ===&lt;br /&gt;
* Forth: https://github.com/ekoeppen/CoreForth&lt;br /&gt;
* JavaScript: http://www.espruino.com/&lt;br /&gt;
* Lua: http://www.eluaproject.net/&lt;br /&gt;
&lt;br /&gt;
=== ARM/XSCALE/CORTEX Instruction Set Simulator ===&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 ladenden 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. Zum Simulator gibt es entsprechende zugehörige Debugtools, die allerdings käuflich zu erwerben sind.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lauterbach.com/frames.html?dwnload.html Download ARM/XSCALE/CORTEX Simulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Programmierschnittstellen (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;
SWD (Serial Wire Debug) ist eine neue mit den Cortex-Mikrocontrollern eingeführte Debug- und Programmierschnittstelle, die weniger Pins benötigt als JTAG. Hier wird Debug-Bandbreite bzw. Speed gegen mehr verfügbare Pins für in-circuit Debugging &amp;quot;getauscht&amp;quot;. Die meisten Controller der Cortex-M0 &amp;amp; M3 Serie können sowohl mittels JTAG als auch mittels SWD programmiert werden, es gibt allerdings auch Exemplare (z.B. [[EFM32]] von [https://www.silabs.com Silicon Labs], XMC1100 von [http://www.infineon.com/xmc Infineon]) welche nur SWD unterstützen.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die empfohlenen Steckerbelegungen für JTAG und SWD gibt ein [http://infocenter.arm.com/help/topic/com.arm.doc.faqs/attached/13634/cortex_debug_connectors.pdf Dokument von ARM].&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus gibt es noch herstellerspezifische Schnittstellen wie SPD (Single Pin Debug) von Infineon, oder vorinstallierte serielle Bootloader, z.B. beim [[STM32]] oder auch bei den [[Infineon XMC]], die dann z.B. über ein eigenes [http://www.infineon.com/cms/de/product/microcontroller/development-tools-software-and-kits/c166/xc166-development-tools-software-and-kits/software-downloads/channel.html?channel=ff80808112ab681d0112ab6b50fe07c9 Tool] ohne weitere Hardware - abgesehen von einem handelsüblichen seriellen Schnittstellenadapter - programmiert werden können. &lt;br /&gt;
&lt;br /&gt;
Viele Entwicklungsboards enthalten auch einen On-Board-Debugadapter zum direkten Anschluss an USB, so dass kein externer SWD- oder JTAG-Adapter notwendig ist. Manche erlauben auch, diesen Adapter abzubrechen und für eigene Entwicklungen weiterzuverwenden, somit ist nach dem Kauf eines Eval-Kits nicht nötig, einen weiteren Adapter später nachzukaufen.&lt;br /&gt;
&lt;br /&gt;
=== Günstige Beispiele zum Einstieg ===&lt;br /&gt;
Ein einfacher JTAG-Adapter für den Parallelport ist der &amp;quot;Wiggler&amp;quot;-kompatible, den man auch einfach selbst bauen 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.  Für USB gibt es ebenfalls OpenOCD-kompatible JTAG-Adapter.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind preiswerte Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG-/-SWD-Programer 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 MBED/Arduino kompatible Nucleo Entwicklungskits (ca. 12€) z.B. &#039;&#039;&#039;[http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF260320?s_searchtype=partnumber]&#039;&#039;&#039;. Der integrierte ST-Link Debugger kann mittels SWD und OpenOCD als Software auch andere Chip programmieren. Die etwas teuereren Discoveryboards, z.B. &#039;&#039;&#039;[http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF260946?s_searchtype=partnumber]&#039;&#039;&#039;, haben mehr externe Bauteile on-board, während die Nucleo Board über Shields erweiterbar sind. Nur bei Nucleo Boards ist eine UART Schnittstelle als Standard über USB zu erreichen, bei Discovery Boards mit ST-Link V2-1 müssen Lötbrücken gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Auch Infineon bietet Arduino-kompatible Boards+Shields mit dem XMC1100 Prozessor und angeflanschtem Debugger an (ab ca. 16€). Weiters gibt es günstige XMC4500 Kits, die auch Ethernet, SPI-Flash und SDCard-Slot Optionen bieten. Am unteren Ende gibt es ein XMC1100 Kit samt Debugger ab ca. 5€, dieses Board für den Schlüsselbund sozusagen nennt sich treffend &amp;quot;XMC 2 Go&amp;quot;. Die Preise können je nach Distributor stark variieren.&lt;br /&gt;
Siehe auch hier &#039;&#039;&#039;[http://www.infineon.com/cms/de/product/microcontroller/32-bit-industrial-microcontroller-based-on-arm-registered-cortex-registered-m/xmc-development-tools-kits-and-boards/channel.html?channel=db3a30433580b3710135a07902883872 XMC-Starter-Kits]&#039;&#039;&#039;.&lt;br /&gt;
Des weiteren werden auch schon Kits in Verbindung mit Sensoren zum Evaluieren angeboten, wie das &amp;quot;3D 2 Go&amp;quot; Board mit einem XMC1100 Prozessor und dem neuen 3D-Magnetfeldsensor von Infineon, um ein Beispiel zu nennen: &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/sensor-ics/magnetic-sensors/3d-magnetic-sensor/channel.html?channel=5546d4624c9e0f0e014c9e105a8a001c 3D-Sensorkit]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von Silicon Labs gibt es [https://www.silabs.com/products/mcu/Pages/32-bit-microcontroller-tools.aspx Starter Kits] mit integriertem J-Link (Debugger) ab ca. 25 € z.B. das [https://www.silabs.com/products/mcu/lowpower/Pages/efm32tg-stk3300.aspx EFM32 Tiny Gecko Starter Kit] bei [http://www.mouser.de/ProductDetail/Silicon-Laboratories/EFM32TG-STK3300/?qs=%2fha2pyFadujBGJvO8YBq9JikBLXQGi%2fjwmF17imXuts5383tWpQKFA%3d%3d 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 &amp;quot;nicht-kommerziellen&amp;quot; Einsatz von Studenten, Funkamateuren und Hobby-Bastler für ca. €50.- erhältlich (J-Link-Edu). Sein Umfang ist auf das Flashen des Speichers und das Debuggen beschränkt. Bonus: Neben den im Prozessor limitiert vorhandenen Hardware-Breakpoints (Anzahl ist MCU abhängig) sind zusätzliche Flash-Breakpoints möglich (müssen aber von der verwendeten Debug-IDE unterstüzt werden). Die sehr gut geplegte Debugger-Software unterstützt nahezu alle ARM Prozessoren. Die Trace-Option wie sie bei der PRO-Variante zur Verfügung steht, ist nicht vorhanden. Für den Preis bekommt man jedoch ein ausgewachsenes Werkzeug mit breiter Unterstützung und der Möglichkeit sowohl SWD als auch JTAG in einem Gerät vereint zu haben. Wenn man aber plant, ein oben genanntes Kit von ST, NXP, Infineon oder ähnlich zu kaufen kann man für ähnliche Kosten auch gleich ein CPU-Board dazubekommen - daher ist es sinnvoll, sich die Dokumentationen der Evalkits voher genau durchzusehen. &lt;br /&gt;
&lt;br /&gt;
Der ULINK2 von Keil/ARM ist ebenfalls ein wirklich gutes Gerät. Leider ist er nicht ganz so günstig und seine Zusammenarbeit beschränkt sich auf die Arm/Keil IDE µVision. Er benötigt jedoch keine speziellen USB-Treiber sondern nutzt geschickt die Funktionalität der HID-Treiber des Betriebssystems. Das macht ihn sofort auf jedem Windows-Betriebssystem einsatzbereit.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Beschreiben des Flash über JTAG ist oft ein serieller [[Bootloader]] im Controller enthalten. Bei ST werden sie über einen speziellen Pin der MPU aktiviert und sind dank Kompression und das intelligente entfernen redundanter Information, bei der Übertragung genauso schnell wie JTAG/SWD Adapter.&lt;br /&gt;
&lt;br /&gt;
== CMSIS - ARM Cortex Software Libraries  ==&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. Dieser 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;
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-Prozessorkern und Peripherie-Registern.&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. Implementierungen gibt es z.B. von Keil ([http://www.keil.com/pack/doc/cmsis_rtx/index.html RTX])&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. Die &amp;quot;Core Peripheral Funktionen&amp;quot; benötigt beispielsweise weniger als 1 KB-Code und weniger als 10 Bytes RAM.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&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 auf der [http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php ARM CMSIS Webseite].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Linksammlung#ARM|Linksammlung (Abschnitt ARM)]]&lt;br /&gt;
* [[LPC1xxx]]&lt;br /&gt;
* [[LPC1xxx_Entwicklungskit_LPCXpresso]]&lt;br /&gt;
* [[Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red]]&lt;br /&gt;
* [[Codebase_f%C3%BCr_LPC1xxx]]&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;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.mySTM32.de Online Tutorial für den STM32]&lt;br /&gt;
* [http://www.myXMC.de Online Tutorial für den XMC von Infineon]&lt;br /&gt;
* [http://www.myUGL.de Online Tutorial für freie Grafikbibliothek, STM32, STM32F429, TFT, Touch]&lt;br /&gt;
* [http://embdev.net/forum/arm-gcc ARM-GCC Forum] im englischsprachigen &amp;quot;Ableger&amp;quot; von mikrocontroller.net embdev.net u.a. für WinARM, Yagarto, CS Codebench&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-m/index.php Cortex-M Produktseite von ARM]&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://booksite.elsevier.com/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;
[[Category:ARM| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=96527</id>
		<title>Cortex-A</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=96527"/>
		<updated>2017-06-02T08:29:06Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Update und hinzufügen der neuen Prozessoren A75 und A55&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ARM Cortex-A sind von [[ARM]] konstruierte Prozessorkerne, 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;
ARM bezeichnet die Prozessorlinien folgendermaßen&amp;lt;ref&amp;gt;http://arm.com/products/processors/index.php&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
;ARM Cortex Embedded Processors: Cortex-M Series – Cost-sensitive solutions for deterministic microcontroller applications&lt;br /&gt;
;ARM Cortex Real-time Embedded Processors: Cortex-R Series – Exceptional performance for real-time applications&lt;br /&gt;
;ARM Cortex Application Processors: Cortex-A Series – High performance processors for open Operating Systems&lt;br /&gt;
&lt;br /&gt;
Die Cortex-A-Prozessoren sind deutlich leistungsstärker als ARM Cortex M Mikroprozessoren, daher werden sie eher im Application-Bereich, sprich mit Betriebssystemen, wie Linux (z.B. Debian, Arch Linux ARM, Android), Windows Mobile etc. eingesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ Offizielle Beschreibungen aller Cortex-A Prozessoren von ARM&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 25% | ARM Core   || Key Benefits&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A5  || &lt;br /&gt;
* ARM’s smallest application processor with Uniprocessor (UP) and Multiprocessor (MP) licensing options&lt;br /&gt;
* Extremely configurable processor with optional NEON, optional FPU and L1 caches configurable from 4K-64KB&lt;br /&gt;
* Full feature set of Cortex-A9 processor at one third the area and power&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A7  || &lt;br /&gt;
* ARMv7-A architectural extensions (40-bit physical addressing, hardware virtualization support)&lt;br /&gt;
* More than 20% improvement in single thread integer performance compared to Cortex-A5&lt;br /&gt;
* Integrated L2 cache subsystem provides improved area efficiency and up to 43% improvements in memory streaming performance&lt;br /&gt;
* Proven successful design, now well matched to the needs of wearable mobile devices and other UI-based consumer products&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A8  || &lt;br /&gt;
* Large increase in single thread performance over it’s predecessor, the ARM11&lt;br /&gt;
* ARMv7-A support including NEON and TrustZone&lt;br /&gt;
* Widely deployed in mobile and embedded, with numerous low-cost 3rd party development platforms. A great processor on which to learn the ARM architecture.&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A9  || &lt;br /&gt;
* Scalable performance and power efficiency for a broad range of 32-bit consumer, networking, enterprise and mobile applications&lt;br /&gt;
* Support the wide ARMv7-A 32-bit software eco-system&lt;br /&gt;
* Mature and silicon proven in multiple process technologies&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A15 || &lt;br /&gt;
* Established ARMv7-A processor with NEON-VFP configurability&lt;br /&gt;
* Reliable 32-bit infrastructure computing with 1TB addressing&lt;br /&gt;
* Support for multi-tenant software virtualization&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A17 || &lt;br /&gt;
* Highest performance for ARMv7-A software ecosystem&lt;br /&gt;
* Cost efficiency with premium 32-bit performance for mass-market devices&lt;br /&gt;
* Mature and shipped in a wide range of consumer and embedded markets&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A32 || &lt;br /&gt;
* ARMv8-A architectural enhancements, full backwards compatibility with ARMv7-A software&lt;br /&gt;
* Higher efficiency and performance compared to Cortex-A7 processor&lt;br /&gt;
* New idle power management features&lt;br /&gt;
* Highly scalable 32-bit processor with new configuration options&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A35 || &lt;br /&gt;
* Most efficient 64-bit ARMv8-A processor with full ARMv7-A compatibility&lt;br /&gt;
* Efficiency improvements compared to the Cortex-A7: Less active power, improved performance&lt;br /&gt;
* Highly scalable ARMv8-A processor with new configuration options&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A53 || &lt;br /&gt;
* High efficiency CPU for wide range of applications in mobile, DTV, automotive, networking, and more&lt;br /&gt;
* ARMv8-A architecture at low cost for standalone entry level designs&lt;br /&gt;
* Versatile enough to pair with any ARMv8 core in a big.LITTLE pairing, including Cortex-A57, Cortex-A72, or even other Cortex-A53 or Cortex-A35 CPU clusters&lt;br /&gt;
* Mature product with high volume shipment&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A55 ||&lt;br /&gt;
* Extreme scalability &lt;br /&gt;
* Delivering great performance and efficiency for immersive experiences&lt;br /&gt;
* Over 3000 unique design configurations&lt;br /&gt;
* new DynamIQ big.LITTLE Concept&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A57 || &lt;br /&gt;
* Established ARMv8-A 64-bit processor&lt;br /&gt;
* Reliable 64-bit infrastructure computing with 16TB addressing&lt;br /&gt;
* Proven functional safety documentation package&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A72 || &lt;br /&gt;
* ARM’s state-of-the-art high-performance processor for infrastructure, mobile, and automotive&lt;br /&gt;
* Market-leading compute density across all application form factors&lt;br /&gt;
* Improved performance and efficiency, with full ARMv8-A 64b support.&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A73 || &lt;br /&gt;
* Highest performance in mobile power envelope. Up to 30% higher performance than previous generation.&lt;br /&gt;
* Up to 2.8GHz frequency for highest peak performance&lt;br /&gt;
* New levels of sustained usage for the best user experience. Up to 30% increased power efficiency&lt;br /&gt;
* Smallest premium ARMv8-A processor ever. Premium CPU under 0.65mm2 per core.&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A75 ||&lt;br /&gt;
* New levels of performance&lt;br /&gt;
* 20% more integer core performance&lt;br /&gt;
* Latest architecture (ARMv8-A)&lt;br /&gt;
* new DynamIQ big.LITTLE Concept&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zum Cortex-M ==&lt;br /&gt;
&lt;br /&gt;
Die Unterschiede zu den Cortex-M Mikrocontrollern sind unter anderem folgende:&lt;br /&gt;
* Teilweise 64 bit Prozessoren, mit vergrößertem Adressraum (44 bit oder mehr statt 32 bit)&lt;br /&gt;
* Kein On-Chip Speicher (meist ein geringes RAM vorhanden, aber ein externes ist so gut wie immer trotzdem nötig) macht externes Speicherinterface nötig, was viele Pins nutzt. Auch braucht man natürlich extra Speicher- und (DDR)-SDRAM-ICs.&lt;br /&gt;
* Mehrere Levels von Data und Instruction Caches&lt;br /&gt;
* Gehäuse mit wesentlich mehr Pins, meist im BGA&lt;br /&gt;
* Höhere Taktfrequenz (mehr als 500 MHz sind keine Seltenheit, aktuell maximal 2.8 GHz)&lt;br /&gt;
* ARM big.LITTLE Konzept: mehrere &amp;quot;kleine&amp;quot; Cortex-A-Cores werden zusammen mit mehreren &amp;quot;großen&amp;quot; Cores verschalten, um Enegie zu sparen: wenn wenig Leistung nötig ist werden die Energie-effizienteren Cores benutzt, bei hohen Leistungsanforderungen übernehmen die anderen Cores&lt;br /&gt;
* DynamIQ: neuere Erweiterung des big.LITTLE-Konzepts für mehr Flexibilität&lt;br /&gt;
* ARM Jazelle für die beschleunigte Ausführung von Java-Code&lt;br /&gt;
* Sicherheitsmechanismen, wie eine [[MMU]] oder die ARM TrustZone Technologie&lt;br /&gt;
* Optional eine NEON™ Media Processing Engine&lt;br /&gt;
* Schnellere und präzisere [[FPU]]&lt;br /&gt;
* Kryptographie, wie AES- und SHA-Algorithmen, True-Random-Generators&lt;br /&gt;
* Digitale Interfaces, die man eher aus dem PC-Bereich kennt, wie HS-USB-Hosts, schnelles Ethernet, SD/MMC Interface, Kamera- oder Video-Dekoder, I²S, ...&lt;br /&gt;
* Dazu kommen aber auch klassische Mikrocontroller-Interfaces, wie UART, I²C, SPIs, interne ADCs und DACs, sowie Timer&lt;br /&gt;
&#039;&#039;(für alle oben genannten Fälle gibt es natürlich auch Ausnahmen)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einige der oben genannten Punkte finden sich neuerdings auch in Cortex-M7-Controllern, die damit die Brücke zwischen Mikrocontrollern und Anwendungsprozessoren schlagen.&lt;br /&gt;
&lt;br /&gt;
Größter Nachteil für diese Leistungsfähigen Controller wird das fehlen von On-Chip Flash und RAM sein, weil man so extra ICs braucht, was wiederum das Layouten erschwert, da ein DDR3-RAM-Design nicht mehr sonderlich einfach ist.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-a Offizielle ARM Seite zu der Cortex-A Serie]&lt;br /&gt;
* [[Linux Boards]]&lt;br /&gt;
* [[Raspberry Pi Einführung]]&lt;br /&gt;
* [[ARM Cortex Mikrocontroller]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Implementierung_einer_Finite_State_Machine&amp;diff=96471</id>
		<title>Implementierung einer Finite State Machine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Implementierung_einer_Finite_State_Machine&amp;diff=96471"/>
		<updated>2017-05-30T04:56:06Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Änderung 96470 von 46.161.9.51 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Statemachine#Implementierung einer objektorientiert Finite State Machine in C++]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LeckerWecker_(Zeitschloss)&amp;diff=96451</id>
		<title>LeckerWecker (Zeitschloss)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LeckerWecker_(Zeitschloss)&amp;diff=96451"/>
		<updated>2017-05-29T08:53:06Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Änderung 96450 von 46.161.9.20 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:LeckerWeckerZwischenstand.JPG|thumb|So gut wie fertig!]]&lt;br /&gt;
Egal ob man die Leckereien vor seinen Mitmenschen oder sich selbst schützen muss, das Zeitschloss &#039;&#039;&#039;LeckerWecker&#039;&#039;&#039; gibt seinen Inhalt erst nach Ablauf der eingestellten Zeit frei.&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
Das Zeitschloss LeckerWecker sperrt eine Kiste für eine einstellbare Zeit ab. Durch Drücken der Sperr-Taste für drei Sekunden lässt sich die Sperrzeit einstellen, wobei die Eingabe in Stunden und Tagen über einen Drehgeber erfolgt. Die Einstellungen werden mit der Sperr-Taste abgeschlossen oder bei 30 Sekunden Untätigkeit verworfen. Die Taste zum Entsperren gibt das elektrische Schloss frei sofern die Sperrzeit abgelaufen ist oder zeigt die verbliebene Wartezeit auf einer 7-Segmentanzeige an.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist für langen Batteriebetrieb ausgelegt und verfügt zudem über eine Batterieüberwachung. Bei leerer Batterie blinkt, während der Auslösung des elektrischen Schlosses, auf der 7-Segmentanzeige der Schriftzug &amp;lt;tt&amp;gt;bat&amp;lt;/tt&amp;gt;. Bei längerer Lagerung empfiehlt sich den Türöffner mechanisch zu entsperren.&lt;br /&gt;
&lt;br /&gt;
Der Nachbau soll jedem Hobbyelektroniker möglich sein. Daher wurden keine raren Spezialteile verwendet. Alle Teile lassen sich vom Baumarkt, bei eBay oder beim Elektronikversender beziehen. Für das präzise Bohren der Frontplatte empfiehlt sich eine Ständerbohrmaschine und für die Platine gibt es den Leiterplattenservice. Alles andere sollte sich auch in der kleinsten Hobbywerkstatt finden lassen.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Die nachfolgende Bauanleitung stellt keine exakte Schritt für Schritt Anleitung dar, jedoch ist alles soweit nötig beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Mechanik ===&lt;br /&gt;
&lt;br /&gt;
Obwohl es sich hier um ein Elektronikprojekt handelt zeigt es sich, dass der mechanische Aufbau das meiste Geschick und die meiste Zeit erfordert.&lt;br /&gt;
&lt;br /&gt;
Im ersten Schritt erfolgt das Bohren und Bestücken der großen Frontplatte. Die Maße sind dabei nicht bindend sondern eine Empfehlung. Die Löcher für die Leiterplatte müssen mit großer Sorgfalt an einer Ständerbohrmaschine gesetzt werden, denn sonst sieht unschön aus. Alle haben mit Ausnahme für das Türschloss (4mm) und den Drehgeber (8mm) einen Durchmesser von 3mm. Das Fenster für die 7-Segmentanzeige wird zunächst aufgezeichnet und dann mit vielen Bohrlöchern grob frei gemacht und anschließend mit der Feile auf seine volle Größe erweitert.&lt;br /&gt;
&lt;br /&gt;
Die Leiterplatte wird mit einem Sandwich befestigt bestehend aus:&lt;br /&gt;
* 20mm lange M3-Zylinderkopfschraube &lt;br /&gt;
* 10mm lange M3-Distanzhülse&lt;br /&gt;
* Leiterplatte &lt;br /&gt;
* M3-Mutter&lt;br /&gt;
* Schutzplatte&lt;br /&gt;
* M3-Mutter&lt;br /&gt;
&lt;br /&gt;
Im weiteren Steht das zweiteilige Batteriefach an, das passend zur Frontplatte gebohrt wird. Die Senkkopfschrauben werden mit einem 6mm Bohrer von Hand versenkt. Zum Schluss erfolgt die Befestigung mittels 20mm langen M3-Distanzhülsen.&lt;br /&gt;
&lt;br /&gt;
Da das Schließblech so noch zu Groß ist, muss es erstmal passend zur Frontplatte zugeschnitten werden. Den Türöffner zwecks Stabilität vor den Arbeiten gleich einbauen. Als Abstandhalter dienen ein 40mm M4-Distanzhülsen und 10mm lange M4-Zylinderkopfschrauben.&lt;br /&gt;
&lt;br /&gt;
An der Kiste muss jetzt das Stück für die Frontplatte heraus gesägt werden, wobei seitlich und unten eine Überlappung von 15mm erhalten bleibt. Und natürlich nicht vergessen die Verschraubung anbringen. Da reichen auch M3-Schrauben und Beilagscheiben für die Holzseite.&lt;br /&gt;
&lt;br /&gt;
Soweit der einfache Teil, denn mit Falle beginnt die Pfrimelei. Als erstes wird der Abstand von der Innenkante der Frontplatte zur Spitze des Türöffner gemessen. Davon wird die Tiefe des Schlosses abgezogen. Als nächstes wird von der Spitze der Falle bis zur Innenkante der Befestigungsplatte des Einsteckschlosses gemessen. Aus diesen beiden Maßen kann die Einrückung für die Montagewinkel bestimmt werden. Da die Falle deutlich schmaler als der Türöffner ist, lässt sich die seitliche Einrückung grob über den Daumen peilen. Statt den Deckel zu verkrizeln sollte ein Blatt Papier eingeklebt werden. Damit die Kiste auch stabelbar bleibt, bieten sich M5-Senkkopfschrauben für die Befestigung der Winkel an.&lt;br /&gt;
&lt;br /&gt;
Nun zum aller schwierigsten der Höhenbohrung der Montagewinkel. Zunächst wird grob ein Loch gebohrt, so dass mindestens ein Restspalt von 10mm bleibt. Nun wird die Spaltbreite ermittelt bis die Falle an der Zunge vom Türöffner anschlägt. Das ist das Maß, um der die endgültige Bohrung versetzt werden muss.&lt;br /&gt;
&lt;br /&gt;
Zuletzt fehlt noch der Griff zum Öffnen der Kiste.&lt;br /&gt;
&lt;br /&gt;
=== Elektronik ===&lt;br /&gt;
&lt;br /&gt;
Die Drähte der Batteriehalter verlängern, so dass es eben reicht. Vielleicht mit einem übergezogenem Schrumpfschlauch die Leitungen noch bündeln und mit Kabelbinder an den Distanzhülsen fixieren.&lt;br /&gt;
&lt;br /&gt;
Für das Zusammenlöten sei auf den Eagle-Schaltplan verwiesen, der sich mit der kostenlosen Light Edition öffnen und bearbeiten lässt.&lt;br /&gt;
&lt;br /&gt;
Den Uhrenquarz mit Patex oder Heißkleber fixieren.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
&lt;br /&gt;
Die Software liegt als Intel HEX-Format vor und kann mit jedem ISP-Programmer in den Atmel AVR geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== Inbetriebnahme ===&lt;br /&gt;
&lt;br /&gt;
Der erste Teil der Inbetriebnahme erfolgt, wenn die Leiterplatte fertig gelötet und programmiert ist. Statt dem Türöffner dient eine LED mit Vorwiderstand als Indikator. Als Spannungsversorgung dient nicht die Batterie, sondern ein Labornetzteil mit der Spannung 9,0V und der Strombegrenzung auf 200mA.&lt;br /&gt;
&lt;br /&gt;
Beim Drücken der rechten Taste leuchten die Anzeige und die Test-LED. Nach kurzem Warten gehen beide wieder aus. Nun am Labornetzteil die Spannung absenken und nach dem drücken der rechten Taste die Schwelle zur Unterspannungserkennung ermitteln. Die sollte bei 6,0V liegen. Ansonsten ggf. den Spannungsteiler R18 und R19 nach Tabelle aus der Materialliste austauschen.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
! !! R18 !! R19&lt;br /&gt;
|----&lt;br /&gt;
| Zu hoch/Zu früh || 240kΩ || 1,0MΩ&lt;br /&gt;
|----&lt;br /&gt;
| Normal || 240kΩ || 1,1MΩ&lt;br /&gt;
|----&lt;br /&gt;
| Zu niedrig/Zu spät || 250kΩ || 1,2MΩ&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Danach die linke Taste lange drücken bis die Tagesanzeige blinkt. Nun mit dem Drehgeber testen das alle Zahlen stimmen. Die linke Taste nochmal kurz drücken und nun blinkt die Stundenanzeige. Auch hier die Zahlen mit den Drehgeber durchtesten. Nach etwa 30 Sekunden warten hört das blinken auf. Zuletzt ohne Strombegrenzung das zuverlässige auslösen des Türöffners prüfen.&lt;br /&gt;
&lt;br /&gt;
Für den weiteren Aufbau den Türöffner auf Tagesentriegelung stellen solange nicht alles funktioniert. Die arbeiten gelten als abgeschlossen, wenn die Sperrzeit minutengenau über mehrere Tage gelaufen ist.&lt;br /&gt;
&lt;br /&gt;
== Materialliste ==&lt;br /&gt;
&lt;br /&gt;
Die Details zur Materialliste finden sich in den [[#Downloads]]&lt;br /&gt;
&lt;br /&gt;
== Funktion ==&lt;br /&gt;
&lt;br /&gt;
Jedem steht es frei Abwandlungen und Verbesserungen an diesem Projekt vorzunehmen. Deswegen sei nachfolgend kurz die Funktion erläutert&lt;br /&gt;
&lt;br /&gt;
=== Mechanik ===&lt;br /&gt;
&lt;br /&gt;
Neben dem elektrischen Türöffner wären noch weitere Lösungen für ein elektrisches Schloss denkbar gewesen. Zum einen ein Modellbauservo, der einen Riegel dreht oder verschiebt und des weiteren ein Zugmagnet als Betätiger. &lt;br /&gt;
&lt;br /&gt;
=== Elektronik ===&lt;br /&gt;
&lt;br /&gt;
Als Kostengründen wurde die Leiterplatte einlagig gestaltet, wobei ein zweilagiges Layout sicher weniger Umstände gemacht hätte. Aus EMV-gründen umschließt die Massefläche die gesamte Schaltung. Als Anzeige dient eine LED-7-Segmentanzeige im Multiplexbetrieb.&lt;br /&gt;
&lt;br /&gt;
Eine Notstromversorgung, die nur bei Ausfall der Batterie und Elektronik das Schloss freigibt wäre super gewesen.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Zustandsautomat.svg|thumb|]]&lt;br /&gt;
Im Kern besteht der LeckerWecker aus einem [[Zustandsautomat]]en, der sich im Main-Modul in einer Endlosschleife befindet. Je nach Eingangsereignis oder Zeitablauf erfolgt ein Zustandsübergang.&lt;br /&gt;
&lt;br /&gt;
Die Software selbst ist in Schichten aufgebaut. Es gibt die HAL-Schicht in der alle Zugriffe auf die Hardware gekapselt sind, darauf setzen dann die Schichten mit den Funktionseinheiten auf und als oberstes das Main-Modul, das die Funktionseinheiten zu einer Anwendung verknüpft.&lt;br /&gt;
&lt;br /&gt;
Die HAL-Schicht lässt sich ziemlich einfach testen. In einem separatem Unterordner befindet sich ein weiteres Makefile, das nur auf die HAL-Module verweist. Und beim entsprechenden Testschritt aufruft.&lt;br /&gt;
&lt;br /&gt;
Die Modultest für die Funktionseinheiten wurden noch nicht realisiert. Naheliegend sind hierfür zwei Verfahren. Der Quellcode für die Funktionseinheiten wird in einen anderen Ordner kopiert, in dem sich ein Mockup-HAL befindet, und das ganze Makefile wird als normale PC-Anwendung realisiert, die den HAL und die Modul-Schnittstellen stimuliert. Alternativ könnte der gleiche Trick mit der Zielhardware umgesetzt werden. Hier ist nur das auswerten den Resultate schwieriger.&lt;br /&gt;
&lt;br /&gt;
== Projektstatus / TODO ==&lt;br /&gt;
;Software&lt;br /&gt;
* Modultests fehlen&lt;br /&gt;
* Bei Spannungsaussetzer, durch Schläge auf die Kiste, mit der letzten Stunde aus dem EEPROM beginnen&lt;br /&gt;
* Inkonsistenz: Programmier-Taste/Sperrtaste/Entsperren/Öffnen&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
* [[:Datei: LeckerWecker.zip]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[EEU]]&lt;br /&gt;
* [[:Kategorie:Timer und Uhren]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;keine&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Lokale_Elektroniklieferanten&amp;diff=96438</id>
		<title>Lokale Elektroniklieferanten</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Lokale_Elektroniklieferanten&amp;diff=96438"/>
		<updated>2017-05-29T05:03:27Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Änderung 96433 von 46.161.9.20 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
Diese Liste enthält &#039;&#039;&#039;Ladengeschäfte&#039;&#039;&#039;, bei denen man als Privatkunde lokal, vor Ort, elektronische Bauteile erhalten kann. Keine Flohmärkte, einmalige Veranstaltungen oder Geschäfte, die nur an gewerbliche Kunden verkaufen.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Falls die Darstellungsart nicht gefällt oder Rubriken fehlen, so bitte nicht hier ändern, sondern das Template anpassen: [[Vorlage:ElektronikLieferant]]&amp;lt;br&amp;gt;&lt;br /&gt;
So soll das Template ausgefüllt werden:&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=hier Firmenname eintragen&lt;br /&gt;
|Straße=Straßenname, z.&amp;amp;nbsp;B. Musterstraße 123&lt;br /&gt;
|PLZ=PLZ, z.&amp;amp;nbsp;B. 12345&lt;br /&gt;
|Ort=Ort, z.&amp;amp;nbsp;B. München&lt;br /&gt;
|Telefon=Telnr., z.&amp;amp;nbsp;B. 012345/12341234&lt;br /&gt;
|Fax=Faxnr., z.&amp;amp;nbsp;B. 012345/12345234&lt;br /&gt;
|Öffnungszeiten=Öffnungszeiten eintragen&amp;lt;br&amp;gt;Neue Zeile mit &amp;quot;br&amp;quot; abgetrennt&lt;br /&gt;
|Weblink=http://www.mikrocontroller.net Link ohne umschliessende eckige Klammern&lt;br /&gt;
|Email=Emailadresse, z.&amp;amp;nbsp;B. xxx@yyy.de&lt;br /&gt;
|Bemerkung=ggf. Bemerkung, ansonsten Rubrik/Feld/Variable leer lassen&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Deutschland=&lt;br /&gt;
==Baden-Württemberg==&lt;br /&gt;
===Aalen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Wilhelm-Zapf-Str. 9&lt;br /&gt;
|PLZ=73430&lt;br /&gt;
|Ort=Aalen&lt;br /&gt;
|Telefon=07361/610820&lt;br /&gt;
|Fax=07361/610821&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.00 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.muekra.com/Filiale_Aalen&lt;br /&gt;
|Email=info@muekra.de&lt;br /&gt;
|Bemerkung=Keine SMD-Teile&amp;lt;br&amp;gt;&lt;br /&gt;
Leider gibt es den Laden nicht mehr!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Bopfingen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=HENRI-electronic GmbH&lt;br /&gt;
|Straße=Am Stadtgraben 11&lt;br /&gt;
|PLZ=73441&lt;br /&gt;
|Ort=Bopfingen&lt;br /&gt;
|Telefon=07362/919093&lt;br /&gt;
|Fax=07362/919096&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.30 - 12.30 Uhr, 13.30 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.henri.de&lt;br /&gt;
|Email=vertrieb@henri.de&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Esslingen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Bahnhofstr. 23&lt;br /&gt;
|PLZ=73728&lt;br /&gt;
|Ort=Esslingen&lt;br /&gt;
|Telefon=0711/355676&lt;br /&gt;
|Fax=0711/3108656&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.30 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=https://www.muekra.de/filiale-esslingen/&lt;br /&gt;
|Email=info@muekra.de&lt;br /&gt;
|Bemerkung=Keine Mikrocontroller, keine SMD-Teile (ausser einige wenige Transistoren)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Göppingen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Geislinger Str. 2&lt;br /&gt;
|PLZ=73033&lt;br /&gt;
|Ort=Göppingen&lt;br /&gt;
|Telefon=07161/9641718&lt;br /&gt;
|Fax=07161/9641730&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00 - 12.30 Uhr, 14.00 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.muekra.com/Filiale_Goeppingen&lt;br /&gt;
|Email=info@muekra.de&lt;br /&gt;
|Bemerkung=Keine Mikrocontroller, keine SMD-Teile (ausser einige wenige Transistoren). Es besteht die Möglichkeit die Bauteile die nicht im Sortiment vorhanden sind zu bestellen. Dies ist sehr günstig und passiert in 2-3 Werktagen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Heilbronn===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=centralsystems GmbH&lt;br /&gt;
|Straße=Otto-Hahn-Straße 8&lt;br /&gt;
|PLZ=74078 &lt;br /&gt;
|Ort=Heilbronn&lt;br /&gt;
|Telefon=07066-9192790&lt;br /&gt;
|Fax=07066-9192791&lt;br /&gt;
|Öffnungszeiten=Mo.-Do. 8.00 - 20.00 Uhr&amp;lt;br&amp;gt;Fr. 8.00 - 12.00 Uhr&amp;lt;br&amp;gt;&lt;br /&gt;
|Weblink=http://www.centralsystems.de&lt;br /&gt;
|Email=info@centralsystems.de&lt;br /&gt;
|Bemerkung=Standardkomponenten vor allem im Bereich der EDV, keine SMD-Teile, keine Microcontroller.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Heilbronn===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Krauss Elektronik GmbH&lt;br /&gt;
|Straße=Turmstraße 20&lt;br /&gt;
|PLZ=74072 &lt;br /&gt;
|Ort=Heilbronn&lt;br /&gt;
|Telefon=07131/68191&lt;br /&gt;
|Fax=07131/68192&lt;br /&gt;
|Öffnungszeiten=Mo.-Mi.+Fr. 9.00 - 18.00 Uhr&amp;lt;br&amp;gt;Do. 9.00 - 19.00 Uhr&amp;lt;br&amp;gt;Sa. 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.krauss-elektronik.de/&lt;br /&gt;
|Email=info@krauss-elektronik.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
===Freiburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Omega electronic GmbH&lt;br /&gt;
|Straße=Eschholzstr. 58-60&lt;br /&gt;
|PLZ=79115&lt;br /&gt;
|Ort=Freiburg&lt;br /&gt;
|Telefon=0761/76776-0&lt;br /&gt;
|Fax=0761/76776-55&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa.: 09:00 - 19:30&lt;br /&gt;
|Weblink=http://www.omega-electronic.de&lt;br /&gt;
|Email=info@omega-electronic.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Karlsbad===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=IT-WNS, Thomas Heldt&lt;br /&gt;
|Straße=Schulstr. 13&lt;br /&gt;
|PLZ=76307&lt;br /&gt;
|Ort=Karlsbad - Mutschelbach&lt;br /&gt;
|Telefon=07202/936083&lt;br /&gt;
|Fax=07202/936085&lt;br /&gt;
|Öffnungszeiten=Nach Vereinbahrung (Email-Kontakt)&lt;br /&gt;
|Weblink=http://www.it-wns.de&lt;br /&gt;
|Email=info@it-wns.de&lt;br /&gt;
|Bemerkung=Bestellungen im Onlineshop können wahlweise auch direkt abgeholt werden&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Karlsruhe===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Fritz-Erler-Straße 24&lt;br /&gt;
|PLZ=76133&lt;br /&gt;
|Ort=Karlsruhe&lt;br /&gt;
|Telefon=0721/374270&lt;br /&gt;
|Fax=0721/9379171&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.30 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=https://www.muekra.de/filiale-karlsruhe&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Werner Bremer Elektrotechnik &amp;amp; Einzelhandel&lt;br /&gt;
|Straße=Zähringerstraße 55a&lt;br /&gt;
|PLZ=76133&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Ort=Karlsruhe&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Bemerkung=Vielleicht geschlossen?? keine Website. Versand?&amp;lt;br&amp;gt;GESCHLOSSEN. Seit ca. 2014 ist da ein Friseur drin.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Ludwigsburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Mayer Elektronik&lt;br /&gt;
|Straße=Stuttgarter Str. 32&lt;br /&gt;
|PLZ=71638&lt;br /&gt;
|Ort=Ludwigsburg&lt;br /&gt;
|Telefon=07141 920 711&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 09.00-12.30 und 14.30-18.00 Uhr, Mittwoch nachmittags geschlossen, Sa. 09.00-12:30 Uhr&lt;br /&gt;
|Weblink=http://www.Mayer-Elektronik.de&lt;br /&gt;
|Email=info@Mayer-Elektronik.de&lt;br /&gt;
|Bemerkung= Spezialisiert auf Antennentechnik, Sat-Anlagen. Verschiedene Kleinteile erhältlich&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mannheim===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Morchfeldstr. 37-39&lt;br /&gt;
|PLZ=68199&lt;br /&gt;
|Ort=Mannheim - Neckarau&lt;br /&gt;
|Telefon=0180 6 564445 (20 Cent/Verbindung aus dem Festnetz, max. 60 Cent/Verbindung aus dem Mobilfunknetz)&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 10.00-20.00 Uhr, Sa. 10.00-18.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-mannheim.html&lt;br /&gt;
|Email=filiale.mannheim@conrad.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Offenburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Günther Wultschner (Elektronikladen)&lt;br /&gt;
|Straße=Luisenstraße 16&lt;br /&gt;
|PLZ=77654&lt;br /&gt;
|Ort=Offenburg&lt;br /&gt;
|Telefon=0781 43270&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.30 - 18:30 Uhr&amp;lt;br&amp;gt;Sa. 9.30 - 14.00 Uhr&lt;br /&gt;
|Weblink=http://www.wultschner-elektronik.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Pforzheim===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Westliche Karl-Friedrich-Str. 73 &lt;br /&gt;
|PLZ=75172 &lt;br /&gt;
|Ort=Pforzheim&lt;br /&gt;
|Telefon=07231 313952&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00 - 12:30 Uhr; 14.00 Uhr - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.muekra.com/Filiale_Pforzheim&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Reutlingen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Federnseestr. 4 &lt;br /&gt;
|PLZ=72764&lt;br /&gt;
|Ort=Reutlingen&lt;br /&gt;
|Telefon=07121/370748&lt;br /&gt;
|Fax=07121/370741&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.30 - 13.00 Uhr, 14.00 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.30 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.muekra.com/filiale_reutlingen.html&lt;br /&gt;
|Email=info@muekra.de&lt;br /&gt;
|Bemerkung=Keine SMD-Teile&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Schwäbisch Gmünd===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Kalter Markt 12&lt;br /&gt;
|PLZ=73525&lt;br /&gt;
|Ort=Schwäbisch Gmünd&lt;br /&gt;
|Telefon=07171/64352&lt;br /&gt;
|Fax=07171/405684&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00 - 12.30 Uhr, 14.00 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.30 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.muekra.com/Filiale_Schwaebisch_Gmuend&lt;br /&gt;
|Email=info@muekra.de&lt;br /&gt;
|Bemerkung=Keine SMD-Teile.... Laden geschlossen seit 31.12.15 !&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Stuttgart===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Dräger Electronic &amp;amp; Audio GmbH&lt;br /&gt;
|Straße=Hauptstätter Strasse 55&lt;br /&gt;
|PLZ=70178&lt;br /&gt;
|Ort=Stuttgart&lt;br /&gt;
|Telefon=+49 711 601818-46&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Montag - Freitag  10:00 - 19:00 Uhr Samstag 10:00 - 16:00 Uhr&lt;br /&gt;
|Weblink=http://www.dea-gmbh.de&lt;br /&gt;
|Email=info@draeger-electronic.de&lt;br /&gt;
|Bemerkung= Audio, Hifi, Tontechnik, Kabel, schon lange keine Bauelemente mehr!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Kronenstraße 7, Altes Postquartier&lt;br /&gt;
|PLZ=70173&lt;br /&gt;
|Ort=Stuttgart&lt;br /&gt;
|Telefon=0180 5 564445 (14 Cent/Min. aus dem Festnetz, max. 42 Cent/Min. aus dem Mobilfunknetz)&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-stuttgart.html&lt;br /&gt;
|Email=filiale.stuttgart@conrad.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Ulm===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=AW-Elektronik&lt;br /&gt;
|Straße=Hermann-Köhl-Str. 9&lt;br /&gt;
|PLZ=89160 &lt;br /&gt;
|Ort=Ulm/Dornstadt&lt;br /&gt;
|Dienstleistungen=Entwicklung Hard &amp;amp; Software; Leiterplattenbestückung SMD und THD; Leiterplattenlayout und Routing&lt;br /&gt;
|Weblink=http://www.aw-elektronik.de&lt;br /&gt;
|Email=info@aw-elektronik.de&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Bemerkung=Nach Absprache können lagernde Bauteile gekauft werden. Am Lager sind SMD-Bauteile wie z.B. AVR, Widerstände, Kondensatoren, LEDs; Die LEDs sind als WarmWeiß 3500K (1800mcd), Kaltweis 7000K (2850mcd), Rot (1500mcd) und Blau (350mcd) und UV vorhanden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Neutorstr. 20&lt;br /&gt;
|PLZ=89073&lt;br /&gt;
|Ort=Ulm&lt;br /&gt;
|Telefon=0731/64494&lt;br /&gt;
|Fax=0731/6028676&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.muekra.com/Filiale_Ulm.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Keine SMD-Teile&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Villingen-Schwenningen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Buchmann Elektronik&lt;br /&gt;
|Straße=Wasenstraße 51&lt;br /&gt;
|PLZ=78054&lt;br /&gt;
|Ort=Villingen-Schwenningen&lt;br /&gt;
|Telefon=07720/1308&lt;br /&gt;
|Fax=07720/1360&lt;br /&gt;
|Öffnungszeiten=Montag bis Freitag 09.00 - 12.30 &amp;amp; 14.00 - 19.00 Uhr; Mittwoch Nachmittag geschlossen; Samstag geschlossen&lt;br /&gt;
|Weblink=http://www.buchmann-elektronik.de&lt;br /&gt;
|Email=buchmann-elektronik@t-online.de&lt;br /&gt;
|Bemerkung=keine SMD.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=SchiBe Elektronik&lt;br /&gt;
|Straße=Mühlenstr. 9&lt;br /&gt;
|PLZ=78050&lt;br /&gt;
|Ort=Villingen-Schwenningen&lt;br /&gt;
|Telefon=07721/8879880&lt;br /&gt;
|Fax=07721/88798820&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 11.00 bis 12.00 Uhr, 14.00 Uhr bis 18.30 Uhr&lt;br /&gt;
|Weblink=http://www.schibe.de&lt;br /&gt;
|Email=info@SchiBe.de&lt;br /&gt;
|Bemerkung=Bestellt auf Anfrage ohne Versandkosten bei Conrad mit Selbstabholung dort.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Bayern==&lt;br /&gt;
===Ansbach===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Mehl Electronic&lt;br /&gt;
|Straße=Schaitbergerstr. 1&lt;br /&gt;
|PLZ=91522&lt;br /&gt;
|Ort=Ansbach&lt;br /&gt;
|Telefon=0981/977166&lt;br /&gt;
|Fax=0981/977167&lt;br /&gt;
|Öffnungszeiten=Montag - Freitag 09:00 - 18:00 Uhr&amp;lt;br&amp;gt;Samtag 10:00 - 13:00 Uhr &lt;br /&gt;
|Weblink=http://www.electronic-mehl.de&lt;br /&gt;
|Email=service@electronic-mehl.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Aschaffenburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=VS Elektronik OHG&lt;br /&gt;
|Straße= Magnolienweg 3&lt;br /&gt;
|PLZ= 63739&lt;br /&gt;
|Ort=Aschaffenburg &lt;br /&gt;
|Telefon=06021-30460&lt;br /&gt;
|Fax=06021-304626&lt;br /&gt;
|Öffnungszeiten= Montag - Freitag: 09:00 - 18:00 Uhr&amp;lt;br&amp;gt;Samstag: 09:00 - 13:00 Uhr&lt;br /&gt;
|Weblink=http://www.vs-electronic.de&lt;br /&gt;
|Email=info@vs-electronic.de&lt;br /&gt;
|Bemerkung= führt Vellemann Bausätze, PCs, Telekommunikation und Bauteile&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Augsburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=rf-elektronik&lt;br /&gt;
|Straße= Karlstraße 2, Eingang über Obstmarkt&lt;br /&gt;
|PLZ=86150&lt;br /&gt;
|Ort=Augsburg &lt;br /&gt;
|Telefon=0821 39830&lt;br /&gt;
|Fax=0821 518727?&lt;br /&gt;
|Öffnungszeiten= Montag - Freitag: 10:00 - 18:00 Uhr&amp;lt;br&amp;gt;Samstag: 10:00 - 13:00 Uhr&lt;br /&gt;
|Weblink=http://www.rf-elektronik.de&lt;br /&gt;
|Email=info@rf-elektronik.de&lt;br /&gt;
|Bemerkung=Bauelemente, Satellitentechnik+Zubehör, Halbleitertechnik, Satellitenanlagenbau, Akkus, im Laden befindet sich als nettes Schmankerl auch ein winziges, technisches Bücher-Antiquariat&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Erlangen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Schoffer Radio-Fernseh-Elektronik&lt;br /&gt;
|Straße=Beethovenstraße 2&lt;br /&gt;
|PLZ=91052&lt;br /&gt;
|Ort=Erlangen&lt;br /&gt;
|Telefon=09131 25288&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 9.00 - 12.30, 13.30-18.00 Uhr. Sa 9.30 - 13.00 Uhr&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname= &lt;br /&gt;
|Straße=Marquardsenstraße 21&lt;br /&gt;
|PLZ=91054 &lt;br /&gt;
|Ort=Erlangen&lt;br /&gt;
|Telefon=09131 27595&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 9.00 - 13.00, 14.00-18.00 Uhr. Sa 9.00 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.feller-electronic.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Fürth===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=B+D Electronic GmbH&lt;br /&gt;
|Straße=Königstr. 107 (gegenüber Citycenter und neben Feuerwehr)&lt;br /&gt;
|PLZ=90762 &lt;br /&gt;
|Ort=Fürth&lt;br /&gt;
|Telefon=0911 - 77 30 40&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo - Fr:   10.00 - 12.30 &amp;amp; 14.00 - 18.00&amp;lt;br&amp;gt;Sa:        10.00 - 13.00&lt;br /&gt;
|Weblink=http://www.bdelectronic.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=komplettes Sortiment online einsehbar (Excel), keine Mikrocontroller&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Holzheim===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=RH Electronic Eva Spaeth&lt;br /&gt;
|Straße=Ostertalstraße 15&lt;br /&gt;
|PLZ=86684&lt;br /&gt;
|Ort=Holzheim&lt;br /&gt;
|Telefon=08276 / 58800&lt;br /&gt;
|Fax=08276 / 58802&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=http://rhelectronic.tradoria.de/&lt;br /&gt;
|Email=eva@peterscable.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Kaufbeuren ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Jantsch-Elektronik GmbH&lt;br /&gt;
|Straße=Porschestraße  26&lt;br /&gt;
|PLZ=87600&lt;br /&gt;
|Ort=Kaufbeuren&lt;br /&gt;
|Telefon=0 83 41 / 95 33-0&lt;br /&gt;
|Fax=0 83 41 / 37 00&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 9:00-12:30 / 13:30-18:00&amp;lt;br/&amp;gt;&lt;br /&gt;
Sa 9:00-13:00 Uhr&lt;br /&gt;
|Weblink= http://www.j-e.de&lt;br /&gt;
|Email=info@j-e.de&lt;br /&gt;
|Bemerkung=führt auch gebrauchte Messgeräte&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Kiefersfelden (bei Rosenheim) ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=db-electronic, Jutta Richter&lt;br /&gt;
|Straße=Dorfstr. 30&lt;br /&gt;
|PLZ=83088&lt;br /&gt;
|Ort=Kiefersfelden&lt;br /&gt;
|Telefon=0 80 33 / 86 80&lt;br /&gt;
|Fax=0 80 33 / 76 19&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 9:00-18:00&amp;lt;br/&amp;gt;&lt;br /&gt;
Sa 10:00-12:00 Uhr&lt;br /&gt;
|Weblink= http://www.db-electronic.de&lt;br /&gt;
|Email=info@db-electronic.de&lt;br /&gt;
|Bemerkung=Verkauft neben aktiven, passiven und mechanischen Bauteilen, Werkzeug, technische Sprays, Messgeräte, Kleingeräte, LED-Artikel, Kabel, Akkus, Batterien und Computerzubehör&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Landshut===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Der Elektronik Landen&lt;br /&gt;
|Straße=Innere Münchener Straße 16&lt;br /&gt;
|PLZ=84036&lt;br /&gt;
|Ort=Landshut&lt;br /&gt;
|Öffnungszeiten=Mo - Fr 8:00 - 12:00, 14:00 - 18:00; Sa 8:00 - 12:00&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= kleiner, aber feiner Laden. Verkauft eher nur Analogtechnik, Röhren, und recht selten gewordene Sachen&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Rauschhuber Electronic&lt;br /&gt;
|Straße=Gaußstraße 2&lt;br /&gt;
|PLZ=84030&lt;br /&gt;
|Ort=Landshut&lt;br /&gt;
|Öffnungszeiten=Mo - Fr 8:00 - 17:00&lt;br /&gt;
|Weblink=http://rauschhuber.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= Kleiner Laden neben MediaMarkt. Verkauft Verbrauchsmaterial, wie Zinn und Lötsauglitze, Aktive und Passive Bauelemente und Werkzeug, wie Lötkolben, Seitenschneider, Schraubendreher u.n.v.m.K..&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Leiblfing (bei Straubing)===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Hans Entner Funkelektronik&lt;br /&gt;
|Straße=Landshuter Straße 1 &lt;br /&gt;
|PLZ=94339&lt;br /&gt;
|Ort=Leiblfing&lt;br /&gt;
|Telefon=(0 94 27) 90 20 86&lt;br /&gt;
|Fax=09427 - 902087&lt;br /&gt;
|Öffnungszeiten= leider nicht bekannt&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=Entner-DF9RJ@t-online.de&lt;br /&gt;
|Bemerkung= Kleiner Laden und sehr netter Inhaber. Einige Geräte und Zubehör. Viele HF-Stecker (v.a. SMA, BNC, N und PL(UHF)) und Koax-Kabel. Bietet auch Reparaturen an.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===München===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=AM Elektronik Vertrieb - Albert &amp;amp; Machl KG&lt;br /&gt;
|Straße=Kirchtruderinger Str. 6&lt;br /&gt;
|PLZ=81829&lt;br /&gt;
|Ort= München (Trudering)&lt;br /&gt;
|Telefon=089/4904180 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo-Do 8:00-12:00, 13:00-17:00 Uhr, Fr 8:00-12:00, 13:00-15:00 Uhr&lt;br /&gt;
|Weblink=http://stores.ebay.de/weri2elektronikwelt, http://www.am-elektronik.de&lt;br /&gt;
|Email=info@am-elektronik.de&lt;br /&gt;
|Bemerkung=Laden ist eher ein grosses Lager, daher am besten Bestellung per Mail und dann abholen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Balzer CFS&lt;br /&gt;
|Straße=Implerstrasse 14&lt;br /&gt;
|PLZ=81371&lt;br /&gt;
|Ort=München&lt;br /&gt;
|Telefon=089/55221243&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=http://www.balzer-cfs.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Bürklin&lt;br /&gt;
|Straße=Grünwalder Weg 30&lt;br /&gt;
|PLZ=82041 &lt;br /&gt;
|Ort=Oberhaching&lt;br /&gt;
|Telefon=(089) 55 875-0&lt;br /&gt;
|Fax=(089) 55 875-421&lt;br /&gt;
|Öffnungszeiten=Mo - Fr:   8:00 - 19:00&lt;br /&gt;
|Weblink=https://www.buerklin.com/de&lt;br /&gt;
|Email=info@buerklin.de&lt;br /&gt;
|Bemerkung= Achtung neuer Standort nicht mehr Schillerstraße !!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Tal 29&lt;br /&gt;
|PLZ=80331 &lt;br /&gt;
|Ort=München&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo - Fr:   9:00 - 20:00&amp;lt;br&amp;gt;Sa:        9:00 - 20:00&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-muenchen-tal.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Hanauer Straße 91 (gegenüber OEZ)&lt;br /&gt;
|PLZ=80993 &lt;br /&gt;
|Ort=München - Moosach&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo - Fr:   9:30 - 20:00&amp;lt;br&amp;gt;Sa:        9:00 - 20:00&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-muenchen-moosach.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Strixner &amp;amp; Holzinger&lt;br /&gt;
|Straße=Schillerstraße 25-29&lt;br /&gt;
|PLZ=80336 &lt;br /&gt;
|Ort=München&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo - Fr:   9:30 - 18:00&lt;br /&gt;
|Weblink=http://www.strixner-electronic.de, http://sh-halbleiter.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Nürnberg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Fürther Straße 212&lt;br /&gt;
|PLZ=90429&lt;br /&gt;
|Ort=Nürnberg&lt;br /&gt;
|Telefon=0180 5 564445&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo - Fr:   9:30 - 20:00&amp;lt;br&amp;gt;Sa: 9.30 - 18:00&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-nuernberg.html&lt;br /&gt;
|Email=filiale.nuernberg@conrad.de&lt;br /&gt;
|Bemerkung=Gegenüber ehemaligem Quelle-Stammhaus&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Regensburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Langobardenstraße 2&lt;br /&gt;
|PLZ=93053&lt;br /&gt;
|Ort=Regensburg&lt;br /&gt;
|Telefon=0180 5 564445&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo - Sa:   10:00 - 20:00&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-regensburg.html&lt;br /&gt;
|Email=filiale.regensburg@conrad.de&lt;br /&gt;
|Bemerkung=Im Fachmarktzentrum Bajuwarenstraße&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Pförring===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Pollin&lt;br /&gt;
|Straße=Max-Pollin-Straße 1&lt;br /&gt;
|PLZ=85104&lt;br /&gt;
|Ort=Pförring&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9 - 19 Uhr&amp;lt;br&amp;gt;Sa. 9 - 16 Uhr &lt;br /&gt;
|Weblink=http://www.pollin.de/shop/static/ecenter.htm&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=nähe Ingolstadt&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Rosenheim===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=AKAZEN GmbH&lt;br /&gt;
|Straße=Papinstr. 8&lt;br /&gt;
|PLZ=83022&lt;br /&gt;
|Ort=Rosenheim&lt;br /&gt;
|Telefon=+49 (0) 8031 / 90088-0&lt;br /&gt;
|Fax= +49 (0) 8031 / 90088-22&lt;br /&gt;
|Öffnungszeiten= 9.00 - 17.00&lt;br /&gt;
|Weblink= http://shop.akazen.de&lt;br /&gt;
|Email= info@akazen.de&lt;br /&gt;
|Bemerkung= Online bestellen &amp;amp; bezahlen, Vor-Ort Abholung möglich. Shop befindet sich im Aufbau, wenn Sie etwas suchen, bitte Anfrage per Mail oder Telefon &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Schweinfurt===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=elkra electronic&lt;br /&gt;
|Straße=Kerschensteinerstr. 11&lt;br /&gt;
|PLZ=97422&lt;br /&gt;
|Ort=Schweinfurt&lt;br /&gt;
|Telefon=09721-3870033&lt;br /&gt;
|Fax=09721-803295&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=http://www.elkra.de&lt;br /&gt;
|Email=info@elkra.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Spath Elektronische Bauteile&lt;br /&gt;
|Straße=Cramerstr. 9&lt;br /&gt;
|PLZ=97421&lt;br /&gt;
|Ort=Schweinfurt&lt;br /&gt;
|Telefon=09721/25186&lt;br /&gt;
|Fax=09721/22999&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Untermeitingen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Werner Weidemeier Ilona Elektronik&lt;br /&gt;
|PLZ=86836&lt;br /&gt;
|Ort=Untermeitingen&lt;br /&gt;
|Straße=Wiesenstr. 15 A&lt;br /&gt;
|Telefon=+49 (0) 8232 / 78598&lt;br /&gt;
|Fax=unbekannt&lt;br /&gt;
|Öffnungszeiten=unbekannt&lt;br /&gt;
|Weblink=kein WebLink vorhanden&lt;br /&gt;
|Email=keine ofizielle eMail-Adresse&lt;br /&gt;
|Bemerkung= Alle wichtigen und gängigen Kleinteile vorhanden. Uriger, kleiner Laden im Wohnhauskeller :-) &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Wernberg ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Klaus-Conrad-Straße 2&lt;br /&gt;
|PLZ=92533&lt;br /&gt;
|Ort=Wernberg&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo - Fr 09.00-19.00 Uhr&amp;lt;br&amp;gt;Sa 09.00-18.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-wernberg.html&lt;br /&gt;
|Email=filiale.wernberg@conrad.de&lt;br /&gt;
|Bemerkung=auch Versandzentrum&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Berlin==&lt;br /&gt;
===Charlottenburg-Wilmersdorf===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Segor-electronics&lt;br /&gt;
|Straße=Kaiserin-Augusta-Allee 94&lt;br /&gt;
|PLZ=10589&lt;br /&gt;
|Ort=Berlin&lt;br /&gt;
|Telefon=030 4399843&lt;br /&gt;
|Fax=030 4399855&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 10.00-13.30 Uhr und 14:30-18:00 Uhr, Sa. 10.00-13.00 Uhr&lt;br /&gt;
|Weblink=http://www.segor.de&lt;br /&gt;
|Email=sales@segor.de&lt;br /&gt;
|Bemerkung=Sehr gut sortiertes und vielseitiges Sortiment, preiswert, hochwertig.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Kreuzberg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Hasenheide 14-15&lt;br /&gt;
|PLZ=10967&lt;br /&gt;
|Ort=Berlin&lt;br /&gt;
|Telefon=0180 5 564445 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 10.00-19.00 Uhr, Sa. 10.00-18.00 Uhr &lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-berlin-kreuzberg.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Friedrichshain===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=TinkerSoup&lt;br /&gt;
|Straße=Frankfurter Allee 53&lt;br /&gt;
|PLZ=10247&lt;br /&gt;
|Ort=Berlin&lt;br /&gt;
|Telefon=03077903156&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=http://www.tinkersoup.de&lt;br /&gt;
|Email=info@tinkersoup.de&lt;br /&gt;
|Bemerkung=Ist ein reiner Onlineshop eigentlich, wurde 2016 von Pimoroni aus Englang gekauft. Hat deutschen Kunden Support.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mahlsdorf===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Marotronics&lt;br /&gt;
|Straße=Hultschiner Damm 151&lt;br /&gt;
|PLZ=12623&lt;br /&gt;
|Ort=Berlin&lt;br /&gt;
|Telefon=030 5163658-4&lt;br /&gt;
|Fax=030 5163658-5&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=https://www.marotronics.de&lt;br /&gt;
|Email=info@marotronics.de&lt;br /&gt;
|Bemerkung=Arduinolastiges Angebot(wird ausgebaut), nach Absprache Selbstabholung möglich, wer Interesse an einem DIY Rasenroboter hat kann ihn sich dort im Einsatz ansehen&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Prenzlauer Berg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=SLY electronic&lt;br /&gt;
|Straße=Erich-Weinert-Straße 139-141&lt;br /&gt;
|PLZ=10409&lt;br /&gt;
|Ort=Berlin&lt;br /&gt;
|Telefon=030 428492-0&lt;br /&gt;
|Fax=030 428492-29&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 10.00-19.00(Juli+Aug nur bis 18:00) Uhr, Sa. 10.00-16.00 Uhr, &lt;br /&gt;
|Weblink=http://www.sly.de&lt;br /&gt;
|Email=mail@sly.de&lt;br /&gt;
|Bemerkung=Für den kleinen Laden ist das Angebot relativ groß, der Audio-bastler wird hier für fündig v.a. für Musiker: sprich Stecker, Potis (große Auswahl an Knöpfen), Fittings. im Laden wird mehr angeboten als auf der Internetseite (nicht 100% aktualisiert). Er ist im Schnitt im Vergleich zur Apotheke Conrad preisgünstiger.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Schöneberg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Kleiststraße 30-31&lt;br /&gt;
|PLZ=10787&lt;br /&gt;
|Ort=Berlin&lt;br /&gt;
|Telefon=0180 5 564445 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-berlin-schoeneberg.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Atzert Radio&lt;br /&gt;
|Straße=Kleiststraße 32-33&lt;br /&gt;
|PLZ=10787&lt;br /&gt;
|Ort=Berlin&lt;br /&gt;
|Telefon= &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten= nur online&lt;br /&gt;
|Weblink=http://www.atzert-radio.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Ist geschlossen (27.3.2015) und nur noch Online verfügbar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Steglitz===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Schloßstraße 34-36&lt;br /&gt;
|PLZ=12163&lt;br /&gt;
|Ort=Berlin&lt;br /&gt;
|Telefon=0180 5 564445 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-berlin-steglitz.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Brandenburg==&lt;br /&gt;
&lt;br /&gt;
===Cottbus===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Klauck Electronic-Shop&lt;br /&gt;
|Straße=Karl-Liebknecht-Str. 53a&lt;br /&gt;
|PLZ=03046&lt;br /&gt;
|Ort=Cottbus&lt;br /&gt;
|Telefon=0355 / 797044&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=reichlich eigene Parkplätze im Hof&lt;br /&gt;
&amp;lt;br&amp;gt;Mai 2014: seit längerem geschlossen :(&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=electronic Shop cottbus&lt;br /&gt;
|Straße=Schweriner Str. 2&lt;br /&gt;
|PLZ=03046&lt;br /&gt;
|Ort=Cottbus&lt;br /&gt;
|Telefon=0355 / 2890585&lt;br /&gt;
|Fax=0355 / 539545&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr.  09.00 - 12.00 Uhr, 14.00 - 18.00 Uhr&lt;br /&gt;
|Weblink=http://www.eshop-cb.de/eshop/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=der Shop ist sehr jung, daher ist das Team noch etwas unerfahren, macht dies aber durch Freundlichkeit wett&lt;br /&gt;
&amp;lt;br&amp;gt; Von der Straße aus nicht auszumachen, am besten zu Fuß erkunden. Mai 2014: Eintrag noch immer aktuell&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Koenig Elektronik / Technorm&lt;br /&gt;
|Straße=Karl-Liebknecht-Str. 59&lt;br /&gt;
|PLZ=03046&lt;br /&gt;
|Ort=Cottbus&lt;br /&gt;
|Telefon=0355 22746&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 08.00 - 14.00 Uhr&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=ein &amp;quot;typischer Krämerladen&amp;quot;, hat aber genau das, was man vom lokalen Händer erwartet.&lt;br /&gt;
&amp;lt;br&amp;gt; richtet sich eher an gewerbliche Radiotechniker, verkauft aber problemlos auch an Endkunden.&lt;br /&gt;
&amp;lt;br&amp;gt; Laden im Hinterhof. Mai 2014: Eintrag noch aktuell&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Frankfurt (Oder)===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronik Service Landrock&lt;br /&gt;
|Straße=Karl-Ritter-Platz 8-9&lt;br /&gt;
|PLZ=15230&lt;br /&gt;
|Ort=Frankfurt (Oder) &lt;br /&gt;
|Telefon=0335 / 6802029&lt;br /&gt;
|Fax=0335 / 684171&lt;br /&gt;
|Öffnungszeiten=Mo-Fr. 10-18 Uhr&lt;br /&gt;
|Weblink=http://www.landrock-elektronik.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Jürgen (Chef) ist superfreundlich, habe jahrelang dort eingekauft.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Bremen==&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Borgwardstr. 2&lt;br /&gt;
|PLZ=28279&lt;br /&gt;
|Ort=Bremen &lt;br /&gt;
|Telefon=01 80 / 55 64 44 5&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 10.00-19.00 Uhr&amp;lt;br&amp;gt;Sa 10.00-18.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-bremen.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Schuricht Distrelec GmbH&lt;br /&gt;
|Straße=Rehland 8&lt;br /&gt;
|PLZ=28832&lt;br /&gt;
|Ort=Achim &lt;br /&gt;
|Telefon= 04 20 2 / 97 47-97&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=https://www.distrelec.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= Nur telefonische Bestellung. Wenn man bei der Bestellung explizit sagt dass man die Sachen in Achim abholen möchte, dann klappt dies auch... meistens...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Widi-Elektronik&lt;br /&gt;
|Straße=Waller-Heerstraße 29&lt;br /&gt;
|PLZ=28217&lt;br /&gt;
|Ort=Bremen&lt;br /&gt;
|Telefon= 0421 - 39 61 137&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten= Mo-Sa: 9.30-13, Mo-Fr: 15-18&lt;br /&gt;
|Weblink=http://widi-elektronik.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= Hat fast alles, am besten vorher die genaue Bezeichnung im Katalog (auf der Website zu finden) aufschreiben und eine Liste vorlegen. Dann geht&#039;s auch relativ zügig&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Hamburg==&lt;br /&gt;
=== Hammerbrook ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Radio Kölsch&lt;br /&gt;
|Straße=Kreuzbrook 14&lt;br /&gt;
|PLZ=20537&lt;br /&gt;
|Ort=Hamburg &lt;br /&gt;
|Telefon=040 / 653 00 81&lt;br /&gt;
|Fax=040 / 653 00 80&lt;br /&gt;
|Öffnungszeiten=Montag - Freitag 10:00 - 19:00 Uhr, Samstag 10:00 - 16:00 Uhr&lt;br /&gt;
|Weblink=http://www.radiokoelsch.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= Sortiment nahezu komplett umgestellt auf Leuchten und Textilkabel. Eine kleine Auswahl historischer Bauteile wird auf der Homepage noch angeboten. Ansonsten gibt es noch diverses &amp;quot;Chinawerkzeug&amp;quot; und Ersatzteile für Haushaltsgeräte&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Hoheluft Ost===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Statronic&lt;br /&gt;
|Straße=Hoheluftchaussee 84&lt;br /&gt;
|PLZ=20253&lt;br /&gt;
|Ort=Hamburg &lt;br /&gt;
|Telefon=040 / 422 33 22&lt;br /&gt;
|Fax=040 / 422 33 25&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=http://www.statronic.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Stand 06/2014 kaum noch Bauteile verfügbar, mit Chance bekommt man einfache Teile z.B. Schraubklemmblöcke. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Wandsbek===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Wandsbeker Zollstr. 67-69&lt;br /&gt;
|PLZ=22041&lt;br /&gt;
|Ort=Hamburg&lt;br /&gt;
|Telefon=0180 5 564445 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 09.30-20.00 Uhr, Sa. 09.00-18.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-hamburg-wandsbek.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Altona===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Hahnenkamp 1&lt;br /&gt;
|PLZ=22765 &lt;br /&gt;
|Ort=Hamburg&lt;br /&gt;
|Telefon=0180 5 564445 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr &lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-hamburg-altona.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Hessen==&lt;br /&gt;
===Darmstadt===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Zimmermann Electronic GmbH&lt;br /&gt;
|Straße=Kasinostr. 2&lt;br /&gt;
|PLZ=64293 &lt;br /&gt;
|Ort=Darmstadt&lt;br /&gt;
|Telefon=06151 - 66 69 - 240&lt;br /&gt;
|Fax=06151 - 66 69 - 290&lt;br /&gt;
|Öffnungszeiten=Mo.- Fr. 9:00 - 19:00 Uhr&amp;lt;br&amp;gt;Sa. 9:00 - 14:00 Uhr&lt;br /&gt;
|Weblink=http://www.zeg-shop.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=EBG Electronic Business GmbH&lt;br /&gt;
|Straße=Bismarckstr. 61&lt;br /&gt;
|PLZ=64293 &lt;br /&gt;
|Ort=Darmstadt&lt;br /&gt;
|Telefon=06151 / 82 91 - 0&lt;br /&gt;
|Fax=06151 / 82 91 - 20&lt;br /&gt;
|Öffnungszeiten=Montag-Freitag: 9:00 bis 18:00 Uhr&amp;lt;br&amp;gt;Samstag:        9:00 bis 13:00 Uhr&lt;br /&gt;
|Weblink=http://www.ebg-darmstadt.de&lt;br /&gt;
|Email=info@ebg-darmstadt.de&lt;br /&gt;
|Bemerkung=Geschäft geschlossen wegen Insolvenz&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Frankfurt/Main===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Zeil 58 + 64 (Konstabler Wache)&lt;br /&gt;
|PLZ=60313 &lt;br /&gt;
|Ort=Frankfurt&lt;br /&gt;
|Telefon=0180 5 564445&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Mi. 10.00-20.00 Uhr&amp;lt;br&amp;gt;Do.-Sa. 10.00-21.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-frankfurt.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Hanau===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=MP Elektronik Vertriebs GmbH&lt;br /&gt;
|Straße=Hospitalstr. 13&lt;br /&gt;
|PLZ=63450 &lt;br /&gt;
|Ort=Hanau&lt;br /&gt;
|Telefon=06181/253077&lt;br /&gt;
|Fax=06181/921450 &lt;br /&gt;
|Öffnungszeiten= Seit 30. Nov. 2013 geschlosssen wegen jahrelanger unzumutbarer Baustellen in Hanau&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Kassel===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Geddert-Elektronik        (seit Januar 2014 geschlossen)&lt;br /&gt;
|Straße=Holländische Straße 31&lt;br /&gt;
|PLZ=34127&lt;br /&gt;
|Ort=Kassel&lt;br /&gt;
|Telefon=0561 / 897177&lt;br /&gt;
|Fax=0561 / 84329&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= Gibt es leider nicht mehr&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=UK-Elektronik&lt;br /&gt;
|Straße=Königstor 52&lt;br /&gt;
|PLZ=34117&lt;br /&gt;
|Ort=Kassel&lt;br /&gt;
|Telefon=0561 / 771074&lt;br /&gt;
|Fax=0561 / 778373&lt;br /&gt;
|Öffnungszeiten=Montag - Freitag 9:30 bis 18:00 Uhr, Samstag 9:30 bis 13:00 Uhr&lt;br /&gt;
|Weblink=http://www.uk-elektronik.com/&lt;br /&gt;
|Email=info@UK-Elektronik.com&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Schuro Elektronik GmbH&lt;br /&gt;
|Straße=Friedrich-Ebert-Straße 3&lt;br /&gt;
|PLZ=34117&lt;br /&gt;
|Ort=Kassel&lt;br /&gt;
|Telefon=0561 / 16415&lt;br /&gt;
|Fax=0561 / 770318&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= keine Abholung von Bauteilen möglich&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=NT-Elektronik Toprakci Nihat Elektronik&lt;br /&gt;
|Straße=Hoffmann-von-Fallersleben-Str 3&lt;br /&gt;
|PLZ=34117&lt;br /&gt;
|Ort=Kassel&lt;br /&gt;
|Telefon=0561 / 2020858&lt;br /&gt;
|Fax=0561 / 2020857&lt;br /&gt;
|Öffnungszeiten=Montag - Freitag 10:00 – 19:00 Uhr, Samstag 10:00 – 16:00 Uhr&lt;br /&gt;
|Weblink=http://www.nt-elektronik.de/&lt;br /&gt;
|Email=NT-Elektronik@hotmail.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Offenbach===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=rail- electronic GmbH&lt;br /&gt;
|Straße=Waldemar- Klein- Platz 1&lt;br /&gt;
|PLZ=63071&lt;br /&gt;
|Ort=Offenbach&lt;br /&gt;
|Telefon=069 / 88 20 72&lt;br /&gt;
|Fax=069 / 88 31 14&lt;br /&gt;
|Öffnungszeiten=Mo - Fr 10h - 19h&amp;lt;br&amp;gt;Sa 10h - 16h&lt;br /&gt;
|Weblink=http://www.rail-electronic.de&lt;br /&gt;
|Email=info@rail-electronic.de&lt;br /&gt;
|Bemerkung=Computer- Hardware/ Software/ Service/ Kabel/ Stecker/ Adapter/ ... Unser Ladengeschäft befindet sich direkt im Stadion in der unteren Ladenzeile, Sie können gleich davor parken&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Wetzlar===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Electronic-Shop Lutz Hoffmann&lt;br /&gt;
|Straße=Silhöfertorstr. 3&lt;br /&gt;
|PLZ=35578&lt;br /&gt;
|Ort=Wetzlar&lt;br /&gt;
|Telefon=06441 / 94627&lt;br /&gt;
|Fax=06441 / 946271&lt;br /&gt;
|Öffnungszeiten=Mo. - Sa. 9.00 - 13.00 Uhr&amp;lt;br&amp;gt;Mo. - Fr. 14.00 - 18.00 Uhr&lt;br /&gt;
|Weblink=http://www.funk-shop.de/&lt;br /&gt;
|Email=mail@funk-shop.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Wöllstadt===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=ELW Elektronik Handels GMBH&lt;br /&gt;
|Straße=Am Kalkofen 10&lt;br /&gt;
|PLZ=61206&lt;br /&gt;
|Ort=Wöllstadt&lt;br /&gt;
|Telefon=06034-4411&lt;br /&gt;
|Fax=06034-5739&lt;br /&gt;
|Öffnungszeiten=Mo. - Fr. 08.30 - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 08.30 - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.elw-elektronik.com/&lt;br /&gt;
|Email=elw-gmbh@t-online.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Mecklenburg-Vorpommern==&lt;br /&gt;
===Rostock===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=A-Z City-Stores&lt;br /&gt;
|Straße=Doberaner-Hof&lt;br /&gt;
|PLZ=&lt;br /&gt;
|Ort=Rostock&lt;br /&gt;
|Telefon=0381-4031171&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo. – Fr.    9.30 – 19.30 Uhr&amp;lt;br&amp;gt;Sa.   9.30 – 16.00 Uhr&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=geringes Angebot&amp;lt;br&amp;gt;recht teuer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Niedersachsen==&lt;br /&gt;
===Braunschweig===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic GmbH&lt;br /&gt;
|Straße=Sudetenstr. 4&lt;br /&gt;
|PLZ=38114&lt;br /&gt;
|Ort=Braunschweig&lt;br /&gt;
|Telefon=0180 5 564445&lt;br /&gt;
|Fax=???&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 09.30-19.00 Uhr, Sa. 09.00-18.00 Uhr (Abweichend in der Vorweihnachtszeit!)&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-braunschweig.html&lt;br /&gt;
|Email=filiale.braunschweig@conrad.de&lt;br /&gt;
|Bemerkung= Die Resterampe hinter dem Hauptgebäude gibt es nicht mehr. Dorthin wurde die Modellbau-Abteilung ausgelagert.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=ETT - Electronic Toys Trading GmbH&lt;br /&gt;
|Straße=Kreuzstraße 65&lt;br /&gt;
|PLZ=38118&lt;br /&gt;
|Ort=Braunschweig&lt;br /&gt;
|Telefon=0531-58 11 00&lt;br /&gt;
|Fax=0531-58 11 030&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=http://www.ett-online.de/&lt;br /&gt;
|Email=bestell@ett-online.de&lt;br /&gt;
|Bemerkung= Online-Katalog unter http://www.megakick-stores.de/. Zu Atzert-Elektronik mutiert. &#039;&#039;&#039;Insolvent!:&#039;&#039;&#039; Stand August 2014: ETT hat Insolvent angemeldet; evtl. Garantieansprüche für alte Käufe werden damit wohl verfallen; sollte das Unternehmen komplett insolvent sein, gilt dies auch für neue Käufe. Auch die angeschlossenen vier Atzert-Läden sind betroffen: alle vier sind für immer geschlossen worden. 2015 gerüchtehalber unter Löwen-Elektronik wieder eröffnet (http://löwen-elektronik.com/).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronik Bauteile Vertrieb - Dipl.-Ing. Jörg Bassenberg&lt;br /&gt;
|Straße=Nußbergstraße 9&lt;br /&gt;
|PLZ=38102&lt;br /&gt;
|Ort=Braunschweig&lt;br /&gt;
|Telefon=0531-79 17 07&lt;br /&gt;
|Fax=0531-7 60 22&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=http://www.bassenberg.de/&lt;br /&gt;
|Email=info@bassenberg.de&lt;br /&gt;
|Bemerkung= Kleines Ladengeschäft, hauptsächlich ältere Bauteile vorrätig.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=ChiliTec GmbH&lt;br /&gt;
|Straße=Bäckerberg 12&lt;br /&gt;
|PLZ=38165&lt;br /&gt;
|Ort=Lehre-Essenrode&lt;br /&gt;
|Telefon=05301-9029980&lt;br /&gt;
|Fax=05301-9029988&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 8-17 Uhr&lt;br /&gt;
|Weblink=http://www.chilitec.de/&lt;br /&gt;
|Email=willkommen@chilitec.de&lt;br /&gt;
|Bemerkung= Elektronik-Großhandel mit Schwerpunkt auf LED-Beleuchtung und Haustechnik. Versand oder Selbstabholung möglich.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Buxtehude===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Sell-Elektronik&lt;br /&gt;
|Straße=Brillenburgsweg 31A&lt;br /&gt;
|PLZ=21614&lt;br /&gt;
|Ort=Buxtehude&lt;br /&gt;
|Telefon=04161-88305&lt;br /&gt;
|Fax=-&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 10:00-12:00 Uhr &amp;amp; 15:00-18:30 Uhr, Sa. 10:00-13:00 Uhr &lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Ladengeschäft. Riesen Sortiment an passiven, aktiven und mechanischen Bauteilen. Gute Beratung und faire Preise. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Göttingen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Göttinger Elektronik Center&lt;br /&gt;
|Straße=Bahnhofstr. 9&lt;br /&gt;
|PLZ=37130&lt;br /&gt;
|Ort=Gleichen&lt;br /&gt;
|Telefon=0551-487988&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Ortsteil Diemarden&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Goslar===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Thometzek-Elektronik&lt;br /&gt;
|Straße=Marktstr. 12&lt;br /&gt;
|PLZ=38640&lt;br /&gt;
|Ort=Goslar&lt;br /&gt;
|Telefon=05321-23773&lt;br /&gt;
|Fax=05321-20180&lt;br /&gt;
|Öffnungszeiten=Mo-Sa: 9:00-13:00 Uhr, Mo,Di,Do,Fr: 14:30-18:00 Uhr&lt;br /&gt;
|Weblink=http://www.thometzek-elektronik.de&lt;br /&gt;
|Email=ruediger.thometzek@t-online.de &lt;br /&gt;
|Bemerkung=Kleines Ladengeschäft mit CB- und Amateurfunk, Lichttechnik, ... und Bauteilen&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Hannover===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic GmbH&lt;br /&gt;
|Straße=Goseriede 3&lt;br /&gt;
|PLZ=30159&lt;br /&gt;
|Ort=Hannover&lt;br /&gt;
|Telefon=0180 5 564445&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 09.00-20.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-hannover.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Radio Menzel-Electronic&lt;br /&gt;
|Straße=Fössestraße 6&lt;br /&gt;
|PLZ=30451&lt;br /&gt;
|Ort=Hannover&lt;br /&gt;
|Telefon= 0511 442607&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo-Fr: 10:00-13:30, 14:30-18:00  Sa: 10:00-13:30&lt;br /&gt;
|Weblink=http://www.menzel-electronic.de &lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Zloch-Elektronik&lt;br /&gt;
|Straße=Calenberger Str. 33 &lt;br /&gt;
|PLZ=30169&lt;br /&gt;
|Ort=Hannover&lt;br /&gt;
|Telefon=0511 15575 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo-Fr: ? Sa: ?&lt;br /&gt;
|Weblink=keine&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= &#039;&#039;&#039;Geschlossen&#039;&#039;&#039; - Zloch Elektronik ist einer der ältesten Läden dieser Art in Hannover. Man bekommt dort auch Bauteile, die selten sind (Restbestände alter Zeiten). Anfahrt mit öffentlichen Verkehrsmitteln: Haltestelle Humboldtstraße oder Haltestelle Waterloo. Seit mindestens September 2013 geschlossen (laut Schild). Seit mindestens August 2014 wird Inventar in Umzugskisten verpackt.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Lüneburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Beusch Elektronik&lt;br /&gt;
|Straße=Reichenbachstr. 8&lt;br /&gt;
|PLZ=21335 &lt;br /&gt;
|Ort=Lüneburg&lt;br /&gt;
|Telefon=04131 33311&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo und Sa geschlossen, Di - Fr 10:00-13:00, 14:00-18:00&lt;br /&gt;
|Bemerkung=Gibt&#039;s nicht mehr! :-(&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=EleConT - Peter Schoss&lt;br /&gt;
|Straße=Schierenweg 29a&lt;br /&gt;
|PLZ=21382&lt;br /&gt;
|Ort=Brietlingen&lt;br /&gt;
|Telefon=04133 404843&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=nach Absprache&lt;br /&gt;
|Weblink=http://www.elecont.de/&lt;br /&gt;
|Email=info@elecont.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Oldenburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=ebc Utz Kohl GmbH &lt;br /&gt;
|Straße=Alexanderstraße 31&lt;br /&gt;
|Telefon=0441 82114&lt;br /&gt;
|Fax=0441 85801&lt;br /&gt;
|Weblink=www.e-b-c-elektronik.de&lt;br /&gt;
|Email=kontakt@e-b-c-elektronik.de&lt;br /&gt;
|PLZ=26121&lt;br /&gt;
|Ort=Oldenburg&lt;br /&gt;
|Öffnungszeiten=Mo. - Fr. 9:00 - 12:30 und 13:30 - 18:00 Uhr, Sa. 9:00 - 13:00 Uhr&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Osnabrück===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Heinicke-electronic&lt;br /&gt;
|Straße=Meller Str. 43 &lt;br /&gt;
|PLZ=49084&lt;br /&gt;
|Ort=Osnabrück&lt;br /&gt;
|Telefon=0541 587666&lt;br /&gt;
|Fax=0541 586614 &lt;br /&gt;
|Öffnungszeiten=Mo-Fr. 9:30-13:00Uhr und 14:30-18:00Uhr Sa. 9:30-13:00Uhr&lt;br /&gt;
|Weblink=http://www.heinicke-electronic.de/&lt;br /&gt;
|Email=sales@heinicke-electronic.de&lt;br /&gt;
|Bemerkung=Haben auch einen PC Shop nebenan.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Wilhelmshaven===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Reichelt Elektronik&lt;br /&gt;
|Straße=Elektronikring 1 &lt;br /&gt;
|PLZ=26452&lt;br /&gt;
|Ort=Sande&lt;br /&gt;
|Telefon=04422-955 333&lt;br /&gt;
|Fax=04422-955 111 &lt;br /&gt;
|Öffnungszeiten=Montag - Donnerstag: 9:00 - 17:00 Uhr; Freitag: 9:00 - 15:30 Uhr&lt;br /&gt;
|Weblink=http://www.reichelt.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Nordrhein-Westfalen==&lt;br /&gt;
===Aachen===&lt;br /&gt;
&#039;&#039;&#039;Firma 	AG-Elektronik&lt;br /&gt;
Kontakt Hirschgraben 9-11;52062 Aachen&lt;br /&gt;
Telefon: 0241-25226&lt;br /&gt;
http://www.agelektronik.de&lt;br /&gt;
Öffnungszeiten Mo-Fr 10:00 bis 18.30 Sa 10:00-14:00.&#039;&#039;&#039; &lt;br /&gt;
Übernommen aus [http://aachen.wikia.com/wiki/Elektronik-Teile http://aachen.wikia.com/wiki/Elektronik-Teile]. Die Liste dort ist größer.&lt;br /&gt;
* TH-Elektronic, Karlsgraben 47, 52062 Aachen, Tel: 404593, Fax: 404594, http://www.th-electronic.de/ Öffnungszeiten Mo-Fr 9-19:30 Sa 9-16 Uhr&lt;br /&gt;
* AG Elektronik, Hirschgraben 9-11, 52062 Aachen,Tel.:0241-25226 http://www.agelektronik.de/(Sehr freundlich und großes Sortiment, Werktags geöffnet Mo-Fr 10:00 bis 18.30 Sa 10:00-14:00.&lt;br /&gt;
* Helmut Singer Elektronik, Feldchen 16-24, D-52070 Aachen. http://www.singer-elektronik.de/ (Gebrauchte Messgeräte)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nähere Umgebung:&#039;&#039;&#039;&lt;br /&gt;
* Fleu Elektronik, Kantgasse 26, 52477 Alsdorf, Tel. 02404/22240, ubestätigt: Öffnungszeiten Mo - Fr. von 09 - 12 und 15 - 19 Uhr.&lt;br /&gt;
* Zilles Elektronik GmbH, Bauelemente für die Elektronik, Aachener Str. 415, 41069 Mönchengladbach, Tel: 02161-176005&lt;br /&gt;
&lt;br /&gt;
===Bielefeld===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=alpha electronic Ing. A. Berger GmbH&lt;br /&gt;
|Straße=Oldentruper Str. 104&lt;br /&gt;
|PLZ=33604&lt;br /&gt;
|Ort=Bielefeld&lt;br /&gt;
|Telefon=0521-324333&lt;br /&gt;
|Fax=0521-320435&lt;br /&gt;
|Öffnungszeiten=Mo. – Sa.    9.00 – 13.00 Uhr&amp;lt;br&amp;gt;Mo. – Fr.   14.00 – 18.00 Uhr&lt;br /&gt;
|Weblink=http://www.alphaelectronic.de/&lt;br /&gt;
|Email=info@alphaelectronic.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Fuchs und Lützow Elekronik - Handelsges. mbH&lt;br /&gt;
|Straße=Heeper Str. 184&lt;br /&gt;
|PLZ=33607&lt;br /&gt;
|Ort=Bielefeld&lt;br /&gt;
|Telefon=0521-5576555&lt;br /&gt;
|Fax=0521-5576557&lt;br /&gt;
|Öffnungszeiten=Mo. – Sa.    9.00 – 13.00 Uhr&amp;lt;br&amp;gt;Mo. – Fr.   14.00 – 18.00 Uhr&lt;br /&gt;
|Weblink=http://www.electronicfuchs.com/&lt;br /&gt;
|Email=info@electronicfuchs.com&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Bochum===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Schmitt Elektronik&lt;br /&gt;
|Straße=Dorstener Straße 18-20&lt;br /&gt;
|PLZ=44787&lt;br /&gt;
|Ort=Bochum&lt;br /&gt;
|Telefon=0234 9620130 &lt;br /&gt;
|Fax=0234 9629132 &lt;br /&gt;
|Öffnungszeiten=Mo - Fr 09:00 - 18:00, Sa 09:00 - 14:00&lt;br /&gt;
|Weblink=http://www.elektronik-wunderland.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Alteingesessener laden, hat viel seltenes zeug aus den 70-90ern, sortiment an modernen bauteilen wie AVR eher gering. Sehr zu empfehlen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Bonn===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Karlstraße 3&lt;br /&gt;
|PLZ=53115&lt;br /&gt;
|Ort=Bonn&lt;br /&gt;
|Telefon=0180 5 564445&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr &lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-bonn.html&lt;br /&gt;
|Email=filiale.bonn@conrad.de  &lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=CSD-Electronics&lt;br /&gt;
|Straße=Bunsenstraße 3&lt;br /&gt;
|PLZ=53121&lt;br /&gt;
|Ort=Bonn&lt;br /&gt;
|Telefon=0228 85041574&lt;br /&gt;
|Fax=0228 85041600&lt;br /&gt;
|Öffnungszeiten=Mo-Do 10-12 und 14-17 Uhr Fr 10-12 und 14-16 Uhr. Andere Uhrzeiten? Anrufen!&lt;br /&gt;
|Weblink=http://www.csd-electronics.de/?pk_campaign=micro_locale&lt;br /&gt;
|Email=support@csd-electronics.de&lt;br /&gt;
|Bemerkung=Artikel können online bestellt und im Laden abgeholt werden&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=P &amp;amp; M Elektronik Bonn GmbH&lt;br /&gt;
|Straße=Budapester Straße 6&lt;br /&gt;
|PLZ=53111&lt;br /&gt;
|Ort=Bonn&lt;br /&gt;
|Telefon=0228-656005&lt;br /&gt;
|Fax=0228-656336&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 09:00 – 19:00 Uhr&amp;lt;br&amp;gt;Sa 10:00 – 16:00 Uhr&lt;br /&gt;
|Weblink=http://www.pm-elektronik-bonn.de/&lt;br /&gt;
|Email=pm-elektronikbonn@web.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Dortmund===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Westenhellweg 95-101&lt;br /&gt;
|PLZ=44137&lt;br /&gt;
|Ort=Dortmund&lt;br /&gt;
|Telefon=01805-564445 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo. – Fr.    10.00 – 20.00 Uhr&amp;lt;br&amp;gt;Sa.  9.30 – 20.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-dortmund.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=direkt in der Innenstadt&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=SR-Tronic&lt;br /&gt;
|Straße=Beratgerstr. 28&lt;br /&gt;
|PLZ=44149&lt;br /&gt;
|Ort=Dortmund&lt;br /&gt;
|Telefon=0231-33671-0&lt;br /&gt;
|Fax=0231-33671-25&lt;br /&gt;
|Öffnungszeiten=Mo. – Fr.    10.00 – 18.00 Uhr&lt;br /&gt;
|Weblink=http://www.sr-tronic.de&lt;br /&gt;
|Email=info@sr-tronic.de&lt;br /&gt;
|Bemerkung=Ist zwar ein Versandhandel, Abholung ist aber möglich, extrem kleines Elektroniksortiment (Atmel, Eproms), ist eigentlich ein Satshop. Hat bereits Insolvenz angemeldet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- laut Diskussion:Lokale_Elektroniklieferanten gibt es den Laden nicht mehr.&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Electronic am Wall&lt;br /&gt;
|Straße=Hoher Wall 22&lt;br /&gt;
|PLZ=44137&lt;br /&gt;
|Ort=Dortmund&lt;br /&gt;
|Telefon=0231-16863&lt;br /&gt;
|Fax= 	0231-160632&lt;br /&gt;
|Öffnungszeiten=Mo. – Fr.    9.00 – 18.00 Uhr (?)&lt;br /&gt;
|Weblink=http://electronic-am-wall.de&lt;br /&gt;
|Email=electronic-am-wall@t-online.de&lt;br /&gt;
|Bemerkung=Alteingesessener Laden mit mittlerem Elektronik und Bauteilesortiment (Leider nicht mehr so viel wie früher).&lt;br /&gt;
}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Duisburg ===&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektro Urban&lt;br /&gt;
|Kurfürstenstr. 151&lt;br /&gt;
|46147 Oberhausen / Holten&lt;br /&gt;
|Telefon 0208 62 12 88 &lt;br /&gt;
|Weblink=http://www.elur.de/&lt;br /&gt;
|Bemerkung= Verzogen nach Oberhausen, Kurfürstenstrasse. Siehe dort.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Düsseldorf ===&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Oststraße 34&lt;br /&gt;
|PLZ=40211&lt;br /&gt;
|Ort=Düsseldorf&lt;br /&gt;
|Telefon=0211 - 38 83 76 - 0&lt;br /&gt;
|Fax=0211 - 38 83 76 - 14&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 10:00-19:30 Uhr&lt;br /&gt;
|Email=filiale.duesseldorf@conrad.de  &lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-duesseldorf.html&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Emsdetten===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronik-Shop Emsdetten&lt;br /&gt;
|Straße=Borghorster Str. 28&lt;br /&gt;
|PLZ=48282&lt;br /&gt;
|Ort=Emsdetten&lt;br /&gt;
|Telefon=02572-83546&lt;br /&gt;
|Fax=02572-9606299&lt;br /&gt;
|Öffnungszeiten=Mo: 14:30 - 18:00 Uhr, Di - Fr: 9:00 - 12:30 und 14:30 - 18:00 Uhr, Sa: 9:00 - 12:30 Uhr&lt;br /&gt;
|Weblink=http://www.elektronik-shop-emsdetten.de/&lt;br /&gt;
|Email=info@elektronik-shop-emsdetten.de&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Essen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Altendorfer Str. 11&lt;br /&gt;
|PLZ=45127&lt;br /&gt;
|Ort=Essen&lt;br /&gt;
|Telefon=01805-564445 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo. – Fr.    10.00 – 19.30 Uhr&amp;lt;br&amp;gt;Sa.  9.30 – 18.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-essen.html&lt;br /&gt;
|Email=filiale.essen@conrad.de&lt;br /&gt;
|Bemerkung=schräg gegenüber von IKEA, Tiefgarage im UG für Kunden kostenlos, Karte an der Kasse lochen lassen&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Geldern===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=BSAB-Elektronik Strulik &amp;amp; Bosch GmbH&lt;br /&gt;
|Straße=Zeppelinstr. 8&lt;br /&gt;
|PLZ=47608&lt;br /&gt;
|Ort=Geldern&lt;br /&gt;
|Telefon=02831/12051 &lt;br /&gt;
|Fax=02831/2437&lt;br /&gt;
|Öffnungszeiten=Mo. – Fr.    8.00 – 17.00 Uhr&lt;br /&gt;
|Weblink=http://www.bsab-elektronik.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Iserlohn===&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Techno-Center-Schmitt&lt;br /&gt;
|Straße=Raiffeisenstr. 14&lt;br /&gt;
|PLZ=58638&lt;br /&gt;
|Ort=Iserlohn&lt;br /&gt;
|Telefon=02371/2197931&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.–Fr. von 10:00 – 18:00 Uhr&amp;lt;br&amp;gt;Sa. von 10:00 – 14:00 Uhr &lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Köln===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=M. + M. van der Meyden GmbH&lt;br /&gt;
|Straße=Breite Straße 101&lt;br /&gt;
|PLZ=50667&lt;br /&gt;
|Ort=Köln&lt;br /&gt;
|Telefon=0221/2576369&lt;br /&gt;
|Fax=0221/2576369&lt;br /&gt;
|Öffnungszeiten=Mo.–Fr. von 9:30 – 19:00 Uhr&amp;lt;br&amp;gt;Sa. von 10:00 – 16:30 Uhr &lt;br /&gt;
|Weblink=http://vandermeyden.de&lt;br /&gt;
|Email=http://vandermeyden.de/?page_id=13&lt;br /&gt;
|Bemerkung=Sehr teuer (Standard Quarz HC49/S --&amp;gt; 1,50€); Muss manche µCs extra bestellen, die gängigsten AVR-Typen in DIP jedoch auf Lager&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Düren===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Hallmanns Elektronik&lt;br /&gt;
|Straße=Weierstraße 41&lt;br /&gt;
|PLZ=52349&lt;br /&gt;
|Ort=Düren&lt;br /&gt;
|Telefon=02421 16635&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr.: 09:00-18:00 Uhr&amp;lt;br&amp;gt;Sa: 09:00 - 13:00 Uhr&lt;br /&gt;
|Weblink=http://www.hallmanns.com&lt;br /&gt;
|Email=info@hallmanns.com&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Bergisch Gladbach===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=MS-Elektronik&lt;br /&gt;
|Straße=Laurentiusstraße 20&lt;br /&gt;
|PLZ=51465&lt;br /&gt;
|Ort=Bergisch Gladbach&lt;br /&gt;
|Telefon=02202 - 93 22 17&lt;br /&gt;
|Fax=02202 - 93 22 18&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr.: 09:00-12:30 &amp;amp; 14:30 - 18:30 Uhr&amp;lt;br&amp;gt;Sa: 09:00 - 14:00 Uhr&lt;br /&gt;
|Weblink=http://www.ms-elektronik.info/&lt;br /&gt;
|Email=info@ms-elektronik.info&lt;br /&gt;
|Bemerkung= Auch Versand. Macht leider nichts mehr im Bereich Modellbau.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=DARISUS GmbH&lt;br /&gt;
|Straße= De-Gasperi-Straße 8 &lt;br /&gt;
|PLZ=51429&lt;br /&gt;
|Ort=Bergisch Gladbach&lt;br /&gt;
|Telefon=02204 - 98 18 11&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=https://darisusgmbh.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Nur Abholung von vorher online bestellten Teilen. Telefonisch 0 Erreichbarkeit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Langenfeld===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=rs elektronik - Reinhard Sinzel&lt;br /&gt;
|Straße=in den Weiden 19&lt;br /&gt;
|PLZ=40764&lt;br /&gt;
|Ort=Langenfeld&lt;br /&gt;
|Telefon=02173/22766&lt;br /&gt;
|Fax=02173/25958&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 10:00-13:00 + 15:00-18:00, Sa 10:00-13:00&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Moers===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Nürnberg Electronic&lt;br /&gt;
|Straße=Uerdinger Str. 121&lt;br /&gt;
|PLZ=47441&lt;br /&gt;
|Ort=Moers&lt;br /&gt;
|Telefon=02841-32221 &lt;br /&gt;
|Fax=02841-31733&lt;br /&gt;
|Öffnungszeiten=Mo.- Fr. 9:00 - 13:00 und 14:00 - 18:00&amp;lt;br&amp;gt;Samstag 9:00 - 13:00&amp;lt;br&amp;gt;Mittwoch Nachmittag geschlossen!&lt;br /&gt;
|Weblink=http://www.nuernberg-electronic.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mönchengladbach===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Brunenberg Elektronik&lt;br /&gt;
|Straße=Lürriper Straße 170&lt;br /&gt;
|PLZ=41065&lt;br /&gt;
|Ort=Mönchengladbach&lt;br /&gt;
|Telefon=02161-44421&lt;br /&gt;
|Fax=02161-42552&lt;br /&gt;
|Öffnungszeiten=Mo.- Fr. 9:00 - 13:00 und 14:00 - 18:00&amp;lt;br&amp;gt;Samstag 9:00 - 13:00&amp;lt;br&amp;gt;Donnerstag Nachmittag geschlossen!&lt;br /&gt;
|Weblink=http://www.bruntronic.de&lt;br /&gt;
|Email=info@bruntronic.de&lt;br /&gt;
|Bemerkung=Das Ladengeschäft wurde geschlossen!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Zilles Elektronik GmbH&lt;br /&gt;
|Straße=Aachener Str. 415&lt;br /&gt;
|PLZ=41069&lt;br /&gt;
|Ort=Mönchengladbach&lt;br /&gt;
|Telefon=02161/176005&lt;br /&gt;
|Fax=02161/176007&lt;br /&gt;
|Öffnungszeiten=Montag - Freitag 8:45 - 13:00 &amp;amp; 14:00 - 18:00&amp;lt;br&amp;gt;Samstag 9:30 - 13:00&lt;br /&gt;
|Weblink=http://www.zilles-elektronik.de/&lt;br /&gt;
|Email=info@zilles-elektronik.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Monheim am Rhein===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Schukat electronic Vertriebs GmbH&lt;br /&gt;
|Straße=Daimlerstraße 26&lt;br /&gt;
|PLZ=40789&lt;br /&gt;
|Ort=Monheim am Rhein&lt;br /&gt;
|Telefon=02173 - 950-5&lt;br /&gt;
|Fax=02173 - 950-999&lt;br /&gt;
|Öffnungszeiten=montags bis freitags zwischen 8 Uhr und 18 Uhr&lt;br /&gt;
|Weblink=http://www.schukat.com&lt;br /&gt;
|Email=info@schukat.com&lt;br /&gt;
|Internet: www.schukat.com&lt;br /&gt;
|Bemerkung=nur Gewerblich Teile können nach Vorbestellung auch abgeholt werden ! &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Münster===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Omega electronic GmbH &lt;br /&gt;
|Straße=Salzstraße 35&lt;br /&gt;
|PLZ=48143&lt;br /&gt;
|Ort=Münster&lt;br /&gt;
|Telefon=Tel:0251-3844540&lt;br /&gt;
|Fax= 0251-38445414&lt;br /&gt;
|Öffnungszeiten=Mo. – Sa.    10.00 – 19.30 Uhr&lt;br /&gt;
|Weblink=http://www.omega.ms/&lt;br /&gt;
|Email=info@omega.ms&lt;br /&gt;
|Bemerkung=Neu in Münster und sehr nah am Hauptbahnhof.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Oberhausen ===&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=KDH-ELEKTRONIK Klaus-Dieter Hösterey&lt;br /&gt;
|Straße=Kurfürstenstr. 151 &lt;br /&gt;
|PLZ=46147&lt;br /&gt;
|Ort=Oberhausen-Holten&lt;br /&gt;
|Telefon=0208-63547742&lt;br /&gt;
|Fax=0208-63547744&lt;br /&gt;
|Öffnungszeiten=Mo–Fr 09:00–13:00 Uhr // 15:00-18:00 Uhr, Samstags 10:00-13:00 Uhr&lt;br /&gt;
|Email=kdh-elektronik@t-online.de&lt;br /&gt;
|Weblink=http://www.kdh-elektronik-oberhausen.de/&lt;br /&gt;
|Bemerkung= vormals Eduard Urban Elektronik Duisburg http://www.openstreetmap.de/karte.html?zoom=18&amp;amp;lat=51.51577&amp;amp;lon=6.79613&amp;amp;layers=B000TT &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Paderborn===&lt;br /&gt;
Keine mehr&lt;br /&gt;
&lt;br /&gt;
===Recklinghausen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronik-Center Wenzlik, Inh. H.- J. Juhnke&lt;br /&gt;
|Straße=Halterner Straße 24&lt;br /&gt;
|PLZ=45657 &lt;br /&gt;
|Ort=Recklinghausen&lt;br /&gt;
|Telefon=02361-14103&lt;br /&gt;
|Fax=02361-182489&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr.: 9.00h-13.00h u. 14.30h-18.30h, Sa.: 10.00h-13.00h geöffnet!&lt;br /&gt;
|Weblink=http://www.ju-tec.de&lt;br /&gt;
|Email=ecw-recklinghausen@t-online.de&lt;br /&gt;
|Bemerkung= Elektronik Einzelhandel 35.000 verschiedene Artikel vorrätig.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Siegen===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Radig Hard &amp;amp; Software, Inh. U. Radig&lt;br /&gt;
|Straße=An der Bahn 18&lt;br /&gt;
|PLZ=57223&lt;br /&gt;
|Ort=Kreuztal&lt;br /&gt;
|Telefon=02732-762442&lt;br /&gt;
|Fax=02732-762443&lt;br /&gt;
|Öffnungszeiten=Nach Vereinbahrung&lt;br /&gt;
|Weblink=http://www.ulrichradig.de&lt;br /&gt;
|Email=mail@ulrichradig.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=RME-Service&lt;br /&gt;
|Straße=Lärchenhof 1&lt;br /&gt;
|PLZ=57223&lt;br /&gt;
|Ort=Kreuztal&lt;br /&gt;
|Telefon=02732-582170&lt;br /&gt;
|Fax=02732-582171&lt;br /&gt;
|Öffnungszeiten=Do/Fr 09:00-18.00, Sa nach Vereinbahrung&lt;br /&gt;
|Weblink=http://www.rme-service.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Wuppertal===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=WE elektronik&lt;br /&gt;
|Straße=Sedanstraße 88&lt;br /&gt;
|PLZ=42281&lt;br /&gt;
|Ort=Wuppertal&lt;br /&gt;
|Telefon=0202-510444&lt;br /&gt;
|Fax=0202-510666&lt;br /&gt;
|Öffnungszeiten=Mo.- Fr. 9.00 - 18.00&lt;br /&gt;
|Weblink=http://www.we-wuppertal.de/&lt;br /&gt;
|Email=info@we-wuppertal.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=K&amp;amp;K Elektronic&lt;br /&gt;
|Straße=Höhne 33&lt;br /&gt;
|PLZ=42275&lt;br /&gt;
|Ort=Wuppertal&lt;br /&gt;
|Telefon=0202&lt;br /&gt;
|Fax=0202&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Rheinland-Pfalz==&lt;br /&gt;
===Andernach===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=EDV + Elektronic Systeme Manuel Zitzer e.K.&lt;br /&gt;
|Straße=Füllscheuer 30&lt;br /&gt;
|PLZ=56626&lt;br /&gt;
|Ort=Andernach&lt;br /&gt;
|Telefon=02632/9293-0&lt;br /&gt;
|Fax=02632/9293-33&lt;br /&gt;
|Öffnungszeiten=Montag-Freitag 8:00 Uhr - 12:00 Uhr und 14:00 Uhr - 18:00 Uhr, Dienstag zusätzlich bis 19:00 Uhr, Samstag geschlossen&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
|Weblink=http://www.eleksys.de/&lt;br /&gt;
|Email=info@eleksys.de&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Kaiserslautern===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=BURCKHARDT-ELEKTRONIK&lt;br /&gt;
|Straße=Waldstr. 17&lt;br /&gt;
|PLZ=67659 &lt;br /&gt;
|Ort=Kaiserslautern&lt;br /&gt;
|Telefon=+49 (0)631 70114&lt;br /&gt;
|Fax=49 (0)631 70162&lt;br /&gt;
|Öffnungszeiten=Montag-Donnerstag 8:00 Uhr - 16:45 Uhr/Freitag 8:00 Uhr - 12:00 Uhr&lt;br /&gt;
|Weblink=http://www.burckhardt-elektronik.de&lt;br /&gt;
|Email=burckhardt-elektronik@web.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Koblenz===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Radio Erbar&lt;br /&gt;
|Straße=Bahnhofstr. 40&lt;br /&gt;
|PLZ=56068  &lt;br /&gt;
|Ort=Koblenz&lt;br /&gt;
|Telefon=0261/34782&lt;br /&gt;
|Fax=0261/14570&lt;br /&gt;
|Öffnungszeiten=Montag-Freitag 9:00 Uhr - 18:00 Uhr/Samstag 9:00 Uhr - 12:00 Uhr&lt;br /&gt;
|Weblink=http://www.radio-erbar.de/&lt;br /&gt;
|Email=webmaster@radio-erbar.de&lt;br /&gt;
|Bemerkung= Achtung, Elektronik-Shop für immer geschlossen. Nur noch Veranstaltungstechnik&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mainz===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Binger Str. 14-16 (nähe Hauptbahnhof)&lt;br /&gt;
|PLZ=55122 &lt;br /&gt;
|Ort=Mainz&lt;br /&gt;
|Telefon=0180 5312111&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo - Sa  9.30 Uhr - 19.30 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-mainz.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronik Schmidt&lt;br /&gt;
|Straße=Boppstraße 62 - 64&lt;br /&gt;
|PLZ=55118 &lt;br /&gt;
|Ort=Mainz&lt;br /&gt;
|Telefon=0180 5312111&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Montag - Freitag 09.00 Uhr - 13.00 Uhr und 14.00 Uhr - 18.00 Uhr&amp;lt;br&amp;gt;&lt;br /&gt;
Samstag 09.00 Uhr - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.schmidt-electronic.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Saarland==&lt;br /&gt;
=== Dillingen ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Lutwin Bosch Elektronik&lt;br /&gt;
|Straße=Weinligstr.38&lt;br /&gt;
|PLZ=66763|Ort=Dillingen|Telefon=+49 (6831) 77165&lt;br /&gt;
|Fax= +49 (6831) 704302&lt;br /&gt;
|Öffnungszeiten= Mo+Di Do+Fr 8:00-12:00 Uhr / 14:00-17:00 Uhr&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Handel mit elektronischen Bauteilen und Komponenten auch Privatverkauf.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Saarbrücken ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=ESS Elektronik Service Skowronek&lt;br /&gt;
|Straße=Peter-Zimmer-Str. 13&lt;br /&gt;
|PLZ=66123  &lt;br /&gt;
|Ort=Saarbrücken&lt;br /&gt;
|Telefon=+49 (681) 816414&lt;br /&gt;
|Fax= +49 (681) 816992&lt;br /&gt;
|Öffnungszeiten= Mo-Fr 8:00-12:00 Uhr / 14:00-18:00 Uhr&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Trierer Straße 16-20&lt;br /&gt;
|PLZ=66111&lt;br /&gt;
|Ort=Saarbrücken&lt;br /&gt;
|Telefon=0180 5 564445 (derzeit 14 Cent/Min. aus dem Festnetz der Dt. Telekom. Evtl. abweichende Preise für Anrufe aus den Mobilfunknetzen.)&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten= Mo.-Sa. 10.00-19.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filial-saarbruecken.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=EXP Tech GmbH&lt;br /&gt;
|Straße=Meerwiesertalweg 23&lt;br /&gt;
|PLZ=66123  &lt;br /&gt;
|Ort=Saarbrücken&lt;br /&gt;
|Telefon=+49 (681) 95819340 &lt;br /&gt;
|Fax= +49 (681) 954176-19 &lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink= http://www.exp-tech.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= Online Verkauf, Abholung vor Ort möglich&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Sachsen==&lt;br /&gt;
===Chemnitz===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mükra electronic shop GmbH&lt;br /&gt;
|Straße=Reichsstraße 58&lt;br /&gt;
|PLZ=09113&lt;br /&gt;
|Ort=Chemnitz&lt;br /&gt;
|Telefon=0371/365736&lt;br /&gt;
|Fax=0371/365736&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 10.00 Uhr - 18.00 Uhr&amp;lt;br&amp;gt;Sa. 10.00 Uhr - 13.00 Uhr&lt;br /&gt;
|Weblink=http://www.muekra.com/filiale_chemnitz.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=gut sortiert aber keine SMD BE | wirkt manchmal recht unfreundlich und demotiviert&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=köhler-elektronik&amp;lt;br&amp;gt;Firma Michael Köhler&lt;br /&gt;
|Straße=Erfenschlager Straße 31&lt;br /&gt;
|PLZ=09125&lt;br /&gt;
|Ort=Chemnitz&lt;br /&gt;
|Telefon=(03 71) 51 91 03&lt;br /&gt;
|Fax=(03 71) 51 91 04&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. von 9 - 18 Uhr&lt;br /&gt;
|Weblink=http://www.koehler-elektronik.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Dresden===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Friedrich-List-Platz 2&amp;lt;br&amp;gt;gegenüber Hauptbahnhof&lt;br /&gt;
|PLZ=01069&lt;br /&gt;
|Ort=Dresden &lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-dresden.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Sullus&lt;br /&gt;
|Straße=Tharandter Str. 67&lt;br /&gt;
|PLZ=01187&lt;br /&gt;
|Ort=Dresden &lt;br /&gt;
|Telefon=0351 4112100&lt;br /&gt;
|Fax=0351 4112146&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 10.00-18.30 Uhr, &amp;lt;br&amp;gt;Sa. 09.00-12.00 Uhr&lt;br /&gt;
|Weblink=http://www.sullus.de/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronic-Shop Meissen&amp;lt;br&amp;gt;Rainer Pötzsch&lt;br /&gt;
|Straße=Neugasse 34&lt;br /&gt;
|PLZ=01662&lt;br /&gt;
|Ort=Meissen&lt;br /&gt;
|Telefon= +49 3521 452301&lt;br /&gt;
|Fax= +49 3521 452399&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. von 9 - 19 Uhr &amp;lt;br&amp;gt; Sa. von 9 - 32 Uhr&lt;br /&gt;
|Weblink=http://www.electronic-poetzsch.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=ANVILEX GmbH&lt;br /&gt;
|Straße=Enderstrasse 94&amp;lt;br&amp;gt;Gebäude C, 1.OG&lt;br /&gt;
|PLZ=01277&lt;br /&gt;
|Ort=Dresden&lt;br /&gt;
|Telefon=+49 351 40945521&lt;br /&gt;
|Fax=+49 351 40945524&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=http://shop.anvilex.de&lt;br /&gt;
|Email=information@anvilex.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Leipzig===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Neumarkt 20&lt;br /&gt;
|PLZ=04109&lt;br /&gt;
|Ort=Leipzig &lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.de/de/filialen/filiale-leipzig.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=ELMICRO Computer GmbH &amp;amp; Co. KG &lt;br /&gt;
|Straße=Hohe Str. 9-13&lt;br /&gt;
|PLZ=04107&lt;br /&gt;
|Ort=Leipzig &lt;br /&gt;
|Telefon=+49-(0)341-9104810&lt;br /&gt;
|Fax=+49-(0)341-9104818&lt;br /&gt;
|Öffnungszeiten=Mo.-Sa.: 09.00-17.00 Uhr&lt;br /&gt;
|Weblink=http://elmicro.com/de/ela-leipzig.html&lt;br /&gt;
|Email=leipzig|at|elmicro.com&lt;br /&gt;
|Bemerkung=Besucher werden gebeten, sich kurzfristig telefonisch anzumelden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Zwickau===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronik Neumerkel GmbH&lt;br /&gt;
|Straße=Kolpingstraße 20&lt;br /&gt;
|PLZ=08058&lt;br /&gt;
|Ort=Zwickau&lt;br /&gt;
|Telefon=+ 49 (0)375-589920&lt;br /&gt;
|Fax=+ 49 (0)375-5899222&lt;br /&gt;
|Öffnungszeiten=Mo. - Fr. 9:00 - 18:00 Uhr, Sa. 9:00 - 12:30 Uhr&lt;br /&gt;
|Weblink=http://www.neumerkel.de&lt;br /&gt;
|Email=info@neumerkel.de&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Sachsen-Anhalt==&lt;br /&gt;
===Magdeburg===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=mittrenga electronic&lt;br /&gt;
|Straße=Maxim-Gorki-Str. 34&lt;br /&gt;
|PLZ=39108&lt;br /&gt;
|Ort=Magdeburg&lt;br /&gt;
|Telefon=0391/7333500&lt;br /&gt;
|Fax=0391/7346538&lt;br /&gt;
|Öffnungszeiten= Dauerhaft geschlossen &lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Keine Microcontroller&lt;br /&gt;
}}&lt;br /&gt;
Habe heute versucht den Shop persönlich zu erreichen.&lt;br /&gt;
Leider war der Shop nicht mehr da. &lt;br /&gt;
Die Telefonnummer ist auch nicht erreichbar.&lt;br /&gt;
Der Inhaber ist verstorben. Leider.&lt;br /&gt;
&lt;br /&gt;
===Halle (Saale)===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Funkhaus Alter Markt&lt;br /&gt;
|Straße=Alter Markt 6&lt;br /&gt;
|PLZ=06108&lt;br /&gt;
|Ort=Halle&lt;br /&gt;
|Telefon=0345/2831651&lt;br /&gt;
|Fax=0345/2831651&lt;br /&gt;
|Öffnungszeiten=Mo bis Fr&lt;br /&gt;
|Weblink=http://www.fernsehklinik-halle.de/&lt;br /&gt;
|Email=Service@Fernsehklinik-Halle.de&lt;br /&gt;
|Bemerkung=elektronische Bauteile aller Art gut sortiert auf Lager. Nach Möglichkeit vorher telefonisch nachfragen(!), damit das Teil aus dem Lager geholt werden kann, insgesamt vergleichsweise teuer, ansonsten recht unkompliziert&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Westfalia&lt;br /&gt;
|Straße=Grenzstraße 35&lt;br /&gt;
|PLZ=06112&lt;br /&gt;
|Ort=Halle&lt;br /&gt;
|Telefon=0345 560 62 31&lt;br /&gt;
|Fax=0345 560 62 32 &lt;br /&gt;
|Öffnungszeiten= &lt;br /&gt;
Montag - Mittwoch 08.00 - 18.30&lt;br /&gt;
&lt;br /&gt;
Donnerstag        08.00 - 19.00&lt;br /&gt;
&lt;br /&gt;
Freitag           08.00 - 18.30&lt;br /&gt;
&lt;br /&gt;
Samstag           08.30 - 13.30 &lt;br /&gt;
&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Elektronikmäßig relativ klein sortiert, keine einzelnen Bauelemente, dafür Restposten-/Sortimentebeutel mit jeweils verschiedenen Widerständen, Kondensatoren, Transistoren, LEDs etc. &lt;br /&gt;
Ferner Platinen, vereinzelt Trafos, jede Menge Bausätze, Lötzubehör, Lautsprecher, Stecker, Buchsen und Kabel aller Art, Gehäuse&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleswig Holstein==&lt;br /&gt;
===Kiel===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronik Schmidt Inh. Karl Heinz Parting&lt;br /&gt;
|Straße=Adelheidstr. 28&lt;br /&gt;
|PLZ=24103&lt;br /&gt;
|Ort=Kiel&lt;br /&gt;
|Telefon=0431 94682&lt;br /&gt;
|Fax=0431 92574&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= viele historische Bauteile verfügbar, Röhren, hat leider Ende 2015 den Laden geschlossen!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Lübeck===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Lenzner Jürgen Elektronik GmbH - seit 2016 geschlossen !&lt;br /&gt;
|Straße=Krähenstraße 19&lt;br /&gt;
|PLZ=23552&lt;br /&gt;
|Ort=Lübeck&lt;br /&gt;
|Telefon=0451 77336&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= keine uC, teils historische Bauteile verfügbar, Röhren, LEDs überteuert&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Schwentinental===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Mergenthalerstr. 22&lt;br /&gt;
|PLZ=24223&lt;br /&gt;
|Ort=Schwentinental, OT Raisdorf&lt;br /&gt;
|Telefon=0180 5 564445 &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 10.00-19.00 Uhr, Sa. 10.00-18.00 Uhr&lt;br /&gt;
|Weblink=http://www.conrad.de&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=bei Kiel&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Thüringen==&lt;br /&gt;
&lt;br /&gt;
===Erfurt===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Thiemann-Elektronik&lt;br /&gt;
|Straße=Schmidtstedter Str. 12&lt;br /&gt;
|PLZ=99084&lt;br /&gt;
|Ort=Erfurt&lt;br /&gt;
|Telefon=0361/21697687&lt;br /&gt;
|Fax=0361/21697688&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 09.30-13.00 und 14.00-18.30, Sa 10.00-13.00&lt;br /&gt;
|Weblink=http://www.thiemann-elektronik.de&lt;br /&gt;
|Email=info@thiemann-elektronik.de&lt;br /&gt;
|Bemerkung=Nähe Hauptbahnhof &amp;lt;!-- http://www.openstreetmap.org/?z=18&amp;amp;mlat=50.9742&amp;amp;mlon=11.03752#map=17/50.97420/11.03750 --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Jena===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Stefan Schmutzer VAT Elektronik&lt;br /&gt;
|Straße=Bachstraße 10&lt;br /&gt;
|PLZ=07743&lt;br /&gt;
|Ort=Jena&lt;br /&gt;
|Telefon= (03641)447184&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten= Mo-Fr. bis 18:00Uhr. Sa zu&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= reichlich teuer. Für einzelne Kleinteile jedoch definitiv zu empfehlen, wenn man nicht gleich bestellen will&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Gera===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname= Neumerkel Elektronik&lt;br /&gt;
|Straße=Karl-Schurz-Straße 12&lt;br /&gt;
|PLZ=07545&lt;br /&gt;
|Ort=Gera&lt;br /&gt;
|Telefon= +49 (0) 3 65 - 82 46 90&lt;br /&gt;
|Fax= 	+49 (0) 3 65 - 82 46 922&lt;br /&gt;
|Öffnungszeiten= Mo-Fr. 9.00 bis 18:00Uhr. Sa 9.00 bis 12.00 &lt;br /&gt;
|Weblink= http://www.neumerkel.de/gera.htm&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Österreich=&lt;br /&gt;
==Linz==&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Aigner Elektronik&lt;br /&gt;
|Straße=Dinghoferstr. 63&lt;br /&gt;
|PLZ=A-4020 &lt;br /&gt;
|Ort=Linz&lt;br /&gt;
|Telefon=+43 732 669691-0 &lt;br /&gt;
|Fax=+43 732 669691-15&lt;br /&gt;
|Öffnungszeiten=Mo. bis Fr. 8:30 bis 17:00 (keine Mittagssperre), Samstag 8:30 bis 12:00&lt;br /&gt;
|Weblink=http://www.aigner.co.at/&lt;br /&gt;
|Email= &lt;br /&gt;
|Bemerkung= September 2014: Geschäft aufgelassen !!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic&lt;br /&gt;
|Straße=Kornstraße 4&lt;br /&gt;
|PLZ=A-4060 &lt;br /&gt;
|Ort=Linz / Leonding&lt;br /&gt;
|Telefon=+43 732 683040-0  &lt;br /&gt;
|Fax=+43 732 683040-13 &lt;br /&gt;
|Öffnungszeiten=Mo. bis Fr. 9:00 bis 18:30, Samstab 9:00 bis 17:00&lt;br /&gt;
|Weblink=https://www.conrad.at/de/stores/linz.html&lt;br /&gt;
|Email=mailto://filiale.linz@conrad.at&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Graz== &lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Neuhold Elektronik&lt;br /&gt;
|Straße=Griesplatz 1&lt;br /&gt;
|PLZ=A-8020 &lt;br /&gt;
|Ort=Graz&lt;br /&gt;
|Telefon=+43 (0) 316 711245   &lt;br /&gt;
|Fax=+43 (0) 316 717419&lt;br /&gt;
|Öffnungszeiten=Montag bis Freitag von 9.00 - 18.00 Uhr&amp;lt;br&amp;gt;Samstag 9.00-12.30 Uhr&lt;br /&gt;
|Weblink=http://www.neuhold-elektronik.at/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=Großes Sortiment mit auch sehr ausgefallenen Artikeln. &amp;lt;br&amp;gt; Führt eine breite Produktpalette. &amp;lt;br&amp;gt; Durchweg sehr günstige Preise, jedoch manchmal bei Standardbauteilen (Mikrocontrollern z.B. AVRs) teurer als die Konkurrenz. &amp;lt;br&amp;gt; Vergleichbar mit Pollin.  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=L-Tronik Austria&lt;br /&gt;
|Straße=Karlauerstraße 5&lt;br /&gt;
|PLZ=A-8020 &lt;br /&gt;
|Ort=Graz&lt;br /&gt;
|Telefon=Tel: +43 (0) 316 904 672            &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Montag bis Freitag von 9.00 - 17.00 Uhr &amp;lt;br&amp;gt;Samstag 9.00-12.00 Uhr&lt;br /&gt;
|Weblink=http://www.l-tronik.com/index.php&lt;br /&gt;
|Email=info@lta.at&lt;br /&gt;
|Bemerkung=Riesiges Sortiment an Halbleitern (Auch SMD). Solartechnik, Sicherheitstechnik, Haustechnik u.s.w..&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Weblinger Gürtel 25&lt;br /&gt;
|PLZ=A-8054&lt;br /&gt;
|Ort=Graz&lt;br /&gt;
|Telefon=Tel: +43 (0) 50 - 20 40 73 00         &lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Montag bis Freitag von 9.00 - 19.30 Uhr &amp;lt;br&amp;gt;Samstag 9.00 - 18.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.at/de/stores/graz.html&lt;br /&gt;
|Email=filiale.graz@conrad.at&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Salzburg==&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Alpenstraße 95 - 97&lt;br /&gt;
|PLZ=5020  &lt;br /&gt;
|Ort=Salzburg&lt;br /&gt;
|Telefon=050 - 20 40 81 00&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.30-18.30 Uhr&amp;lt;br&amp;gt;Sa. 9.30-17.30 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.at/de/stores/salzburg.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Wien==&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Semaf Electronics&lt;br /&gt;
|Straße=Alserbachstraße 10&lt;br /&gt;
|PLZ=1090&lt;br /&gt;
|Ort=Wien&lt;br /&gt;
|Telefon=+43 1 276 4008&lt;br /&gt;
|Fax=+43 1 276 4008&lt;br /&gt;
|Öffnungszeiten=Mo.-Do. 10.00-18.00 Uhr&amp;lt;br&amp;gt;Fr. 10.00-12.30 und 14.30-18.00 Uhr&amp;lt;br&amp;gt;Sa. 10.00-12.00 Uhr&lt;br /&gt;
|Weblink=http://electronics.semaf.at&lt;br /&gt;
|Email=electronics [at] semaf.at&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Technotronic&lt;br /&gt;
|Straße=Laxenburger Straße 74&lt;br /&gt;
|PLZ=1100&lt;br /&gt;
|Ort=Wien&lt;br /&gt;
|Telefon=+43 1 6029525&lt;br /&gt;
|Fax=+43 1 6064794&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00-12.30 und 13.30-18.00 Uhr&lt;br /&gt;
|Weblink=&lt;br /&gt;
|Email=technotronic1100@gmail.com&lt;br /&gt;
|Bemerkung=alle anderen Filialen (Zieglergasse, Floridsdorfer Hauptstraße) mittlerweile geschlossen&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Hütteldorfer Straße 81b (Meiselmarkt U3 Johnstrasse)&lt;br /&gt;
|PLZ=1150 &lt;br /&gt;
|Ort=Wien&lt;br /&gt;
|Telefon=050 - 20 40 75 00&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00-19.00 Uhr&amp;lt;br/&amp;gt;Sa. 9.00-18.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.at/de/stores/wien-meiselmarkt.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Gewerbeparkstraße 12 (Gewerbepark Stadlau)&lt;br /&gt;
|PLZ=1220 &lt;br /&gt;
|Ort=Wien&lt;br /&gt;
|Telefon=050 - 20 40 72 00&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.00-18.30 Uhr&amp;lt;br/&amp;gt;Sa. 9.00-18.00 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.at/de/stores/wien-stadlau.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad&lt;br /&gt;
|Straße=Nordring 2&lt;br /&gt;
|PLZ=2334 &lt;br /&gt;
|Ort=Vösendorf/Süd&lt;br /&gt;
|Telefon=050 - 20 40 71 00&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9.30-18.30 Uhr&amp;lt;br/&amp;gt;Sa. 9.00-17.30 Uhr&lt;br /&gt;
|Weblink=https://www.conrad.at/de/stores/scs-voesendorf.html&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Schweiz=&lt;br /&gt;
----&lt;br /&gt;
== Basel-Landschaft (BL) ==&lt;br /&gt;
=== 4450 Sissach ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Grieder Elektronik Bauteile AG&lt;br /&gt;
|Straße=Reuslistrasse 62&lt;br /&gt;
|PLZ=4450&lt;br /&gt;
|Ort=Sissach&lt;br /&gt;
|Telefon=061 976 95 95&lt;br /&gt;
|Fax=061 976 95 90&lt;br /&gt;
|Öffnungszeiten=Mo-Do 800-1200, 1300-1600 und Fr 800-1200, 1300-1500.&lt;br /&gt;
|Weblink=http://shop.griederbauteile.ch/&lt;br /&gt;
|Email=info@griederbauteile.ch&lt;br /&gt;
|Bemerkung=Mindestbestellwert CHF 20. Vorbestellte Waren können abgeholt werden.  Der &amp;quot;Laden&amp;quot; befindet sich 10 Minuten zu Fuss vom Bahnhof Sissach.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
== Bern (BE) ==&lt;br /&gt;
=== 2560 Nidau ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Redacom AG / thinkembedded.ch Web Shop&lt;br /&gt;
|Straße=Hauptstrasse 96&lt;br /&gt;
|PLZ=2560&lt;br /&gt;
|Ort=Nidau&lt;br /&gt;
|Telefon=+41 32 332 99 55&lt;br /&gt;
|Fax=+41 32 332 99 59&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink =http://redacom.ch/ Shop: http://thinkembedded.ch/ &lt;br /&gt;
|Email=order@redacom.ch&lt;br /&gt;
|Bemerkung=Bestellungen im Onlineshop können wahlweise versendet oder abgeholt werden. &lt;br /&gt;
&#039;&#039;&#039;Sortiment:&#039;&#039;&#039;&amp;lt;br&amp;gt;Diverse Microcontroller Boards, Debugger, Programmer und USB-Messinstrumente&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Luzern (LU) ==&lt;br /&gt;
=== Emmenbrücke ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic Schweiz&lt;br /&gt;
|Straße=Seetalstrasse 11&lt;br /&gt;
|PLZ=6020&lt;br /&gt;
|Ort=Emmenbrücke &lt;br /&gt;
|Telefon=0848/80 12 83&lt;br /&gt;
|Fax=041/267 32 14&lt;br /&gt;
|Öffnungszeiten=Mo/Di/Do 09:00-18:30, Mi/Fr 09:00-21:00, Sa 08:00-16:00 Uhr&lt;br /&gt;
|Weblink=http://www.conrad.ch/ce/de/content/filiale_emmenbruecke/&lt;br /&gt;
|Email=filiale.emmenbruecke@conrad.ch&lt;br /&gt;
|Bemerkung=5 Minuten vom Bahnhof Emmenbrücke&amp;lt;br&amp;gt;GRATIS Parkhaus &amp;amp; Parkplätze &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Solothurn (SO) ==&lt;br /&gt;
===5014 Gretzenbach===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=EFG Electronic AG&lt;br /&gt;
|Straße=Köllikerstrasse 32&lt;br /&gt;
|PLZ=5014&lt;br /&gt;
|Ort=Gretzenbach&lt;br /&gt;
|Telefon= 062 849 23 61 &lt;br /&gt;
|Fax= 062 849 23 70 &lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
Mo-Fr 08:30-11:30, 13:30-18:30, Mi geschlossen, Sa 09:00-16:00 &lt;br /&gt;
|Weblink=http://www.maxland.ch/netmax/standseiten/efg/index.html&lt;br /&gt;
|Email=efgag@yetnet.ch &lt;br /&gt;
|Bemerkung=Kabel - Messgeräte - Lautsprecher - elektronische Bauteile&lt;br /&gt;
kein Versand, nur Ladengeschäft&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Zürich (ZH) ==&lt;br /&gt;
===8004 Zürich===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Pusterla Elektronik AG&lt;br /&gt;
|Straße=Hohlstrasse 52 &lt;br /&gt;
|PLZ=8004&lt;br /&gt;
|Ort= Zürich&lt;br /&gt;
|Telefon=044 241 56 77&lt;br /&gt;
|Fax=044 242 01 04&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
Mo-Fr 09:00-18:30, Sa 09:00-16:00&lt;br /&gt;
|Weblink=http://www.pusterla.ch/&lt;br /&gt;
|Email=info@pusterla.ch&lt;br /&gt;
|Bemerkung=Absoluter &amp;quot;Kult-Laden&amp;quot; mit Tradition. Wer jemals in der Schweiz einen Lötkolben in der Hand hatte, der kennt &amp;quot;Pusti&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Sortiment ist zweigeteilt:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;hinter dem Tresen:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
gutes allgemeines Bauteilesortiment, spezielle Sachen werden bestellt.&lt;br /&gt;
&amp;lt;br&amp;gt;Man nimmt sich Zeit für Fachberatung - es wird auch schon mal ein Vergleichstyp aus der Liste gesucht und dem jungen &amp;quot;Case-Modder&amp;quot; wird mit Engelsgeduld erklärt wie man den Vorwiderstand für seine coole LED-Prozessorinnenbeleuchtung berechnet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;vor dem Tresen - Selbstbedienung:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Am Eingang nimmt man sich eine Pappschale mit Bleistift und Notizblock.&lt;br /&gt;
Artikel, Menge und Preise schreibt man selbst auf!&lt;br /&gt;
&lt;br /&gt;
Das Sortiment bietet einen Querschnitt durch die elektronische Bauteilefertigung der letzten 50 Jahre. Sehr gute Quelle für spannungsfeste Kondensatoren und hochohmige (Leistungs-)Widerstände sowie mechanischem &amp;quot;Klein-Grabbel-Kram.&amp;quot; Gute Auswahl an Gehäusen, Transformatoren (z.T. recht schräge Typen) sowie Relais und Stecker/Buchsen die die Welt wohl niemals gebraucht hat. &amp;lt;br&amp;gt; &#039;&#039;&#039;Vorsicht bei Elektrolytkondensatoren:&#039;&#039;&#039; &amp;quot;historische&amp;quot; Lagerware, besser man hat ein ESR-Meter dabei - sodenn man hat!&lt;br /&gt;
&amp;lt;br&amp;gt;Kabel jeglicher Art gibt es ab der Rolle zum Selberabschneiden - auch 10cm sind kein Problem - ausrechnen und aufschreiben machst Du ja selber.&lt;br /&gt;
&amp;lt;br&amp;gt; Präsentation der Ware im Selbsbedienungsteil:&lt;br /&gt;
&amp;lt;br&amp;gt; Bauteile offen oder ab Gurt in kleinen, liebevoll angeschriebenen Pappschachteln (noch von Vater Pusterla), grösseren Wühlschachteln, einer Wühlecke sowie hier und da einige Merkwürdigkeiten auf dem Fussboden.&lt;br /&gt;
Man stelle sich das Ladenlokal eines Joint-Ventures aus Oppermann, Pollin, dem ehem. Völkner sowie dem örtlichen Entsorgungshof vor - &#039;&#039;&#039;das&#039;&#039;&#039; ist &amp;quot;Pusti&amp;quot; und so war er schon immer!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fazit:&#039;&#039;&#039; absolut lohnenswert, auch wenn man vielleicht nicht immer das bekommt was man wollte, dafür findet man aber alles, wonach man nie gesucht hatte!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===8092 Zürich===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=&amp;quot;Bastli&amp;quot;&amp;lt;br&amp;gt;Fachverein der Departemente Informationstechnologie und Elektrotechnik und Maschinenbau und Verfahrenstechnik an der ETH Zürich.&lt;br /&gt;
|Straße=Universitätsstrasse 19&lt;br /&gt;
|PLZ=8092&lt;br /&gt;
|Ort= Zürich&lt;br /&gt;
|Telefon= n/a&lt;br /&gt;
|Fax= n/a&lt;br /&gt;
|Öffnungszeiten=Die Öffnungszeiten gelten nur während des Semesters.&lt;br /&gt;
Mo 12:15 - 13:00 Uhr&amp;lt;br&amp;gt;&lt;br /&gt;
Do 12:15 - 13:00 Uhr&amp;lt;br&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
|Weblink=http://www.bastli.ethz.ch/&lt;br /&gt;
|Email=bastli@amiv.ethz.ch&lt;br /&gt;
|Bemerkung=Studentischer &amp;quot;Bastel-Shop&amp;quot;&lt;br /&gt;
Während den Öffnungszeiten ist der Bastli-Shop im ersten Stock des UNG geöffnet.&lt;br /&gt;
Ihr könnt Bauteile, welche wir an Lager haben, kaufen und euch wird mit diversen elektronischen Problemen geholfen. &lt;br /&gt;
&lt;br /&gt;
Organisierte Sammelbestellungen bei Fa. Reichelt / Deutschland&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Standort:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bastli und Messplatz befinden sich in den Räumlichkeiten des AMIV im UNG Gebäude schräg gegenüber des CAB.&lt;br /&gt;
Es ist das gleiche Gebäude in dem auch der ehem. AMIV-Verlag respektive ehem. WBS respektive SPOD untergebracht ist.&lt;br /&gt;
&lt;br /&gt;
Das Gebäude wirkt beim ersten Kontakt wohl für jeden neuen ein bisschen abschreckend. Aber keine Scheu, wenn man durch das etwas schlecht beleuchtete Treppenhaus in den ersten Stock gelangt, wendet man sich dort gleich nach rechts. Bastli und Messplatz haben die Zimmernummern C6 und C5.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 8305 Dietlikon ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Conrad Electronic Schweiz&lt;br /&gt;
|Straße=Alte Dübendorferstrasse 17&lt;br /&gt;
|PLZ=8305&lt;br /&gt;
|Ort=Dietlikon&lt;br /&gt;
|Telefon=0848/80 12 84 (Normaltarif)&lt;br /&gt;
|Fax=044/805 35 14&lt;br /&gt;
|Öffnungszeiten=Mo-Sa 09:00-20:00 Uhr&lt;br /&gt;
|Weblink=http://www.conrad.ch/ce/de/content/filiale_dietlikon/&lt;br /&gt;
|Email=filiale.dietlikon@conrad.ch&lt;br /&gt;
|Bemerkung=5 Minuten vom Bahnhof Dietlikon&amp;lt;br&amp;gt;Parkhaus &amp;amp; Parkplätze vorhanden&lt;br /&gt;
(Stand: 2012-08-27)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 8606 Nänikon ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Distrelec Schweiz&lt;br /&gt;
|Straße=Grabenstrasse 6&lt;br /&gt;
|PLZ=8606&lt;br /&gt;
|Ort=Nänikon&lt;br /&gt;
|Telefon=044 - 944 99 11&lt;br /&gt;
|Fax=044 - 944 99 88&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 07:30-18:00 Uhr (nur Abholschalter)&lt;br /&gt;
|Weblink=https://www.distrelec.ch&lt;br /&gt;
|Email=info@distrelec.com&lt;br /&gt;
|Bemerkung=&#039;&#039;&#039;Abholschalter:&#039;&#039;&#039; (Vorbestellung unbedingt erforderlich)&lt;br /&gt;
Telefonisch oder online bestellte Ware kann nach ca. 2 Stunden abgeholt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;Es kann auch direkt vor Ort ab Katalog bestellt werden, allerdings dann Wartezeit von min. 2 Stunden&lt;br /&gt;
&amp;lt;br&amp;gt;Bezahlung: bar/EC- und Post-Card&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== St. Gallen (SG) ==&lt;br /&gt;
=== 9443 Widnau ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Asif Elektronik&lt;br /&gt;
|Straße=Schützenstrasse 35&lt;br /&gt;
|PLZ=9443&lt;br /&gt;
|Ort=Widnau&lt;br /&gt;
|Telefon=071/722 01 57 (Normaltarif)&lt;br /&gt;
|Fax=071/588 02 58&lt;br /&gt;
|Öffnungszeiten=Mo-Fr 14:00-17:00 Uhr (Information und Support)&lt;br /&gt;
|Weblink=http://www.asif-elektronik.ch&lt;br /&gt;
|Email=sales@asif-elektronik.ch&lt;br /&gt;
|Bemerkung= Sprachen: Englisch und Deutsch.&lt;br /&gt;
&amp;lt;br&amp;gt; Online Geschäft. Lieferung per Post. Abholung nur nach Vereinbarung.&lt;br /&gt;
&amp;lt;br&amp;gt;Bezahlung: Überweisung/Paypal/Kreditkarte &amp;lt;br&amp;gt;Gratis Versand ab 50 CHF.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Luxembourg =&lt;br /&gt;
=== L-1510 Luxembourg ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Schallllller Electronic S.à.r.l&lt;br /&gt;
|Straße=19, Av. de la Faïencerie&lt;br /&gt;
|PLZ=1510&lt;br /&gt;
|Ort=Luxembourg&lt;br /&gt;
|Telefon=+352-475239-1&lt;br /&gt;
|Fax=+352-471507&lt;br /&gt;
|Öffnungszeiten=Montag - Freitag: 08:30 - 12:30, 13:30 - 18:00&amp;lt;br&amp;gt;Samstag: 09:00 - 13:00&lt;br /&gt;
|Weblink=http://schaller-electronic.lu/index.php?home&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== L-6905 Niederanven ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=electronic-Shop S.àr.l. &lt;br /&gt;
|Straße=141, route de Trèves&lt;br /&gt;
|PLZ=6905&lt;br /&gt;
|Ort=Niederanven&lt;br /&gt;
|Telefon=+352 269464-1&lt;br /&gt;
|Fax=+352 269464-64&lt;br /&gt;
|Öffnungszeiten=&lt;br /&gt;
|Weblink=www.electronic-shop.lu&lt;br /&gt;
|Email=info@electronic-shop.lu&lt;br /&gt;
|Bemerkung=Online-Bestellungen, die ein paar Tage später an der Abholtheke abgeholt werden können.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Griechenland=&lt;br /&gt;
==Zentralmakedonien==&lt;br /&gt;
===Thessaloniki===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname=Elektronika Vasileiades&lt;br /&gt;
|Straße=λαγκαδα 35 (βαρδαρης)&lt;br /&gt;
|PLZ=54629&lt;br /&gt;
|Ort=Thessaloniki&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=Mo.-Fr. 9:00-17:00&amp;lt;br&amp;gt;Sa. 9:00-14:00&lt;br /&gt;
|Weblink=http://www.elektronik.gr/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Türkei =&lt;br /&gt;
== Istanbul ==&lt;br /&gt;
=== Istanbul ===&lt;br /&gt;
{{ElektronikLieferant&lt;br /&gt;
|Firmenname= Ufuk Elektronik&lt;br /&gt;
|Straße=Yemişçi Hasan Sok. 1&lt;br /&gt;
|PLZ=&lt;br /&gt;
|Ort=&lt;br /&gt;
|Telefon=&lt;br /&gt;
|Fax=&lt;br /&gt;
|Öffnungszeiten=&amp;lt;br&amp;gt;&lt;br /&gt;
|Weblink=http://www.ufukelektronik.com/&lt;br /&gt;
|Email=&lt;br /&gt;
|Bemerkung= Im Gebiet des Fähranleger Karaköy gibt es einige Läden die Bauelemente anbieten. Der aufgeführte Laden wurde nur Beispielhaft aufgeführt. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Siehe auch =&lt;br /&gt;
* [[Platinenhersteller]]&lt;br /&gt;
* [[Elektronikversender]]&lt;br /&gt;
* [[Eisenwarenversender]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Implementierung_einer_Finite_State_Machine&amp;diff=96437</id>
		<title>Implementierung einer Finite State Machine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Implementierung_einer_Finite_State_Machine&amp;diff=96437"/>
		<updated>2017-05-29T05:02:47Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Änderung 96434 von 46.161.9.20 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Statemachine#Implementierung einer objektorientiert Finite State Machine in C++]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Sinusgenerator_mit_IIR-Filter&amp;diff=96436</id>
		<title>Sinusgenerator mit IIR-Filter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Sinusgenerator_mit_IIR-Filter&amp;diff=96436"/>
		<updated>2017-05-29T05:02:11Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Änderung 96435 von 46.161.9.20 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Sinusgenerator wird heute in digitaler Technik üblicherweise nach dem &amp;lt;u&amp;gt;[[DDS]]-Verfahren&amp;lt;/u&amp;gt; aufgebaut. &amp;lt;u&amp;gt;[[Digitale_Sinusfunktion|Näherungsverfahren für den Sinus]]&amp;lt;/u&amp;gt; sind noch eine vergleichbare Alternative sowie das Glätten eines Rechtecks oder Dreieicks mit einer Kette aus IIR-Filtern. Allen gemein ist eine Vorgabe der Frequenz in Form einer äusseren Anregung.&lt;br /&gt;
&lt;br /&gt;
== Funktionsübersicht==&lt;br /&gt;
Weniger bekannt ist der Aufbau mit einem selbstschwingenden Filter, das lediglich aus den üblichen Bestandteilen Addierer, Multiplizierer und Zwischenspeicher besteht. Weder eine Sinustabelle, noch zeitraubende Iterationsschritte, wie beim &amp;lt;u&amp;gt;[[AVR-CORDIC|CORDIC]]-Verfahren&amp;lt;/u&amp;gt;, sind hierfür erforderlich. Die gleichzeitige Nutzung von Sinus und Cosinus ist ohne zusätzlichen Aufwand möglich. Im Gegensatz zur DDS muss man allerdings die Amplitude stabilisieren.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:IIR_Sinusgenerator.png|thumb|right|320px|Allgemeiner IIR-Sinusgenerator nach &amp;lt;ref name=&amp;quot;stream&amp;quot;/&amp;gt; Seite 325]]&lt;br /&gt;
Links vier Multiplizierer mit den Konstanten a...d, danach zwei Addierer und zwei Zwischenspeicher für eine Sampletaktperiode. Die beiden Ausgänge y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, im Buch &#039;&#039;Zustandsvariable&#039;&#039; genannt, haben je nach Oszillatortyp unterschiedliche Phasenverschiebungen. Für Sin/Cos-Oszillatoren muss sie 90 Grad betragen.&lt;br /&gt;
&lt;br /&gt;
In der folgenden Tabelle sind die vier Konstanten a...d rechts mit der Hilfsvariablen k aufgelistet. Sie ergibt sich gemäß der vorletzten Spalte aus dem Winkel θ (kleines Theta), um den die Sinusschwingung pro Sampletakt weiterrückt.&lt;br /&gt;
&lt;br /&gt;
Aus der gewünschten Sinusfrequenz ƒ&amp;lt;sub&amp;gt;osz&amp;lt;/sub&amp;gt; und der Samplefrequenz ƒ&amp;lt;sub&amp;gt;sample&amp;lt;/sub&amp;gt; folgt&lt;br /&gt;
:&amp;lt;math&amp;gt;\theta = \frac{f_\text{osz}}{f_\text{sample}}\cdot 360^\circ&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die beiden &#039;&#039;Barkhausen-Bedingungen&#039;&#039; für Oszillatoren (Schleifenverstärkung = 1 und Phasendrehung = n*360°) lauten hier &lt;br /&gt;
*ad - bc = 1 &lt;br /&gt;
*| a + d | &amp;lt; 2&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Eigenschaften der Oszillatortypen, aus&amp;lt;ref name=&amp;quot;stream&amp;quot;/&amp;gt; Seite 329&lt;br /&gt;
|- &lt;br /&gt;
!Oszillatortyp||Multiplikationen||Gleiche Ampl.||Sin/Cos||k =||Matrix [a/b/c/d]&lt;br /&gt;
|-&lt;br /&gt;
!||||(b = –c)||(a = d)||||&lt;br /&gt;
|-&lt;br /&gt;
|biquad||1||ja||nein||2·cos(θ)||[k / -1 / 1 / 0]&lt;br /&gt;
|-&lt;br /&gt;
|Digital Waveguide&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;||1||nein||ja||cos(θ)||[k / k-1 / k+1 / k]&lt;br /&gt;
|-&lt;br /&gt;
|Equi-ampl. staggered update||2||ja||nein||2·sin(θ/2)||[1-k² / k / -k / 1]&lt;br /&gt;
|-&lt;br /&gt;
|Quadrature staggered update||2||nein||ja||cos(θ)||[k / 1-k² / -1 / k]&lt;br /&gt;
|-&lt;br /&gt;
|Coupled standard quadrature||4||ja||ja||sin(θ)||[√(1-k²) / k / -k / √(1-k²)]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Der Typ &amp;quot;Digital Waveguide&amp;quot; ist patentiert, &amp;lt;u&amp;gt;[http://www.google.com/patents/US5701393 US-Pat.#5701393]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Amplitudenregelung ==&lt;br /&gt;
Um ein Aufschaukeln oder Abklingen der Amplitude zu verhindern, kann man:&lt;br /&gt;
* Nach einigen Schwingungen den Anfangszustand wieder herstellen.&amp;lt;ref&amp;gt;&#039;&#039;Digital Filters and Signal Processing&#039;&#039;, S. 465-469 &amp;quot;Digital Oscillators and Synthesizers&amp;quot;, ISBN 079239559X&amp;lt;/ref&amp;gt; Das führt zu erhöhtem Jitter und funktioniert nur für ganzzahlige Bruchteile der Samplefrequenz.&lt;br /&gt;
* Die Amplitude mittels &amp;quot;Pythagoras&amp;quot; berechnen, damit y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; mit einem Korrekturfaktor multiplizieren. Es reicht aus&amp;lt;ref name=&amp;quot;stream&amp;quot;&amp;gt;&#039;&#039;Streamlining Digital Signal Processing&#039;&#039;, Kapitel 33, S. 319-336 &amp;quot;Recursive Discrete-Time Sinusoidal Oscillators&amp;quot; (Übersicht über unterschiedliche Oszillatorschaltungen), ISBN 9781118278383&amp;lt;/ref&amp;gt;, die Summe der Amplitudenquadrate zu berechnen, die Wurzelberechnung kann entfallen.&lt;br /&gt;
* Die Amplitude mittels einer einfachen AGC-Regelung permanent korrigieren.&lt;br /&gt;
&lt;br /&gt;
== Vergleich mit anderen Verfahren ==&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
Das Filter muss mit einer genügend grossen Anzahl von Zwischenpunkten berechnet werden, wenn es korrekt und genügend genau schwingen soll. Das Verfahren ist daher für technische Anwendungen meist nicht nutzbringend, da sich speziell in Hardware mit unwesentlich mehr Aufwand genauere Sinusdarstellungen mit erheblich höherer Grenzfrequenz - oder umgekehrt ähnlich gute Ergenisse mit wesentlich weniger Aufwand erzielen lassen und allesamt nicht unter dem &amp;quot;Amplitudenproblem&amp;quot; leiden.&lt;br /&gt;
&lt;br /&gt;
Konkret bedarf es für einen Sinus mit &amp;lt;6% Abweichung lediglich der parabolischen Annäherung mittels x*(1-x) ohne jegliche Interpolation. Bei Nutzung einer Sinustabelle von 8x2 Werten für Sin/Cos und gegenseitiger Steigung für Interpolation lassen sich mit nachgeschaltetem IIR-Filter Frequenzen bis direkt an Nyquist/2 erreichen, die bereits auf 1% genau berechenbar sind. Für platzsparende Applikationen ist die Nutzung eines mit mehrfachen IIR-Filtern gerundeten Dreiecks empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
Eingesetzt werden kann das Filter immer dann, wenn die Genauigkeit der sinuswelle, speziell der Amplitude unerheblich ist und niedrige Frequenzen, sowie geringe Frequenzstabilität benötigt werden, wie bei der Erzeugung von simplen Audiosignalen. Auch dann, wenn viele Kanäle zu bedienen sind und der Zugriff auf Sinustabellen und Mehrfachfilter aufgrund der benötigten Speicher ineffektiv wird. Bei FPGAs und MCUs z.B. könnte zwar der Zugriff auf die Sinustabelle noch kanalweise alternierend erfolgen - die Glättung mit Mehrfach IIR-Filtern erfordert jedoch für jeden kanal mehrere Wertespeicher entsprechender Auflösung.&lt;br /&gt;
&lt;br /&gt;
== Einsatzgebiete ==&lt;br /&gt;
&lt;br /&gt;
=== Musik ===&lt;br /&gt;
Optimal ist das Verfahren dann, wenn auf eine exakte und schnelle Amplitudenkorrektur verzichtet werden- und eine simple Regelung verwendet kann und sich die damit ergebende, natürliche Rückwirkung des Regelverhältens der Amplitudenkorrektur auf die Frequenz auch noch positiv auswirkt. Durch eine geschickte Amplitudenregelung, welche die frequenzbestimmenden Parameter die Gleichung geeignet dynamisch beeinflusst, wird die Welle sozusagen minimal beschleunigt oder gebremst, was einer geringen Frequenzmodulation gleichkommt. Auf diese Weise erzeugte Audiosignale sind &amp;quot;natürlicher&amp;quot; und musikalisch &amp;quot;lebendiger&amp;quot;, insbesondere bei der Mischung mit anderen Signalen änhlicher Grundfrequenz, da die unschönen periodischen Interfrenzen unterbleiben, weil die Regelung zu einer langsamen und vor allem unkorrelierten Frequenzmodulation führt.&lt;br /&gt;
&lt;br /&gt;
=== Technik ===&lt;br /&gt;
Das Verfahren des selbschwingenden Oszillators lässt sich dahingehend ausbauen, dass die abstrakten frequenzbestimmenden Parameter in die konkreten Werte für Dämpfung und Masse - sowie zustandsstimmenden Werte für Sinus/Cosinus-Werte in die Aspekte Geschwindigkeit und Weg konkretisiert werden, von denen sich wiederum die Beschleunigung ableiten lässt. Damit können sowohl externe Anfangsbedingungen wie Anfangsgeschwindigkeit und Anfangswert, als auch eine Beschleunigung zugeführt werden, womit eine Reihe von klassischen Feder-Masse-Dämpgungssystemen berechenbar wird. Durch Zusammenschaltung werden komplexe Gefüge in ihrem Verhalten simulier- und berechenbar, so bilden sich z.B. Oberschwingungen auf Wellen und Getrieben und deren Interaktion mit elektronischen Regelungen perfekt ab.&lt;br /&gt;
&lt;br /&gt;
== Thema im Forum ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/243984 iir Filter als Sinusgenerator]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/265393 Sinuserzeugung in VHDL]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/187913 FPGA Größe ausreichend für komplexen FM Synthesizer]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
3.   &#039;&#039;Digitale Signalverarbeitung: Bausteine, Systeme, Anwendungen&#039;&#039;, S. 51-52 &amp;quot;Einfacher Sinus-Cosinus-Generator&amp;quot;, ISBN 9783905681420&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
# [http://www.claysturner.com/dsp/2nd_OSC_paper.pdf Das Kapitel aus 1.] als PDF auf der [http://www.claysturner.com/ Webseite des Autors] Clay Turner (IEEE Signal Processing Magazine, Mai 2003 S.103-111)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LPC-Tutorial&amp;diff=95576</id>
		<title>LPC-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LPC-Tutorial&amp;diff=95576"/>
		<updated>2017-03-09T20:01:32Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Tutorial erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newGeneration&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll den Einstieg in die Programmierung der [[LPC1xxx|LPC]]-Mikrocontroller der Firma NXP mit dem [[ARM_GCC|arm-none-eabi-gcc]]-Compiler erleichtern.&lt;br /&gt;
&lt;br /&gt;
Vorausgesetzt sind Grundkenntnisse der Programmiersprache [[C]]. Wer mit dieser Programmiersprache noch keine Erfahrungen hat, bzw. sie nicht sicher beherrscht, kann sich diese auch online erarbeiten, siehe dazu die [[C#C-Tutorials/Einführungen|Liste der C-Tutorials]]. Kenntnisse aus dem PC-Bereich reichen aus, man muss noch keine Mikrocontroller programmiert haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&#039;&#039;Das Tutorial befindet sich noch im Aufbau&#039;&#039;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
=== Ziel ===&lt;br /&gt;
Dieses Tutorial soll als erstes einmal dem Leser helfen, ein eigenes Grundgerüst zu bauen, auf das dann später aufgebaut werden kann. Weiterhin soll auf Libraries verzichtet werden, die die Hardware-Ansteuerung verschleiern, um das Maximale Verständnis des verwendeten Chips zu bekommen. Eine solche Library wäre zum Beispiel [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-mcus/software-tools/lpcopen-libraries-and-examples:LPC-OPEN-LIBRARIES LPCOpen].&lt;br /&gt;
&lt;br /&gt;
Ferner soll das gesamte Projekt als Makefile-Projekt angelegt werden, um maximale Portabilität zu gewährleisten. Es steht natürlich jedem frei, seine bevorzugte IDE zu verwenden. An diesem Punkt sollte LPCXpresso erwähnt werden, eine auf Eclipse basierende IDE, die von NXP speziell an die LPC-Controller angepasst wurde. Vorteil hier ist das stark vereinfachte Debuggen, da zum Beispiel die gesamten Peripherie-Einheiten mit Erklärungen hinterlegt sind.&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
==== Grundgerüst ====&lt;br /&gt;
In diesem Kapitel soll das Grundlegende Gerüst erstellt werden, damit der Chip C-Standard-Konform programmiert werden kann. Damit ist gemeint: es kann ganz normal mit der Funktion main() begonnen werden. &lt;br /&gt;
&lt;br /&gt;
Dazu braucht man im wesentlichen zwei Dateien:&lt;br /&gt;
* das Linker-Skript&lt;br /&gt;
* den Startup-Code&lt;br /&gt;
Diese werden nun Schritt für Schritt erstellt und erklärt. &lt;br /&gt;
&lt;br /&gt;
Am Ende dieses Artikels gibt es auch noch ein kleines Testprogramm.&lt;br /&gt;
&lt;br /&gt;
==== Peripherie ====&lt;br /&gt;
Die Peripherie-Einheiten werden in den folgenden Artikeln erklärt:&lt;br /&gt;
* [[LPC-Tutorial/SCT-PWM]]&lt;br /&gt;
* [[LPC-Tutorial/Timer]]&lt;br /&gt;
* [[LPC-Tutorial/Watchdog]]&lt;br /&gt;
* [[LPC-Tutorial/USART]]&lt;br /&gt;
* [[LPC-Tutorial/I2C]]&lt;br /&gt;
* [[LPC-Tutorial/ADC]]&lt;br /&gt;
&amp;lt;small&amp;gt;&#039;&#039;Die Artikel (und weitere) sollten nach und nach folgen&#039;&#039;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Warum LPC-Mikrocontroller ==&lt;br /&gt;
Die LPC-Serie basiert auf lizensierten Kernen von [[ARM]], diese haben allgemein einige Vorteile:&lt;br /&gt;
* Der 32bit ARM-Cortex-Architektur mit entsprechender Rechenleistung&lt;br /&gt;
* Höherer Maximaltakt&lt;br /&gt;
* optionale [[MPU]] und [[FPU]]&lt;br /&gt;
* neuere Fertigung bedeuted energieeffizienter&lt;br /&gt;
Speziell die Mikrocontroller von NXP haben mehrere Vorteile:&lt;br /&gt;
* mehr und stromsparendere Sleep-Modes&lt;br /&gt;
* Einfach zu benutzende Hardwaremodule&lt;br /&gt;
* Mächtige Hardware (z.B. State Configurable Timer)&lt;br /&gt;
* Gute Dokumentation (für den Programmierer unabdingbar)&lt;br /&gt;
* als einzige ARMs auch im DIP-Gehäuse erhältlich&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
Als erstes benötigt man den Chip, den es zu programmieren gilt. Entweder man hat schon einen bestimmten, dann kann es direkt weitergehen, oder man muss sich eben noch einen bestellen. Auswahlhilfe gibt hier der Artikel [[LPC1xxx]] im Forum und der Product-Selector auf der [http://www.nxp.com/webapp/parametricSelector.sp?#/&amp;amp;c=c731_c380_c732&amp;amp;page=1 NXP-Homepage].&lt;br /&gt;
&lt;br /&gt;
Dieses Tutorial bezieht sich nur auf die LPC-Mikrocontroller mit Cortex-M-Kern, nicht auf die älteren LPC2000-/LPC3000-Serien mit älteren ARM-Kernen. Auf diese lässt sich das Tutorial möglicherweise übertragen, jedoch ist es nicht garantiert.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel versucht möglichst unabhängig von einem speziellen Prozessor zu sein, allerdings wurden die gesamten Beispiele auf einem LPC54102(J512BD64) getestet. Hardware-Abhängigkeiten werden in Kommentaren (fast immer ;-) ) erwähnt.&lt;br /&gt;
&lt;br /&gt;
=== Chip-Dokumentation ===&lt;br /&gt;
Als erstes braucht man zu seinem Chip eine Dokumentation, denn ohne die wird das Programmieren seeehr schwer. Deswegen sollte man sich diese möglichst schnell zugreifbar abspeichern.&lt;br /&gt;
&lt;br /&gt;
Die benötigten Dateien sind&lt;br /&gt;
* Das Datenblatt mitsamt Pinkonfiguration&lt;br /&gt;
* Das Errata-Sheet mit Hardwarefehlern&lt;br /&gt;
* Das User-Manual mit ausführlichen Erklärungen zum Nutzen der Hardware&lt;br /&gt;
&lt;br /&gt;
Alle diese Dokumente sind auf der [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-mcus:LPC-ARM-CORTEX-M-MCUS NXP]-Homepage unter &lt;br /&gt;
:&#039;&#039;Products -&amp;gt; LPC-Serie -&amp;gt; Produktreihe -&amp;gt; Documentation&#039;&#039; &lt;br /&gt;
zu finden, einfach die aktuellsten Dokumente herunterladen und &amp;quot;in Griffnähe&amp;quot; abspeichern.&lt;br /&gt;
&lt;br /&gt;
=== Toolchain ===&lt;br /&gt;
[[Bild:c-flow.svg|right|thumb|260px|Schritte der Kompilierung]]&lt;br /&gt;
Unter Toolchain versteht man die Sammlung von Programmen, die zu einem Compiler gehören, darunter fallen&lt;br /&gt;
* der Compiler selbst&lt;br /&gt;
* der Linker&lt;br /&gt;
* Assembler&lt;br /&gt;
* Debugger&lt;br /&gt;
* C-Standard-Library&lt;br /&gt;
* Utility-Programme&lt;br /&gt;
Es gibt Toolchains von verschiedenen Herstellern, kommerziell wie auch frei, zum Beispiel von IAR, Keil oder dem GNU-Projekt. Dieses Tutorial zielt auf den GCC, die &#039;&#039;&#039;G&#039;&#039;&#039;NU &#039;&#039;&#039;C&#039;&#039;&#039;ompiler &#039;&#039;&#039;C&#039;&#039;&#039;ollection ab, sollte aber auch auf die anderen Compiler übertragbar sein.&lt;br /&gt;
&lt;br /&gt;
Da die LPC Mikrocontroller alle auf der [[ARM|ARM-Architektur]] basieren bietet sich zum Programmieren auch der offizielle (freie und kostenlose) [https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads GNU ARM Embedded Toolchain] an, die direkt von ARM gepflegt wird. &lt;br /&gt;
&lt;br /&gt;
Nach dem Herunterladen und Installieren einer (GCC-)Toolchain sollte man kurz einen Minimaltest durchführen, nämlich in der Kommandozeile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;arm-none-eabi-gcc --version &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf diesen Befehl hin sollte die Versions-Informationen ausgegeben werden. Wenn eine Fehler kommt stimmen wahrscheinlich die Pfade nicht und müssen angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Grundgerüst erstellen ==&lt;br /&gt;
Nun können wir mit der Programmierung loslegen.&lt;br /&gt;
&lt;br /&gt;
Wie oben schon angesprochen brauchen wir zum &amp;quot;normalen&amp;quot; Programmieren mit der Funktion main() als Einsprungspunkt (mindestens) zwei Dateien, den Startup-Code und das Linkerskript. Diese werden nun erstellt.&lt;br /&gt;
&lt;br /&gt;
=== Linker-Skript ===&lt;br /&gt;
An dieser Stelle sei erst einmal auf die Online-Dokumentation dazu verwiesen: [http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html Using LD, the GNU linker - Linker Scripts].&lt;br /&gt;
&lt;br /&gt;
Starten wir erst einmal mit dem Grundgerüst:&lt;br /&gt;
Dazu legt man eine Datei an, der Name und die Endung ist streng genommen egal, aber es empfiehlt sich ein aussagekräftiger Name (etwa die Bezeichnung des verwendeten Chips). Häufige Endungen sind .ld und .x.&lt;br /&gt;
&lt;br /&gt;
Ganz oben im Linkerskript wird definiert, wo der Programmstart ist. Das ist &#039;&#039;&#039;nicht&#039;&#039;&#039; die main()-Funktion, da voher noch einiges zu tun ist. Deshalb nennen wir die Einsprungfunktion _reset. Der einfache vorangestellte Unterstrich symbolisiert Zugehörigkeit zur C-Runtime.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
ENTRY(_reset)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes werden die Speicher-Regionen beschrieben. Diese sind der Memory-Map im User Manual zu entnehmen. Darunter fallen alle Flash- und RAM-Bereiche. Jeder dieser Bereiche bekommt einen Namen, die Attribute (Read, Write, eXecute), den Beginn und die Länge des Bereichs.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MEMORY {&lt;br /&gt;
  /* memory map des LPC54102. Muss an den verwendeten Controller angepasst werden! */&lt;br /&gt;
  Flash (rx):  ORIGIN = 0x00000000, LENGTH = 0x00080000 /* 512kB */&lt;br /&gt;
  SRAM0 (rwx): ORIGIN = 0x02000000, LENGTH = 0x00010000 /*  64kB */&lt;br /&gt;
  SRAM1 (rwx): ORIGIN = 0x02010000, LENGTH = 0x00008000 /*  32kB */&lt;br /&gt;
  SRAM2 (rwx): ORIGIN = 0x03400000, LENGTH = 0x00002000 /*   8kB */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach kommt des (obere) Ende des Stacks (Achtung: der Stack muss je nach Konfiguration an einer 4 Byte oder 8 Byte Grenze ausgerichtet sein, und darf somit nicht an jeder Adresse beginnen):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
_stack_end = ORIGIN(SRAM0) + LENGTH(SRAM0); /* stack end at end of SRAM0 (LPC54102) */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bisher waren es alles einfach und einleuchtend. Jetzt kommt etwas, wofür man einen kleinen Einblick in den GCC braucht, nämlich seine Sections. Es gibt mehrere, jede für einen bestimmten Zweck: &lt;br /&gt;
* .text - Code&lt;br /&gt;
* .bss - Zu 0 initializierte Variablen&lt;br /&gt;
* .data - Initialisierte Variablen (nicht mit 0)&lt;br /&gt;
* .rodata - Read-Only-Varaiblen&lt;br /&gt;
&lt;br /&gt;
Die Sections legt man dann in einen Memory-Bereich. Sinnvollerweise wird man die nicht-änderbaren Daten mitsamt den Code in den Flash legen, die Variablen in den RAM. Das geschieht mit dem &amp;gt; &amp;quot;Memorybereich&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Damit die .data-Section, die ja eigentlich im RAM liegt, auch mit den richtigen Werten vorbelegt werden kann, müssen diese irgendwo (im Flash) stehen. Das wird mit dem AT&amp;gt; Flash erreicht. Damit landen die Daten auch (nach dem Programmcode) im Flash.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
SECTIONS {&lt;br /&gt;
  .text : {&lt;br /&gt;
    _text_section_start = .;&lt;br /&gt;
    KEEP(*(._vectors)) /* Erklaerung hierzu folgt spaeter */&lt;br /&gt;
    *(.text)&lt;br /&gt;
    *(.text*)&lt;br /&gt;
    *(.rodata .rodata.* .constdata .constdata.*)&lt;br /&gt;
    _text_section_end = .;&lt;br /&gt;
  } &amp;gt; Flash&lt;br /&gt;
  &lt;br /&gt;
  . = ALIGN(4);&lt;br /&gt;
  &lt;br /&gt;
  .bss : {&lt;br /&gt;
    _bss_section_start = .;&lt;br /&gt;
    *(.bss)&lt;br /&gt;
    *(.bss*)&lt;br /&gt;
    _bss_section_end = .;&lt;br /&gt;
  } &amp;gt; SRAM0&lt;br /&gt;
  	&lt;br /&gt;
  . = ALIGN(4);&lt;br /&gt;
  	&lt;br /&gt;
  .data : {&lt;br /&gt;
    _data_section_start = .;&lt;br /&gt;
    *(.data)&lt;br /&gt;
    *(.data*)&lt;br /&gt;
    _data_section_end = .;&lt;br /&gt;
  } &amp;gt; SRAM0 AT &amp;gt; Flash&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist unser Linker-Skript auch schon fertig. Einige abschließende Erklärungen noch:&lt;br /&gt;
* die _name_section_start/end = .;-Anweisungen erzeugen globale Variablen, die die aktuelle Adresse enthalten&lt;br /&gt;
* . = ALIGN(4); sagt dem Linker, dass er die aktuelle Adresse an der nächsten 4 Byte-Grenze ausrichten soll&lt;br /&gt;
* In diesem Beispiel werden alle Konstanten Daten in den Flash gelegt&lt;br /&gt;
* Diesem Grundgerüst fehlen noch einige Dinge, wie zu Beispiel der Heap&lt;br /&gt;
Für genauere Erklärungen sollte das oben verlinkte Linker-Manual zu rate gezogen werden.&lt;br /&gt;
&lt;br /&gt;
=== Startup-Code ===&lt;br /&gt;
So unser Linker-Skript ist nun fertig, jetzt können wir mit dem eigentlichen Programmieren beginnen. Dazu müssen wir den Code erstellen, der direkt nach dem Programmstart ausgeführt wird. &lt;br /&gt;
&lt;br /&gt;
Klassisch wird dieser Code in Assembler geschrieben, jedoch bietet die ARM-Architektur einen perfekten Aufbau, um einen Startup-Code in C schreiben zu können.&lt;br /&gt;
&lt;br /&gt;
Dazu legen wir eine neue Datei an, die hat meistens den Namen crt0.c für &#039;&#039;&#039;C&#039;&#039;&#039;-&#039;&#039;&#039;R&#039;&#039;&#039;un&#039;&#039;&#039;t&#039;&#039;&#039;ime.&lt;br /&gt;
Diese enthält als erstes die Prototypen für die aufgerufenen Funktionen, namentlich _reset(), main() und _stack_end() (ja, das Stackende wird als Funktion angesehen, macht aber nichts, weil es nur um die Adresse geht).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
extern int main(void);&lt;br /&gt;
extern void _reset(void);&lt;br /&gt;
extern void _stack_end(void);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommen die Prototypen für alle Faulthandler. Welche Faults auf dem entsprechenden Device implementiert sind, kann man dem User Manual unter Kapitel ARM Cortex Appendix und dem ARM Cortex-Mx Generic User Manual. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/* die implementierten Faulthandler des LPC54102 */&lt;br /&gt;
void NMI_handler(void);&lt;br /&gt;
void HardFault_handler(void);&lt;br /&gt;
void MemManage_handler(void);&lt;br /&gt;
void BusFault_handler(void);&lt;br /&gt;
void UsageFault_handler(void);&lt;br /&gt;
void SVC_handler(void);&lt;br /&gt;
void DebugMon_handler(void);&lt;br /&gt;
void PendSV_handler(void);&lt;br /&gt;
void SysTick_handler(void);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Danach kommen die Prototypen der Interrupts. Welche hier implementiert sind steht im User Manual unter dem Kapitel zum NVIC.&lt;br /&gt;
&lt;br /&gt;
Das Define sagt dem Compiler/Linker, dass die Funktion weak ist, also von einer anderen Funktion mit selben Namen überschrieben werden kann, und einen alias hat, also, wenn sie nicht überschrieben wird, auf eine andere Funktion verweist.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ALIAS(f) __attribute__ ((weak, alias (#f)))&lt;br /&gt;
&lt;br /&gt;
/* Standard-Handler fuer nicht implementierte Interrupt-Service-Routinen */&lt;br /&gt;
void Default_Interrupt_Handler(void) __attribute__ ((weak));&lt;br /&gt;
&lt;br /&gt;
/* Ausschnitt der implementierten Interrupts des LPC54102 */&lt;br /&gt;
/* wenn es dir ISR nicht gibt, dann springe in den DefaultHandler*/&lt;br /&gt;
void WDT_handler(void) ALIAS(Default_Interrupt_Handler);&lt;br /&gt;
void BOD_handler(void) ALIAS(Default_Interrupt_Handler);&lt;br /&gt;
/* viele ISR-Protoypen mehr */&lt;br /&gt;
void SPI3_handler(void) ALIAS(Default_Interrupt_Handler);&lt;br /&gt;
void RIT_handler(void) ALIAS(Default_Interrupt_Handler);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falls ein C++-Compiler genutzt wird, muss man alles oben stehende mit extern &amp;quot;C&amp;quot; { ... } kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
Bisher ist aber noch nichts passiert. Wir sagen dem Compiler zwar, dass es diese und jene Funktionen irgendwo gibt, aber weder benutzen wird diese, noch deklarieren wir sie.&lt;br /&gt;
&lt;br /&gt;
Das benutzen kommt jetzt, nämlich in der Vektor-Tabelle. Diese wird mit Attributen als benutzt gekennzeichnet und in die Section &amp;quot;._vectors&amp;quot; gepackt. Diese Section wird im Linkerskript an die erste Adresse im Flash gesetzt und, da sie niemals direkt verwendet wird, mit KEEP in jedem Fall behalten. &lt;br /&gt;
&lt;br /&gt;
Die Vektor-Tabelle an sich besteht aus einem Array aus [[Funktionszeiger_in_C|Funktionspointern]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
extern void (* const _vectors[])(void) __attribute__ ((used, section(&amp;quot;._vectors&amp;quot;)));&lt;br /&gt;
void (* const _vectors[])(void) = {&lt;br /&gt;
    &amp;amp;_stack_end,&lt;br /&gt;
    _reset,&lt;br /&gt;
    /* die 14 Fault Handler an die richtige Adresse setzen */&lt;br /&gt;
    /* siehe dazu das ARM Cortex-Mx Generic User Maual */&lt;br /&gt;
    /* bei nicht implementierte Handlern wird einfach eine 0 eingetragen */&lt;br /&gt;
&lt;br /&gt;
    /* danach kommen alle Interrupts an der richtigen Stelle */&lt;br /&gt;
    /* dies steht wiederum im User Manual */&lt;br /&gt;
    WDT_handler,&lt;br /&gt;
    BOD_handler,&lt;br /&gt;
    /* ... */&lt;br /&gt;
    SPI3_handler,&lt;br /&gt;
    RIT_handler&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So, damit haben wir schon einen wichtigen Teil abgearbeitet. Damit könnten wir nun Interrupts nutzen, wenn wir schon ein richtiges Programm schreiben könnten. Dazu fehlt uns aber noch die _reset()-Funktion, die alle Variablen initialisiert und main() aufrauft.&lt;br /&gt;
&lt;br /&gt;
Die Reset-Funktion muss im wesentlichen eines machen: die Variablen initialisieren. Zwar können noch weitere Dinge dort erledigt werden, aber das ist von Anwendung zu Anwendung unterschiedlich. Es könnten zum Beispiel die Clocks zu verschiedenen Peripherie-Modulen aktiviert werden, oder der System-Takt eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Des weiteren aktiviert man gerne noch die FPU (wenn vorhanden) im Startupcode und nimmt wenn nötig Prozessor-Einstellungen vor.&lt;br /&gt;
&lt;br /&gt;
Die Funktion _reset() legen wir jetzt an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void _reset(void) {&lt;br /&gt;
    /* hole die im Linker-Skript erstellen globalen Variablen */&lt;br /&gt;
    extern unsigned int _data_section_start;&lt;br /&gt;
    extern unsigned int _data_section_end;&lt;br /&gt;
    extern unsigned int _text_section_end;&lt;br /&gt;
    extern unsigned int _bss_section_start;&lt;br /&gt;
    extern unsigned int _bss_section_end;&lt;br /&gt;
&lt;br /&gt;
    unsigned int *src;&lt;br /&gt;
    unsigned int *dest;&lt;br /&gt;
    /* jetzt überschreiben wir alle Varaiblen in der .bss-Section mit 0 */&lt;br /&gt;
    dest = &amp;amp;_bss_section_start;&lt;br /&gt;
    while (dest &amp;lt; &amp;amp;_bss_section_end) {&lt;br /&gt;
        *dest++ = 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* jetzt initialisieren wir alle .data-Variablen mit den */&lt;br /&gt;
    /* Daten, die im Flash abgelegt wurden */&lt;br /&gt;
    src = &amp;amp;_text_section_end;&lt;br /&gt;
    dest = &amp;amp;_data_section_start;&lt;br /&gt;
    while (dest &amp;lt; &amp;amp;_data_section_end) {&lt;br /&gt;
        *dest++ = *src++;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* und nun folgt endlich der Aufruf von main() */&lt;br /&gt;
	/* der return-wert wird nicht verwendet, man könnte also main als */&lt;br /&gt;
    /* void main(void) definieren und deklarieren, spart uU etwas Speicher */&lt;br /&gt;
    main();&lt;br /&gt;
    &lt;br /&gt;
    /* falls main() zurückkehrt: gehe in eine Endlosschleife */&lt;br /&gt;
    while(1) ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und als letztes legen wir noch die Fault-Handler, sowie die Funktion an, die angesprungen wird, wenn ein Interrupt auftritt, der keine Interrupt-Service-Routine hat: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void Default_Interrupt_Handler(void) {while(1);}&lt;br /&gt;
void NMI_handler(void) {while(1);}&lt;br /&gt;
void HardFault_handler(void) {while(1);}&lt;br /&gt;
void MemManage_handler(void) {while(1);}&lt;br /&gt;
void BusFault_handler(void) {while(1);}&lt;br /&gt;
void UsageFault_handler(void) {while(1);}&lt;br /&gt;
void SVC_handler(void) {while(1);}&lt;br /&gt;
void DebugMon_handler(void) {while(1);}&lt;br /&gt;
void PendSV_handler(void) {while(1);}&lt;br /&gt;
void SysTick_handler(void) {while(1);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Implementierungen sind natürlich nicht sinnvoll, sondern dienen einzig und alleine dem Zweck die Fault-Handler zu erstellen. Nur warten im Falle eines Faults ist nicht sinnvoll. Siehe [https://www.mikrocontroller.net/topic/420629#new Beitrag:Cortex Faults: Was macht man im Handler?].&lt;br /&gt;
&lt;br /&gt;
... Und, ob man es glaubt, oder nicht: Damit ist das Grundgerüst fertig!&lt;br /&gt;
&lt;br /&gt;
Diese beiden Dateien kann man einfach ohne sie anzupassen in jedes Projekt kopieren, sofern der Chip gleich ist.&lt;br /&gt;
&lt;br /&gt;
Bei unterschiedlichen Chips muss man die Memory-Eintrage im Linker-Skript, sowie die Fault- und Interrupt-Handler im Startup-Code ändern. Der Rest sollte gleich bleiben.&lt;br /&gt;
&lt;br /&gt;
Ab jetzt kann man endlich richtig losprogrammieren.&lt;br /&gt;
&lt;br /&gt;
== Makefile und Compiler-Settings ==&lt;br /&gt;
Um nicht alles ein x-tes mal zu erklären versuche ich mich hier kurz zu halten und auf weitere Artikel zu verweisen, diese sind [[Beispiel_Makefile]] für ein (AVR-)Beispiel, [[AVR-GCC-Tutorial/Exkurs_Makefiles]] für einen groben Überblick, [[ARM_GCC#Nutzung_mit_eigener_Umgebung/Kommandozeile|arm-none-eabi-gcc Parameter]] für eine Liste wichtiger Compiler-Optionen. Eine gute Seite mit einer Einführung in Makefile findet sich [http://www.ijon.de/comp/tutorials/makefile.html hier].&lt;br /&gt;
&lt;br /&gt;
Hier ist ein simples Makefile, das für kleine Projekte ausreicht und leicht erweitert werden kann:&lt;br /&gt;
Diese Datei einfach unter dem Namen &amp;quot;Makefile&amp;quot; (ohne Endung im Projektordner speichern).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
## Example Makefile for arm-none-eabi-gcc and LPC-microcontrollers&lt;br /&gt;
&lt;br /&gt;
OUTPUT_NAME = lpc&lt;br /&gt;
&lt;br /&gt;
## Used tools&lt;br /&gt;
# C compiler frontend&lt;br /&gt;
CC = arm-none-eabi-gcc&lt;br /&gt;
OBJDUMP = arm-none-eabi-objdump&lt;br /&gt;
&lt;br /&gt;
## list files to compile here (suffix: *.o)&lt;br /&gt;
OBJS = crt0.o main.o&lt;br /&gt;
&lt;br /&gt;
## Path and name of the linker script&lt;br /&gt;
LINKER_SCRIPT = lpc.ld&lt;br /&gt;
&lt;br /&gt;
## Flags&lt;br /&gt;
# processor-dependent flags&lt;br /&gt;
MCU_FLAGS = -mthumb -mcpu=cortex-m0 -mtune=cortex-m0 -mfloat-abi=soft&lt;br /&gt;
# Compiler flags&lt;br /&gt;
CFLAGS = $(MCU_FLAGS) &lt;br /&gt;
CFLAGS += -Wall -Og -g3 -MMD&lt;br /&gt;
CFLAGS += -ffunction-sections -fdata-sections -fsingle-precision-constant -fstack-usage # more options&lt;br /&gt;
# Linker flags&lt;br /&gt;
LDFLAGS = $(MCU_FLAGS) $(CFLAGS)&lt;br /&gt;
LDFLAGS += -T$(LINKER_SCRIPT)&lt;br /&gt;
LDFLAGS += -nostartfiles -Wl,--gc-sections,-print-memory-usage&lt;br /&gt;
LDFLAGS += # more options, e.g. libraries&lt;br /&gt;
&lt;br /&gt;
## Rules&lt;br /&gt;
all: $(OUTPUT_NAME).elf $(OUTPUT_NAME).lss&lt;br /&gt;
.PHONY: clean&lt;br /&gt;
&lt;br /&gt;
# Rule for creating the .elf file&lt;br /&gt;
$(OUTPUT_NAME).elf: $(OBJS) Makefile&lt;br /&gt;
	@echo Linking final file...&lt;br /&gt;
	@$(CC) $(CFLAGS) -o $(OUTPUT_NAME).elf $(OBJS) $(LDFLAGS)&lt;br /&gt;
&lt;br /&gt;
# Rule for compiling every needed c file &lt;br /&gt;
%.o: %.c Makefile&lt;br /&gt;
	@echo Compiling file $&amp;lt;...&lt;br /&gt;
	@$(CC) -c $(CFLAGS) -o $@ $&amp;lt;&lt;br /&gt;
&lt;br /&gt;
# Rule for generating a disassembly&lt;br /&gt;
%.lss: %.elf&lt;br /&gt;
	@echo Generating disassembly...&lt;br /&gt;
	@$(OBJDUMP) -d -S $&amp;lt; &amp;gt; $@&lt;br /&gt;
&lt;br /&gt;
# delete all created files&lt;br /&gt;
clean:&lt;br /&gt;
	@echo Cleaning up...&lt;br /&gt;
	@$(RM) $(OBJS) $(OUTPUT_NAME).elf $(OUTPUT_NAME).lss $(OBJS:.o=.d) $(OBJS:.o=.i)&lt;br /&gt;
&lt;br /&gt;
# include C dependencies&lt;br /&gt;
-include $(OBJS:.o=.d)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Makefile ist einfach aufgebaut. Zuerst kommen die Variablen, die jeweilige Bedeutung sollte sich aus dem Namen ergben. Wichtig sind die Flags, bei denen man seine Compiler- und Linker-Option angibt. Die aktuellen Parameter sind selbstverständlich anzupassen.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die sogenannten Rules, die &amp;quot;Erstellungs-Regeln&amp;quot;. Diese beschreiben was wann wie getan werden muss. &#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039; weiter ausführen&lt;br /&gt;
&lt;br /&gt;
Zum Kompilieren muss man nun lediglich &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aufrufen, zum Aufräumen, also zum Löschen aller erstellen Dateien &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;make clean&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Device-Header ==&lt;br /&gt;
Eigentlich kann man jetzt schon den gesamten Chip programmieren, ohne irgendwelche Abstriche machen zu müssen. Um etwa eine LED blinken lassen muss man &amp;quot;nur&amp;quot; folgendes schreiben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern void delay_ms(uint32_t ms); /* implemented somewhere else */&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	/* enable GPIO0 (bit 14) and IOCON (bit 13) clock in the SYSCON-&amp;gt;AHBCLKCTRLSET register */&lt;br /&gt;
	*(volatile uint32_t*)0x400000C8 = (1 &amp;lt;&amp;lt; 13) | (1 &amp;lt;&amp;lt; 14);&lt;br /&gt;
	/* setup PIO0_29: GPIO (bits [2:0]), Pull-Up (bits [4:3]), digital mode (bit 7) */&lt;br /&gt;
	*(volatile uint32_t*)(0x4001C000 + 29 * 0x4) = (0x0 &amp;lt;&amp;lt; 0) | (0x2 &amp;lt;&amp;lt; 3) | (0x1 &amp;lt;&amp;lt; 7);&lt;br /&gt;
	/* set PIO0_29 to output using the GPIO-&amp;gt;DIR0 register */&lt;br /&gt;
	*(volatile uint32_t*)(0x1C000000 + 0x2000 + 0) |= (1U &amp;lt;&amp;lt; 29);&lt;br /&gt;
&lt;br /&gt;
	while(1) {&lt;br /&gt;
		/* toggle LED at PIO0_29 using GPIO-&amp;gt;NOT0 register */&lt;br /&gt;
		*(volatile uint32_t*)(0x1C000000 + 0x2300 + 0) = (1U &amp;lt;&amp;lt; 29);&lt;br /&gt;
		delay_ms(500);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wer erkennt nicht auf den ersten Blick, was hier passiert? Okay, der Code ist einigermaßen gut kommentiert, und damit versteht man vas vorsich geht, aber diese kryptischen Adressen?! Auch die Bitwerte sind zu verbessern, zwar wird auch hier im Kommentar erklärt was mit welchen Bits gemacht wird, aber sprechende Namen wären deutlich schöner.&lt;br /&gt;
&lt;br /&gt;
Wer will, kann den Code testen, die Adressen beziehen sich uaf einen LPC54102, der eine LED an PIO0_29 angeschlossen hat (so wie am Eval-Board für diesen Chip). Dieser Schipsel ist getestet und funktioniert. Für eine mögliche Implementierung einer einfachen delay_ms()-Funktion siehe [https://www.mikrocontroller.net/topic/378584#4301959 diesen Thread].&lt;br /&gt;
&lt;br /&gt;
Aber, wie allen klar sein dürfte: So will man nicht programmieren. Selbst beim konstruieren dieses einfachen Beispiels hatten sich ursprünglich zwei Fehler in den Adressen eingeschlichen. Also: eine andere Möglichkeit muss her.&lt;br /&gt;
&lt;br /&gt;
Die Lösung ist die CMSIS. ARM hat einen Standard für alle möglichen Teile eines Mikrocontroller-Systems, unter anderem das sogenannte CMSIS-SVD. Das steht für &#039;&#039;&#039;S&#039;&#039;&#039;ystem &#039;&#039;&#039;V&#039;&#039;&#039;iew &#039;&#039;&#039;D&#039;&#039;&#039;escription. Das sind Dateien, die einen kompletten Mikrocontroller beschreiben, mit Registern, Interrupts, Bits, ihren Namen. Also genau das was wir brauchen. NAja fast, wir wollen schließlich eine .h-Datei, keine .svd-Datei, diese sind nämlich nicht einfach austauschbar. Aber auch dafür gibt es eine Lösung von ARM: SVDconv.exe ist ein Kommandozeilen-Programm für unter anderem die Generierung von Device-Headern.&lt;br /&gt;
&lt;br /&gt;
Das Programm kann von [https://github.com/ARM-software/CMSIS GitHub aus dem ARM-Repository] heruntergeladen werden und befindet sich unter CMSIS/Utilities/SVDConv.exe. Fehlt nur die .svd-Datei. Diese bekommt man im idealen Fall vom Hersteller des Chips. Wenn dieser seine SVDs nicht veröffentlicht gibt es auch [https://github.com/posborne/cmsis-svd dieses GitHub-Repository], das im Unterordner data eine Sammlung der Dateien von verschiedenen Herstellern beinhaltet, unter anderem eben auch die Beschreibungen für die LPC-Serie von NXP.&lt;br /&gt;
&lt;br /&gt;
Dazu führt man in der Eingabeaufforderung folgendes aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SVDConv.exe &amp;lt;device-file.svd&amp;gt; --generate=header --fields=macro&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Warnings wegen &amp;quot;RESERVED should not be defined&amp;quot; kann man getrost ignorieren. Fehler sollten keine auftreten.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Kommando generiert man eine Header-Datei für seinen Controller. Des weiteren muss man neben den generierten Header noch die von ARM gestellten Header-Dateien core_cmX.h, core_cmFunc.h und core_cmInstr.h aus dem Verzeichnis CMSIS-master\CMSIS\Include zu seinem Header-File kopieren. Wenn beim kompilieren weitere fehlende Dateien angemahnt werden, dann auch diese aus dem Verzeichnis kopieren. Beim Fehler &amp;quot;fatal error: system_&amp;lt;device&amp;gt;.h: No such file or directory&amp;quot; hat man zwei Optionen:&lt;br /&gt;
* das Include löschen, damit ist man zwar nicht mehr CMSIS-kompatibel, aber hat keine arbeit&lt;br /&gt;
* die Datei (mit einer dazugehörigen .c-Datei) erstellen. Der Inhalt sollte der folgende sein:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef __SYSTEM_&amp;lt;device&amp;gt;_H&lt;br /&gt;
#define __SYSTEM_&amp;lt;device&amp;gt;_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern uint32_t SystemCoreClock;     /*!&amp;lt; System Clock Frequency (Core Clock)  */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initialize the system&lt;br /&gt;
 *&lt;br /&gt;
 * @param  none&lt;br /&gt;
 * @return none&lt;br /&gt;
 *&lt;br /&gt;
 * @brief  Setup the microcontroller system.&lt;br /&gt;
 *         Initialize the System and update the SystemCoreClock variable.&lt;br /&gt;
 */&lt;br /&gt;
extern void SystemInit (void);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Update SystemCoreClock variable&lt;br /&gt;
 *&lt;br /&gt;
 * @param  none&lt;br /&gt;
 * @return none&lt;br /&gt;
 *&lt;br /&gt;
 * @brief  Updates the SystemCoreClock with current core Clock &lt;br /&gt;
 *         retrieved from cpu registers.&lt;br /&gt;
 */&lt;br /&gt;
extern void SystemCoreClockUpdate (void);&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif /* __SYSTEM_&amp;lt;device&amp;gt;_H */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: Die .c-Datei implementiert dann die beiden Funktionen und definiert die globale Variable. Was die Funktionen tun kann man dem Doxygen-Kommentar über den Funktionen entnehmen.&lt;br /&gt;
&lt;br /&gt;
Damit sind dann alle wichtigen Dateien fertig!&lt;br /&gt;
&lt;br /&gt;
== Das erste Programm ==&lt;br /&gt;
Nun können wir endlich so programmieren, wie man es von PC oder einem anderen Controller gewöhnt ist. &lt;br /&gt;
&lt;br /&gt;
Also in einer neu angelegten Datei seinen normalen Code schreiben. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int i = 42;&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	&lt;br /&gt;
	while(1) {&lt;br /&gt;
		--i;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Image:Sequentielle Programme.gif|right|thumb|260px|Mikrocontroller-Programmierung]]&lt;br /&gt;
Dieses sollte man testweise einmal Kompilieren, um die bisherigen Schritte zu verifizieren. Wer einen Debugger hat kann auch testen, ob die Variable i mit dem richtigen Wert (42) initialisiert wird und auch schauen, ob die Variable dekrementiert wird. &lt;br /&gt;
&lt;br /&gt;
Aber wie jedem klar sein sollte: das obige Programm macht nichts sinnvolles. Streng genommen macht es gar nichts. Schließlich zeichnet sich ein Mikrocontroller-Programm dadurch aus, dass es auf externe Ereignisse reagiert und Ausgaben tätigt. Diese Ein- und Ausgaben können gerade auf einem Mikrocontroller sehr vielfältig sein, von einfachen Tastern als Ein- und LEDs als Ausgabe, bis hin zu Sensordaten und ganzen Displays oder Motoren ist alles dabei.&lt;br /&gt;
&lt;br /&gt;
Also muss unser Controller mit der Außenwelt kommunizieren, und genau dafür brauchen wir die I/O-Pins, beziehungsweise Peripherie im allgemeinen. Deswegen wenden wir uns als erstes dem GPIO-Modul zu.&lt;br /&gt;
&lt;br /&gt;
Das neue einfache Programm sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;quot;LPC5410x.h&amp;quot; /* die generierte Datei fuer euren Controller */&lt;br /&gt;
&lt;br /&gt;
extern void delay_ms(uint32_t ms); /* implemented somewhere else */&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	LPC_SYSCON-&amp;gt;AHBCLKCTRLSET0 = SYSCON_AHBCLKCTRL0_GPIO0_Msk | SYSCON_AHBCLKCTRL0_IOCON_Msk;&lt;br /&gt;
	LPC_IOCON-&amp;gt;PIO0_29 = (0x0 &amp;lt;&amp;lt; IOCON_PIO0_29_FUNC_Pos) | /* ! */&lt;br /&gt;
		(0x2 &amp;lt;&amp;lt; IOCON_PIO0_29_MODE_Pos) |                  /* ! */&lt;br /&gt;
		IOCON_PIO0_29_DIGIMODE_Msk;&lt;br /&gt;
	LPC_GPIO-&amp;gt;DIR0 |= (1U &amp;lt;&amp;lt; 29);&lt;br /&gt;
&lt;br /&gt;
	while(1) {&lt;br /&gt;
		LPC_GPIO-&amp;gt;NOT0 = (1 &amp;lt;&amp;lt; 29);&lt;br /&gt;
		delay_ms(500);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das sieht doch schon wesentlich besser aus! Die Funktion ist 1:1 die selbe, wie im Beispiel oben, allerdings ist das doch wesentlich lesbarer, obwohl alle Kommentare fehlen. Lediglich die beiden mit /* ! */ markierten Zeilen sollten entweder kommentiert werden, oder mit einem aussagekräftigen define beschrieben werden, damit man nicht im User-Manual nachschauen muss, was 0x0 und 0x2 in diesem Kontext bedeutet.&lt;br /&gt;
&lt;br /&gt;
So, ab jetzt kann jeder mit dem User-Manual als Referenz seine Applikation programmieren. Hilfe zu den einzelnen Peripherie-Einheiten findet man oben unter Aufbau/Peripherie.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* (evtl ARM-Core-Config)&lt;br /&gt;
* Syscon&lt;br /&gt;
* GPIO, weiterführendes Beispiel&lt;br /&gt;
* Delay (AVR-Libc Style)&lt;br /&gt;
* Bearbeiten der Header, IOCON-&amp;gt;PIOn_x -&amp;gt; IOCON-&amp;gt;PIO[n][x], etc.&lt;br /&gt;
* Abschließendes Wort und Verweis auf die nächsten Kapitel&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:LPC-Mikrocontroller&amp;diff=95456</id>
		<title>Diskussion:LPC-Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:LPC-Mikrocontroller&amp;diff=95456"/>
		<updated>2017-03-06T17:01:26Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: /* Umstrukturierung der Seite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Zustimmung von NXP sowie code-red zur Verlinkung bzw. zum direkten Kopieren aus der Domain www.nxp.com bzw. www.code-red-tech.com liegt mir vor. ([[Benutzer:Powerfreak|Powerfreak]] 3. Sep. 2011 (UTC))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kann man die Cortex M0 denn mit dem einfachen GCC für M3 bearbeiten? Oder bracht es da andere Tools?&lt;br /&gt;
Ja, kann man, die Standard-Tools decken das mit ab&lt;br /&gt;
&lt;br /&gt;
Solche Fragen bitte im Forum stellen - wie auch immer: siehe http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html und darin Erläuterungen zu -mcpu=name ([[Benutzer:Mthomas|Mthomas]] 15:35, 2. Sep. 2011 (UTC))&lt;br /&gt;
&lt;br /&gt;
== Umstrukturierung der Seite ==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich einmal das aktuelle Portfolio von NXP anschaut ([http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-mcus:LPC-ARM-CORTEX-M-MCUS LPC Microcontrollers | NXP]), dann stellt man fest, dass diese Seite nicht mehr aktuell ist: &lt;br /&gt;
Es gibt mehr Typen, als die bisher erwähnten LPC1xxx-µCs.&lt;br /&gt;
Der Seitentitel suggeriert auch, dass es eben nur um die LPC1x00-Serie geht, obwohl die LPC800er Serie auch erwähnt wird.&lt;br /&gt;
&lt;br /&gt;
Generell finde ich die Seite nicht mehr übersichtlich genug.&lt;br /&gt;
&lt;br /&gt;
Ein kleiner Überblick zu den aktuellen Produktreihen:&lt;br /&gt;
* Cortex-Kerne&lt;br /&gt;
:* LPC800 mit Cortex-M0+&lt;br /&gt;
:* LPC1100 mit Cortex-M0+/M0&lt;br /&gt;
:* LPC1200 mit Cortex-M0&lt;br /&gt;
:* LPC1300 mit Cortex-M3&lt;br /&gt;
:* LPC1500 mit Cortex-M3&lt;br /&gt;
:* LPC1700 mit Cortex-M3&lt;br /&gt;
:* LPC1800 mit Cortex-M3&lt;br /&gt;
:* LPC4000 mit Cortex-M4&lt;br /&gt;
:* LPC4300 mit Cortex-M4 und M0&lt;br /&gt;
:* LPC54000 mit Cortex-M4 und M0+&lt;br /&gt;
* und eventuell auch die anderen ARM Kerne&lt;br /&gt;
:* (LPC2000 mit ARM7TDMI)&lt;br /&gt;
:* (LPC3000 mit ARM926EJ)&lt;br /&gt;
&lt;br /&gt;
Deswegen mein Vorschlag: die aktuelle Seite umbenennen/verschieben auf eine neue Seite &amp;quot;LPC MCUs&amp;quot;/&amp;quot;LPC Mikrocontroller&amp;quot;/&amp;quot;LPC Series MCUs&amp;quot; (oder so ähnlich) und dann die Seite zu updaten. Darunter fällt &lt;br /&gt;
sowohl generell die neuen Informationen aufzunehmen, als auch ältere Daten auf den aktuellen Stand zu bringen (Der Stand der Seite scheint teilweise von 2013 oder noch früher zu sein). &lt;br /&gt;
Die Verlinkung links oben in der Übersicht müsste bei der Umbenennung der Seite auch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Auch sollte man die Seite durchgehend in deutsch schreiben, oder wenigstens deutsche Erklärungen dazu.&lt;br /&gt;
&lt;br /&gt;
Angefangen habe ich schon mal mit der neuen Vergleichstabelle, die allerdings auch noch erweiterbar ist.&lt;br /&gt;
&lt;br /&gt;
Freue mich auf eure Meinungen dazu&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Newgeneration|Newgeneration]] ([[Benutzer Diskussion:Newgeneration|Diskussion]]) 18:06, 11. Feb. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
:Die abgeschriebenen Übersichten sind nie so aktuell wie die Seiten der Hersteller. Die Änderungen sind schön, aber die parametrische Suche von NXP ist umfangreicher. &lt;br /&gt;
:Die Seite nur &#039;LPC&#039; zu nennen fände ich auch besser, LPC1xxx ist mittlerweile wirklich obsolet.&lt;br /&gt;
:Leider ist hier das Interesse an der LPC Serie sehr gering, obwohl die sehr einfach zu programmieren sind. :Interessanter wären da eher Tutorials zum Einstieg.&lt;br /&gt;
&lt;br /&gt;
:--[[Benutzer:Jojos|Jojos]] ([[Benutzer Diskussion:Jojos|Diskussion]]) 13:12, 6. Mär. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
:: Natürlich hast du recht, die Herstellerseiten sind immer besser gepflegt (wenn nicht läuft echt was schief).&lt;br /&gt;
:: Jedoch halte ich nichts davon, einen &amp;quot;Artikel&amp;quot; zu haben, auf dem nur veraltete, z.T. schon falsche Informationen stehen, dann kann und sollte man sich die Seite gleich sparen und einfach nur auf die Herstellerseite verlinken.&lt;br /&gt;
:: Deswegen würde ich versuchen die Infos so gut wie möglich auf den aktuellen Stand zu bringen. Des weiteren werde ich auch immer einen Stand hinzufügen (also Stand März 2017 etc.) damit andere, die evtl. schon neure Informationen haben dann das ändern können. Die Artikelsammlung lebt schließlich davon dass viele etwas dazu beitragen.&lt;br /&gt;
:: Diese Änderungen können sich aber (zumindest von meiner Seite) noch hinziehen, da ich in diesem Monat doch sehr viel zu tun habe, das eine höhere Priorität hat, unter anderem auch ein Job ;-)&lt;br /&gt;
:: Zum Tutorial: Ich habe da schon etwas in Arbeit, allerdings ist es im Moment noch nicht reif für die Öffentlichkeit. Es muss z.B. noch verallgemeinert werden, denn im Moment bezieht es sich nur auf einen Prozessor... Es kommt, aber alles zu seiner Zeit.&lt;br /&gt;
&lt;br /&gt;
:: Danke aber schon mal an dich für deine Anregung, ich dachte ich führe Selbstgespräche :)&lt;br /&gt;
:: --[[Benutzer:Newgeneration|Newgeneration]] ([[Benutzer Diskussion:Newgeneration|Diskussion]]) 18:01, 6. Mär. 2017 (CET)&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LPC-Mikrocontroller&amp;diff=95411</id>
		<title>LPC-Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LPC-Mikrocontroller&amp;diff=95411"/>
		<updated>2017-03-03T14:51:03Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Controller farbig gemacht und Tabelle überarbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:overview_Sep2011.png|thumb|right|850px|Überblick über die aktuelle Cortex M0/3 Familie, ©NXP.com]]&lt;br /&gt;
[[Bild:positioning_NXPSep2011.gif|thumb|right|850px|Vergleich über die aktuelle Cortex M0/3 Familie, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
Die LPC-Familie von NXP basiert auf 32-Bit Cortex-Kernen von ARM und arbeitet mit bis zu 204MHz. Die verschiedenen Serien basieren auf den Cortex-M0/M0+/M3/M4-Kernen und sind inzwischen auch für Privatnutzer zu Preisen erhältlich, die mit denen von 8-Bit-Mikrocontrollern vergleichbar sind. Eine Auflistung der verschiedenen Typen findet sich in der Tabelle unten.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind preiswerte Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG Programmer und Debugger oder den neuen LPC-Link2, ein reiner Programmer + Debugger) erhältlich z.B. bei [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]. Siehe dazu auch die Dokumentation von NXP zu den [http://www.nxp.com/documents/leaflet/75016842.pdf LPCXpresso-Entwicklungskits (PDF)] und diese [[LPC1xxx Entwicklungskit LPCXpresso]].&lt;br /&gt;
&lt;br /&gt;
== Vergleich aller Typen ==&lt;br /&gt;
&#039;&#039;Stand Feb. 2017&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; class=&amp;quot;unsortable&amp;quot;                               | &lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | CPU&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | Max. Frequency&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | Flash&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | SRAM&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | Voltage&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; class=&amp;quot;unsortable&amp;quot;   | Features&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC800&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2&amp;quot;              | Cortex-M0+&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;30&amp;quot;             | 30MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;8&amp;quot;              | 8-32kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1&amp;quot;              | 1-8kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1.8&amp;quot;            | 1.8-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
SCTimer/PWM,&lt;br /&gt;
Switch Matrix,&lt;br /&gt;
Pattern Match Engine&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC54000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | Cortex-M4&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;180&amp;quot;            | 180MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;128&amp;quot;            | 128-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;96&amp;quot;             | 96-200kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1.62&amp;quot;           | 1.62-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
LCD,&lt;br /&gt;
Ethernet,&lt;br /&gt;
FlexComm,&lt;br /&gt;
Security&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC1100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1&amp;quot;              | Cortex-M0/M0+&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;50&amp;quot; | 50MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | 4-256kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1&amp;quot;              | 1-36kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1.71&amp;quot;           | 1.71-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC1200&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;0&amp;quot;              | Cortex-M0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;32&amp;quot;             | 32-128kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | 4-8kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1.8&amp;quot;            | 1.8-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
8 kV protection,&lt;br /&gt;
IEC 60730 Class B certified&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC1300&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;3&amp;quot;  | Cortex-M3&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;72&amp;quot; | 72MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;8&amp;quot;              | 8-64kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | 4-12kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2.0&amp;quot;            | 2.0-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC1500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;64&amp;quot;             | 64-256kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;12&amp;quot;             | 12-36kB&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2.4&amp;quot;| 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
QEI&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC1700&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;120&amp;quot;            | 120MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;                | 32-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;8&amp;quot;              | 8-96kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
QEI&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC1800&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;180&amp;quot;            | 180MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;512&amp;quot;            | Flashless, &lt;br /&gt;
512kB-1MB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;104&amp;quot;            | 104-200kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
Dual HS USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
Security&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC4000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | Cortex-M4&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;120&amp;quot;            | 120MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;64&amp;quot;             | 64-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;24&amp;quot;             | 24-96kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#EAECF0&amp;quot;                                            | LPC4300&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | Cortex-M4&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;240&amp;quot;            | 204MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;512&amp;quot;            | Flashless, &lt;br /&gt;
512kB-1MB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;104&amp;quot;            | 104-282kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
Dual HS USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
SGPIO,&lt;br /&gt;
Security&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;: gibt es auch als Mehrkern-Prozessoren (mit 0/1/2 Cortex-M0(+)-Cores)&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Informationen ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos + User-Manuals==&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC8xx (Cortex-M0+) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://www.nxp.com/products/microcontrollers/cortex_m0_m0/series/LPC800.html#quickreference LPC8xx]&#039;&#039;&#039; ist nur in Packages mit einer relativ niedrigen Pinanzahl (DIP8, SO20, TSSOP16, TSSOP20) verfügbar, hat zwischen 4-16kB Flash, und 1-4kB RAM. Die zulässige Betriebsspannung liegt zwischen 1,8V und 3,6V.&lt;br /&gt;
&lt;br /&gt;
Überblick über die Features der LPC800-Serie: &lt;br /&gt;
* 1 I2C&lt;br /&gt;
* 1-2 SSP&lt;br /&gt;
* 2-3 UART&lt;br /&gt;
* 4 Timer,  1 OS-Timer&lt;br /&gt;
* 1 watch dog&lt;br /&gt;
* 4 PWM-Einheiten&lt;br /&gt;
* 10-bit ADC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/download/grouping/11045/user_manual User Manual der LPC8-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC11xx (Cortex-M0) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc11xx/ LPC11xx-Serie]&#039;&#039;&#039; (3,3V) bietet viele Möglichkeiten&lt;br /&gt;
* Der LPC1100L ist derzeit laut NXP (Sep2011) der preisgünstigste ARM auf dem Markt. Der 32Bit ARM mit einer Performance von ca. 45DMIPS @50MHZ benötigt bei dieser Taktfrequenz nur etwa 10mA. (Details siehe NXP-Seite)&lt;br /&gt;
&lt;br /&gt;
* Überblick über die Features :&lt;br /&gt;
** LPC1100 Serie: • I2C, SSP, UART, GPIO, • Timers and watch dog timer, • 10-bit ADC, • Flash/SRAM memory, • Weitere Funktionen, siehe &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/LPC1xxx#Features_eines_LPC11xx 2.3 Features]&#039;&#039;&#039;&lt;br /&gt;
** LPC1100L Serie zusätzlich zu LPC1100: • Power Profile mit lower power consumption in Active- und Sleep-mode, • Interne pull-ups auf VDD level, • Programmierbarer pseudo open-drain mode für GPIO Pins, • WWDT mit Clock Source Lock.&lt;br /&gt;
**LPC11C00 Serie zusätzlich zu LPC1100: • CAN controller, • On-chip CAN Treiber, • On-chip CAN Transceiver (LPC11C2x), • WDT (not windowed) mit Clock Source Lock.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10398.pdf User Manual der LPC11-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Besonderes Augenmerk möchte ich auf die neue Serie  &#039;&#039;&#039;[http://www.nxp.com/ps/#/i=71498 LPC111xFD]&#039;&#039;&#039; legen, denn in jetzt gibt es den Cortex-M0 auch im DIL 28 &#039;&#039;&#039;[http://www.nxp.com/redirect/pip/LPC1114FN28.html den LPC1114FN28]&#039;&#039;&#039;&lt;br /&gt;
**Des Weiteren sind damit SO20, sowie TSSOP20 und TSSOP28 Bauformen verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC12xx (Cortex-M0) ===&lt;br /&gt;
* Die Low Power &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc12xx/ LPC12xx-Serie]&#039;&#039;&#039; (3,3V) ist laut NXP (Sep2011) ein Cortex-M0 mit 32 bis 128kB Flash, einem 45 CoreMark™ Benchmark-Score bei 30MHz, 2 bis 8kB SRAM, und einem internen 1% genauen 12MHz Oscillator.&lt;br /&gt;
&lt;br /&gt;
* Überblick über die Features: fMAX von 30MHz, 1 10-Bit  ADC mit 8 Kanälen, 2 Comparatoren, 2 UARTs, 1 SSP/SPI, 1 I2C, DMA Controller, CRC Engine, 1 32-Bit, 5 Timer (16- und 32-Bit, + RTC), 13 PWM Kanäle, bis zu 55 GPIOs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10441.pdf User Manual der LPC12xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC13xx (Cortex-M3) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc13xx/ LPC13xx-Serie]&#039;&#039;&#039; (3,3V) bietet im LQFP 48 Gehäuse 8..32k Flash, 2..8k SRAM, 5 Timer (mit WD), 11 PWM, 1 UART, 1IIC, 1USB, 1..2 SPI, einen 8-Kanal/10Bit AD-Wandler und eine Taktfrequenz von max. 72MHz. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10375.pdf User Manual der LPC13xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC17xx (Cortex-M3) ===&lt;br /&gt;
Die &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc17xx/ LPC17xx-Serie]&#039;&#039;&#039; hingegen enthält eine weit größere Peripherie in einem LQFP80/100/144/208 Package.&lt;br /&gt;
32..512k Flash, 8..96k SRAM, 6 Timer (mit WD), 6 zusätzliche PWM-Einheiten, teilweise Ethernet und STN/TFT-LCD-Controller, meist USB (teilw. mit Host+OTG), 4 UART, 2..3IIC, 1..2 CAN, 1 SPI, 2 SSP/SPI einen 6..8-Kanal/12Bit AD-Wandler, einen 10Bit DAC, Motor-Control-Einheiten, einen Encoder-Eingang und eine Taktfrequenz von max. 100MHz(120MHz) und vieles mehr. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10360.pdf User Manual der LPC17xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC18xx (Cortex-M3) ===&lt;br /&gt;
Die &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc18xx/ LPC18xx-Serie]&#039;&#039;&#039; stellt DIE &amp;quot;High-Performance&amp;quot; Controller aus der Cortex-M3-Serie. Die Taktfrequenz geht bis 150MHz, die Controller enthalten große dual-Bank Flash Speicher bis zu 1MB, ein großes On-Chip SRAM mit bis zu 200KB, zusätzliche Peripherie wie z.B. SPI Flash Interface (SPIFI) und State Configurable Timer (SCT), 2x High Speed USB (1x mit On-Chip HS PHY) und eine MPU.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://ics.nxp.com/support/documents/microcontrollers/pdf/user.manual.lpc18xx.pdf User Manual der LPC18xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblick über die Features: &#039;&#039;&#039;[http://ics.nxp.com/literature/leaflets/microcontrollers/pdf/lpc18xx.pdf LPC18xx Flyer von NXP]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungskits ===&lt;br /&gt;
Von NXP sind &amp;lt;u&amp;gt;sehr preiswerte&amp;lt;/u&amp;gt; Entwicklungskits (ca. 25€ für. 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 (PDF)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Kostenlose Entwicklungsumgebung für ALLE hier genannten Controller ===&lt;br /&gt;
Für die ganze Prozessorfamilie ist eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; Entwicklungsumgebung  erhältlich. Informationen unter &#039;&#039;&#039;[http://www.lpcware.com/lpcxpresso/home  lpcware]&#039;&#039;&#039;: Die auf Eclipse basierende Entwicklungsumgebung ist nach der Installation bis 8k freigeschaltet und nach einer einfachen und kostenlosen Registrierung für 256kB. Die IDE ist auch für &#039;&#039;&#039;[http://www.lpcware.com/lpcxpresso/home Linux und Mac]&#039;&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
Hier die &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== LPC8xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC8xx ===&lt;br /&gt;
Bezugsquellen und Preise (Stand 06/2016)&lt;br /&gt;
* LPC810FN8 (DIP8): Digikey 1,09 € (bei einem Stuck).&lt;br /&gt;
* LPC812JD20 (SOIC-W 20): Digikey 1,26 € (bei einem Stuck).&lt;br /&gt;
* LPC812JDH20 (TSSOP-20): Digikey 1,44 € (bei einem Stuck).&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC800_block_diagram_Jan2014.gif|thumb|right|850px|Blockdiagramm des Cortex-M0+, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC8xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC8xx ===&lt;br /&gt;
* System:&lt;br /&gt;
** ARM Cortex-M0+ processor, running at frequencies of up to 30 MHz. &lt;br /&gt;
** single cycle multiplier&lt;br /&gt;
** single cycle I/O port&lt;br /&gt;
** ARM Cortex-M0+ built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug, Micro Trace Buffer supported.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory:&lt;br /&gt;
** 16 kB (LPC812M101JD20/LPC812M101JDH20/LPC812M101JDH16), 8 kB (LPC811M001JDH16) or 4kB (LPC810M021FN8) on-chip flash programming memory. &lt;br /&gt;
**  4kB, 2 kB, or 1 kB SRAM.&lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** Up to 18 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors. Number of GPIO pins is reduced for smaller packages down to 6.&lt;br /&gt;
** GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** High-current output driver (20 mA) on one pin.&lt;br /&gt;
** High-current sink drivers (20 mA) on two open drain pins.&lt;br /&gt;
** Four general purpose timers/counters with a total of four capture inputs and up to 13 match outputs. &lt;br /&gt;
** Programmable WatchDog Timer (WDT).&lt;br /&gt;
** &#039;&#039;&#039;Switch matrix for flexible configuration of each I/O pin function.&#039;&#039;&#039;&lt;br /&gt;
** CRC engine&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** Comparator with internal and external references and 31 step voltage divider.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** UART with fractional baud rate generation, internal FIFO, and RS-485 support. &lt;br /&gt;
** SPI controllers with SSP features and with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. &lt;br /&gt;
* Clock generation:&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** Programmable watchdog oscillator with a frequency range of 9.4 kHz to 2.3 MHz.&lt;br /&gt;
** 10 kHz low-power oscillator for the WKT.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, and the Watchdog clock.&lt;br /&gt;
* Power control:&lt;br /&gt;
** Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
** Power profiles residing in boot ROM allowing to optimize performance and minimize power consumption for any given application through one simple function call. &lt;br /&gt;
** Reduced power modes: Sleep mode, Deep-sleep mode, Power-down mode, and Deep power-down mode.&lt;br /&gt;
** Wake-up from Deep-sleep and Power-down modes on activity on USART, SPI, and I2C peripherals.&lt;br /&gt;
** Brownout detect.&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Single 3.3 V power supply (1.8 V to 3.6 V).&lt;br /&gt;
* Available as DIP8, TSSOP16, SO20, and TSSOP20 package.&lt;br /&gt;
&lt;br /&gt;
== LPC11xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC11xx ===&lt;br /&gt;
Bezugsquellen und Preise (Stand 01/2014):&lt;br /&gt;
&lt;br /&gt;
elpro.org: von 1.61EUR (LPC1111FN33) bis 5.73EUR (LPC11U37) bei einen Stueck. Die Familie ist sehr gross mit sehr unterschiedlichen Ausfuehrungen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Block.diagramM0_NXPSep2011.gif|thumb|right|850px|Blockdiagramm des Cortex-M0, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC11xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC11xx ===&lt;br /&gt;
* System:&lt;br /&gt;
** ARM Cortex-M0 processor, running at frequencies of up to 50 MHz. &lt;br /&gt;
** ARM Cortex-M0 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory:&lt;br /&gt;
** 32 kB (LPC1114/LPC11C14), 24 kB (LPC1113), 16 kB (LPC1112/LPC11C12), or 8 kB (LPC1111) on-chip flash programming memory.  &lt;br /&gt;
** 8 kB, 4 kB, or 2 kB SRAM. &lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** Up to 42 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors. Number of GPIO pins is reduced for smaller packages and LPC11C22/C24. &lt;br /&gt;
** GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** High-current output driver (20 mA) on one pin.&lt;br /&gt;
** High-current sink drivers (20 mA) on two open drain pins.&lt;br /&gt;
** Four general purpose timers/counters with a total of four capture inputs and up to 13 match outputs. &lt;br /&gt;
** Programmable WatchDog Timer (WDT).&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** 10-bit ADC with input multiplexing among 8 pins.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** UART with fractional baud rate generation, internal FIFO, and RS-485 support. &lt;br /&gt;
** SPI controllers with SSP features and with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. &lt;br /&gt;
* Clock generation:&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** Programmable watchdog oscillator with a frequency range of 7.8 kHz to 1.8 MHz.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, and the Watchdog clock.&lt;br /&gt;
* Power control:&lt;br /&gt;
** Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
** Power profiles residing in boot ROM allowing to optimize performance and minimize power consumption for any given application through one simple function call. &lt;br /&gt;
** Processor wake-up from Deep-sleep mode via a dedicated start logic using up to 13 of the functional pins.&lt;br /&gt;
** Power-On Reset (POR). &lt;br /&gt;
** Brownout detect with four separate thresholds for interrupt and forced reset. &lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Single 3.3 V power supply (1.8 V to 3.6 V).&lt;br /&gt;
* Available in the following packages: 16WLCSP, 25WLCSP 20-SOIC, 20-TSSOP, 28-DIP, 28-TSSOP, 48-LQFP, 64-LQFP, 100-LQFP, and others.&lt;br /&gt;
&lt;br /&gt;
== LPC12xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC12xx ===&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
[[Bild:block.diagramM0_NXPSep2011.gif|thumb|right|850px|Blockdiagramm des Cortex-M0, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC12xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC12xx ===&lt;br /&gt;
&lt;br /&gt;
* Processor core&lt;br /&gt;
** ARM Cortex-M0 processor, running at frequencies of up to 45 MHz (one wait state from flash) or 30 MHz (zero wait states from flash). The LPC122x have a high score of over 45 in CoreMark CPU performance benchmark testing, equivalent to 1.51/MHz.&lt;br /&gt;
** ARM Cortex-M0 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug (SWD).&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory&lt;br /&gt;
** Up to 8 kB SRAM.&lt;br /&gt;
** Up to 128 kB on-chip flash programming memory. &lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
** Includes ROM-based 32-bit integer division routines.&lt;br /&gt;
* Clock generation unit&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** 12 MHz Internal RC (IRC) oscillator trimmed to 1 % accuracy that can optionally be used as a system clock.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, main clock, and Watchdog clock.&lt;br /&gt;
** Real-Time Clock (RTC).&lt;br /&gt;
* Digital peripherals&lt;br /&gt;
** Micro DMA controller with 21 channels.&lt;br /&gt;
** CRC engine.&lt;br /&gt;
** Two UARTs with fractional baud rate generation and internal FIFO. One UART with RS-485 and modem support and one standard UART with IrDA.&lt;br /&gt;
** SSP/SPI controller with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. I2C-bus pins have programmable glitch filter.&lt;br /&gt;
** Up to 55 General Purpose I/O (GPIO) pins with programmable pull-up resistor, open-drain mode, programmable digital input glitch filter, and programmable input inverter. &lt;br /&gt;
** Programmable output drive on all GPIO pins. Four pins support high-current output drivers.&lt;br /&gt;
** All GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** Four general purpose counter/timers with four capture inputs and four match outputs (32-bit timers) or two capture inputs and two match outputs (16-bit timers). &lt;br /&gt;
** Windowed WatchDog Timer (WWDT).&lt;br /&gt;
* Analog peripherals&lt;br /&gt;
** One 8-channel, 10-bit ADC.&lt;br /&gt;
** Two highly flexible analog comparators. Comparator outputs can be programmed to trigger a timer match signal or can be used to emulate 555 timer behavior.&lt;br /&gt;
* Power&lt;br /&gt;
** Three reduced power modes: Sleep, Deep-sleep, and Deep power-down.&lt;br /&gt;
** Processor wake-up from Deep-sleep mode via start logic using 12 port pins.&lt;br /&gt;
** Processor wake-up from Deep-power down and Deep-sleep modes via the RTC.&lt;br /&gt;
** Brownout detect with three separate thresholds each for interrupt and forced reset.&lt;br /&gt;
** Power-On Reset (POR).&lt;br /&gt;
** Integrated PMU (Power Management Unit).&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* 3.3 V power supply.&lt;br /&gt;
* Available as 64-pin and 48-pin LQFP package.&lt;br /&gt;
&lt;br /&gt;
== LPC13xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC13xx ===&lt;br /&gt;
[[Bild:LPC13xx_Selection_Guide_Sep2011.png|thumb|left|600px|Selection Guide zur LPC13xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
LPC1313 mit 32k-Flash mit 72MHz im LQFP 48 Gehäuse. Der LPC1313 ist bei &#039;&#039;&#039;[http://www.darisus.de/ Darius]&#039;&#039;&#039; erhältlich für 3,57 € (Juli 2016), oder elpro.org für 2,29 €.  Entwicklungskit INKLUSIVE JTAG-Programmer &amp;amp; Debugger bei &#039;&#039;&#039;[http://www.watterott.com/de/LPC1343-LPCXpresso-Board Watterott]&#039;&#039;&#039; für 23,80 € (Juli 2011)&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagram der LPC13xx Familie ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC13xx Block Diagram Sep2011.png|thumb|left|680px|Blockdiagramm der LPC13xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC1313 ===&lt;br /&gt;
* ARM Cortex-M3 processor, running at frequencies of up to 72 MHz.&lt;br /&gt;
* ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
* 32 kB on-chip flash programming memory.&lt;br /&gt;
* 8 kB SRAM.&lt;br /&gt;
* In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* UART with fractional baud rate generation, modem, internal FIFO, and RS-485/EIA-485 support.&lt;br /&gt;
* SSP controller with FIFO and multi-protocol capabilities.&lt;br /&gt;
* Additional SSP controller on LPC1313FBD48/01.&lt;br /&gt;
* I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode.&lt;br /&gt;
* Up to 42 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors.&lt;br /&gt;
* Four general purpose counter/timers with a total of four capture inputs and 13 match outputs.&lt;br /&gt;
* Programmable Watchdog Timer (WDT) &lt;br /&gt;
* System tick timer.&lt;br /&gt;
* Serial Wire Debug and Serial Wire Trace port.&lt;br /&gt;
* High-current output driver (20 mA) on one pin.&lt;br /&gt;
* High-current sink drivers (20 mA) on two I2C-bus pins in Fast-mode Plus.&lt;br /&gt;
* Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
* Three reduced power modes: Sleep, Deep-sleep, and Deep power-down.&lt;br /&gt;
* Single power supply (2.0 V to 3.6 V).&lt;br /&gt;
* 10-bit ADC with input multiplexing among 8 pins.&lt;br /&gt;
* GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
* Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, or the watchdog clock.&lt;br /&gt;
* Processor wake-up from Deep-sleep mode via a dedicated start logic using up to 40 of the functional pins.&lt;br /&gt;
* Brownout detect with four separate thresholds for interrupt and one thresholds for forced reset.&lt;br /&gt;
* Power-On Reset (POR).&lt;br /&gt;
* Integrated oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
* 12 MHz internal RC oscillator trimmed to 1 % accuracy over the entire temperature and voltage range that can optionally be used as a system clock.&lt;br /&gt;
* Programmable watchdog oscillator with a frequency range of 7.8 kHz to 1.8 MHz. System PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
* Code Read Protection (CRP) with different security levels.&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Available as 48-pin LQFP package and 33-pin HVQFN package.&lt;br /&gt;
&lt;br /&gt;
== LPC17xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC17xx ===&lt;br /&gt;
[[Bild:LPC17xx_Selection_Guide_Sep2011.png|thumb|left|680px|Selection Guide zur LPC17xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
LPC1754 mit 128K Flash im LQFP80, der bei &#039;&#039;&#039;[http://www.darisus.de/ Darius]&#039;&#039;&#039; für 7€74 (Juli/2011) erhältlich ist,[den LPC1751 (32k/8k) schon für 5€95] und bei Digikey für 6€35, den LPC1764FBD100 bei &#039;&#039;&#039;[http://www.tme.eu/de TME]&#039;&#039;&#039;    für 7€ Entwicklungskit INCLUSIVE JTAG-Programmer &amp;amp; Debugger bei &#039;&#039;&#039;[http://www.watterott.com/de/LPC1769-LPCXpresso Watterott]&#039;&#039;&#039; für 23€80 (Juli/2011)&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagram der LPC17xx Familie ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC177x_178x Block Diagram Sep2011.png|thumb|left|680px|Blockdiagramm der LPC17xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC1754 ===&lt;br /&gt;
* ARM Cortex-M3 processor, running at frequencies of up to 100 MHz &lt;br /&gt;
* A Memory Protection Unit (MPU) supporting eight regions is included.&lt;br /&gt;
* ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
* 128 kB on-chip flash program memory with In-System Programming (ISP) and In-Application Programming (IAP) capabilities. &lt;br /&gt;
* 32 kB of SRAM on the CPU with local code/data bus for high-performance CPU access.&lt;br /&gt;
* Eight channel General Purpose DMA controller &lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
* USB 2.0 full-speed controller that can be configured for either device, Host, or OTG operation with an on-chip PHY for device and Host functions &lt;br /&gt;
* Four UARTs with fractional baud rate generation, internal FIFO, IrDA, and DMA, Einer mit Modem I/Os und RS485 Support&lt;br /&gt;
* 1 CAN controller.&lt;br /&gt;
* 2 SSP controllers &lt;br /&gt;
* 1 SPI controller &lt;br /&gt;
* 2 I2C-bus interfaces with data rates of 1Mbit/s,&lt;br /&gt;
* I2S (Inter-IC Sound) &lt;br /&gt;
* 52  General Purpose I/O (GPIO) pins Any pin of ports 0 and 2 can be used to generate an interrupt.&lt;br /&gt;
* 8x 12-bit Analog-to-Digital Converter (ADC) conversion rates up to 200 kHz&lt;br /&gt;
* 1x 10-bit Digital-to-Analog Converter (DAC) &lt;br /&gt;
* Four general purpose timers/counters, with a total of eight capture inputs and ten compare outputs. &lt;br /&gt;
* One motor control PWM with support for three-phase motor control.&lt;br /&gt;
* Quadrature encoder interface that can monitor one external quadrature encoder.&lt;br /&gt;
* One standard PWM/timer block with external count input.&lt;br /&gt;
* Real-Time Clock (RTC) with a separate power domain including 20 bytes of battery-powered backup registers,  An RTC interrupt can wake up the CPU from any reduced power mode.&lt;br /&gt;
* Watchdog Timer (WDT). &lt;br /&gt;
* Cortex-M3 system tick timer&lt;br /&gt;
* Repetitive interrupt timer &lt;br /&gt;
* Standard JTAG test/debug interface as well as Serial Wire Debug and Serial Wire Trace Port options.&lt;br /&gt;
* Four reduced power modes: Sleep, Deep-sleep, Power-down, and Deep power-down.&lt;br /&gt;
* Single 3.3 V power supply (2.4 V to 3.6 V). &lt;br /&gt;
* Four external interrupt inputs configurable as edge/level sensitive. All pins on PORT0 and PORT2 can be used as edge sensitive interrupt sources.&lt;br /&gt;
* Non-maskable Interrupt (NMI) input.&lt;br /&gt;
* Wakeup Interrupt Controller (WIC) &lt;br /&gt;
* Each peripheral has its own clock divider for further power savings.&lt;br /&gt;
* Brownout detect with separate threshold for interrupt and forced reset.&lt;br /&gt;
* On-chip Power-On Reset (POR).&lt;br /&gt;
* On-chip crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
* 4 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
* An on-chip PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the main oscillator, the internal RC oscillator, or the RTC oscillator.&lt;br /&gt;
* Available as 80-pin LQFP (12 x 12 x 1.4 mm) packages.&lt;br /&gt;
&lt;br /&gt;
== LPC18xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC18xx ===&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC18xx Familie ===&lt;br /&gt;
[[Bild:block.diagram_NXP18xx Sep2011.gif|thumb|left|680px|Blockdiagramm der LPC18xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC18xx ===&lt;br /&gt;
DRAFT!&lt;br /&gt;
* Processor core&lt;br /&gt;
** ARM Cortex-M3 processor, running at frequencies of up to 180 MHz.&lt;br /&gt;
** ARM Cortex-M3 built-in Memory Protection Unit (MPU) supporting eight regions.&lt;br /&gt;
** ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Non-maskable Interrupt (NMI) input.&lt;br /&gt;
** JTAG and Serial Wire Debug, serial trace, eight breakpoints, and four watch points.&lt;br /&gt;
** ETM and ETB support.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* On-chip memory (flashless parts LPC1850/30/20/10)&lt;br /&gt;
** Up to 200 kB SRAM total for code and data use.&lt;br /&gt;
** Two 32 kB SRAM blocks with separate bus access. Both SRAM blocks can be powered down individually.&lt;br /&gt;
** 64 kB ROM containing boot code and on-chip software drivers.&lt;br /&gt;
** 32-bit One-Time Programmable (OTP) memory for general-purpose customer use.&lt;br /&gt;
* On-chip memory (parts with on-chip flash)&lt;br /&gt;
** Up to 1 MB total dual bank flash memory with flash accelerator.&lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
** Up to 136 kB SRAM for code and data use.&lt;br /&gt;
** Two 32 kB SRAM blocks with separate bus access. Both SRAM blocks can be powered down individually.&lt;br /&gt;
** 32 kB ROM containing boot code and on-chip software drivers.&lt;br /&gt;
** 32-bit One-Time Programmable (OTP) memory for general-purpose customer use.&lt;br /&gt;
* Clock generation unit&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1 % accuracy.&lt;br /&gt;
** Ultra-low power RTC crystal oscillator.&lt;br /&gt;
** Three PLLs allow CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. The second PLL is dedicated to the High-speed USB, the third PLL can be used as audio PLL.&lt;br /&gt;
** Clock output.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** Quad SPI Flash Interface (SPIFI) with four lanes and data rates of up to 40 MB per second total.&lt;br /&gt;
** 10/100T Ethernet MAC with RMII and MII interfaces and DMA support for high throughput at low CPU load. Support for IEEE 1588 time stamping/advanced time stamping (IEEE 1588-2008 v2).&lt;br /&gt;
** One High-speed USB 2.0 Host/Device/OTG interface with DMA support and on-chip PHY.&lt;br /&gt;
** One High-speed USB 2.0 Host/Device interface with DMA support, on-chip full-speed PHY and ULPI interface to external high-speed PHY.&lt;br /&gt;
** USB interface electrical test software included in ROM USB stack.&lt;br /&gt;
** Four 550 UARTs with DMA support: one UART with full modem interface; one UART with IrDA interface; three USARTs support synchronous mode and a smart card interface conforming to ISO7816 specification.&lt;br /&gt;
** Two C_CAN 2.0B controllers with one channel each.&lt;br /&gt;
** Two SSP controllers with FIFO and multi-protocol support. Both SSPs with DMA support.&lt;br /&gt;
** One Fast-mode Plus I2C-bus interface with monitor mode and with open-drain I/O pins conforming to the full I2C-bus specification. Supports data rates of up to 1 Mbit/s.&lt;br /&gt;
** One standard I2C-bus interface with monitor mode and standard I/O pins.&lt;br /&gt;
** Two I2S interfaces with DMA support, each with one input and one output.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** External Memory Controller (EMC) supporting external SRAM, ROM, NOR flash, and SDRAM devices.&lt;br /&gt;
** LCD controller with DMA support and a programmable display resolution of up to 1024H x 768V. Supports monochrome and color STN panels and TFT color panels; supports 1/2/4/8 bpp CLUT and 16/24-bit direct pixel mapping.&lt;br /&gt;
** SD/MMC card interface.&lt;br /&gt;
** Eight-channel General-Purpose DMA (GPDMA) controller can access all memories on the AHB and all DMA-capable AHB slaves.&lt;br /&gt;
** Up to 80 General-Purpose Input/Output (GPIO) pins with configurable pull-up/pull-down resistors and open-drain modes. &lt;br /&gt;
** GPIO registers are located on the AHB for fast access. GPIO ports have DMA support.&lt;br /&gt;
** State Configurable Timer (SCT) subsystem on AHB.&lt;br /&gt;
** Four general-purpose timer/counters with capture and match capabilities.&lt;br /&gt;
** One motor control PWM for three-phase motor control.&lt;br /&gt;
** One Quadrature Encoder Interface (QEI).&lt;br /&gt;
** Repetitive Interrupt timer (RI timer).&lt;br /&gt;
** Windowed watchdog timer.&lt;br /&gt;
** Ultra-low power Real-Time Clock (RTC) on separate power domain with 256 bytes of battery powered backup registers.&lt;br /&gt;
** Alarm timer; can be battery powered.&lt;br /&gt;
* Digital peripherals available on flash-based parts LPC18xx only:&lt;br /&gt;
** &amp;lt;tbd&amp;gt;&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** One 10-bit DAC with DMA support and a data conversion rate of 400 kSamples/s.&lt;br /&gt;
** Two 10-bit ADCs with DMA support and a data conversion rate of 400 kSamples/s.&lt;br /&gt;
* Security:&lt;br /&gt;
** Hardware-based AES security engine programmable through an on-chip API.&lt;br /&gt;
** Two 128-bit secure OTP memories for AES key storage and customer use.&lt;br /&gt;
** Unique ID for each device.&lt;br /&gt;
* Power: &lt;br /&gt;
** Single 3.3 V (2.2 V to 3.6 V) power supply with on-chip internal voltage regulator for the core supply and the RTC power domain.&lt;br /&gt;
** RTC power domain can be powered separately by a 3 V battery supply.&lt;br /&gt;
** Four reduced power modes: Sleep, Deep-sleep, Power-down, and Deep power-down.&lt;br /&gt;
** Processor wake-up from Sleep mode via wake-up interrupts from various eripherals. &lt;br /&gt;
** Wake-up from Deep-sleep, Power-down, and Deep power-down modes via external interrupts and interrupts generated by battery powered blocks in the RTC power domain.&lt;br /&gt;
** Brownout detect with four separate thresholds for interrupt and forced reset.&lt;br /&gt;
** Power-On Reset (POR).&lt;br /&gt;
* Available as 100-pin, 144-pin, and 208-pin LQFP packages and as 100-pin, 180-pin, and 256-pin LBGA packages.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
=== LPCWare (kostenlos) ===&lt;br /&gt;
[[Bild:lpcxpresso-debug_Code-red_3Sep2011.gif|thumb|right|680px|Ansicht der Entwicklungsumgebung, ©code-red-tech.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Entwicklungs Tool ====&lt;br /&gt;
(Beschreibung aus der Web-Site:)&lt;br /&gt;
LPCXpresso&#039;s IDE (Ursprünglich von &amp;quot;Code RED&amp;quot; entwickelt, die Firma wurde 2013 von LPC gekauft) ist eine hoch integrierte Entwicklungsumgebung für LPC-Controller, und beinhaltet alle zur Entwicklung erforderlichen Tools um hoch qualitative Software in einer angemessenen Zeit zu schreiben. LPCXpresso basiert auf ein vereinfachtes Eclipse mit vielen LPC-specifischen Erweiterungen.&lt;br /&gt;
Des Weiteren ist eine aktuelle Version der Industrie-Standard GNU Tool-Chain mit einer propritären und optimierten C-Lib mit dabei. Die LPCXpresso IDE stellt ein voll optimiertes Executable zur Verfügung. Die einzige Beschränkung der kostenlosen Version ist eine Limitierung auf 256kB Code nach erfolgter Registrierung.&lt;br /&gt;
Das LPCXpresso Target Board ist eine Gemeinschaftsentwicklung von Embedded Artists, Code Red und NXP.&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
Die LPCXpresso IDE stellt eine C-Umgebung mit Syntax-Colouring, Source-Formatierung, Funktions-Folding, sowie mit Online- und Offline Hilfe und umfangreichen Projekt-Management Funktionen zur Verfügung.  &lt;br /&gt;
Dies beinhaltet:&lt;br /&gt;
* Wizards um Projekte für alle unterstützten Controller zu erstellen &lt;br /&gt;
* Automatische Linker Script Generierung inklusive Memory-Map Unterstützung &lt;br /&gt;
* Programmierung des Controllers&lt;br /&gt;
* On-Line Debugging&lt;br /&gt;
* Datenblatt-Zugriff über eingebauten Browser&lt;br /&gt;
* Support für die NXP LPC Microcontroller Familien, von Cortex-M0, Cortex-M3 bis Cortex-M4 und ARM7 bis ARM9&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Peripherie und Register Views im Debugger ====&lt;br /&gt;
Der Peripherie-Viewer im integrierten Debugger zeigt alle Register und Bit-Felder in einer einfachen Baumstruktur.&lt;br /&gt;
Ein Prozessor-Register Viewer erlaubt den Zugriff auf alle Prozessor-Register und stellt eine &amp;quot;Smart-Formatting&amp;quot;  Funktion zur Verfügung um komplexe Register wie Flags oder Status Register übersichtlich darstellen zu können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Unterstützte Familien ====&lt;br /&gt;
Cortex-M0, Cortex-M3, Cortex-M4, Einzelne Controller aus der LPC2000 family, ARM966, ARM926-EJ, ARM926-EJ + VFP&lt;br /&gt;
&lt;br /&gt;
==== Sehr preiswerter USB_JTAG_SWD Debugger ====&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 (PDF)]&#039;&#039;&#039; und diese &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso Beschreibung]&#039;&#039;&#039;&lt;br /&gt;
Der neue Programmer/Debugger ist hier für ca 18€ +P&amp;amp;P erhältlich &#039;&#039;&#039;[http://www.watterott.com/de/LPC-Link-2 Programmer]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Standard Library ====&lt;br /&gt;
Im Download der &amp;quot;Code Red&amp;quot; Entwicklungsumgebung ist eine relativ umfangreiche Firmwarebibliothek vorhanden.&lt;br /&gt;
&lt;br /&gt;
==== Installationsanleitung zur IDE ====&lt;br /&gt;
&#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Codebase für LPC11xx und LPC13xx ====&lt;br /&gt;
Für die Cortex-M0 und -M3 Familien existieren verschiedene Basispakete die als Startausstattung sehr gut geeignet sind. Auf microbuilder.eu findet man eine sehr interessante Version inklusive Dokumentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx HIER]&#039;&#039;&#039; findet man alle Links zur original Codebase mit allen Dateien (Stand Januar 2012) aber auch eine deutsche Übersetzung zu den Files.&lt;br /&gt;
&lt;br /&gt;
=== CooCox ===&lt;br /&gt;
&lt;br /&gt;
Auf der &#039;&#039;&#039;[http://www.coocox.org/Index.html Homepage]&#039;&#039;&#039; von CooCox - einem chinesischen Open-Source Projekt, auf der eine IDE für Atmel, Energy Micro, Holtek, Nuvoton, ST, TI und NXP verfügbar ist  - findet man die auf Eclipse basierende &amp;quot;CooCox CoIDE&amp;quot;, die sich aus dem &amp;quot;CoBuilder&amp;quot; und dem &amp;quot;CoDebugger&amp;quot; zusammensetzt.&lt;br /&gt;
Des Weiteren bietet man dort ein Echtzeit-Multitasking Betriebssystem, sowie SW-Versionen von zwei unterschiedliche Debugging-Adapter und ein Stand-alone Flash-Tool zum freien Download an.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Controller können damit programmiert und debugged werden:&lt;br /&gt;
    LPC1111x101    LPC1111x201   LPC1112x101   LPC1112x201&lt;br /&gt;
    LPC1113x201    LPC1113x301   LPC1114x201   LPC1114x301&lt;br /&gt;
    LPC11C14x301   LPC11C12x301&lt;br /&gt;
    LPC1224x101    LPC1224x121   LPC1225x301   LPC1225x321   LPC1226x301  LPC1227x301&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LPC1311   LPC1313   LPC1342   LPC1343&lt;br /&gt;
    LPC1751   LPC1752   LPC1754   LPC1756   LPC1758   LPC1759&lt;br /&gt;
    LPC1763   LPC1764   LPC1765   LPC1766   LPC1767   LPC1768   LPC1769&lt;br /&gt;
&lt;br /&gt;
=== EmBlocks ===&lt;br /&gt;
&#039;&#039;&#039;[http://www.emblocks.org/web/ Emblocks]&#039;&#039;&#039; ist eine kostenlose Entwicklungsumgebung. Sie unterstützt neben NXP uC weitere ARM uC (STM32, EFM32) sowie PIC, AVR und MSP430. Die IDE hat einen eingebauten GDB Debugger welcher System view (Peripherie Register anzeigen) beim Debuggen unterstützt. Ausserdem gibt es einen Project Wizzard für NXP uC &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Unterstützt wird der JLINK mit folgenden NXP uC:&lt;br /&gt;
LPC11Axx, LPC11Exx, LPC11Uxx, LPC11xxLV, LPC12xx, LPC13Uxx, LPC13xx, LPC17xx, LPC18xx, LPC18xx, LPC177x_8x, LPC407x_8x&lt;br /&gt;
&lt;br /&gt;
=== Codebase ===&lt;br /&gt;
Des Weiteren existiert eine umfangreiche Sammlung von &#039;&#039;&#039;[http://www.coocox.org/NXP-Series.php Code-Beispielen]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Keil ===&lt;br /&gt;
[https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM] (Windows, Free Version auf 32KB begrenzt, mit vielen Beispielen zu div. Evaluation Boards) &lt;br /&gt;
*[http://www.keil.com/arm/chips.asp unterstützte Mikrocontroller]&lt;br /&gt;
=== WinARM ===&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;
=== GNUARM ===&lt;br /&gt;
[http://gnuarm.com/ GNUARM] (Linux, Windows, wird derzeit nicht gepflegt), &lt;br /&gt;
&lt;br /&gt;
=== Yagarto ===&lt;br /&gt;
[http://www.yagarto.de/ Yagarto] (Windows, mit Eclipse-Integration) &lt;br /&gt;
&lt;br /&gt;
=== CodeSourcery ===&lt;br /&gt;
[http://www.codesourcery.com/gnu_toolchains/arm CodeSourcery CodeBench Lite]&lt;br /&gt;
&lt;br /&gt;
== CMSIS  -  Standard für alle Plattformen ==&lt;br /&gt;
Der Cortex Microcontroller Software Interface Standard (CMSIS) stellt einen &amp;quot;abstraction layer&amp;quot; für alle Cortex-Mx Controller zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
CMSIS stellt einen Schnittstellenstandard von ARM dar, der von vielen Tool-Herstellern unterstützt wird und ist (laut verschiedener Berichte)  kompatibel mit den verschiedensten Compilern (incl GCC). Dies wird erreicht durch einheitliche Definitionen für Adressen und Namen die den Zugriff auf die Register des Cores und der Peripherie ermöglichen.&lt;br /&gt;
Auch Standard-Funktionen für den Start und die Interrupts stehen zur Verfügung.&lt;br /&gt;
Natürlich kann auch weiterhin direkt auf die HW zugegriffen werden, es geht nur um eine Vereinheitlichung von identischen Funktionen. &lt;br /&gt;
Da die Peripherie-Teile zumindest innerhalb eines Halbleiterherstellers für die Cortex-Mx Controller sehr ähnlich oder sogar weitgehend identisch sind kann deutlich mehr SW für verschiedene Derivate innerhalb dieser Prozessorfamilien wiederverwendet werden.  (siehe Google: &amp;quot;CMSIS_Doulos_Tutorial.pdf&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Ein weiterer, interessanter Punkt ist die CMSIS-DSP Lib mit ihren Vektorfunktionen, Matrix-Berechnung sowie komplexen Algorithmen für Filter, &lt;br /&gt;
Regler und Fourietransformation sowie weiterer DSP Algorithmen (insgesamt 61).&lt;br /&gt;
&lt;br /&gt;
Leider hat diese Kompatibilität auch ihre Grenzen, denn Sonderfunktionen bzw. Spezialitäten in der &amp;quot;gleichen&amp;quot; Peripherie zwischen unterschiedlichen Halbleiterherstellern werden nicht abgedeckt. &lt;br /&gt;
Wäre auch zu schön, wenn die Prozesorhersteller dem Entwickler dadurch einen fliegenden HW-Wechsel bzw. eine einfache Vergleichbarkeit ermöglichen würden ;-)&lt;br /&gt;
&lt;br /&gt;
Eine komplette CMSIS-Lib (V2.0) &amp;quot;Cortex Microcontroller Software Interface Standard&amp;quot; ist für das &amp;quot;Code Red&amp;quot; Paket verfügbar, inklusive einer &amp;quot;DSP-Library&amp;quot; &lt;br /&gt;
http://support.code-red-tech.com/CodeRedWiki/NewInVersion4&lt;br /&gt;
bzw. für GNU / Keil / IAR unter&lt;br /&gt;
http://ics.nxp.com/support/documents/microcontrollers/?search=CMSIS&amp;amp;type=software&amp;amp;Search.x=8&amp;amp;Search.y=12&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* Wiki&lt;br /&gt;
** &#039;&#039;&#039;[[LPC1xxx_Entwicklungskit_LPCXpresso]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Codebase_f%C3%BCr_LPC1xxx]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[LPC1xxx für Umsteiger]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Projekte&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/264089 FreeRTOS auf LPC1768]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/321481 Multithreading auf LPC8xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/319537 Python Script zum Flashen des LPC8xx]&lt;br /&gt;
&lt;br /&gt;
* Suche im Forum&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC8* LPC8xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC11* LPC11xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC11* LPC11xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC12* LPC12xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC13* LPC13xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC17* LPC17xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC18* LPC18xx]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
(Die Preiswertesten sind &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt)&lt;br /&gt;
* &#039;&#039;&#039;[http://darisusgmbh.de/shop/advanced_search_result.php?keywords=LPC1&amp;amp;x=0&amp;amp;y=0 Darisus]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[http://www.elpro.org/shop/shop.php elpro]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.hbe-shop.de HBE] &lt;br /&gt;
* [http://www.tme.eu/de/katalog#cleanParameters%3D1%26searchClick%3D1%26search%3DLPC1%26bf_szukaj%3D+ TME]&lt;br /&gt;
* [http://www.tn-electronics.de/advanced_search_result.php?keywords=LPC1&amp;amp;x=0&amp;amp;y=0 TN]&lt;br /&gt;
* [http://de.mouser.com/_/?Keyword=LPC1&amp;amp;Ns=Pricing|0&amp;amp;FS=True Mouser]&lt;br /&gt;
* [http://www.soselectronic.eu/?searchstring=LPC1&amp;amp;str=378 SOS]&lt;br /&gt;
* [http://de.farnell.com Farnell/Element14]&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;page_action=query&amp;amp;desc=off&amp;amp;sdesc=on&amp;amp;keywords=LPCXpresso Watterott (24€ inclusive JTAG-Programmiergerät UND JTAG Debugger für kostenlose &amp;quot;Code-Red&amp;quot; Entwicklungsplattform)], dazu hier die [[LPC1xxx_Entwicklungskit_LPCXpresso|Beschreibung]]&lt;br /&gt;
* [http://www.lpctools.com/evaluationboardskitsforlpc17xx.aspx LPC-Tools]&lt;br /&gt;
* [http://thinkembedded.ch/NXP:::25.html thinkembedded.ch] div. Olimex Boards&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://www.nxp.com/#/page/content=[f=/dynamic/applicationnotes/tid-50809_sid-56890/data.xml] Appnotes&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html Projects]&lt;br /&gt;
* [http://mbed.org/handbook/Homepage MBED]&lt;br /&gt;
* [http://forums.nxp.com/forums/viewforum.php?f=1 NXP-WIKI]&lt;br /&gt;
* [http://knowledgebase.nxp.com/forumdisplay.php?s=389a3610c741bca7b18221d32b9c0ce0&amp;amp;f=4 NXP-Forum]&lt;br /&gt;
* [http://ics.nxp.com/lpcxpresso/ LPCXpresso]&lt;br /&gt;
* [http://code.google.com/p/32bitmicro/ 32BitMicro]&lt;br /&gt;
* [http://www.brc-electronics.nl SimpleCortex]&lt;br /&gt;
* [http://www.lpcware.com/ LPCWare NXP MCU community]&lt;br /&gt;
* [http://nanohome.be/nxp/index.html LPC175/6x und LPC23xx pin Configurator]&lt;br /&gt;
* [https://code.google.com/p/lpc-1768-arm-synthesizer/  MIDI controlled monophonic synthesizer based on the LPCXpresso 1768.]&lt;br /&gt;
* [https://code.google.com/p/lpc1343codebase/  An open source software library for NXP&#039;s Cortex-M3 based LPC1300 microcontroller family]&lt;br /&gt;
* [https://code.google.com/p/lpc1114codebase/   An open source software library for NXP&#039;s Cortex-M0 based LPC1100 microcontroller family]&lt;br /&gt;
* [https://code.google.com/p/lpc-12xx-bootloader/  A flexible bootloader for use with LPC12xx Microcontrollers from NXP, Firmware code is AES128 encrypted to secure your project / source code when giving out public firmware updates. ]&lt;br /&gt;
* [https://code.google.com/p/lpcxpresso-rc/   Read receiver and sensor signals for radio controlled model aircrafts configured for LPCXpresso]&lt;br /&gt;
* [https://code.google.com/p/olpcx/   Open toolset for LPCXpresso]&lt;br /&gt;
* [https://code.google.com/p/32bitmicro/   Collection of code and tools for 32 bit microcontrollers]&lt;br /&gt;
* [https://code.google.com/p/my-nxp-lpc1114/   my-nxp-lpc1114 study course]&lt;br /&gt;
* [https://code.google.com/p/nxp-lpc/   nxp-lpc]&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsplattformen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.lpcware.com/lpcxpresso/home LPDXpresso Download (Kostenlos mit Debugger)]&lt;br /&gt;
* [http://www.lpcware.com LPCXpresso Homepage]&lt;br /&gt;
* [http://support.code-red-tech.com/CodeRedWiki/WikiHome CR-WIKI]&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp ARM/Keil MDK-ARM]&lt;br /&gt;
* IAR EWARM&lt;br /&gt;
* Rowley Crossworks&lt;br /&gt;
* Green Hills Software &lt;br /&gt;
* [http://www.coocox.org/CooCox_CoIDE.htm CooCox] (Kostenlos)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:LPC1x]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LPC-Mikrocontroller&amp;diff=95410</id>
		<title>LPC-Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LPC-Mikrocontroller&amp;diff=95410"/>
		<updated>2017-03-03T14:42:39Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Tabelle überarbeitet und sortierbar gemacht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:overview_Sep2011.png|thumb|right|850px|Überblick über die aktuelle Cortex M0/3 Familie, ©NXP.com]]&lt;br /&gt;
[[Bild:positioning_NXPSep2011.gif|thumb|right|850px|Vergleich über die aktuelle Cortex M0/3 Familie, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
Die LPC-Familie von NXP basiert auf 32-Bit Cortex-Kernen von ARM und arbeitet mit bis zu 204MHz. Die verschiedenen Serien basieren auf den Cortex-M0/M0+/M3/M4-Kernen und sind inzwischen auch für Privatnutzer zu Preisen erhältlich, die mit denen von 8-Bit-Mikrocontrollern vergleichbar sind. Eine Auflistung der verschiedenen Typen findet sich in der Tabelle unten.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind preiswerte Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG Programmer und Debugger oder den neuen LPC-Link2, ein reiner Programmer + Debugger) erhältlich z.B. bei [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]. Siehe dazu auch die Dokumentation von NXP zu den [http://www.nxp.com/documents/leaflet/75016842.pdf LPCXpresso-Entwicklungskits (PDF)] und diese [[LPC1xxx Entwicklungskit LPCXpresso]].&lt;br /&gt;
&lt;br /&gt;
== Vergleich aller Typen ==&lt;br /&gt;
&#039;&#039;Stand Feb. 2017&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; class=&amp;quot;unsortable&amp;quot;                               | &lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | CPU&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | Max. Frequency&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | Flash&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | SRAM&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;                      | Voltage&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; class=&amp;quot;unsortable&amp;quot;   | Features&lt;br /&gt;
|-&lt;br /&gt;
| LPC800&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2&amp;quot;              | Cortex-M0+&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;30&amp;quot;             | 30MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;8&amp;quot;              | 8-32kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1&amp;quot;              | 1-8kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1.8&amp;quot;            | 1.8-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
SCTimer/PWM,&lt;br /&gt;
Switch Matrix,&lt;br /&gt;
Pattern Match Engine&lt;br /&gt;
|-&lt;br /&gt;
| LPC54000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | Cortex-M4&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;180&amp;quot;            | 180MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;128&amp;quot;            | 128-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;96&amp;quot;             | 96-200kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1.62&amp;quot;           | 1.62-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
LCD,&lt;br /&gt;
Ethernet,&lt;br /&gt;
FlexComm,&lt;br /&gt;
Security&lt;br /&gt;
|-&lt;br /&gt;
| LPC1100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1&amp;quot;              | Cortex-M0/M0+&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;50&amp;quot; | 50MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | 4-256kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1&amp;quot;              | 1-36kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1.71&amp;quot;           | 1.71-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| LPC1200&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;0&amp;quot;              | Cortex-M0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;32&amp;quot;             | 32-128kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | 4-8kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;1.8&amp;quot;            | 1.8-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
8 kV protection,&lt;br /&gt;
IEC 60730 Class B certified&lt;br /&gt;
|-&lt;br /&gt;
| LPC1300&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;3&amp;quot;  | Cortex-M3&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;72&amp;quot; | 72MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;8&amp;quot;              | 8-64kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | 4-12kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2.0&amp;quot;            | 2.0-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB&lt;br /&gt;
|-&lt;br /&gt;
| LPC1500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;64&amp;quot;             | 64-256kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;12&amp;quot;             | 12-36kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2.4&amp;quot;            | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
QEI&lt;br /&gt;
|-&lt;br /&gt;
| LPC1700&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;120&amp;quot;            | 120MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;                | 32-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;8&amp;quot;              | 8-96kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2.4&amp;quot;            | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
QEI&lt;br /&gt;
|-&lt;br /&gt;
| LPC1800&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;180&amp;quot;            | 180MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;512&amp;quot;            | Flashless, &lt;br /&gt;
512kB-1MB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;104&amp;quot;            | 104-200kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2.4&amp;quot;            | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
Dual HS USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
Security&lt;br /&gt;
|-&lt;br /&gt;
| LPC4000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | Cortex-M4&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;120&amp;quot;            | 120MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;64&amp;quot;             | 64-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;24&amp;quot;             | 24-96kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2.4&amp;quot;            | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD&lt;br /&gt;
|-&lt;br /&gt;
| LPC4300&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;4&amp;quot;              | Cortex-M4&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;240&amp;quot;            | 204MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;512&amp;quot;            | Flashless,&lt;br /&gt;
512kB-1MB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;104&amp;quot;            | 104-282kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; data-sort-value=&amp;quot;2.4&amp;quot;            | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot;                                  | &lt;br /&gt;
Dual HS USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
SGPIO,&lt;br /&gt;
Security&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;: gibt es auch als Mehrkern-Prozessoren (mit 0/1/2 Cortex-M0(+)-Cores)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Informationen ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos + User-Manuals==&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC8xx (Cortex-M0+) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://www.nxp.com/products/microcontrollers/cortex_m0_m0/series/LPC800.html#quickreference LPC8xx]&#039;&#039;&#039; ist nur in Packages mit einer relativ niedrigen Pinanzahl (DIP8, SO20, TSSOP16, TSSOP20) verfügbar, hat zwischen 4-16kB Flash, und 1-4kB RAM. Die zulässige Betriebsspannung liegt zwischen 1,8V und 3,6V.&lt;br /&gt;
&lt;br /&gt;
Überblick über die Features der LPC800-Serie: &lt;br /&gt;
* 1 I2C&lt;br /&gt;
* 1-2 SSP&lt;br /&gt;
* 2-3 UART&lt;br /&gt;
* 4 Timer,  1 OS-Timer&lt;br /&gt;
* 1 watch dog&lt;br /&gt;
* 4 PWM-Einheiten&lt;br /&gt;
* 10-bit ADC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/download/grouping/11045/user_manual User Manual der LPC8-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC11xx (Cortex-M0) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc11xx/ LPC11xx-Serie]&#039;&#039;&#039; (3,3V) bietet viele Möglichkeiten&lt;br /&gt;
* Der LPC1100L ist derzeit laut NXP (Sep2011) der preisgünstigste ARM auf dem Markt. Der 32Bit ARM mit einer Performance von ca. 45DMIPS @50MHZ benötigt bei dieser Taktfrequenz nur etwa 10mA. (Details siehe NXP-Seite)&lt;br /&gt;
&lt;br /&gt;
* Überblick über die Features :&lt;br /&gt;
** LPC1100 Serie: • I2C, SSP, UART, GPIO, • Timers and watch dog timer, • 10-bit ADC, • Flash/SRAM memory, • Weitere Funktionen, siehe &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/LPC1xxx#Features_eines_LPC11xx 2.3 Features]&#039;&#039;&#039;&lt;br /&gt;
** LPC1100L Serie zusätzlich zu LPC1100: • Power Profile mit lower power consumption in Active- und Sleep-mode, • Interne pull-ups auf VDD level, • Programmierbarer pseudo open-drain mode für GPIO Pins, • WWDT mit Clock Source Lock.&lt;br /&gt;
**LPC11C00 Serie zusätzlich zu LPC1100: • CAN controller, • On-chip CAN Treiber, • On-chip CAN Transceiver (LPC11C2x), • WDT (not windowed) mit Clock Source Lock.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10398.pdf User Manual der LPC11-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Besonderes Augenmerk möchte ich auf die neue Serie  &#039;&#039;&#039;[http://www.nxp.com/ps/#/i=71498 LPC111xFD]&#039;&#039;&#039; legen, denn in jetzt gibt es den Cortex-M0 auch im DIL 28 &#039;&#039;&#039;[http://www.nxp.com/redirect/pip/LPC1114FN28.html den LPC1114FN28]&#039;&#039;&#039;&lt;br /&gt;
**Des Weiteren sind damit SO20, sowie TSSOP20 und TSSOP28 Bauformen verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC12xx (Cortex-M0) ===&lt;br /&gt;
* Die Low Power &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc12xx/ LPC12xx-Serie]&#039;&#039;&#039; (3,3V) ist laut NXP (Sep2011) ein Cortex-M0 mit 32 bis 128kB Flash, einem 45 CoreMark™ Benchmark-Score bei 30MHz, 2 bis 8kB SRAM, und einem internen 1% genauen 12MHz Oscillator.&lt;br /&gt;
&lt;br /&gt;
* Überblick über die Features: fMAX von 30MHz, 1 10-Bit  ADC mit 8 Kanälen, 2 Comparatoren, 2 UARTs, 1 SSP/SPI, 1 I2C, DMA Controller, CRC Engine, 1 32-Bit, 5 Timer (16- und 32-Bit, + RTC), 13 PWM Kanäle, bis zu 55 GPIOs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10441.pdf User Manual der LPC12xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC13xx (Cortex-M3) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc13xx/ LPC13xx-Serie]&#039;&#039;&#039; (3,3V) bietet im LQFP 48 Gehäuse 8..32k Flash, 2..8k SRAM, 5 Timer (mit WD), 11 PWM, 1 UART, 1IIC, 1USB, 1..2 SPI, einen 8-Kanal/10Bit AD-Wandler und eine Taktfrequenz von max. 72MHz. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10375.pdf User Manual der LPC13xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC17xx (Cortex-M3) ===&lt;br /&gt;
Die &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc17xx/ LPC17xx-Serie]&#039;&#039;&#039; hingegen enthält eine weit größere Peripherie in einem LQFP80/100/144/208 Package.&lt;br /&gt;
32..512k Flash, 8..96k SRAM, 6 Timer (mit WD), 6 zusätzliche PWM-Einheiten, teilweise Ethernet und STN/TFT-LCD-Controller, meist USB (teilw. mit Host+OTG), 4 UART, 2..3IIC, 1..2 CAN, 1 SPI, 2 SSP/SPI einen 6..8-Kanal/12Bit AD-Wandler, einen 10Bit DAC, Motor-Control-Einheiten, einen Encoder-Eingang und eine Taktfrequenz von max. 100MHz(120MHz) und vieles mehr. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10360.pdf User Manual der LPC17xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC18xx (Cortex-M3) ===&lt;br /&gt;
Die &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc18xx/ LPC18xx-Serie]&#039;&#039;&#039; stellt DIE &amp;quot;High-Performance&amp;quot; Controller aus der Cortex-M3-Serie. Die Taktfrequenz geht bis 150MHz, die Controller enthalten große dual-Bank Flash Speicher bis zu 1MB, ein großes On-Chip SRAM mit bis zu 200KB, zusätzliche Peripherie wie z.B. SPI Flash Interface (SPIFI) und State Configurable Timer (SCT), 2x High Speed USB (1x mit On-Chip HS PHY) und eine MPU.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://ics.nxp.com/support/documents/microcontrollers/pdf/user.manual.lpc18xx.pdf User Manual der LPC18xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblick über die Features: &#039;&#039;&#039;[http://ics.nxp.com/literature/leaflets/microcontrollers/pdf/lpc18xx.pdf LPC18xx Flyer von NXP]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungskits ===&lt;br /&gt;
Von NXP sind &amp;lt;u&amp;gt;sehr preiswerte&amp;lt;/u&amp;gt; Entwicklungskits (ca. 25€ für. 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 (PDF)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Kostenlose Entwicklungsumgebung für ALLE hier genannten Controller ===&lt;br /&gt;
Für die ganze Prozessorfamilie ist eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; Entwicklungsumgebung  erhältlich. Informationen unter &#039;&#039;&#039;[http://www.lpcware.com/lpcxpresso/home  lpcware]&#039;&#039;&#039;: Die auf Eclipse basierende Entwicklungsumgebung ist nach der Installation bis 8k freigeschaltet und nach einer einfachen und kostenlosen Registrierung für 256kB. Die IDE ist auch für &#039;&#039;&#039;[http://www.lpcware.com/lpcxpresso/home Linux und Mac]&#039;&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
Hier die &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== LPC8xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC8xx ===&lt;br /&gt;
Bezugsquellen und Preise (Stand 06/2016)&lt;br /&gt;
* LPC810FN8 (DIP8): Digikey 1,09 € (bei einem Stuck).&lt;br /&gt;
* LPC812JD20 (SOIC-W 20): Digikey 1,26 € (bei einem Stuck).&lt;br /&gt;
* LPC812JDH20 (TSSOP-20): Digikey 1,44 € (bei einem Stuck).&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC800_block_diagram_Jan2014.gif|thumb|right|850px|Blockdiagramm des Cortex-M0+, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC8xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC8xx ===&lt;br /&gt;
* System:&lt;br /&gt;
** ARM Cortex-M0+ processor, running at frequencies of up to 30 MHz. &lt;br /&gt;
** single cycle multiplier&lt;br /&gt;
** single cycle I/O port&lt;br /&gt;
** ARM Cortex-M0+ built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug, Micro Trace Buffer supported.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory:&lt;br /&gt;
** 16 kB (LPC812M101JD20/LPC812M101JDH20/LPC812M101JDH16), 8 kB (LPC811M001JDH16) or 4kB (LPC810M021FN8) on-chip flash programming memory. &lt;br /&gt;
**  4kB, 2 kB, or 1 kB SRAM.&lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** Up to 18 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors. Number of GPIO pins is reduced for smaller packages down to 6.&lt;br /&gt;
** GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** High-current output driver (20 mA) on one pin.&lt;br /&gt;
** High-current sink drivers (20 mA) on two open drain pins.&lt;br /&gt;
** Four general purpose timers/counters with a total of four capture inputs and up to 13 match outputs. &lt;br /&gt;
** Programmable WatchDog Timer (WDT).&lt;br /&gt;
** &#039;&#039;&#039;Switch matrix for flexible configuration of each I/O pin function.&#039;&#039;&#039;&lt;br /&gt;
** CRC engine&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** Comparator with internal and external references and 31 step voltage divider.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** UART with fractional baud rate generation, internal FIFO, and RS-485 support. &lt;br /&gt;
** SPI controllers with SSP features and with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. &lt;br /&gt;
* Clock generation:&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** Programmable watchdog oscillator with a frequency range of 9.4 kHz to 2.3 MHz.&lt;br /&gt;
** 10 kHz low-power oscillator for the WKT.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, and the Watchdog clock.&lt;br /&gt;
* Power control:&lt;br /&gt;
** Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
** Power profiles residing in boot ROM allowing to optimize performance and minimize power consumption for any given application through one simple function call. &lt;br /&gt;
** Reduced power modes: Sleep mode, Deep-sleep mode, Power-down mode, and Deep power-down mode.&lt;br /&gt;
** Wake-up from Deep-sleep and Power-down modes on activity on USART, SPI, and I2C peripherals.&lt;br /&gt;
** Brownout detect.&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Single 3.3 V power supply (1.8 V to 3.6 V).&lt;br /&gt;
* Available as DIP8, TSSOP16, SO20, and TSSOP20 package.&lt;br /&gt;
&lt;br /&gt;
== LPC11xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC11xx ===&lt;br /&gt;
Bezugsquellen und Preise (Stand 01/2014):&lt;br /&gt;
&lt;br /&gt;
elpro.org: von 1.61EUR (LPC1111FN33) bis 5.73EUR (LPC11U37) bei einen Stueck. Die Familie ist sehr gross mit sehr unterschiedlichen Ausfuehrungen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Block.diagramM0_NXPSep2011.gif|thumb|right|850px|Blockdiagramm des Cortex-M0, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC11xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC11xx ===&lt;br /&gt;
* System:&lt;br /&gt;
** ARM Cortex-M0 processor, running at frequencies of up to 50 MHz. &lt;br /&gt;
** ARM Cortex-M0 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory:&lt;br /&gt;
** 32 kB (LPC1114/LPC11C14), 24 kB (LPC1113), 16 kB (LPC1112/LPC11C12), or 8 kB (LPC1111) on-chip flash programming memory.  &lt;br /&gt;
** 8 kB, 4 kB, or 2 kB SRAM. &lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** Up to 42 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors. Number of GPIO pins is reduced for smaller packages and LPC11C22/C24. &lt;br /&gt;
** GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** High-current output driver (20 mA) on one pin.&lt;br /&gt;
** High-current sink drivers (20 mA) on two open drain pins.&lt;br /&gt;
** Four general purpose timers/counters with a total of four capture inputs and up to 13 match outputs. &lt;br /&gt;
** Programmable WatchDog Timer (WDT).&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** 10-bit ADC with input multiplexing among 8 pins.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** UART with fractional baud rate generation, internal FIFO, and RS-485 support. &lt;br /&gt;
** SPI controllers with SSP features and with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. &lt;br /&gt;
* Clock generation:&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** Programmable watchdog oscillator with a frequency range of 7.8 kHz to 1.8 MHz.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, and the Watchdog clock.&lt;br /&gt;
* Power control:&lt;br /&gt;
** Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
** Power profiles residing in boot ROM allowing to optimize performance and minimize power consumption for any given application through one simple function call. &lt;br /&gt;
** Processor wake-up from Deep-sleep mode via a dedicated start logic using up to 13 of the functional pins.&lt;br /&gt;
** Power-On Reset (POR). &lt;br /&gt;
** Brownout detect with four separate thresholds for interrupt and forced reset. &lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Single 3.3 V power supply (1.8 V to 3.6 V).&lt;br /&gt;
* Available in the following packages: 16WLCSP, 25WLCSP 20-SOIC, 20-TSSOP, 28-DIP, 28-TSSOP, 48-LQFP, 64-LQFP, 100-LQFP, and others.&lt;br /&gt;
&lt;br /&gt;
== LPC12xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC12xx ===&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
[[Bild:block.diagramM0_NXPSep2011.gif|thumb|right|850px|Blockdiagramm des Cortex-M0, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC12xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC12xx ===&lt;br /&gt;
&lt;br /&gt;
* Processor core&lt;br /&gt;
** ARM Cortex-M0 processor, running at frequencies of up to 45 MHz (one wait state from flash) or 30 MHz (zero wait states from flash). The LPC122x have a high score of over 45 in CoreMark CPU performance benchmark testing, equivalent to 1.51/MHz.&lt;br /&gt;
** ARM Cortex-M0 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug (SWD).&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory&lt;br /&gt;
** Up to 8 kB SRAM.&lt;br /&gt;
** Up to 128 kB on-chip flash programming memory. &lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
** Includes ROM-based 32-bit integer division routines.&lt;br /&gt;
* Clock generation unit&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** 12 MHz Internal RC (IRC) oscillator trimmed to 1 % accuracy that can optionally be used as a system clock.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, main clock, and Watchdog clock.&lt;br /&gt;
** Real-Time Clock (RTC).&lt;br /&gt;
* Digital peripherals&lt;br /&gt;
** Micro DMA controller with 21 channels.&lt;br /&gt;
** CRC engine.&lt;br /&gt;
** Two UARTs with fractional baud rate generation and internal FIFO. One UART with RS-485 and modem support and one standard UART with IrDA.&lt;br /&gt;
** SSP/SPI controller with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. I2C-bus pins have programmable glitch filter.&lt;br /&gt;
** Up to 55 General Purpose I/O (GPIO) pins with programmable pull-up resistor, open-drain mode, programmable digital input glitch filter, and programmable input inverter. &lt;br /&gt;
** Programmable output drive on all GPIO pins. Four pins support high-current output drivers.&lt;br /&gt;
** All GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** Four general purpose counter/timers with four capture inputs and four match outputs (32-bit timers) or two capture inputs and two match outputs (16-bit timers). &lt;br /&gt;
** Windowed WatchDog Timer (WWDT).&lt;br /&gt;
* Analog peripherals&lt;br /&gt;
** One 8-channel, 10-bit ADC.&lt;br /&gt;
** Two highly flexible analog comparators. Comparator outputs can be programmed to trigger a timer match signal or can be used to emulate 555 timer behavior.&lt;br /&gt;
* Power&lt;br /&gt;
** Three reduced power modes: Sleep, Deep-sleep, and Deep power-down.&lt;br /&gt;
** Processor wake-up from Deep-sleep mode via start logic using 12 port pins.&lt;br /&gt;
** Processor wake-up from Deep-power down and Deep-sleep modes via the RTC.&lt;br /&gt;
** Brownout detect with three separate thresholds each for interrupt and forced reset.&lt;br /&gt;
** Power-On Reset (POR).&lt;br /&gt;
** Integrated PMU (Power Management Unit).&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* 3.3 V power supply.&lt;br /&gt;
* Available as 64-pin and 48-pin LQFP package.&lt;br /&gt;
&lt;br /&gt;
== LPC13xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC13xx ===&lt;br /&gt;
[[Bild:LPC13xx_Selection_Guide_Sep2011.png|thumb|left|600px|Selection Guide zur LPC13xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
LPC1313 mit 32k-Flash mit 72MHz im LQFP 48 Gehäuse. Der LPC1313 ist bei &#039;&#039;&#039;[http://www.darisus.de/ Darius]&#039;&#039;&#039; erhältlich für 3,57 € (Juli 2016), oder elpro.org für 2,29 €.  Entwicklungskit INKLUSIVE JTAG-Programmer &amp;amp; Debugger bei &#039;&#039;&#039;[http://www.watterott.com/de/LPC1343-LPCXpresso-Board Watterott]&#039;&#039;&#039; für 23,80 € (Juli 2011)&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagram der LPC13xx Familie ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC13xx Block Diagram Sep2011.png|thumb|left|680px|Blockdiagramm der LPC13xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC1313 ===&lt;br /&gt;
* ARM Cortex-M3 processor, running at frequencies of up to 72 MHz.&lt;br /&gt;
* ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
* 32 kB on-chip flash programming memory.&lt;br /&gt;
* 8 kB SRAM.&lt;br /&gt;
* In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* UART with fractional baud rate generation, modem, internal FIFO, and RS-485/EIA-485 support.&lt;br /&gt;
* SSP controller with FIFO and multi-protocol capabilities.&lt;br /&gt;
* Additional SSP controller on LPC1313FBD48/01.&lt;br /&gt;
* I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode.&lt;br /&gt;
* Up to 42 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors.&lt;br /&gt;
* Four general purpose counter/timers with a total of four capture inputs and 13 match outputs.&lt;br /&gt;
* Programmable Watchdog Timer (WDT) &lt;br /&gt;
* System tick timer.&lt;br /&gt;
* Serial Wire Debug and Serial Wire Trace port.&lt;br /&gt;
* High-current output driver (20 mA) on one pin.&lt;br /&gt;
* High-current sink drivers (20 mA) on two I2C-bus pins in Fast-mode Plus.&lt;br /&gt;
* Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
* Three reduced power modes: Sleep, Deep-sleep, and Deep power-down.&lt;br /&gt;
* Single power supply (2.0 V to 3.6 V).&lt;br /&gt;
* 10-bit ADC with input multiplexing among 8 pins.&lt;br /&gt;
* GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
* Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, or the watchdog clock.&lt;br /&gt;
* Processor wake-up from Deep-sleep mode via a dedicated start logic using up to 40 of the functional pins.&lt;br /&gt;
* Brownout detect with four separate thresholds for interrupt and one thresholds for forced reset.&lt;br /&gt;
* Power-On Reset (POR).&lt;br /&gt;
* Integrated oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
* 12 MHz internal RC oscillator trimmed to 1 % accuracy over the entire temperature and voltage range that can optionally be used as a system clock.&lt;br /&gt;
* Programmable watchdog oscillator with a frequency range of 7.8 kHz to 1.8 MHz. System PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
* Code Read Protection (CRP) with different security levels.&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Available as 48-pin LQFP package and 33-pin HVQFN package.&lt;br /&gt;
&lt;br /&gt;
== LPC17xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC17xx ===&lt;br /&gt;
[[Bild:LPC17xx_Selection_Guide_Sep2011.png|thumb|left|680px|Selection Guide zur LPC17xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
LPC1754 mit 128K Flash im LQFP80, der bei &#039;&#039;&#039;[http://www.darisus.de/ Darius]&#039;&#039;&#039; für 7€74 (Juli/2011) erhältlich ist,[den LPC1751 (32k/8k) schon für 5€95] und bei Digikey für 6€35, den LPC1764FBD100 bei &#039;&#039;&#039;[http://www.tme.eu/de TME]&#039;&#039;&#039;    für 7€ Entwicklungskit INCLUSIVE JTAG-Programmer &amp;amp; Debugger bei &#039;&#039;&#039;[http://www.watterott.com/de/LPC1769-LPCXpresso Watterott]&#039;&#039;&#039; für 23€80 (Juli/2011)&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagram der LPC17xx Familie ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC177x_178x Block Diagram Sep2011.png|thumb|left|680px|Blockdiagramm der LPC17xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC1754 ===&lt;br /&gt;
* ARM Cortex-M3 processor, running at frequencies of up to 100 MHz &lt;br /&gt;
* A Memory Protection Unit (MPU) supporting eight regions is included.&lt;br /&gt;
* ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
* 128 kB on-chip flash program memory with In-System Programming (ISP) and In-Application Programming (IAP) capabilities. &lt;br /&gt;
* 32 kB of SRAM on the CPU with local code/data bus for high-performance CPU access.&lt;br /&gt;
* Eight channel General Purpose DMA controller &lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
* USB 2.0 full-speed controller that can be configured for either device, Host, or OTG operation with an on-chip PHY for device and Host functions &lt;br /&gt;
* Four UARTs with fractional baud rate generation, internal FIFO, IrDA, and DMA, Einer mit Modem I/Os und RS485 Support&lt;br /&gt;
* 1 CAN controller.&lt;br /&gt;
* 2 SSP controllers &lt;br /&gt;
* 1 SPI controller &lt;br /&gt;
* 2 I2C-bus interfaces with data rates of 1Mbit/s,&lt;br /&gt;
* I2S (Inter-IC Sound) &lt;br /&gt;
* 52  General Purpose I/O (GPIO) pins Any pin of ports 0 and 2 can be used to generate an interrupt.&lt;br /&gt;
* 8x 12-bit Analog-to-Digital Converter (ADC) conversion rates up to 200 kHz&lt;br /&gt;
* 1x 10-bit Digital-to-Analog Converter (DAC) &lt;br /&gt;
* Four general purpose timers/counters, with a total of eight capture inputs and ten compare outputs. &lt;br /&gt;
* One motor control PWM with support for three-phase motor control.&lt;br /&gt;
* Quadrature encoder interface that can monitor one external quadrature encoder.&lt;br /&gt;
* One standard PWM/timer block with external count input.&lt;br /&gt;
* Real-Time Clock (RTC) with a separate power domain including 20 bytes of battery-powered backup registers,  An RTC interrupt can wake up the CPU from any reduced power mode.&lt;br /&gt;
* Watchdog Timer (WDT). &lt;br /&gt;
* Cortex-M3 system tick timer&lt;br /&gt;
* Repetitive interrupt timer &lt;br /&gt;
* Standard JTAG test/debug interface as well as Serial Wire Debug and Serial Wire Trace Port options.&lt;br /&gt;
* Four reduced power modes: Sleep, Deep-sleep, Power-down, and Deep power-down.&lt;br /&gt;
* Single 3.3 V power supply (2.4 V to 3.6 V). &lt;br /&gt;
* Four external interrupt inputs configurable as edge/level sensitive. All pins on PORT0 and PORT2 can be used as edge sensitive interrupt sources.&lt;br /&gt;
* Non-maskable Interrupt (NMI) input.&lt;br /&gt;
* Wakeup Interrupt Controller (WIC) &lt;br /&gt;
* Each peripheral has its own clock divider for further power savings.&lt;br /&gt;
* Brownout detect with separate threshold for interrupt and forced reset.&lt;br /&gt;
* On-chip Power-On Reset (POR).&lt;br /&gt;
* On-chip crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
* 4 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
* An on-chip PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the main oscillator, the internal RC oscillator, or the RTC oscillator.&lt;br /&gt;
* Available as 80-pin LQFP (12 x 12 x 1.4 mm) packages.&lt;br /&gt;
&lt;br /&gt;
== LPC18xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC18xx ===&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC18xx Familie ===&lt;br /&gt;
[[Bild:block.diagram_NXP18xx Sep2011.gif|thumb|left|680px|Blockdiagramm der LPC18xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC18xx ===&lt;br /&gt;
DRAFT!&lt;br /&gt;
* Processor core&lt;br /&gt;
** ARM Cortex-M3 processor, running at frequencies of up to 180 MHz.&lt;br /&gt;
** ARM Cortex-M3 built-in Memory Protection Unit (MPU) supporting eight regions.&lt;br /&gt;
** ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Non-maskable Interrupt (NMI) input.&lt;br /&gt;
** JTAG and Serial Wire Debug, serial trace, eight breakpoints, and four watch points.&lt;br /&gt;
** ETM and ETB support.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* On-chip memory (flashless parts LPC1850/30/20/10)&lt;br /&gt;
** Up to 200 kB SRAM total for code and data use.&lt;br /&gt;
** Two 32 kB SRAM blocks with separate bus access. Both SRAM blocks can be powered down individually.&lt;br /&gt;
** 64 kB ROM containing boot code and on-chip software drivers.&lt;br /&gt;
** 32-bit One-Time Programmable (OTP) memory for general-purpose customer use.&lt;br /&gt;
* On-chip memory (parts with on-chip flash)&lt;br /&gt;
** Up to 1 MB total dual bank flash memory with flash accelerator.&lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
** Up to 136 kB SRAM for code and data use.&lt;br /&gt;
** Two 32 kB SRAM blocks with separate bus access. Both SRAM blocks can be powered down individually.&lt;br /&gt;
** 32 kB ROM containing boot code and on-chip software drivers.&lt;br /&gt;
** 32-bit One-Time Programmable (OTP) memory for general-purpose customer use.&lt;br /&gt;
* Clock generation unit&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1 % accuracy.&lt;br /&gt;
** Ultra-low power RTC crystal oscillator.&lt;br /&gt;
** Three PLLs allow CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. The second PLL is dedicated to the High-speed USB, the third PLL can be used as audio PLL.&lt;br /&gt;
** Clock output.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** Quad SPI Flash Interface (SPIFI) with four lanes and data rates of up to 40 MB per second total.&lt;br /&gt;
** 10/100T Ethernet MAC with RMII and MII interfaces and DMA support for high throughput at low CPU load. Support for IEEE 1588 time stamping/advanced time stamping (IEEE 1588-2008 v2).&lt;br /&gt;
** One High-speed USB 2.0 Host/Device/OTG interface with DMA support and on-chip PHY.&lt;br /&gt;
** One High-speed USB 2.0 Host/Device interface with DMA support, on-chip full-speed PHY and ULPI interface to external high-speed PHY.&lt;br /&gt;
** USB interface electrical test software included in ROM USB stack.&lt;br /&gt;
** Four 550 UARTs with DMA support: one UART with full modem interface; one UART with IrDA interface; three USARTs support synchronous mode and a smart card interface conforming to ISO7816 specification.&lt;br /&gt;
** Two C_CAN 2.0B controllers with one channel each.&lt;br /&gt;
** Two SSP controllers with FIFO and multi-protocol support. Both SSPs with DMA support.&lt;br /&gt;
** One Fast-mode Plus I2C-bus interface with monitor mode and with open-drain I/O pins conforming to the full I2C-bus specification. Supports data rates of up to 1 Mbit/s.&lt;br /&gt;
** One standard I2C-bus interface with monitor mode and standard I/O pins.&lt;br /&gt;
** Two I2S interfaces with DMA support, each with one input and one output.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** External Memory Controller (EMC) supporting external SRAM, ROM, NOR flash, and SDRAM devices.&lt;br /&gt;
** LCD controller with DMA support and a programmable display resolution of up to 1024H x 768V. Supports monochrome and color STN panels and TFT color panels; supports 1/2/4/8 bpp CLUT and 16/24-bit direct pixel mapping.&lt;br /&gt;
** SD/MMC card interface.&lt;br /&gt;
** Eight-channel General-Purpose DMA (GPDMA) controller can access all memories on the AHB and all DMA-capable AHB slaves.&lt;br /&gt;
** Up to 80 General-Purpose Input/Output (GPIO) pins with configurable pull-up/pull-down resistors and open-drain modes. &lt;br /&gt;
** GPIO registers are located on the AHB for fast access. GPIO ports have DMA support.&lt;br /&gt;
** State Configurable Timer (SCT) subsystem on AHB.&lt;br /&gt;
** Four general-purpose timer/counters with capture and match capabilities.&lt;br /&gt;
** One motor control PWM for three-phase motor control.&lt;br /&gt;
** One Quadrature Encoder Interface (QEI).&lt;br /&gt;
** Repetitive Interrupt timer (RI timer).&lt;br /&gt;
** Windowed watchdog timer.&lt;br /&gt;
** Ultra-low power Real-Time Clock (RTC) on separate power domain with 256 bytes of battery powered backup registers.&lt;br /&gt;
** Alarm timer; can be battery powered.&lt;br /&gt;
* Digital peripherals available on flash-based parts LPC18xx only:&lt;br /&gt;
** &amp;lt;tbd&amp;gt;&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** One 10-bit DAC with DMA support and a data conversion rate of 400 kSamples/s.&lt;br /&gt;
** Two 10-bit ADCs with DMA support and a data conversion rate of 400 kSamples/s.&lt;br /&gt;
* Security:&lt;br /&gt;
** Hardware-based AES security engine programmable through an on-chip API.&lt;br /&gt;
** Two 128-bit secure OTP memories for AES key storage and customer use.&lt;br /&gt;
** Unique ID for each device.&lt;br /&gt;
* Power: &lt;br /&gt;
** Single 3.3 V (2.2 V to 3.6 V) power supply with on-chip internal voltage regulator for the core supply and the RTC power domain.&lt;br /&gt;
** RTC power domain can be powered separately by a 3 V battery supply.&lt;br /&gt;
** Four reduced power modes: Sleep, Deep-sleep, Power-down, and Deep power-down.&lt;br /&gt;
** Processor wake-up from Sleep mode via wake-up interrupts from various eripherals. &lt;br /&gt;
** Wake-up from Deep-sleep, Power-down, and Deep power-down modes via external interrupts and interrupts generated by battery powered blocks in the RTC power domain.&lt;br /&gt;
** Brownout detect with four separate thresholds for interrupt and forced reset.&lt;br /&gt;
** Power-On Reset (POR).&lt;br /&gt;
* Available as 100-pin, 144-pin, and 208-pin LQFP packages and as 100-pin, 180-pin, and 256-pin LBGA packages.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
=== LPCWare (kostenlos) ===&lt;br /&gt;
[[Bild:lpcxpresso-debug_Code-red_3Sep2011.gif|thumb|right|680px|Ansicht der Entwicklungsumgebung, ©code-red-tech.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Entwicklungs Tool ====&lt;br /&gt;
(Beschreibung aus der Web-Site:)&lt;br /&gt;
LPCXpresso&#039;s IDE (Ursprünglich von &amp;quot;Code RED&amp;quot; entwickelt, die Firma wurde 2013 von LPC gekauft) ist eine hoch integrierte Entwicklungsumgebung für LPC-Controller, und beinhaltet alle zur Entwicklung erforderlichen Tools um hoch qualitative Software in einer angemessenen Zeit zu schreiben. LPCXpresso basiert auf ein vereinfachtes Eclipse mit vielen LPC-specifischen Erweiterungen.&lt;br /&gt;
Des Weiteren ist eine aktuelle Version der Industrie-Standard GNU Tool-Chain mit einer propritären und optimierten C-Lib mit dabei. Die LPCXpresso IDE stellt ein voll optimiertes Executable zur Verfügung. Die einzige Beschränkung der kostenlosen Version ist eine Limitierung auf 256kB Code nach erfolgter Registrierung.&lt;br /&gt;
Das LPCXpresso Target Board ist eine Gemeinschaftsentwicklung von Embedded Artists, Code Red und NXP.&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
Die LPCXpresso IDE stellt eine C-Umgebung mit Syntax-Colouring, Source-Formatierung, Funktions-Folding, sowie mit Online- und Offline Hilfe und umfangreichen Projekt-Management Funktionen zur Verfügung.  &lt;br /&gt;
Dies beinhaltet:&lt;br /&gt;
* Wizards um Projekte für alle unterstützten Controller zu erstellen &lt;br /&gt;
* Automatische Linker Script Generierung inklusive Memory-Map Unterstützung &lt;br /&gt;
* Programmierung des Controllers&lt;br /&gt;
* On-Line Debugging&lt;br /&gt;
* Datenblatt-Zugriff über eingebauten Browser&lt;br /&gt;
* Support für die NXP LPC Microcontroller Familien, von Cortex-M0, Cortex-M3 bis Cortex-M4 und ARM7 bis ARM9&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Peripherie und Register Views im Debugger ====&lt;br /&gt;
Der Peripherie-Viewer im integrierten Debugger zeigt alle Register und Bit-Felder in einer einfachen Baumstruktur.&lt;br /&gt;
Ein Prozessor-Register Viewer erlaubt den Zugriff auf alle Prozessor-Register und stellt eine &amp;quot;Smart-Formatting&amp;quot;  Funktion zur Verfügung um komplexe Register wie Flags oder Status Register übersichtlich darstellen zu können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Unterstützte Familien ====&lt;br /&gt;
Cortex-M0, Cortex-M3, Cortex-M4, Einzelne Controller aus der LPC2000 family, ARM966, ARM926-EJ, ARM926-EJ + VFP&lt;br /&gt;
&lt;br /&gt;
==== Sehr preiswerter USB_JTAG_SWD Debugger ====&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 (PDF)]&#039;&#039;&#039; und diese &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso Beschreibung]&#039;&#039;&#039;&lt;br /&gt;
Der neue Programmer/Debugger ist hier für ca 18€ +P&amp;amp;P erhältlich &#039;&#039;&#039;[http://www.watterott.com/de/LPC-Link-2 Programmer]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Standard Library ====&lt;br /&gt;
Im Download der &amp;quot;Code Red&amp;quot; Entwicklungsumgebung ist eine relativ umfangreiche Firmwarebibliothek vorhanden.&lt;br /&gt;
&lt;br /&gt;
==== Installationsanleitung zur IDE ====&lt;br /&gt;
&#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Codebase für LPC11xx und LPC13xx ====&lt;br /&gt;
Für die Cortex-M0 und -M3 Familien existieren verschiedene Basispakete die als Startausstattung sehr gut geeignet sind. Auf microbuilder.eu findet man eine sehr interessante Version inklusive Dokumentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx HIER]&#039;&#039;&#039; findet man alle Links zur original Codebase mit allen Dateien (Stand Januar 2012) aber auch eine deutsche Übersetzung zu den Files.&lt;br /&gt;
&lt;br /&gt;
=== CooCox ===&lt;br /&gt;
&lt;br /&gt;
Auf der &#039;&#039;&#039;[http://www.coocox.org/Index.html Homepage]&#039;&#039;&#039; von CooCox - einem chinesischen Open-Source Projekt, auf der eine IDE für Atmel, Energy Micro, Holtek, Nuvoton, ST, TI und NXP verfügbar ist  - findet man die auf Eclipse basierende &amp;quot;CooCox CoIDE&amp;quot;, die sich aus dem &amp;quot;CoBuilder&amp;quot; und dem &amp;quot;CoDebugger&amp;quot; zusammensetzt.&lt;br /&gt;
Des Weiteren bietet man dort ein Echtzeit-Multitasking Betriebssystem, sowie SW-Versionen von zwei unterschiedliche Debugging-Adapter und ein Stand-alone Flash-Tool zum freien Download an.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Controller können damit programmiert und debugged werden:&lt;br /&gt;
    LPC1111x101    LPC1111x201   LPC1112x101   LPC1112x201&lt;br /&gt;
    LPC1113x201    LPC1113x301   LPC1114x201   LPC1114x301&lt;br /&gt;
    LPC11C14x301   LPC11C12x301&lt;br /&gt;
    LPC1224x101    LPC1224x121   LPC1225x301   LPC1225x321   LPC1226x301  LPC1227x301&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LPC1311   LPC1313   LPC1342   LPC1343&lt;br /&gt;
    LPC1751   LPC1752   LPC1754   LPC1756   LPC1758   LPC1759&lt;br /&gt;
    LPC1763   LPC1764   LPC1765   LPC1766   LPC1767   LPC1768   LPC1769&lt;br /&gt;
&lt;br /&gt;
=== EmBlocks ===&lt;br /&gt;
&#039;&#039;&#039;[http://www.emblocks.org/web/ Emblocks]&#039;&#039;&#039; ist eine kostenlose Entwicklungsumgebung. Sie unterstützt neben NXP uC weitere ARM uC (STM32, EFM32) sowie PIC, AVR und MSP430. Die IDE hat einen eingebauten GDB Debugger welcher System view (Peripherie Register anzeigen) beim Debuggen unterstützt. Ausserdem gibt es einen Project Wizzard für NXP uC &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Unterstützt wird der JLINK mit folgenden NXP uC:&lt;br /&gt;
LPC11Axx, LPC11Exx, LPC11Uxx, LPC11xxLV, LPC12xx, LPC13Uxx, LPC13xx, LPC17xx, LPC18xx, LPC18xx, LPC177x_8x, LPC407x_8x&lt;br /&gt;
&lt;br /&gt;
=== Codebase ===&lt;br /&gt;
Des Weiteren existiert eine umfangreiche Sammlung von &#039;&#039;&#039;[http://www.coocox.org/NXP-Series.php Code-Beispielen]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Keil ===&lt;br /&gt;
[https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM] (Windows, Free Version auf 32KB begrenzt, mit vielen Beispielen zu div. Evaluation Boards) &lt;br /&gt;
*[http://www.keil.com/arm/chips.asp unterstützte Mikrocontroller]&lt;br /&gt;
=== WinARM ===&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;
=== GNUARM ===&lt;br /&gt;
[http://gnuarm.com/ GNUARM] (Linux, Windows, wird derzeit nicht gepflegt), &lt;br /&gt;
&lt;br /&gt;
=== Yagarto ===&lt;br /&gt;
[http://www.yagarto.de/ Yagarto] (Windows, mit Eclipse-Integration) &lt;br /&gt;
&lt;br /&gt;
=== CodeSourcery ===&lt;br /&gt;
[http://www.codesourcery.com/gnu_toolchains/arm CodeSourcery CodeBench Lite]&lt;br /&gt;
&lt;br /&gt;
== CMSIS  -  Standard für alle Plattformen ==&lt;br /&gt;
Der Cortex Microcontroller Software Interface Standard (CMSIS) stellt einen &amp;quot;abstraction layer&amp;quot; für alle Cortex-Mx Controller zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
CMSIS stellt einen Schnittstellenstandard von ARM dar, der von vielen Tool-Herstellern unterstützt wird und ist (laut verschiedener Berichte)  kompatibel mit den verschiedensten Compilern (incl GCC). Dies wird erreicht durch einheitliche Definitionen für Adressen und Namen die den Zugriff auf die Register des Cores und der Peripherie ermöglichen.&lt;br /&gt;
Auch Standard-Funktionen für den Start und die Interrupts stehen zur Verfügung.&lt;br /&gt;
Natürlich kann auch weiterhin direkt auf die HW zugegriffen werden, es geht nur um eine Vereinheitlichung von identischen Funktionen. &lt;br /&gt;
Da die Peripherie-Teile zumindest innerhalb eines Halbleiterherstellers für die Cortex-Mx Controller sehr ähnlich oder sogar weitgehend identisch sind kann deutlich mehr SW für verschiedene Derivate innerhalb dieser Prozessorfamilien wiederverwendet werden.  (siehe Google: &amp;quot;CMSIS_Doulos_Tutorial.pdf&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Ein weiterer, interessanter Punkt ist die CMSIS-DSP Lib mit ihren Vektorfunktionen, Matrix-Berechnung sowie komplexen Algorithmen für Filter, &lt;br /&gt;
Regler und Fourietransformation sowie weiterer DSP Algorithmen (insgesamt 61).&lt;br /&gt;
&lt;br /&gt;
Leider hat diese Kompatibilität auch ihre Grenzen, denn Sonderfunktionen bzw. Spezialitäten in der &amp;quot;gleichen&amp;quot; Peripherie zwischen unterschiedlichen Halbleiterherstellern werden nicht abgedeckt. &lt;br /&gt;
Wäre auch zu schön, wenn die Prozesorhersteller dem Entwickler dadurch einen fliegenden HW-Wechsel bzw. eine einfache Vergleichbarkeit ermöglichen würden ;-)&lt;br /&gt;
&lt;br /&gt;
Eine komplette CMSIS-Lib (V2.0) &amp;quot;Cortex Microcontroller Software Interface Standard&amp;quot; ist für das &amp;quot;Code Red&amp;quot; Paket verfügbar, inklusive einer &amp;quot;DSP-Library&amp;quot; &lt;br /&gt;
http://support.code-red-tech.com/CodeRedWiki/NewInVersion4&lt;br /&gt;
bzw. für GNU / Keil / IAR unter&lt;br /&gt;
http://ics.nxp.com/support/documents/microcontrollers/?search=CMSIS&amp;amp;type=software&amp;amp;Search.x=8&amp;amp;Search.y=12&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* Wiki&lt;br /&gt;
** &#039;&#039;&#039;[[LPC1xxx_Entwicklungskit_LPCXpresso]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Codebase_f%C3%BCr_LPC1xxx]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[LPC1xxx für Umsteiger]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Projekte&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/264089 FreeRTOS auf LPC1768]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/321481 Multithreading auf LPC8xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/319537 Python Script zum Flashen des LPC8xx]&lt;br /&gt;
&lt;br /&gt;
* Suche im Forum&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC8* LPC8xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC11* LPC11xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC11* LPC11xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC12* LPC12xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC13* LPC13xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC17* LPC17xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC18* LPC18xx]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
(Die Preiswertesten sind &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt)&lt;br /&gt;
* &#039;&#039;&#039;[http://darisusgmbh.de/shop/advanced_search_result.php?keywords=LPC1&amp;amp;x=0&amp;amp;y=0 Darisus]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[http://www.elpro.org/shop/shop.php elpro]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.hbe-shop.de HBE] &lt;br /&gt;
* [http://www.tme.eu/de/katalog#cleanParameters%3D1%26searchClick%3D1%26search%3DLPC1%26bf_szukaj%3D+ TME]&lt;br /&gt;
* [http://www.tn-electronics.de/advanced_search_result.php?keywords=LPC1&amp;amp;x=0&amp;amp;y=0 TN]&lt;br /&gt;
* [http://de.mouser.com/_/?Keyword=LPC1&amp;amp;Ns=Pricing|0&amp;amp;FS=True Mouser]&lt;br /&gt;
* [http://www.soselectronic.eu/?searchstring=LPC1&amp;amp;str=378 SOS]&lt;br /&gt;
* [http://de.farnell.com Farnell/Element14]&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;page_action=query&amp;amp;desc=off&amp;amp;sdesc=on&amp;amp;keywords=LPCXpresso Watterott (24€ inclusive JTAG-Programmiergerät UND JTAG Debugger für kostenlose &amp;quot;Code-Red&amp;quot; Entwicklungsplattform)], dazu hier die [[LPC1xxx_Entwicklungskit_LPCXpresso|Beschreibung]]&lt;br /&gt;
* [http://www.lpctools.com/evaluationboardskitsforlpc17xx.aspx LPC-Tools]&lt;br /&gt;
* [http://thinkembedded.ch/NXP:::25.html thinkembedded.ch] div. Olimex Boards&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://www.nxp.com/#/page/content=[f=/dynamic/applicationnotes/tid-50809_sid-56890/data.xml] Appnotes&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html Projects]&lt;br /&gt;
* [http://mbed.org/handbook/Homepage MBED]&lt;br /&gt;
* [http://forums.nxp.com/forums/viewforum.php?f=1 NXP-WIKI]&lt;br /&gt;
* [http://knowledgebase.nxp.com/forumdisplay.php?s=389a3610c741bca7b18221d32b9c0ce0&amp;amp;f=4 NXP-Forum]&lt;br /&gt;
* [http://ics.nxp.com/lpcxpresso/ LPCXpresso]&lt;br /&gt;
* [http://code.google.com/p/32bitmicro/ 32BitMicro]&lt;br /&gt;
* [http://www.brc-electronics.nl SimpleCortex]&lt;br /&gt;
* [http://www.lpcware.com/ LPCWare NXP MCU community]&lt;br /&gt;
* [http://nanohome.be/nxp/index.html LPC175/6x und LPC23xx pin Configurator]&lt;br /&gt;
* [https://code.google.com/p/lpc-1768-arm-synthesizer/  MIDI controlled monophonic synthesizer based on the LPCXpresso 1768.]&lt;br /&gt;
* [https://code.google.com/p/lpc1343codebase/  An open source software library for NXP&#039;s Cortex-M3 based LPC1300 microcontroller family]&lt;br /&gt;
* [https://code.google.com/p/lpc1114codebase/   An open source software library for NXP&#039;s Cortex-M0 based LPC1100 microcontroller family]&lt;br /&gt;
* [https://code.google.com/p/lpc-12xx-bootloader/  A flexible bootloader for use with LPC12xx Microcontrollers from NXP, Firmware code is AES128 encrypted to secure your project / source code when giving out public firmware updates. ]&lt;br /&gt;
* [https://code.google.com/p/lpcxpresso-rc/   Read receiver and sensor signals for radio controlled model aircrafts configured for LPCXpresso]&lt;br /&gt;
* [https://code.google.com/p/olpcx/   Open toolset for LPCXpresso]&lt;br /&gt;
* [https://code.google.com/p/32bitmicro/   Collection of code and tools for 32 bit microcontrollers]&lt;br /&gt;
* [https://code.google.com/p/my-nxp-lpc1114/   my-nxp-lpc1114 study course]&lt;br /&gt;
* [https://code.google.com/p/nxp-lpc/   nxp-lpc]&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsplattformen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.lpcware.com/lpcxpresso/home LPDXpresso Download (Kostenlos mit Debugger)]&lt;br /&gt;
* [http://www.lpcware.com LPCXpresso Homepage]&lt;br /&gt;
* [http://support.code-red-tech.com/CodeRedWiki/WikiHome CR-WIKI]&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp ARM/Keil MDK-ARM]&lt;br /&gt;
* IAR EWARM&lt;br /&gt;
* Rowley Crossworks&lt;br /&gt;
* Green Hills Software &lt;br /&gt;
* [http://www.coocox.org/CooCox_CoIDE.htm CooCox] (Kostenlos)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:LPC1x]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:LPC-Mikrocontroller&amp;diff=95379</id>
		<title>Diskussion:LPC-Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:LPC-Mikrocontroller&amp;diff=95379"/>
		<updated>2017-02-27T09:38:47Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Zustimmung von NXP sowie code-red zur Verlinkung bzw. zum direkten Kopieren aus der Domain www.nxp.com bzw. www.code-red-tech.com liegt mir vor. ([[Benutzer:Powerfreak|Powerfreak]] 3. Sep. 2011 (UTC))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kann man die Cortex M0 denn mit dem einfachen GCC für M3 bearbeiten? Oder bracht es da andere Tools?&lt;br /&gt;
Ja, kann man, die Standard-Tools decken das mit ab&lt;br /&gt;
&lt;br /&gt;
Solche Fragen bitte im Forum stellen - wie auch immer: siehe http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html und darin Erläuterungen zu -mcpu=name ([[Benutzer:Mthomas|Mthomas]] 15:35, 2. Sep. 2011 (UTC))&lt;br /&gt;
&lt;br /&gt;
== Umstrukturierung der Seite ==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich einmal das aktuelle Portfolio von NXP anschaut ([http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-mcus:LPC-ARM-CORTEX-M-MCUS LPC Microcontrollers | NXP]), dann stellt man fest, dass diese Seite nicht mehr aktuell ist: &lt;br /&gt;
Es gibt mehr Typen, als die bisher erwähnten LPC1xxx-µCs.&lt;br /&gt;
Der Seitentitel suggeriert auch, dass es eben nur um die LPC1x00-Serie geht, obwohl die LPC800er Serie auch erwähnt wird.&lt;br /&gt;
&lt;br /&gt;
Generell finde ich die Seite nicht mehr übersichtlich genug.&lt;br /&gt;
&lt;br /&gt;
Ein kleiner Überblick zu den aktuellen Produktreihen:&lt;br /&gt;
* Cortex-Kerne&lt;br /&gt;
:* LPC800 mit Cortex-M0+&lt;br /&gt;
:* LPC1100 mit Cortex-M0+/M0&lt;br /&gt;
:* LPC1200 mit Cortex-M0&lt;br /&gt;
:* LPC1300 mit Cortex-M3&lt;br /&gt;
:* LPC1500 mit Cortex-M3&lt;br /&gt;
:* LPC1700 mit Cortex-M3&lt;br /&gt;
:* LPC1800 mit Cortex-M3&lt;br /&gt;
:* LPC4000 mit Cortex-M4&lt;br /&gt;
:* LPC4300 mit Cortex-M4 und M0&lt;br /&gt;
:* LPC54000 mit Cortex-M4 und M0+&lt;br /&gt;
* und eventuell auch die anderen ARM Kerne&lt;br /&gt;
:* (LPC2000 mit ARM7TDMI)&lt;br /&gt;
:* (LPC3000 mit ARM926EJ)&lt;br /&gt;
&lt;br /&gt;
Deswegen mein Vorschlag: die aktuelle Seite umbenennen/verschieben auf eine neue Seite &amp;quot;LPC MCUs&amp;quot;/&amp;quot;LPC Mikrocontroller&amp;quot;/&amp;quot;LPC Series MCUs&amp;quot; (oder so ähnlich) und dann die Seite zu updaten. Darunter fällt &lt;br /&gt;
sowohl generell die neuen Informationen aufzunehmen, als auch ältere Daten auf den aktuellen Stand zu bringen (Der Stand der Seite scheint teilweise von 2013 oder noch früher zu sein). &lt;br /&gt;
Die Verlinkung links oben in der Übersicht müsste bei der Umbenennung der Seite auch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Auch sollte man die Seite durchgehend in deutsch schreiben, oder wenigstens deutsche Erklärungen dazu.&lt;br /&gt;
&lt;br /&gt;
Angefangen habe ich schon mal mit der neuen Vergleichstabelle, die allerdings auch noch erweiterbar ist.&lt;br /&gt;
&lt;br /&gt;
Freue mich auf eure Meinungen dazu&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Newgeneration|Newgeneration]] ([[Benutzer Diskussion:Newgeneration|Diskussion]]) 18:06, 11. Feb. 2017 (CET)&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LPC-Mikrocontroller&amp;diff=95378</id>
		<title>LPC-Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LPC-Mikrocontroller&amp;diff=95378"/>
		<updated>2017-02-27T09:35:18Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Vergleichstabelle eingefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:overview_Sep2011.png|thumb|right|850px|Überblick über die aktuelle Cortex M0/3 Familie, ©NXP.com]]&lt;br /&gt;
[[Bild:positioning_NXPSep2011.gif|thumb|right|850px|Vergleich über die aktuelle Cortex M0/3 Familie, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
Die LPC-Familie von NXP basiert auf 32-Bit Cortex-Kernen von ARM und arbeitet mit bis zu 204MHz. Die verschiedenen Serien basieren auf den Cortex-M0/M0+/M3/M4-Kernen und sind inzwischen auch für Privatnutzer zu Preisen erhältlich, die mit denen von 8-Bit-Mikrocontrollern vergleichbar sind. Eine Auflistung der verschiedenen Typen findet sich in der Tabelle unten.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind preiswerte Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG Programmer und Debugger oder den neuen LPC-Link2, ein reiner Programmer + Debugger) erhältlich z.B. bei [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]. Siehe dazu auch die Dokumentation von NXP zu den [http://www.nxp.com/documents/leaflet/75016842.pdf LPCXpresso-Entwicklungskits (PDF)] und diese [[LPC1xxx Entwicklungskit LPCXpresso]].&lt;br /&gt;
&lt;br /&gt;
== Vergleich aller Typen ==&lt;br /&gt;
&#039;&#039;Stand Feb. 2017&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | &lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | CPU&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | Max. Frequency&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | Memory&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | Voltage&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | Features&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Flash&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | SRAM&lt;br /&gt;
|-&lt;br /&gt;
| LPC800&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Cortex-M0+&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 30MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8-32kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1-8kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1.8-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
SCTimer/PWM,&lt;br /&gt;
Switch Matrix,&lt;br /&gt;
Pattern Match Engine&lt;br /&gt;
|-&lt;br /&gt;
| LPC54000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Cortex-M4&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 100MHz/180MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 128-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 96-200kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1,62-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
LCD,&lt;br /&gt;
Ethernet,&lt;br /&gt;
FlexComm,&lt;br /&gt;
Security&lt;br /&gt;
|-&lt;br /&gt;
| LPC1100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Cortex-M0/M0+&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | 50MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 4-256kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1-36kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1.71-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| LPC1200&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Cortex-M0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32-128kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 4-8kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1.8-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
8 kV protection,&lt;br /&gt;
IEC 60730 Class B certified&lt;br /&gt;
|-&lt;br /&gt;
| LPC1300&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | Cortex-M3&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | 72MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8-64kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 4-12kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 2.0-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
USB&lt;br /&gt;
|-&lt;br /&gt;
| LPC1500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64-256kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 12-36kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
QEI&lt;br /&gt;
|-&lt;br /&gt;
| LPC1700&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 120MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8-96kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
QEI&lt;br /&gt;
|-&lt;br /&gt;
| LPC1800&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 180MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Flashless, 512kB-1MB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 104-200kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
Dual HS USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
Security&lt;br /&gt;
|-&lt;br /&gt;
| LPC4000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Cortex-M4&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 120MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64-512kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 24-96kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD&lt;br /&gt;
|-&lt;br /&gt;
| LPC4300&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Cortex-M4&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 204MHz&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Flashless,&lt;br /&gt;
512kB-1MB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 104-282kB&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 2.4-3.6V&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
Dual HS USB,&lt;br /&gt;
CAN,&lt;br /&gt;
Ethernet,&lt;br /&gt;
LCD,&lt;br /&gt;
SGPIO,&lt;br /&gt;
Security&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;: gibt es auch als Mehrkern-Prozessoren (mit 0/1/2 Cortex-M0(+)-Cores)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos + User-Manuals==&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC8xx (Cortex-M0+) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://www.nxp.com/products/microcontrollers/cortex_m0_m0/series/LPC800.html#quickreference LPC8xx]&#039;&#039;&#039; ist nur in Packages mit einer relativ niedrigen Pinanzahl (DIP8, SO20, TSSOP16, TSSOP20) verfügbar, hat zwischen 4-16kB Flash, und 1-4kB RAM. Die zulässige Betriebsspannung liegt zwischen 1,8V und 3,6V.&lt;br /&gt;
&lt;br /&gt;
Überblick über die Features der LPC800-Serie: &lt;br /&gt;
* 1 I2C&lt;br /&gt;
* 1-2 SSP&lt;br /&gt;
* 2-3 UART&lt;br /&gt;
* 4 Timer,  1 OS-Timer&lt;br /&gt;
* 1 watch dog&lt;br /&gt;
* 4 PWM-Einheiten&lt;br /&gt;
* 10-bit ADC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/download/grouping/11045/user_manual User Manual der LPC8-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC11xx (Cortex-M0) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc11xx/ LPC11xx-Serie]&#039;&#039;&#039; (3,3V) bietet viele Möglichkeiten&lt;br /&gt;
* Der LPC1100L ist derzeit laut NXP (Sep2011) der preisgünstigste ARM auf dem Markt. Der 32Bit ARM mit einer Performance von ca. 45DMIPS @50MHZ benötigt bei dieser Taktfrequenz nur etwa 10mA. (Details siehe NXP-Seite)&lt;br /&gt;
&lt;br /&gt;
* Überblick über die Features :&lt;br /&gt;
** LPC1100 Serie: • I2C, SSP, UART, GPIO, • Timers and watch dog timer, • 10-bit ADC, • Flash/SRAM memory, • Weitere Funktionen, siehe &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/LPC1xxx#Features_eines_LPC11xx 2.3 Features]&#039;&#039;&#039;&lt;br /&gt;
** LPC1100L Serie zusätzlich zu LPC1100: • Power Profile mit lower power consumption in Active- und Sleep-mode, • Interne pull-ups auf VDD level, • Programmierbarer pseudo open-drain mode für GPIO Pins, • WWDT mit Clock Source Lock.&lt;br /&gt;
**LPC11C00 Serie zusätzlich zu LPC1100: • CAN controller, • On-chip CAN Treiber, • On-chip CAN Transceiver (LPC11C2x), • WDT (not windowed) mit Clock Source Lock.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10398.pdf User Manual der LPC11-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Besonderes Augenmerk möchte ich auf die neue Serie  &#039;&#039;&#039;[http://www.nxp.com/ps/#/i=71498 LPC111xFD]&#039;&#039;&#039; legen, denn in jetzt gibt es den Cortex-M0 auch im DIL 28 &#039;&#039;&#039;[http://www.nxp.com/redirect/pip/LPC1114FN28.html den LPC1114FN28]&#039;&#039;&#039;&lt;br /&gt;
**Des Weiteren sind damit SO20, sowie TSSOP20 und TSSOP28 Bauformen verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC12xx (Cortex-M0) ===&lt;br /&gt;
* Die Low Power &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc12xx/ LPC12xx-Serie]&#039;&#039;&#039; (3,3V) ist laut NXP (Sep2011) ein Cortex-M0 mit 32 bis 128kB Flash, einem 45 CoreMark™ Benchmark-Score bei 30MHz, 2 bis 8kB SRAM, und einem internen 1% genauen 12MHz Oscillator.&lt;br /&gt;
&lt;br /&gt;
* Überblick über die Features: fMAX von 30MHz, 1 10-Bit  ADC mit 8 Kanälen, 2 Comparatoren, 2 UARTs, 1 SSP/SPI, 1 I2C, DMA Controller, CRC Engine, 1 32-Bit, 5 Timer (16- und 32-Bit, + RTC), 13 PWM Kanäle, bis zu 55 GPIOs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10441.pdf User Manual der LPC12xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC13xx (Cortex-M3) ===&lt;br /&gt;
Die sehr stromsparende &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc13xx/ LPC13xx-Serie]&#039;&#039;&#039; (3,3V) bietet im LQFP 48 Gehäuse 8..32k Flash, 2..8k SRAM, 5 Timer (mit WD), 11 PWM, 1 UART, 1IIC, 1USB, 1..2 SPI, einen 8-Kanal/10Bit AD-Wandler und eine Taktfrequenz von max. 72MHz. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10375.pdf User Manual der LPC13xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC17xx (Cortex-M3) ===&lt;br /&gt;
Die &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc17xx/ LPC17xx-Serie]&#039;&#039;&#039; hingegen enthält eine weit größere Peripherie in einem LQFP80/100/144/208 Package.&lt;br /&gt;
32..512k Flash, 8..96k SRAM, 6 Timer (mit WD), 6 zusätzliche PWM-Einheiten, teilweise Ethernet und STN/TFT-LCD-Controller, meist USB (teilw. mit Host+OTG), 4 UART, 2..3IIC, 1..2 CAN, 1 SPI, 2 SSP/SPI einen 6..8-Kanal/12Bit AD-Wandler, einen 10Bit DAC, Motor-Control-Einheiten, einen Encoder-Eingang und eine Taktfrequenz von max. 100MHz(120MHz) und vieles mehr. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.nxp.com/documents/user_manual/UM10360.pdf User Manual der LPC17xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten LPC18xx (Cortex-M3) ===&lt;br /&gt;
Die &#039;&#039;&#039;[http://ics.nxp.com/products/lpc1000/lpc18xx/ LPC18xx-Serie]&#039;&#039;&#039; stellt DIE &amp;quot;High-Performance&amp;quot; Controller aus der Cortex-M3-Serie. Die Taktfrequenz geht bis 150MHz, die Controller enthalten große dual-Bank Flash Speicher bis zu 1MB, ein großes On-Chip SRAM mit bis zu 200KB, zusätzliche Peripherie wie z.B. SPI Flash Interface (SPIFI) und State Configurable Timer (SCT), 2x High Speed USB (1x mit On-Chip HS PHY) und eine MPU.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://ics.nxp.com/support/documents/microcontrollers/pdf/user.manual.lpc18xx.pdf User Manual der LPC18xx-Familie (PDF)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Überblick über die Features: &#039;&#039;&#039;[http://ics.nxp.com/literature/leaflets/microcontrollers/pdf/lpc18xx.pdf LPC18xx Flyer von NXP]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungskits ===&lt;br /&gt;
Von NXP sind &amp;lt;u&amp;gt;sehr preiswerte&amp;lt;/u&amp;gt; Entwicklungskits (ca. 25€ für. 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 (PDF)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Kostenlose Entwicklungsumgebung für ALLE hier genannten Controller ===&lt;br /&gt;
Für die ganze Prozessorfamilie ist eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; Entwicklungsumgebung  erhältlich. Informationen unter &#039;&#039;&#039;[http://www.lpcware.com/lpcxpresso/home  lpcware]&#039;&#039;&#039;: Die auf Eclipse basierende Entwicklungsumgebung ist nach der Installation bis 8k freigeschaltet und nach einer einfachen und kostenlosen Registrierung für 256kB. Die IDE ist auch für &#039;&#039;&#039;[http://www.lpcware.com/lpcxpresso/home Linux und Mac]&#039;&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
Hier die &#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== LPC8xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC8xx ===&lt;br /&gt;
Bezugsquellen und Preise (Stand 06/2016)&lt;br /&gt;
* LPC810FN8 (DIP8): Digikey 1,09 € (bei einem Stuck).&lt;br /&gt;
* LPC812JD20 (SOIC-W 20): Digikey 1,26 € (bei einem Stuck).&lt;br /&gt;
* LPC812JDH20 (TSSOP-20): Digikey 1,44 € (bei einem Stuck).&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC800_block_diagram_Jan2014.gif|thumb|right|850px|Blockdiagramm des Cortex-M0+, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC8xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC8xx ===&lt;br /&gt;
* System:&lt;br /&gt;
** ARM Cortex-M0+ processor, running at frequencies of up to 30 MHz. &lt;br /&gt;
** single cycle multiplier&lt;br /&gt;
** single cycle I/O port&lt;br /&gt;
** ARM Cortex-M0+ built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug, Micro Trace Buffer supported.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory:&lt;br /&gt;
** 16 kB (LPC812M101JD20/LPC812M101JDH20/LPC812M101JDH16), 8 kB (LPC811M001JDH16) or 4kB (LPC810M021FN8) on-chip flash programming memory. &lt;br /&gt;
**  4kB, 2 kB, or 1 kB SRAM.&lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** Up to 18 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors. Number of GPIO pins is reduced for smaller packages down to 6.&lt;br /&gt;
** GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** High-current output driver (20 mA) on one pin.&lt;br /&gt;
** High-current sink drivers (20 mA) on two open drain pins.&lt;br /&gt;
** Four general purpose timers/counters with a total of four capture inputs and up to 13 match outputs. &lt;br /&gt;
** Programmable WatchDog Timer (WDT).&lt;br /&gt;
** &#039;&#039;&#039;Switch matrix for flexible configuration of each I/O pin function.&#039;&#039;&#039;&lt;br /&gt;
** CRC engine&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** Comparator with internal and external references and 31 step voltage divider.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** UART with fractional baud rate generation, internal FIFO, and RS-485 support. &lt;br /&gt;
** SPI controllers with SSP features and with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. &lt;br /&gt;
* Clock generation:&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** Programmable watchdog oscillator with a frequency range of 9.4 kHz to 2.3 MHz.&lt;br /&gt;
** 10 kHz low-power oscillator for the WKT.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, and the Watchdog clock.&lt;br /&gt;
* Power control:&lt;br /&gt;
** Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
** Power profiles residing in boot ROM allowing to optimize performance and minimize power consumption for any given application through one simple function call. &lt;br /&gt;
** Reduced power modes: Sleep mode, Deep-sleep mode, Power-down mode, and Deep power-down mode.&lt;br /&gt;
** Wake-up from Deep-sleep and Power-down modes on activity on USART, SPI, and I2C peripherals.&lt;br /&gt;
** Brownout detect.&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Single 3.3 V power supply (1.8 V to 3.6 V).&lt;br /&gt;
* Available as DIP8, TSSOP16, SO20, and TSSOP20 package.&lt;br /&gt;
&lt;br /&gt;
== LPC11xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC11xx ===&lt;br /&gt;
Bezugsquellen und Preise (Stand 01/2014):&lt;br /&gt;
&lt;br /&gt;
elpro.org: von 1.61EUR (LPC1111FN33) bis 5.73EUR (LPC11U37) bei einen Stueck. Die Familie ist sehr gross mit sehr unterschiedlichen Ausfuehrungen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Block.diagramM0_NXPSep2011.gif|thumb|right|850px|Blockdiagramm des Cortex-M0, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC11xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC11xx ===&lt;br /&gt;
* System:&lt;br /&gt;
** ARM Cortex-M0 processor, running at frequencies of up to 50 MHz. &lt;br /&gt;
** ARM Cortex-M0 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory:&lt;br /&gt;
** 32 kB (LPC1114/LPC11C14), 24 kB (LPC1113), 16 kB (LPC1112/LPC11C12), or 8 kB (LPC1111) on-chip flash programming memory.  &lt;br /&gt;
** 8 kB, 4 kB, or 2 kB SRAM. &lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** Up to 42 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors. Number of GPIO pins is reduced for smaller packages and LPC11C22/C24. &lt;br /&gt;
** GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** High-current output driver (20 mA) on one pin.&lt;br /&gt;
** High-current sink drivers (20 mA) on two open drain pins.&lt;br /&gt;
** Four general purpose timers/counters with a total of four capture inputs and up to 13 match outputs. &lt;br /&gt;
** Programmable WatchDog Timer (WDT).&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** 10-bit ADC with input multiplexing among 8 pins.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** UART with fractional baud rate generation, internal FIFO, and RS-485 support. &lt;br /&gt;
** SPI controllers with SSP features and with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. &lt;br /&gt;
* Clock generation:&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** Programmable watchdog oscillator with a frequency range of 7.8 kHz to 1.8 MHz.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, and the Watchdog clock.&lt;br /&gt;
* Power control:&lt;br /&gt;
** Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
** Power profiles residing in boot ROM allowing to optimize performance and minimize power consumption for any given application through one simple function call. &lt;br /&gt;
** Processor wake-up from Deep-sleep mode via a dedicated start logic using up to 13 of the functional pins.&lt;br /&gt;
** Power-On Reset (POR). &lt;br /&gt;
** Brownout detect with four separate thresholds for interrupt and forced reset. &lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Single 3.3 V power supply (1.8 V to 3.6 V).&lt;br /&gt;
* Available in the following packages: 16WLCSP, 25WLCSP 20-SOIC, 20-TSSOP, 28-DIP, 28-TSSOP, 48-LQFP, 64-LQFP, 100-LQFP, and others.&lt;br /&gt;
&lt;br /&gt;
== LPC12xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC12xx ===&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
[[Bild:block.diagramM0_NXPSep2011.gif|thumb|right|850px|Blockdiagramm des Cortex-M0, ©NXP.com]]&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC12xx Familie ===&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC12xx ===&lt;br /&gt;
&lt;br /&gt;
* Processor core&lt;br /&gt;
** ARM Cortex-M0 processor, running at frequencies of up to 45 MHz (one wait state from flash) or 30 MHz (zero wait states from flash). The LPC122x have a high score of over 45 in CoreMark CPU performance benchmark testing, equivalent to 1.51/MHz.&lt;br /&gt;
** ARM Cortex-M0 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Serial Wire Debug (SWD).&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* Memory&lt;br /&gt;
** Up to 8 kB SRAM.&lt;br /&gt;
** Up to 128 kB on-chip flash programming memory. &lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
** Includes ROM-based 32-bit integer division routines.&lt;br /&gt;
* Clock generation unit&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** 12 MHz Internal RC (IRC) oscillator trimmed to 1 % accuracy that can optionally be used as a system clock.&lt;br /&gt;
** PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
** Clock output function with divider that can reflect the system oscillator clock, IRC clock, main clock, and Watchdog clock.&lt;br /&gt;
** Real-Time Clock (RTC).&lt;br /&gt;
* Digital peripherals&lt;br /&gt;
** Micro DMA controller with 21 channels.&lt;br /&gt;
** CRC engine.&lt;br /&gt;
** Two UARTs with fractional baud rate generation and internal FIFO. One UART with RS-485 and modem support and one standard UART with IrDA.&lt;br /&gt;
** SSP/SPI controller with FIFO and multi-protocol capabilities.&lt;br /&gt;
** I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode. I2C-bus pins have programmable glitch filter.&lt;br /&gt;
** Up to 55 General Purpose I/O (GPIO) pins with programmable pull-up resistor, open-drain mode, programmable digital input glitch filter, and programmable input inverter. &lt;br /&gt;
** Programmable output drive on all GPIO pins. Four pins support high-current output drivers.&lt;br /&gt;
** All GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
** Four general purpose counter/timers with four capture inputs and four match outputs (32-bit timers) or two capture inputs and two match outputs (16-bit timers). &lt;br /&gt;
** Windowed WatchDog Timer (WWDT).&lt;br /&gt;
* Analog peripherals&lt;br /&gt;
** One 8-channel, 10-bit ADC.&lt;br /&gt;
** Two highly flexible analog comparators. Comparator outputs can be programmed to trigger a timer match signal or can be used to emulate 555 timer behavior.&lt;br /&gt;
* Power&lt;br /&gt;
** Three reduced power modes: Sleep, Deep-sleep, and Deep power-down.&lt;br /&gt;
** Processor wake-up from Deep-sleep mode via start logic using 12 port pins.&lt;br /&gt;
** Processor wake-up from Deep-power down and Deep-sleep modes via the RTC.&lt;br /&gt;
** Brownout detect with three separate thresholds each for interrupt and forced reset.&lt;br /&gt;
** Power-On Reset (POR).&lt;br /&gt;
** Integrated PMU (Power Management Unit).&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* 3.3 V power supply.&lt;br /&gt;
* Available as 64-pin and 48-pin LQFP package.&lt;br /&gt;
&lt;br /&gt;
== LPC13xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC13xx ===&lt;br /&gt;
[[Bild:LPC13xx_Selection_Guide_Sep2011.png|thumb|left|600px|Selection Guide zur LPC13xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
LPC1313 mit 32k-Flash mit 72MHz im LQFP 48 Gehäuse. Der LPC1313 ist bei &#039;&#039;&#039;[http://www.darisus.de/ Darius]&#039;&#039;&#039; erhältlich für 3,57 € (Juli 2016), oder elpro.org für 2,29 €.  Entwicklungskit INKLUSIVE JTAG-Programmer &amp;amp; Debugger bei &#039;&#039;&#039;[http://www.watterott.com/de/LPC1343-LPCXpresso-Board Watterott]&#039;&#039;&#039; für 23,80 € (Juli 2011)&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagram der LPC13xx Familie ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC13xx Block Diagram Sep2011.png|thumb|left|680px|Blockdiagramm der LPC13xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC1313 ===&lt;br /&gt;
* ARM Cortex-M3 processor, running at frequencies of up to 72 MHz.&lt;br /&gt;
* ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
* 32 kB on-chip flash programming memory.&lt;br /&gt;
* 8 kB SRAM.&lt;br /&gt;
* In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
* UART with fractional baud rate generation, modem, internal FIFO, and RS-485/EIA-485 support.&lt;br /&gt;
* SSP controller with FIFO and multi-protocol capabilities.&lt;br /&gt;
* Additional SSP controller on LPC1313FBD48/01.&lt;br /&gt;
* I2C-bus interface supporting full I2C-bus specification and Fast-mode Plus with a data rate of 1 Mbit/s with multiple address recognition and monitor mode.&lt;br /&gt;
* Up to 42 General Purpose I/O (GPIO) pins with configurable pull-up/pull-down resistors.&lt;br /&gt;
* Four general purpose counter/timers with a total of four capture inputs and 13 match outputs.&lt;br /&gt;
* Programmable Watchdog Timer (WDT) &lt;br /&gt;
* System tick timer.&lt;br /&gt;
* Serial Wire Debug and Serial Wire Trace port.&lt;br /&gt;
* High-current output driver (20 mA) on one pin.&lt;br /&gt;
* High-current sink drivers (20 mA) on two I2C-bus pins in Fast-mode Plus.&lt;br /&gt;
* Integrated PMU (Power Management Unit) to minimize power consumption during Sleep, Deep-sleep, and Deep power-down modes.&lt;br /&gt;
* Three reduced power modes: Sleep, Deep-sleep, and Deep power-down.&lt;br /&gt;
* Single power supply (2.0 V to 3.6 V).&lt;br /&gt;
* 10-bit ADC with input multiplexing among 8 pins.&lt;br /&gt;
* GPIO pins can be used as edge and level sensitive interrupt sources.&lt;br /&gt;
* Clock output function with divider that can reflect the system oscillator clock, IRC clock, CPU clock, or the watchdog clock.&lt;br /&gt;
* Processor wake-up from Deep-sleep mode via a dedicated start logic using up to 40 of the functional pins.&lt;br /&gt;
* Brownout detect with four separate thresholds for interrupt and one thresholds for forced reset.&lt;br /&gt;
* Power-On Reset (POR).&lt;br /&gt;
* Integrated oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
* 12 MHz internal RC oscillator trimmed to 1 % accuracy over the entire temperature and voltage range that can optionally be used as a system clock.&lt;br /&gt;
* Programmable watchdog oscillator with a frequency range of 7.8 kHz to 1.8 MHz. System PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the system oscillator or the internal RC oscillator.&lt;br /&gt;
* Code Read Protection (CRP) with different security levels.&lt;br /&gt;
* Unique device serial number for identification.&lt;br /&gt;
* Available as 48-pin LQFP package and 33-pin HVQFN package.&lt;br /&gt;
&lt;br /&gt;
== LPC17xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC17xx ===&lt;br /&gt;
[[Bild:LPC17xx_Selection_Guide_Sep2011.png|thumb|left|680px|Selection Guide zur LPC17xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
LPC1754 mit 128K Flash im LQFP80, der bei &#039;&#039;&#039;[http://www.darisus.de/ Darius]&#039;&#039;&#039; für 7€74 (Juli/2011) erhältlich ist,[den LPC1751 (32k/8k) schon für 5€95] und bei Digikey für 6€35, den LPC1764FBD100 bei &#039;&#039;&#039;[http://www.tme.eu/de TME]&#039;&#039;&#039;    für 7€ Entwicklungskit INCLUSIVE JTAG-Programmer &amp;amp; Debugger bei &#039;&#039;&#039;[http://www.watterott.com/de/LPC1769-LPCXpresso Watterott]&#039;&#039;&#039; für 23€80 (Juli/2011)&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagram der LPC17xx Familie ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:LPC177x_178x Block Diagram Sep2011.png|thumb|left|680px|Blockdiagramm der LPC17xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC1754 ===&lt;br /&gt;
* ARM Cortex-M3 processor, running at frequencies of up to 100 MHz &lt;br /&gt;
* A Memory Protection Unit (MPU) supporting eight regions is included.&lt;br /&gt;
* ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
* 128 kB on-chip flash program memory with In-System Programming (ISP) and In-Application Programming (IAP) capabilities. &lt;br /&gt;
* 32 kB of SRAM on the CPU with local code/data bus for high-performance CPU access.&lt;br /&gt;
* Eight channel General Purpose DMA controller &lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
* USB 2.0 full-speed controller that can be configured for either device, Host, or OTG operation with an on-chip PHY for device and Host functions &lt;br /&gt;
* Four UARTs with fractional baud rate generation, internal FIFO, IrDA, and DMA, Einer mit Modem I/Os und RS485 Support&lt;br /&gt;
* 1 CAN controller.&lt;br /&gt;
* 2 SSP controllers &lt;br /&gt;
* 1 SPI controller &lt;br /&gt;
* 2 I2C-bus interfaces with data rates of 1Mbit/s,&lt;br /&gt;
* I2S (Inter-IC Sound) &lt;br /&gt;
* 52  General Purpose I/O (GPIO) pins Any pin of ports 0 and 2 can be used to generate an interrupt.&lt;br /&gt;
* 8x 12-bit Analog-to-Digital Converter (ADC) conversion rates up to 200 kHz&lt;br /&gt;
* 1x 10-bit Digital-to-Analog Converter (DAC) &lt;br /&gt;
* Four general purpose timers/counters, with a total of eight capture inputs and ten compare outputs. &lt;br /&gt;
* One motor control PWM with support for three-phase motor control.&lt;br /&gt;
* Quadrature encoder interface that can monitor one external quadrature encoder.&lt;br /&gt;
* One standard PWM/timer block with external count input.&lt;br /&gt;
* Real-Time Clock (RTC) with a separate power domain including 20 bytes of battery-powered backup registers,  An RTC interrupt can wake up the CPU from any reduced power mode.&lt;br /&gt;
* Watchdog Timer (WDT). &lt;br /&gt;
* Cortex-M3 system tick timer&lt;br /&gt;
* Repetitive interrupt timer &lt;br /&gt;
* Standard JTAG test/debug interface as well as Serial Wire Debug and Serial Wire Trace Port options.&lt;br /&gt;
* Four reduced power modes: Sleep, Deep-sleep, Power-down, and Deep power-down.&lt;br /&gt;
* Single 3.3 V power supply (2.4 V to 3.6 V). &lt;br /&gt;
* Four external interrupt inputs configurable as edge/level sensitive. All pins on PORT0 and PORT2 can be used as edge sensitive interrupt sources.&lt;br /&gt;
* Non-maskable Interrupt (NMI) input.&lt;br /&gt;
* Wakeup Interrupt Controller (WIC) &lt;br /&gt;
* Each peripheral has its own clock divider for further power savings.&lt;br /&gt;
* Brownout detect with separate threshold for interrupt and forced reset.&lt;br /&gt;
* On-chip Power-On Reset (POR).&lt;br /&gt;
* On-chip crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
* 4 MHz internal RC oscillator trimmed to 1% accuracy that can optionally be used as a system clock.&lt;br /&gt;
* An on-chip PLL allows CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. May be run from the main oscillator, the internal RC oscillator, or the RTC oscillator.&lt;br /&gt;
* Available as 80-pin LQFP (12 x 12 x 1.4 mm) packages.&lt;br /&gt;
&lt;br /&gt;
== LPC18xx ==&lt;br /&gt;
&lt;br /&gt;
=== Familienübersicht LPC18xx ===&lt;br /&gt;
Bezugsquellen und Preise:&lt;br /&gt;
&lt;br /&gt;
=== Blockdiagramm der LPC18xx Familie ===&lt;br /&gt;
[[Bild:block.diagram_NXP18xx Sep2011.gif|thumb|left|680px|Blockdiagramm der LPC18xx Familie, ©NXP.com]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Features eines LPC18xx ===&lt;br /&gt;
DRAFT!&lt;br /&gt;
* Processor core&lt;br /&gt;
** ARM Cortex-M3 processor, running at frequencies of up to 180 MHz.&lt;br /&gt;
** ARM Cortex-M3 built-in Memory Protection Unit (MPU) supporting eight regions.&lt;br /&gt;
** ARM Cortex-M3 built-in Nested Vectored Interrupt Controller (NVIC).&lt;br /&gt;
** Non-maskable Interrupt (NMI) input.&lt;br /&gt;
** JTAG and Serial Wire Debug, serial trace, eight breakpoints, and four watch points.&lt;br /&gt;
** ETM and ETB support.&lt;br /&gt;
** System tick timer.&lt;br /&gt;
* On-chip memory (flashless parts LPC1850/30/20/10)&lt;br /&gt;
** Up to 200 kB SRAM total for code and data use.&lt;br /&gt;
** Two 32 kB SRAM blocks with separate bus access. Both SRAM blocks can be powered down individually.&lt;br /&gt;
** 64 kB ROM containing boot code and on-chip software drivers.&lt;br /&gt;
** 32-bit One-Time Programmable (OTP) memory for general-purpose customer use.&lt;br /&gt;
* On-chip memory (parts with on-chip flash)&lt;br /&gt;
** Up to 1 MB total dual bank flash memory with flash accelerator.&lt;br /&gt;
** In-System Programming (ISP) and In-Application Programming (IAP) via on-chip bootloader software.&lt;br /&gt;
** Up to 136 kB SRAM for code and data use.&lt;br /&gt;
** Two 32 kB SRAM blocks with separate bus access. Both SRAM blocks can be powered down individually.&lt;br /&gt;
** 32 kB ROM containing boot code and on-chip software drivers.&lt;br /&gt;
** 32-bit One-Time Programmable (OTP) memory for general-purpose customer use.&lt;br /&gt;
* Clock generation unit&lt;br /&gt;
** Crystal oscillator with an operating range of 1 MHz to 25 MHz.&lt;br /&gt;
** 12 MHz internal RC oscillator trimmed to 1 % accuracy.&lt;br /&gt;
** Ultra-low power RTC crystal oscillator.&lt;br /&gt;
** Three PLLs allow CPU operation up to the maximum CPU rate without the need for a high-frequency crystal. The second PLL is dedicated to the High-speed USB, the third PLL can be used as audio PLL.&lt;br /&gt;
** Clock output.&lt;br /&gt;
* Serial interfaces:&lt;br /&gt;
** Quad SPI Flash Interface (SPIFI) with four lanes and data rates of up to 40 MB per second total.&lt;br /&gt;
** 10/100T Ethernet MAC with RMII and MII interfaces and DMA support for high throughput at low CPU load. Support for IEEE 1588 time stamping/advanced time stamping (IEEE 1588-2008 v2).&lt;br /&gt;
** One High-speed USB 2.0 Host/Device/OTG interface with DMA support and on-chip PHY.&lt;br /&gt;
** One High-speed USB 2.0 Host/Device interface with DMA support, on-chip full-speed PHY and ULPI interface to external high-speed PHY.&lt;br /&gt;
** USB interface electrical test software included in ROM USB stack.&lt;br /&gt;
** Four 550 UARTs with DMA support: one UART with full modem interface; one UART with IrDA interface; three USARTs support synchronous mode and a smart card interface conforming to ISO7816 specification.&lt;br /&gt;
** Two C_CAN 2.0B controllers with one channel each.&lt;br /&gt;
** Two SSP controllers with FIFO and multi-protocol support. Both SSPs with DMA support.&lt;br /&gt;
** One Fast-mode Plus I2C-bus interface with monitor mode and with open-drain I/O pins conforming to the full I2C-bus specification. Supports data rates of up to 1 Mbit/s.&lt;br /&gt;
** One standard I2C-bus interface with monitor mode and standard I/O pins.&lt;br /&gt;
** Two I2S interfaces with DMA support, each with one input and one output.&lt;br /&gt;
* Digital peripherals:&lt;br /&gt;
** External Memory Controller (EMC) supporting external SRAM, ROM, NOR flash, and SDRAM devices.&lt;br /&gt;
** LCD controller with DMA support and a programmable display resolution of up to 1024H x 768V. Supports monochrome and color STN panels and TFT color panels; supports 1/2/4/8 bpp CLUT and 16/24-bit direct pixel mapping.&lt;br /&gt;
** SD/MMC card interface.&lt;br /&gt;
** Eight-channel General-Purpose DMA (GPDMA) controller can access all memories on the AHB and all DMA-capable AHB slaves.&lt;br /&gt;
** Up to 80 General-Purpose Input/Output (GPIO) pins with configurable pull-up/pull-down resistors and open-drain modes. &lt;br /&gt;
** GPIO registers are located on the AHB for fast access. GPIO ports have DMA support.&lt;br /&gt;
** State Configurable Timer (SCT) subsystem on AHB.&lt;br /&gt;
** Four general-purpose timer/counters with capture and match capabilities.&lt;br /&gt;
** One motor control PWM for three-phase motor control.&lt;br /&gt;
** One Quadrature Encoder Interface (QEI).&lt;br /&gt;
** Repetitive Interrupt timer (RI timer).&lt;br /&gt;
** Windowed watchdog timer.&lt;br /&gt;
** Ultra-low power Real-Time Clock (RTC) on separate power domain with 256 bytes of battery powered backup registers.&lt;br /&gt;
** Alarm timer; can be battery powered.&lt;br /&gt;
* Digital peripherals available on flash-based parts LPC18xx only:&lt;br /&gt;
** &amp;lt;tbd&amp;gt;&lt;br /&gt;
* Analog peripherals:&lt;br /&gt;
** One 10-bit DAC with DMA support and a data conversion rate of 400 kSamples/s.&lt;br /&gt;
** Two 10-bit ADCs with DMA support and a data conversion rate of 400 kSamples/s.&lt;br /&gt;
* Security:&lt;br /&gt;
** Hardware-based AES security engine programmable through an on-chip API.&lt;br /&gt;
** Two 128-bit secure OTP memories for AES key storage and customer use.&lt;br /&gt;
** Unique ID for each device.&lt;br /&gt;
* Power: &lt;br /&gt;
** Single 3.3 V (2.2 V to 3.6 V) power supply with on-chip internal voltage regulator for the core supply and the RTC power domain.&lt;br /&gt;
** RTC power domain can be powered separately by a 3 V battery supply.&lt;br /&gt;
** Four reduced power modes: Sleep, Deep-sleep, Power-down, and Deep power-down.&lt;br /&gt;
** Processor wake-up from Sleep mode via wake-up interrupts from various eripherals. &lt;br /&gt;
** Wake-up from Deep-sleep, Power-down, and Deep power-down modes via external interrupts and interrupts generated by battery powered blocks in the RTC power domain.&lt;br /&gt;
** Brownout detect with four separate thresholds for interrupt and forced reset.&lt;br /&gt;
** Power-On Reset (POR).&lt;br /&gt;
* Available as 100-pin, 144-pin, and 208-pin LQFP packages and as 100-pin, 180-pin, and 256-pin LBGA packages.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
=== LPCWare (kostenlos) ===&lt;br /&gt;
[[Bild:lpcxpresso-debug_Code-red_3Sep2011.gif|thumb|right|680px|Ansicht der Entwicklungsumgebung, ©code-red-tech.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Entwicklungs Tool ====&lt;br /&gt;
(Beschreibung aus der Web-Site:)&lt;br /&gt;
LPCXpresso&#039;s IDE (Ursprünglich von &amp;quot;Code RED&amp;quot; entwickelt, die Firma wurde 2013 von LPC gekauft) ist eine hoch integrierte Entwicklungsumgebung für LPC-Controller, und beinhaltet alle zur Entwicklung erforderlichen Tools um hoch qualitative Software in einer angemessenen Zeit zu schreiben. LPCXpresso basiert auf ein vereinfachtes Eclipse mit vielen LPC-specifischen Erweiterungen.&lt;br /&gt;
Des Weiteren ist eine aktuelle Version der Industrie-Standard GNU Tool-Chain mit einer propritären und optimierten C-Lib mit dabei. Die LPCXpresso IDE stellt ein voll optimiertes Executable zur Verfügung. Die einzige Beschränkung der kostenlosen Version ist eine Limitierung auf 256kB Code nach erfolgter Registrierung.&lt;br /&gt;
Das LPCXpresso Target Board ist eine Gemeinschaftsentwicklung von Embedded Artists, Code Red und NXP.&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
Die LPCXpresso IDE stellt eine C-Umgebung mit Syntax-Colouring, Source-Formatierung, Funktions-Folding, sowie mit Online- und Offline Hilfe und umfangreichen Projekt-Management Funktionen zur Verfügung.  &lt;br /&gt;
Dies beinhaltet:&lt;br /&gt;
* Wizards um Projekte für alle unterstützten Controller zu erstellen &lt;br /&gt;
* Automatische Linker Script Generierung inklusive Memory-Map Unterstützung &lt;br /&gt;
* Programmierung des Controllers&lt;br /&gt;
* On-Line Debugging&lt;br /&gt;
* Datenblatt-Zugriff über eingebauten Browser&lt;br /&gt;
* Support für die NXP LPC Microcontroller Familien, von Cortex-M0, Cortex-M3 bis Cortex-M4 und ARM7 bis ARM9&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Peripherie und Register Views im Debugger ====&lt;br /&gt;
Der Peripherie-Viewer im integrierten Debugger zeigt alle Register und Bit-Felder in einer einfachen Baumstruktur.&lt;br /&gt;
Ein Prozessor-Register Viewer erlaubt den Zugriff auf alle Prozessor-Register und stellt eine &amp;quot;Smart-Formatting&amp;quot;  Funktion zur Verfügung um komplexe Register wie Flags oder Status Register übersichtlich darstellen zu können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Unterstützte Familien ====&lt;br /&gt;
Cortex-M0, Cortex-M3, Cortex-M4, Einzelne Controller aus der LPC2000 family, ARM966, ARM926-EJ, ARM926-EJ + VFP&lt;br /&gt;
&lt;br /&gt;
==== Sehr preiswerter USB_JTAG_SWD Debugger ====&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 (PDF)]&#039;&#039;&#039; und diese &#039;&#039;&#039;[http://www.mikrocontroller.net/wikisoftware/index.php?title=LPC1xxx_Entwicklungskit_LPCXpresso Beschreibung]&#039;&#039;&#039;&lt;br /&gt;
Der neue Programmer/Debugger ist hier für ca 18€ +P&amp;amp;P erhältlich &#039;&#039;&#039;[http://www.watterott.com/de/LPC-Link-2 Programmer]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Standard Library ====&lt;br /&gt;
Im Download der &amp;quot;Code Red&amp;quot; Entwicklungsumgebung ist eine relativ umfangreiche Firmwarebibliothek vorhanden.&lt;br /&gt;
&lt;br /&gt;
==== Installationsanleitung zur IDE ====&lt;br /&gt;
&#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red Installationsanleitung]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Codebase für LPC11xx und LPC13xx ====&lt;br /&gt;
Für die Cortex-M0 und -M3 Familien existieren verschiedene Basispakete die als Startausstattung sehr gut geeignet sind. Auf microbuilder.eu findet man eine sehr interessante Version inklusive Dokumentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.mikrocontroller.net/articles/Codebase_f%C3%BCr_LPC1xxx HIER]&#039;&#039;&#039; findet man alle Links zur original Codebase mit allen Dateien (Stand Januar 2012) aber auch eine deutsche Übersetzung zu den Files.&lt;br /&gt;
&lt;br /&gt;
=== CooCox ===&lt;br /&gt;
&lt;br /&gt;
Auf der &#039;&#039;&#039;[http://www.coocox.org/Index.html Homepage]&#039;&#039;&#039; von CooCox - einem chinesischen Open-Source Projekt, auf der eine IDE für Atmel, Energy Micro, Holtek, Nuvoton, ST, TI und NXP verfügbar ist  - findet man die auf Eclipse basierende &amp;quot;CooCox CoIDE&amp;quot;, die sich aus dem &amp;quot;CoBuilder&amp;quot; und dem &amp;quot;CoDebugger&amp;quot; zusammensetzt.&lt;br /&gt;
Des Weiteren bietet man dort ein Echtzeit-Multitasking Betriebssystem, sowie SW-Versionen von zwei unterschiedliche Debugging-Adapter und ein Stand-alone Flash-Tool zum freien Download an.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Controller können damit programmiert und debugged werden:&lt;br /&gt;
    LPC1111x101    LPC1111x201   LPC1112x101   LPC1112x201&lt;br /&gt;
    LPC1113x201    LPC1113x301   LPC1114x201   LPC1114x301&lt;br /&gt;
    LPC11C14x301   LPC11C12x301&lt;br /&gt;
    LPC1224x101    LPC1224x121   LPC1225x301   LPC1225x321   LPC1226x301  LPC1227x301&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LPC1311   LPC1313   LPC1342   LPC1343&lt;br /&gt;
    LPC1751   LPC1752   LPC1754   LPC1756   LPC1758   LPC1759&lt;br /&gt;
    LPC1763   LPC1764   LPC1765   LPC1766   LPC1767   LPC1768   LPC1769&lt;br /&gt;
&lt;br /&gt;
=== EmBlocks ===&lt;br /&gt;
&#039;&#039;&#039;[http://www.emblocks.org/web/ Emblocks]&#039;&#039;&#039; ist eine kostenlose Entwicklungsumgebung. Sie unterstützt neben NXP uC weitere ARM uC (STM32, EFM32) sowie PIC, AVR und MSP430. Die IDE hat einen eingebauten GDB Debugger welcher System view (Peripherie Register anzeigen) beim Debuggen unterstützt. Ausserdem gibt es einen Project Wizzard für NXP uC &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Unterstützt wird der JLINK mit folgenden NXP uC:&lt;br /&gt;
LPC11Axx, LPC11Exx, LPC11Uxx, LPC11xxLV, LPC12xx, LPC13Uxx, LPC13xx, LPC17xx, LPC18xx, LPC18xx, LPC177x_8x, LPC407x_8x&lt;br /&gt;
&lt;br /&gt;
=== Codebase ===&lt;br /&gt;
Des Weiteren existiert eine umfangreiche Sammlung von &#039;&#039;&#039;[http://www.coocox.org/NXP-Series.php Code-Beispielen]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Keil ===&lt;br /&gt;
[https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM] (Windows, Free Version auf 32KB begrenzt, mit vielen Beispielen zu div. Evaluation Boards) &lt;br /&gt;
*[http://www.keil.com/arm/chips.asp unterstützte Mikrocontroller]&lt;br /&gt;
=== WinARM ===&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;
=== GNUARM ===&lt;br /&gt;
[http://gnuarm.com/ GNUARM] (Linux, Windows, wird derzeit nicht gepflegt), &lt;br /&gt;
&lt;br /&gt;
=== Yagarto ===&lt;br /&gt;
[http://www.yagarto.de/ Yagarto] (Windows, mit Eclipse-Integration) &lt;br /&gt;
&lt;br /&gt;
=== CodeSourcery ===&lt;br /&gt;
[http://www.codesourcery.com/gnu_toolchains/arm CodeSourcery CodeBench Lite]&lt;br /&gt;
&lt;br /&gt;
== CMSIS  -  Standard für alle Plattformen ==&lt;br /&gt;
Der Cortex Microcontroller Software Interface Standard (CMSIS) stellt einen &amp;quot;abstraction layer&amp;quot; für alle Cortex-Mx Controller zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
CMSIS stellt einen Schnittstellenstandard von ARM dar, der von vielen Tool-Herstellern unterstützt wird und ist (laut verschiedener Berichte)  kompatibel mit den verschiedensten Compilern (incl GCC). Dies wird erreicht durch einheitliche Definitionen für Adressen und Namen die den Zugriff auf die Register des Cores und der Peripherie ermöglichen.&lt;br /&gt;
Auch Standard-Funktionen für den Start und die Interrupts stehen zur Verfügung.&lt;br /&gt;
Natürlich kann auch weiterhin direkt auf die HW zugegriffen werden, es geht nur um eine Vereinheitlichung von identischen Funktionen. &lt;br /&gt;
Da die Peripherie-Teile zumindest innerhalb eines Halbleiterherstellers für die Cortex-Mx Controller sehr ähnlich oder sogar weitgehend identisch sind kann deutlich mehr SW für verschiedene Derivate innerhalb dieser Prozessorfamilien wiederverwendet werden.  (siehe Google: &amp;quot;CMSIS_Doulos_Tutorial.pdf&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Ein weiterer, interessanter Punkt ist die CMSIS-DSP Lib mit ihren Vektorfunktionen, Matrix-Berechnung sowie komplexen Algorithmen für Filter, &lt;br /&gt;
Regler und Fourietransformation sowie weiterer DSP Algorithmen (insgesamt 61).&lt;br /&gt;
&lt;br /&gt;
Leider hat diese Kompatibilität auch ihre Grenzen, denn Sonderfunktionen bzw. Spezialitäten in der &amp;quot;gleichen&amp;quot; Peripherie zwischen unterschiedlichen Halbleiterherstellern werden nicht abgedeckt. &lt;br /&gt;
Wäre auch zu schön, wenn die Prozesorhersteller dem Entwickler dadurch einen fliegenden HW-Wechsel bzw. eine einfache Vergleichbarkeit ermöglichen würden ;-)&lt;br /&gt;
&lt;br /&gt;
Eine komplette CMSIS-Lib (V2.0) &amp;quot;Cortex Microcontroller Software Interface Standard&amp;quot; ist für das &amp;quot;Code Red&amp;quot; Paket verfügbar, inklusive einer &amp;quot;DSP-Library&amp;quot; &lt;br /&gt;
http://support.code-red-tech.com/CodeRedWiki/NewInVersion4&lt;br /&gt;
bzw. für GNU / Keil / IAR unter&lt;br /&gt;
http://ics.nxp.com/support/documents/microcontrollers/?search=CMSIS&amp;amp;type=software&amp;amp;Search.x=8&amp;amp;Search.y=12&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* Wiki&lt;br /&gt;
** &#039;&#039;&#039;[[LPC1xxx_Entwicklungskit_LPCXpresso]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Codebase_f%C3%BCr_LPC1xxx]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[LPC1xxx für Umsteiger]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Projekte&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/264089 FreeRTOS auf LPC1768]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/321481 Multithreading auf LPC8xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/319537 Python Script zum Flashen des LPC8xx]&lt;br /&gt;
&lt;br /&gt;
* Suche im Forum&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC8* LPC8xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC11* LPC11xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC11* LPC11xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC12* LPC12xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC13* LPC13xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC17* LPC17xx]&lt;br /&gt;
** [http://www.mikrocontroller.net/search?query=LPC18* LPC18xx]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
(Die Preiswertesten sind &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt)&lt;br /&gt;
* &#039;&#039;&#039;[http://darisusgmbh.de/shop/advanced_search_result.php?keywords=LPC1&amp;amp;x=0&amp;amp;y=0 Darisus]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[http://www.elpro.org/shop/shop.php elpro]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.hbe-shop.de HBE] &lt;br /&gt;
* [http://www.tme.eu/de/katalog#cleanParameters%3D1%26searchClick%3D1%26search%3DLPC1%26bf_szukaj%3D+ TME]&lt;br /&gt;
* [http://www.tn-electronics.de/advanced_search_result.php?keywords=LPC1&amp;amp;x=0&amp;amp;y=0 TN]&lt;br /&gt;
* [http://de.mouser.com/_/?Keyword=LPC1&amp;amp;Ns=Pricing|0&amp;amp;FS=True Mouser]&lt;br /&gt;
* [http://www.soselectronic.eu/?searchstring=LPC1&amp;amp;str=378 SOS]&lt;br /&gt;
* [http://de.farnell.com Farnell/Element14]&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* [http://www.watterott.com/index.php?page=search&amp;amp;page_action=query&amp;amp;desc=off&amp;amp;sdesc=on&amp;amp;keywords=LPCXpresso Watterott (24€ inclusive JTAG-Programmiergerät UND JTAG Debugger für kostenlose &amp;quot;Code-Red&amp;quot; Entwicklungsplattform)], dazu hier die [[LPC1xxx_Entwicklungskit_LPCXpresso|Beschreibung]]&lt;br /&gt;
* [http://www.lpctools.com/evaluationboardskitsforlpc17xx.aspx LPC-Tools]&lt;br /&gt;
* [http://thinkembedded.ch/NXP:::25.html thinkembedded.ch] div. Olimex Boards&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://www.nxp.com/#/page/content=[f=/dynamic/applicationnotes/tid-50809_sid-56890/data.xml] Appnotes&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html Projects]&lt;br /&gt;
* [http://mbed.org/handbook/Homepage MBED]&lt;br /&gt;
* [http://forums.nxp.com/forums/viewforum.php?f=1 NXP-WIKI]&lt;br /&gt;
* [http://knowledgebase.nxp.com/forumdisplay.php?s=389a3610c741bca7b18221d32b9c0ce0&amp;amp;f=4 NXP-Forum]&lt;br /&gt;
* [http://ics.nxp.com/lpcxpresso/ LPCXpresso]&lt;br /&gt;
* [http://code.google.com/p/32bitmicro/ 32BitMicro]&lt;br /&gt;
* [http://www.brc-electronics.nl SimpleCortex]&lt;br /&gt;
* [http://www.lpcware.com/ LPCWare NXP MCU community]&lt;br /&gt;
* [http://nanohome.be/nxp/index.html LPC175/6x und LPC23xx pin Configurator]&lt;br /&gt;
* [https://code.google.com/p/lpc-1768-arm-synthesizer/  MIDI controlled monophonic synthesizer based on the LPCXpresso 1768.]&lt;br /&gt;
* [https://code.google.com/p/lpc1343codebase/  An open source software library for NXP&#039;s Cortex-M3 based LPC1300 microcontroller family]&lt;br /&gt;
* [https://code.google.com/p/lpc1114codebase/   An open source software library for NXP&#039;s Cortex-M0 based LPC1100 microcontroller family]&lt;br /&gt;
* [https://code.google.com/p/lpc-12xx-bootloader/  A flexible bootloader for use with LPC12xx Microcontrollers from NXP, Firmware code is AES128 encrypted to secure your project / source code when giving out public firmware updates. ]&lt;br /&gt;
* [https://code.google.com/p/lpcxpresso-rc/   Read receiver and sensor signals for radio controlled model aircrafts configured for LPCXpresso]&lt;br /&gt;
* [https://code.google.com/p/olpcx/   Open toolset for LPCXpresso]&lt;br /&gt;
* [https://code.google.com/p/32bitmicro/   Collection of code and tools for 32 bit microcontrollers]&lt;br /&gt;
* [https://code.google.com/p/my-nxp-lpc1114/   my-nxp-lpc1114 study course]&lt;br /&gt;
* [https://code.google.com/p/nxp-lpc/   nxp-lpc]&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsplattformen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.lpcware.com/lpcxpresso/home LPDXpresso Download (Kostenlos mit Debugger)]&lt;br /&gt;
* [http://www.lpcware.com LPCXpresso Homepage]&lt;br /&gt;
* [http://support.code-red-tech.com/CodeRedWiki/WikiHome CR-WIKI]&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp ARM/Keil MDK-ARM]&lt;br /&gt;
* IAR EWARM&lt;br /&gt;
* Rowley Crossworks&lt;br /&gt;
* Green Hills Software &lt;br /&gt;
* [http://www.coocox.org/CooCox_CoIDE.htm CooCox] (Kostenlos)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:LPC1x]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_GCC&amp;diff=95275</id>
		<title>ARM GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_GCC&amp;diff=95275"/>
		<updated>2017-02-12T15:59:07Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;arm-gcc ist ein freier [[C]]-Cross-[[Compiler]] für [[ARM]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es primär um den arm-none-eabi-gcc, der ein für embedded Systems optimiertes ABI (Application Binary Interface) hat. Für ARM-System, die ein eigenständiges OS (wie Linux) haben, gibt es den arm-elf-gcc.&lt;br /&gt;
&lt;br /&gt;
Es gibt diverse fertige Binärdistributionen die für verschiedene Controller mit ARM-Kern verwendet werden können. &lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
Die Toolchain besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung.&lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* eine C-Standardbibliothek &lt;br /&gt;
&lt;br /&gt;
Die vorherrschende C-Bibliothek ist die [https://sourceware.org/newlib/ newlib] (oder auch [https://github.com/32bitmicro/newlib-nano-1.0 newlib-nano]), für andere Optionen siehe [http://wiki.osdev.org/C_Library#Implementations hier].&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;
== Fertige GCC Binärdistributionen ==&lt;br /&gt;
* [https://developer.arm.com/open-source/gnu-toolchain/gnu-rm GCC-ARM-Embedded] ([https://launchpad.net/gcc-arm-embedded Ältere Releases]) für Cortex-R4/R5/R7/R8/M0(+)/M3/M4(F)/M7/M23/M33. Windows, Linux, Mac, bereitgestellt von ARM selbst, vollständiger Support für FPUs, C++11, kein Code-Size-Limit&lt;br /&gt;
* [http://www.mentor.com/embedded-software/codesourcery Mentor Graphics Sourcery Tools (vormals CodeSourcery CodeBench Lite)] Windows, Linux&lt;br /&gt;
* [http://sourceforge.net/projects/devkitpro/ devkitPro]&lt;br /&gt;
* [http://www.lpcware.com/lpcxpresso/home LPCXpresso] (vormals CodeRed IDE) ist eine IDE von NXP für die LPC-Mikrocontroller die den GCC enthält&lt;br /&gt;
* [http://www.yagarto.de/ Yagarto] (Windows, mit Eclipse-Integration) - veraltet&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#winarm WinARM] - veraltet&lt;br /&gt;
* GNUARM - veraltet&lt;br /&gt;
* summon-arm Toolchain: hat einen Compiler-Bug [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 Optimierungsleveln &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 unter Umständen nicht so aussehen wie sie sollten.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [http://embdev.net/topic/129986#1175214 ARM-GCC development resources] im Forum.&lt;br /&gt;
&lt;br /&gt;
== Nutzung mit eigener Umgebung/Kommandozeile ==&lt;br /&gt;
Hier einige Hinweise wie man den GCC direkt verwenden kann (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt.&lt;br /&gt;
=== Compiler &amp;amp; Linker Flags ===&lt;br /&gt;
Die Flags, die festlegen, welcher Core verwendet wird, sind in der folgenden Tabelle beschrieben:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M0&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M0+&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M3&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M4&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M7&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M33&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M23&lt;br /&gt;
|-&lt;br /&gt;
| CPU&lt;br /&gt;
| -mcpu=cortex-m0&amp;lt;sup&amp;gt;[1]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| -mcpu=cortex-m0plus&amp;lt;sup&amp;gt;[1]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| -mcpu=cortex-m3&lt;br /&gt;
| -mcpu=cortex-m4&lt;br /&gt;
| -mcpu=cortex-m7&lt;br /&gt;
| -mcpu=cortex-m33&lt;br /&gt;
| -mcpu=cortex-m23&lt;br /&gt;
|-&lt;br /&gt;
| Float ABI&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | -mfloat-abi=soft&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | -mfloat-abi=soft&lt;br /&gt;
&lt;br /&gt;
-mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
-mfloat-abi=hard&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -mfloat-abi=soft&lt;br /&gt;
|-&lt;br /&gt;
| FPU&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &lt;br /&gt;
| -mfpu=fpv4-sp-d16&lt;br /&gt;
| -mfpu=fpv5-d16&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Instruction Set&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | -mthumb&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;[1]&amp;lt;/sup&amp;gt;&amp;lt;small&amp;gt;Anmerkung: Es gibt für diese Cores 2 Optionen (für den Hersteller): diese Betreffen die Multiplikationsbefehle. &lt;br /&gt;
* Die übliche Implementierung enthält einen 1-Takt-Multiplizierer&lt;br /&gt;
* Für reduzierte Chipfläche kann auche ein 32-Takt-Multiplizierer ausgewählt werden&lt;br /&gt;
Um nun bei Multiplikationen mit Konstanten nicht die langsame 32-Takt-Multiplikation zu nutzen kann der Compiler angewiesen werden, dort Shifts oder Ähnliches zu generieren. &lt;br /&gt;
Um dem Compiler das mitzuteilen wird der Parameter, der die CPU angibt, abgeändert: -mcpu=cortex-m0[plus].small-multiply&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu diesen Flags gibt es noch die Maschinenunabhängigen Parameter, wovon hier nur einige wichtigen erläutert werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 20% | Option !! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
| -W[all, extra]&lt;br /&gt;
| Lässt den Compiler Warnungen ausgeben. &lt;br /&gt;
-Wall gibt nur Standard-Warnungen aus, nicht alle!&lt;br /&gt;
-Wextra erzeugt noch einmal mehr Warnungen.&lt;br /&gt;
|-&lt;br /&gt;
| -O[0,1,2,3,s,g]&lt;br /&gt;
| Wählt die Art der Optimierung.&lt;br /&gt;
-O0: keine Optimierung&lt;br /&gt;
-O[1,2,3]: Optimierung auf Ausführungsgeschwindigkeit. Je höher die Stufe, desto aggressiver ist die Optimierung. Das führt unter Umständen zu beträchtlich größerem Code&lt;br /&gt;
-Os: Optimierung auf Codegröße&lt;br /&gt;
-Og: Optimierung, aber so, dass das Debugging nicht erschwert wird&lt;br /&gt;
|-&lt;br /&gt;
| -fdata-sections&lt;br /&gt;
-ffunction-sections&lt;br /&gt;
| Teilt jeder Funktion/jeder Variable eine eigene Section zu.Damit kann der Linker mit der Option --gc-sections ungenutzte Funktionen entfernen. Siehe [[GCC:_unbenutzte_Funktionen_entfernen]]&lt;br /&gt;
|-&lt;br /&gt;
| -Wl,--gc-sections&lt;br /&gt;
| Der Linker verwirft unreferenzierte Sections und packt diese damit nicht ins Binary. Siehe [[GCC:_unbenutzte_Funktionen_entfernen]]&lt;br /&gt;
|-&lt;br /&gt;
| -g&lt;br /&gt;
| Erzeugt Debugging-Informationen.&lt;br /&gt;
Siehe auch [https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html GCC Debugging Options]&lt;br /&gt;
|-&lt;br /&gt;
| -fno-rtti&lt;br /&gt;
-fno-exceptions&lt;br /&gt;
| C++-Optionen&lt;br /&gt;
Teilt dem Compiler mit, dass&lt;br /&gt;
- keine Runtime Type Information zu generieren sind&lt;br /&gt;
- keine Exceptions benutzt werden und damit kein Overhead generiert werden muss.&lt;br /&gt;
|-&lt;br /&gt;
| -flto&lt;br /&gt;
| Link-Time-Optimizations:&lt;br /&gt;
Der Linker optimiert den kompletten Code. Da er nicht nur ein Source-File, sondern alle kennt, kann er optimieren, wo dem Compiler  Informationen fehlen.&lt;br /&gt;
Achtung: bei älteren Compiler-Versionen muss nach diesem Flag noch einmal die Optimierungsstufe angegeben werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die [http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html#Option-Summary GCC Dokumentation] listet alle Parameter auf, auch [http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html#ARM-Options Parameter speziell für ARM].&lt;br /&gt;
&lt;br /&gt;
* Siehe auch das [https://launchpadlibrarian.net/135588846/readme.txt Readme vom GCC-ARM-Embedded]&lt;br /&gt;
* Um das -flto -Flag verwenden zu können, muss der GCC [http://gcc.gnu.org/onlinedocs/gccint/LTO.html LTO] unterstützen. Beim GCC-ARM-Embedded ist dies ab Version 4.7-2013-q2-update  der Fall.&lt;br /&gt;
* Die LTO erkennt die ISR&#039;s und den Interrupt Vector möglicherweise als &amp;quot;unbenutzt&amp;quot; und optimiert sie daher weg. Dies kann durch Markierung der Funktionen &amp;amp; Variablen mit  &amp;quot;__attribute__ ((used))&amp;quot; verhindert werden.&lt;br /&gt;
* Alle Compileroptionen müssen auch beim Linken mit angegeben werden (ist in obiger Tabelle berücksichtigt), da auch dann u.U. Code generiert werden kann.&lt;br /&gt;
&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. Das Script ist praktisch Controller-spezifisch, es gibt Beispiel-Scripte der Controller-Hersteller.&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. Startupcode im allgemeinen ist meistens in Assembler geschrieben, aber die ARM-Architektur macht aber auch einfacheren C/C++-Code möglich. Auch für den Startupcode gibt es Beispiele der Controller-Hersteller.&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;
=== FPU der Cortex-M4F nutzen ===&lt;br /&gt;
Um die FPU zu nutzen, muss der Compiler per [[#Compiler_.26_Linker_Flags|Flag]] dazu gebracht werden, FPU-Instruktionen zu generieren.&lt;br /&gt;
&lt;br /&gt;
Außerdem muss vor Benutzung der FPU-Befehle die FPU aktiviert werden, dies geschieht typischerweise im Startupcode, bevor die main() -Funktion aufgerufen wird. Hier die entsprechenden Befehle, falls sie im verwendeten Startupcode nicht onehin schon enthalten sind:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;/*FPU settings*/&lt;br /&gt;
 ldr     r0, =0xE000ED88           /* Enable CP10,CP11 */&lt;br /&gt;
 ldr     r1,[r0]&lt;br /&gt;
 orr     r1,r1,#(0xF &amp;lt;&amp;lt; 20)&lt;br /&gt;
 str     r1,[r0]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In C/C++ unter Verwendung der CMSIS geht es so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
SCB-&amp;gt;CPACR |= ((3UL &amp;lt;&amp;lt; 10*2)|(3UL &amp;lt;&amp;lt; 11*2)); /* set CP10 and CP11 Full Access */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin sollte die GCC-Distribution auch Laufzeitbibliotheken mit FPU-Unterstützung mitbringen (CodeBench lite und Yagarto werden ohne ausgeliefert, GCC-ARM-Embedded mit).&lt;br /&gt;
&lt;br /&gt;
Am Beispiel der STM32F4 mehr dazu in diesem Thread: [http://www.mikrocontroller.net/topic/261021 Floating Pointing Unit STM32F4]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/298976#3197418 Hier] finden sich noch ein paar Tipps, für den 1. kann aber mittlerweile der GCC-ARM-Embedded direkt verwendet werden, da er jetzt LTO unterstützt (s.o.).&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/178840 Thread]: Unterschied arm-none-eabi-gcc und arm-elf-gcc&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]]&lt;br /&gt;
[[Category:Compiler]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_GCC&amp;diff=95274</id>
		<title>ARM GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_GCC&amp;diff=95274"/>
		<updated>2017-02-12T15:54:00Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Artikel überarbeitet, neue Tabellen eigefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;arm-gcc ist ein freier [[C]]-Cross-[[Compiler]] für [[ARM]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es primär um den arm-none-eabi-gcc, der ein für embedded Systems optimiertes ABI (Application Binary Interface) hat. Für ARM-System, die ein eigenstädniges OS (wie Linux) haben, gibt es den arm-elf-gcc.&lt;br /&gt;
&lt;br /&gt;
Es gibt diverse fertige Binärdistributionen die für verschiedene Controller mit ARM-Kern verwendet werden können. &lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
Die Toolchain besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung.&lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* eine C-Standardbibliothek &lt;br /&gt;
&lt;br /&gt;
Die vorherrschende C-Bibliothek ist die [https://sourceware.org/newlib/ newlib] (oder auch [https://github.com/32bitmicro/newlib-nano-1.0 newlib-nano]), für andere Optionen siehe [http://wiki.osdev.org/C_Library#Implementations hier].&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;
== Fertige GCC Binärdistributionen ==&lt;br /&gt;
* [https://developer.arm.com/open-source/gnu-toolchain/gnu-rm GCC-ARM-Embedded] ([https://launchpad.net/gcc-arm-embedded Ältere Releases]) für Cortex-R4/R5/R7/R8/M0(+)/M3/M4(F)/M7/M23/M33. Windows, Linux, Mac, bereitgestellt von ARM selbst, vollständiger Support für FPUs, C++11, kein Code-Size-Limit&lt;br /&gt;
* [http://www.mentor.com/embedded-software/codesourcery Mentor Graphics Sourcery Tools (vormals CodeSourcery CodeBench Lite)] Windows, Linux&lt;br /&gt;
* [http://sourceforge.net/projects/devkitpro/ devkitPro]&lt;br /&gt;
* [http://www.lpcware.com/lpcxpresso/home LPCXpresso] (vormals CodeRed IDE) ist eine IDE von NXP für die LPC-Mikrocontroller die den GCC enthält&lt;br /&gt;
* [http://www.yagarto.de/ Yagarto] (Windows, mit Eclipse-Integration) - veraltet&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#winarm WinARM] - veraltet&lt;br /&gt;
* GNUARM - veraltet&lt;br /&gt;
* summon-arm Toolchain: hat einen Compiler-Bug [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;
Siehe auch [http://embdev.net/topic/129986#1175214 ARM-GCC development resources] im Forum.&lt;br /&gt;
&lt;br /&gt;
== Nutzung mit eigener Umgebung/Kommandozeile ==&lt;br /&gt;
Hier einige Hinweise wie man den GCC direkt verwenden kann (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt.&lt;br /&gt;
=== Compiler &amp;amp; Linker Flags ===&lt;br /&gt;
Die Flags, die festlegen, welcher Core verwendet wird, sind in der folgenden Tabelle beschrieben:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M0&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M0+&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M3&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M4&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M7&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M33&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Cortex-M23&lt;br /&gt;
|-&lt;br /&gt;
| CPU&lt;br /&gt;
| -mcpu=cortex-m0&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
| -mcpu=cortex-m0plus&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
| -,mcpu=cortex-m3&lt;br /&gt;
| -mcpu=cortex-m4&lt;br /&gt;
| -mcpu=cortex-m7&lt;br /&gt;
| -mcpu=cortex-m33&lt;br /&gt;
| -mcpu=cortex-m23&lt;br /&gt;
|-&lt;br /&gt;
| Float ABI&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | -mfloat-abi=soft&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | -mfloat-abi=soft&lt;br /&gt;
&lt;br /&gt;
-mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
-mfloat-abi=hard&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -mfloat-abi=soft&lt;br /&gt;
|-&lt;br /&gt;
| FPU&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &lt;br /&gt;
| -mfpu=fpv4-sp-d16&lt;br /&gt;
| -mfpu=fpv5-d16&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Instruction Set&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | -mthumb&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;[1]&amp;lt;/sup&amp;gt;&amp;lt;small&amp;gt;Anmerkung: Es gibt für diese Cores 2 Optionen (für den Hersteller): diese Betreffen die Multipplikationsbefehle. &lt;br /&gt;
* Die übliche Implementierung enthält einen 1-Takt-Multiplizierer&lt;br /&gt;
* Für reduzierete Chipfläche kann auche ein 32-Takt-Multiplizierer ausgewählt werden&lt;br /&gt;
Um nun bei Multiplikationen mit Konstanten nicht die langsame 32-Takt-Multiplikation zu nutzen kann der Compiler angewiesen werden, dort Shifts oder Ähnliches zu generieren. &lt;br /&gt;
Um dem Compiler das mitzuteilen wird der Paramter, der die CPU angibt, abgeändert: -mcpu=cortex-m0[plus].small-multiply&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu diesen Flags gibt es noch die Maschinenunabhängigen Parameter, wovon hier nur einige wichtigen erläutert werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 20% | Option !! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
| -W[all, extra]&lt;br /&gt;
| Lässt den Compiler Warnungen ausgeben. &lt;br /&gt;
-Wall gibt nur Standard-Warnungen aus, nicht alle!&lt;br /&gt;
-Wextra erzeugt noch einmal mehr Warnungen.&lt;br /&gt;
|-&lt;br /&gt;
| -O[0,1,2,3,s,g]&lt;br /&gt;
| Wählt die Art der Optimierung.&lt;br /&gt;
-O0: keine Optimierung&lt;br /&gt;
-O[1,2,3]: Optimierung auf Ausführungsgeschwindigkeit. Je höher die Stufe, desto aggressiver ist die Optimierung. Das führt unter Umständen zu beträchtlich größerem Code&lt;br /&gt;
-Os: Optimierung auf Codegröße&lt;br /&gt;
-Og: Optimierung, aber so, dass das Debugging nicht erschwert wird&lt;br /&gt;
|-&lt;br /&gt;
| -fdata-sections&lt;br /&gt;
-ffunction-sections&lt;br /&gt;
| Teilt jeder Funktion/jeder Variable eine eigene Section zu.Damit kann der Linker mit der Option --gc-sections ungenutzte Funktionen entfernen. Siehe [[GCC:_unbenutzte_Funktionen_entfernen]]&lt;br /&gt;
|-&lt;br /&gt;
| -Wl,--gc-sections&lt;br /&gt;
| Der Linker verwirft unreferenzierte Sections und packt diese damit nicht ins Binary. Siehe [[GCC:_unbenutzte_Funktionen_entfernen]]&lt;br /&gt;
|-&lt;br /&gt;
| -g&lt;br /&gt;
| Erzeugt Debugging-Informationen.&lt;br /&gt;
Siehe auch [[https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html]]&lt;br /&gt;
|-&lt;br /&gt;
| -fno-rtti&lt;br /&gt;
-fno-exceptions&lt;br /&gt;
| C++-Optionen&lt;br /&gt;
Teilt dem Compiler mit, dass&lt;br /&gt;
- keine Runtime Type Information zu generieren sind&lt;br /&gt;
- keine Exceptions benutzt werden und damit kein Overhead generiert werden muss.&lt;br /&gt;
|-&lt;br /&gt;
| -flto&lt;br /&gt;
| Link-Time-Optimizations:&lt;br /&gt;
Der Linker optimiert den kompletten Code. Da er nicht nur ein Source-File, sondern alle kennt, kann er optimieren, wo dem Compiler  Informationen fehlen.&lt;br /&gt;
Achtung: bei älteren Compiler-Versionen muss nach diesem Flag noch einmal die Optimierungsstufe angegeben werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die [http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html#Option-Summary GCC Dokumentation] listet alle Parameter auf, auch [http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html#ARM-Options Parameter speziell für ARM].&lt;br /&gt;
&lt;br /&gt;
* Siehe auch das [https://launchpadlibrarian.net/135588846/readme.txt Readme vom GCC-ARM-Embedded]&lt;br /&gt;
* Um das -flto -Flag verwenden zu können, muss der GCC [http://gcc.gnu.org/onlinedocs/gccint/LTO.html LTO] unterstützen. Beim GCC-ARM-Embedded ist dies ab Version 4.7-2013-q2-update  der Fall.&lt;br /&gt;
* Die LTO erkennt die ISR&#039;s und den Interrupt Vector möglicherweise als &amp;quot;unbenutzt&amp;quot; und optimiert sie daher weg. Dies kann durch Markierung der Funktionen &amp;amp; Variablen mit  &amp;quot;__attribute__ ((used))&amp;quot; verhindert werden.&lt;br /&gt;
* Alle Compileroptionen müssen auch beim Linken mit angegeben werden (ist in obiger Tabelle berücksichtigt), da auch dann u.U. Code generiert werden kann.&lt;br /&gt;
&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. Das Script ist praktisch Controller-spezifisch, es gibt Beispiel-Scripte der Controller-Hersteller.&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. Startupcode im allgemeinen ist meistens in Assembler geschrieben, aber die ARM-Architektur macht aber auch einfacheren C/C++-Code möglich. Auch für den Startupcode gibt es Beispiele der Controller-Hersteller.&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;
=== FPU der Cortex-M4F nutzen ===&lt;br /&gt;
Um die FPU zu nutzen, muss der Compiler per [[#Compiler_.26_Linker_Flags|Flag]] dazu gebracht werden, FPU-Instruktionen zu generieren.&lt;br /&gt;
&lt;br /&gt;
Außerdem muss vor Benutzung der FPU-Befehle die FPU aktiviert werden, dies geschieht typischerweise im Startupcode, bevor die main() -Funktion aufgerufen wird. Hier die entsprechenden Befehle, falls sie im verwendeten Startupcode nicht onehin schon enthalten sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;/*FPU settings*/&lt;br /&gt;
 ldr     r0, =0xE000ED88           /* Enable CP10,CP11 */&lt;br /&gt;
 ldr     r1,[r0]&lt;br /&gt;
 orr     r1,r1,#(0xF &amp;lt;&amp;lt; 20)&lt;br /&gt;
 str     r1,[r0]&amp;lt;/pre&amp;gt;&lt;br /&gt;
In C/C++ unter Verwendung der CMSIS geht es so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
SCB-&amp;gt;CPACR |= ((3UL &amp;lt;&amp;lt; 10*2)|(3UL &amp;lt;&amp;lt; 11*2)); /* set CP10 and CP11 Full Access */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin sollte die GCC-Distribution auch Laufzeitbibliotheken mit FPU-Unterstützung mitbringen (CodeBench lite und Yagarto werden ohne ausgeleifert, GCC-ARM-Embedded mit).&lt;br /&gt;
&lt;br /&gt;
Am Beispiel der STM32F4 mehr dazu in diesem Thread: [http://www.mikrocontroller.net/topic/261021 Floating Pointing Unit STM32F4]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/298976#3197418 Hier] finden sich noch ein paar Tipps, für den 1. kann aber mittlerweile der GCC-ARM-Embedded direkt verwendet werden, da er jetzt LTO unterstützt (s.o.).&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/178840 Thread]: Unterschied arm-none-eabi-gcc und arm-elf-gcc&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]]&lt;br /&gt;
[[Category:Compiler]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:LPC-Mikrocontroller&amp;diff=95264</id>
		<title>Diskussion:LPC-Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:LPC-Mikrocontroller&amp;diff=95264"/>
		<updated>2017-02-11T17:06:01Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Neuer Abschnitt /* Umstrukturierung der Seite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Zustimmung von NXP sowie code-red zur Verlinkung bzw. zum direkten Kopieren aus der Domain www.nxp.com bzw. www.code-red-tech.com liegt mir vor. ([[Benutzer:Powerfreak|Powerfreak]] 3. Sep. 2011 (UTC))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kann man die Cortex M0 denn mit dem einfachen GCC für M3 bearbeiten? Oder bracht es da andere Tools?&lt;br /&gt;
Ja, kann man, die Standard-Tools decken das mit ab&lt;br /&gt;
&lt;br /&gt;
Solche Fragen bitte im Forum stellen - wie auch immer: siehe http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html und darin Erläuterungen zu -mcpu=name ([[Benutzer:Mthomas|Mthomas]] 15:35, 2. Sep. 2011 (UTC))&lt;br /&gt;
&lt;br /&gt;
== Umstrukturierung der Seite ==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich einmal das aktuelle Portfolio von NXP anschaut ([http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-mcus:LPC-ARM-CORTEX-M-MCUS LPC Microcontrollers | NXP]), dann stellt man fest, dass diese Seite nicht mehr aktuell ist: &lt;br /&gt;
Es gibt mehr Typen, als die bisher erwähnten LPC1xxx-µCs.&lt;br /&gt;
Der Seitentitel suggeriert auch, dass es eben nur um die LPC1x00-Serie geht, obwohl die LPC800er Serie auch erwähnt wird.&lt;br /&gt;
&lt;br /&gt;
Generell finde ich die Seite nicht mehr übersichtlich genug.&lt;br /&gt;
&lt;br /&gt;
Ein kleiner Überblick zu den aktuellen Produktreihen:&lt;br /&gt;
* Cortex-Kerne&lt;br /&gt;
:* LPC800 mit Cortex-M0+&lt;br /&gt;
:* LPC1100 mit Cortex-M0+/M0&lt;br /&gt;
:* LPC1200 mit Cortex-M0&lt;br /&gt;
:* LPC1300 mit Cortex-M3&lt;br /&gt;
:* LPC1500 mit Cortex-M3&lt;br /&gt;
:* LPC1700 mit Cortex-M3&lt;br /&gt;
:* LPC1800 mit Cortex-M3&lt;br /&gt;
:* LPC4000 mit Cortex-M4&lt;br /&gt;
:* LPC4300 mit Cortex-M4 und M0&lt;br /&gt;
:* LPC54000 mit Cortex-M4 und M0+&lt;br /&gt;
* und eventuell auch die anderen ARM Kerne&lt;br /&gt;
:* (LPC2000 mit ARM7TDMI)&lt;br /&gt;
:* (LPC3000 mit ARM926EJ)&lt;br /&gt;
&lt;br /&gt;
Deswegen mein Vorschlag: die aktuelle Seite umbenennen/verschieben auf eine neue Seite &amp;quot;LPC MCUs&amp;quot;/&amp;quot;LPC Mikrocontroller&amp;quot; (oder so ähnlich) und dann die Seite zu updaten. Darunter fällt &lt;br /&gt;
sowohl generell die neuen Informationen aufzunehmen, als auch ältere Daten auf den aktuellen Stand zu bringen. (Die Verlinkung links in der Übersicht müsste auch angepasst werden)&lt;br /&gt;
&lt;br /&gt;
Auch sollte man die Seite durchgehend in deutsch schreiben, oder wenigstens deutsche Erklärungen dazu.&lt;br /&gt;
&lt;br /&gt;
Des weiteren könnte man die Eval-Boards von NXP erwähnen.&lt;br /&gt;
&lt;br /&gt;
Freue mich auf eure Meinungen dazu&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Newgeneration|Newgeneration]] ([[Benutzer Diskussion:Newgeneration|Diskussion]]) 18:06, 11. Feb. 2017 (CET)&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Gleitkommazahlen&amp;diff=95100</id>
		<title>Gleitkommazahlen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Gleitkommazahlen&amp;diff=95100"/>
		<updated>2017-01-31T13:23:34Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Hinzufügen der Berechnung von Hand&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gleitkommazahlen sind eine Möglichkeit für Computer und Mikrocontroller mit rationalen Zahlen (also Brüche und Kommazahlen) zu rechnen. Die damit verbundene Gleitkommaarithmetik ist das Gegenstück zur [[Festkommaarithmetik]].&lt;br /&gt;
&lt;br /&gt;
Um effizient mit Gleitkommazahlen zu rechnen empfiehlt sich ein Controller mit eingebauter [[FPU]], da dieser Hardware-Befehle zum Umgang mit diesen besitzt. Sonst muss die Toolchain alle Gleitkommaoperationen mittels mehrerer Hardwarebefehle nachbilden, was Zeit und Speicher kostet.&lt;br /&gt;
&lt;br /&gt;
== Darstellung von Zahlen ==&lt;br /&gt;
Anders als gewohnt werden die Zahlen nicht einfach binär gespeichert, sondern nach dem IEEE-754-Format:&lt;br /&gt;
&lt;br /&gt;
x = (-1)&amp;lt;sup&amp;gt;s&amp;lt;/sup&amp;gt; * m * b&amp;lt;sup&amp;gt;e&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* x ist die gewünschte Zahl im Gleitkommaformat&lt;br /&gt;
* s ist das Vorzeichen-bit: 0 entspricht +, 1 entspricht -&lt;br /&gt;
* m ist die sogenannte Mantisse, sie speichert die Ziffern der Zahl&lt;br /&gt;
* b ist die Basis 2 und&lt;br /&gt;
* e ist der Exponent, dieser gibt die Position des Kommas an&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Bits für Exponent und Mantisse hängen von der gewünschten Genauigkeit ab.&lt;br /&gt;
Die Programmiersprache [[C]] (und die davon abgeleiteten) kennen folgende Genauigkeiten:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | Datentyp !! style=&amp;quot;width:10%&amp;quot; | Anzahl Bits !! style=&amp;quot;width:7.5%&amp;quot; | Sign  !! style=&amp;quot;width:10%&amp;quot; | Mantisse !! style=&amp;quot;width:10%&amp;quot; | Exponent !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;float&#039;&#039;       || style=&amp;quot;text-align:right&amp;quot;| 32 Bit      || style=&amp;quot;text-align:right&amp;quot;| 1 bit || style=&amp;quot;text-align:right&amp;quot;| 23 bit   || style=&amp;quot;text-align:right&amp;quot;| 8 bit    || &#039;&#039;single precision&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;double&#039;&#039;      || style=&amp;quot;text-align:right&amp;quot;| 64 Bit      || style=&amp;quot;text-align:right&amp;quot;| 1 bit || style=&amp;quot;text-align:right&amp;quot;| 52 bit   || style=&amp;quot;text-align:right&amp;quot;| 11 bit   || &#039;&#039;double precision&#039;&#039;&lt;br /&gt;
Achtung: Abweichend vom Standard sind double beim [[AVR-GCC]] und der avr-libc auch nur 32 Bit!&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;long double&#039;&#039; || style=&amp;quot;text-align:right&amp;quot;| 80 Bit      || style=&amp;quot;text-align:right&amp;quot;| 1 bit || style=&amp;quot;text-align:right&amp;quot;| 64 bit   || style=&amp;quot;text-align:right&amp;quot;| 15 bit   || &#039;&#039;extendend precision&#039;&#039; &lt;br /&gt;
Achtung: Der C Standard legt nicht genau fest, wie long double zu implementieren ist. Diese Angaben sind also nicht allgemein gültig.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Gespeichert wird in der folgenden Reihenfolge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pre&amp;quot;&amp;gt;&lt;br /&gt;
+------+----------+----------+&lt;br /&gt;
| Sign | Exponent | Mantisse |&lt;br /&gt;
+------+----------+----------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wobei der Exponent rechtsbündig ist, die Mantisse dagegen linksbündig. Das LSB steht immer rechts, das MSB links.&lt;br /&gt;
&lt;br /&gt;
== Berechnung von Hand ==&lt;br /&gt;
Als Beispiel soll die Zahl -12,75 dienen. Diese soll ins IEEE754-single-precision-Format gewandelt werden.&lt;br /&gt;
&lt;br /&gt;
Zuerst muss man die Mantisse berechnen: Das funktioniert in 3 Schritten:&lt;br /&gt;
# Umrechnen: Vom Dezimalsystem ins Dualsystem konvertieren. 12,75&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; -&amp;gt; 1100,11&lt;br /&gt;
# Normieren: Das Komma wird so weit verschoben, bis es genau eine führende 1 gibt. 1,10011&lt;br /&gt;
# Mantisse: die führende 1 Kommt bei jeder Zahl (mit Ausnahme von den Spezialfällen) vor, also ist sie redundant und wird nicht gespeichert. Somit ist das Bitmuster unserer Mantisse 10011&lt;br /&gt;
&lt;br /&gt;
Der Exponent ist eigentlich auch ganz einfach: dieser gibt an, um wie viele Stellen wir das Komma verschoben haben, im Beispiel also 3. Allerdings wird im Exponent nicht nur eine 3 gespeichert, denn dann wären Negative Exponenten nicht (so einfach) möglich. Deswegen wird der Exponent 0 einfach auf die Hälfte minus 1 der maximal darstellbaren Zahl festgelegt, bei &#039;&#039;float&#039;&#039; mit einem 8-bit-Exponent also auf 256 / 2 -1 = 127. Dies nennt sich Bias. Bei &#039;&#039;double&#039;&#039; ist dieser Bias dementsprechend 1023. Um nun den &amp;quot;richtigen&amp;quot; wert des Exponenten herauszubekommen muss man nun diesen Bias zu unserem Wert 3 addieren, was 130 ergibt. &lt;br /&gt;
&lt;br /&gt;
Nun muss man nur noch die Ergebnisse zusammenbasteln:&lt;br /&gt;
* Die Zahl ist negativ, also ist das Sign-Bit gesetzt&lt;br /&gt;
* Der Exponent ist 130&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; bzw. 1000 0010&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Die Mantisse ist 10011&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; und wird linksbündig gespeichert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pre&amp;quot;&amp;gt;&lt;br /&gt;
+-+--------+-----------------------+&lt;br /&gt;
|S|Exponent|       Mantisse        |&lt;br /&gt;
+-+--------+-----------------------+&lt;br /&gt;
|1|10000010|10011000000000000000000|&lt;br /&gt;
+-+--------+-----------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
* hoher Dynamikbereich: je nach dem wie viele Bits genutzt werden können sehr sehr kleine und sehr große Werte dargestellt werden&lt;br /&gt;
* Extra definierte Zahlen für -INF (minus Unendlich), +INF (plus Unendlich) und NaN (not a number), die bei Rechenoperationen herauskommen können und somit geprüft werden können. So sind (immer bei Gleitkommarechnungen, nicht Integer) eine Zahl (ungleich 0) / 0 immer INF (+ oder - je nach dem ob die Zahl größer oder kleiner 0 war). 0/0 entspricht immer NaN. Bei Integerrechnungen sind diese Operationen undefiniert.&lt;br /&gt;
* Formeln können mehr oder weniger komplett und direkt übernommen werden. Es muss nur darauf geachtet werden, dass die Operationen auch in float/double ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Ein kleines Beispielprogramm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    double a = 5 / 3; &lt;br /&gt;
    printf(&amp;quot;5 / 3 = %.10f (Berechnung mittels int)\n&amp;quot;, a);&lt;br /&gt;
    double b = 5.0 / 3.0;&lt;br /&gt;
    printf(&amp;quot;5 / 3 = %.10f (Berechnung mittels double)\n&amp;quot;, b);&lt;br /&gt;
    double c = (double)5 / 3;&lt;br /&gt;
    printf(&amp;quot;5 / 3 = %.10f (Berechnung mittels cast auf double)&amp;quot;, c);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses hat die folgende Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pre&amp;quot;&amp;gt;&lt;br /&gt;
5 / 3 = 1.0000000000 (Berechnung mittels int)&lt;br /&gt;
5 / 3 = 1.6666666667 (Berechnung mittels double)&lt;br /&gt;
5 / 3 = 1.6666666667 (Berechnung mittels cast auf double)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nachteile ==&lt;br /&gt;
* Unterläufe von sehr kleinen Zahlen auf 0&lt;br /&gt;
* Auslöschung bei Subtraktion: Bei zwei fast gleich großen Zahlen wird das Ergebnis falsch&lt;br /&gt;
* Prüfen auf Gleichheit: siehe [http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison hier]&lt;br /&gt;
* Absorption, dazu wieder ein kleines Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    float little =    0.0000001F;&lt;br /&gt;
    float huge = 100000.0000000F;&lt;br /&gt;
    printf(&amp;quot;little        = %17.10f\n&amp;quot;, little);&lt;br /&gt;
    printf(&amp;quot;huge          = %17.10f\n&amp;quot;, huge);&lt;br /&gt;
    printf(&amp;quot;little + huge = %17.10f&amp;quot;, little + huge);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses hat die folgende Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pre&amp;quot;&amp;gt;&lt;br /&gt;
little        =      0.0000001000&lt;br /&gt;
huge          = 100000.0000000000&lt;br /&gt;
little + huge = 100000.0000000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wie man sehen kann: Durch die viel kleinere Zahl und den damit verbundenen Ungenauigkeiten bei der Rechnung ändert die Rechnung nichts.&lt;br /&gt;
&lt;br /&gt;
* Ungenaue Darstellung von Zahlen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    // ich habe dieses Beispiel gewählt, weil meine &amp;quot;tolle und hochgenaue&amp;quot; Taschenrechner App dieses Ergebnis ausgab&lt;br /&gt;
    printf(&amp;quot;6,4 - 6,85 = %.15f&amp;quot;, 6.4 - 6.85);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pre&amp;quot;&amp;gt;&lt;br /&gt;
6,4 - 6,85 = -0.449999999999999&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sollte ja eigentlich -0,45 sein. Aber weil der Computer mit der Basis 2, wie Menschen im allgemeinen mit der Basis 10 rechnen, sind diese für uns einfachen Zahlen für einen Computer eben nicht genau darzustellen. Und dann passieren bei Rechnungen solche Fehler&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
Gleitkommazahlen sind kein Allheilmittel, im Gegenteil. Sie sollten nur mit bedacht eingesetzt werden.&lt;br /&gt;
Das Problem ist, das viele Leute gar nicht wissen, was Gleitkommazahlen eigentlich sind und vor allem wie sie Aufgebaut sind.&lt;br /&gt;
&lt;br /&gt;
Bei Problemen mit kleinem oder gar keinem Dynamikbereich ist oftmals [[Festkommaarithmetik]] die bessere Wahl.&lt;br /&gt;
&lt;br /&gt;
Wenn man Gleitkommazahlen jedoch mit bedacht einsetzt und immer die möglichen Fehler im Kopf hat, dann sind diese sehr mächtig.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html What Every Computer Scientist Should Know About Floating-Point Arithmetic]&lt;br /&gt;
* [https://www.cs.berkeley.edu/~wkahan/MathSand.pdf Abhandlung von 1983 über Gleitkommazahlen in Taschenrechnern (HP-15C) und anderen präzisen Berechnungen (8087 FPU)]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94740</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94740"/>
		<updated>2017-01-02T21:02:41Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: /* Voraussetzungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== C-Kenntnisse ===&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich nur wärmstens empfehlen, ein C-Buch oder wenigstens ein (gutes) C-Tutorial durchzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
=== Andere Vorkenntnisse ===&lt;br /&gt;
* [[Bitmanipulation]]&lt;br /&gt;
* [[Harvard-Architektur]]&lt;br /&gt;
* Wissen über [[AVR]] und [[Mikrocontroller]] allgemein kann nicht schaden&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
* Compiler: Man sollte entweder die Pfade zu den Executables des avr-gccs in der Arduino-Umgebung zur Umgebungsvariable PATH hinzufügen oder, vor allem wenn man die Arduino-IDE später deinstallieren möchte, eine separate Compiler-Installation vornehmen. Siehe dazu [[AVR-GCC]]. &lt;br /&gt;
* Ein Terminal-Programm wie Putty oder HTerm kann nie schaden.&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. &lt;br /&gt;
Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der Arduino-Libraries ===&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der delay()-Aufrufen ====&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 828 Bytes (2%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der I/O-Aufrufe ====&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind. Wichtig sind dazu vor allem drei [[Register]]:&lt;br /&gt;
* PORT&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Register&lt;br /&gt;
* DDR&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Direction Register&lt;br /&gt;
* PIN&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Input Pin Register&lt;br /&gt;
Wobei das &#039;&#039;x&#039;&#039; für den Port steht. Welche Ports es gibt hängt vom jeweiligen AVR ab. Der Atmega328p hat zum Beispiel vier Stück: PORTA, PORTB, PORTC, PORTD. Ein ATmega2560 hingegen hat derer elf: PORTA - PORTH und PORTJ - PORTL.&lt;br /&gt;
Gemeinsam ist allen, dass ein Port maximal 8 Pins enthält (P&#039;&#039;XN&#039;&#039;, &#039;&#039;X&#039;&#039;=Port-Buchstabe, &#039;&#039;N&#039;&#039;=Port-Bit).&lt;br /&gt;
&lt;br /&gt;
Genaueres gibt es hier:&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_Register| Register-Zugriffe]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_IO-Ports| I/O-Ports]]&lt;br /&gt;
Eine Kurzfassung folgt nun:&lt;br /&gt;
&lt;br /&gt;
Um auf die I/O-Register (beziehungsweise Register allgemein) zugreifen zu können braucht man eine weiter Header-Datei:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels diesen Registern kann man dann jeden einzelnen Pin steuern. Die folgende Tabelle zeigt die Einstellungsmöglichkeiten:&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;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das übrige PINx-Register hat nun auch wieder zwei Einsatzmöglichkeiten. Wenn der Pin ein Input-Pin ist (DDxn = 0), dann gibt dieses Register den Zustand des Pins aus, eine 1 für High und eine 0 für Low. Ist der Pin jedoch als Ausgang konfiguriert, dann können neuere AVRs (praktisch alle auf Arduinos) den Pin direkt &amp;quot;togglen&amp;quot;, also umschalten: ist er aktuell High, dann wird er auf Low geschalten, und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Wissen können wir wieder unseren Code anpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
    {&lt;br /&gt;
        PORTD |= (1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);       // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 534 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man sieht: der Speicherverbrauch wurde nochmal gedrückt, und schneller wurde das Programm auch noch.&lt;br /&gt;
&lt;br /&gt;
Bleiben aber noch Fragen: Warum verbraucht dieses Mini-Programm immer noch so viel Flash? Un warum wird RAM verbraucht, obwohl keine einzige Variable verwendet wird?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Geschwindigkeit mittels Oszi messen &#039;&#039;(Darf gerne auch von jemand anderem gemacht werden)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== main()-Funktion statt setup() &amp;amp; loop() ===&lt;br /&gt;
Die Arduino-IDE hat im Vergleich zu anderen IDEs eine &amp;quot;Gemeinheit&amp;quot; eingebaut. Um es dem Benutzer einfacher zu manchen, ändert diese stillschweigend den Code (fügt etwa eine main()-Funktion hinzu und das include &amp;lt;Arduino.h&amp;gt;) und zieht Code mitein, selbst wenn dieser nicht genutzt wird. &lt;br /&gt;
&lt;br /&gt;
So zum Beispiel die Interrupt-Routine, die den Millisekunden-Timer für die delay()-Funktion bildet: Sowohl die Routine an sich, als auch die Konfigurierung des Interrupts und auch die generelle Erlaubnis aller ISRs geschieht automatisch, ohne das der User daran etwas ändern kann. &lt;br /&gt;
&lt;br /&gt;
Das ist im Normalfall auch in Ordnung, da sich der 08/15-Arduino-Benutzer gar nicht dafür interessiert.&lt;br /&gt;
&lt;br /&gt;
Bei uns ist das aber etwas anderes! Also wird das Programm an ein richtiges C-Programm angeglichen, also mit einer main()-Funktion, statt setup() und loop().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
        {&lt;br /&gt;
            PORTD |= (1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
            _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
            PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);       // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
        }&lt;br /&gt;
        _delay_ms(1000);              // waits for a second&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 222 Bytes (0%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 0 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2048 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voilà! Da haben wir es: Der Code-Verbrauch ist nochmal drastisch gesunken und vor allem: keine Varaible, kein RAM-Verbrauch!&lt;br /&gt;
&lt;br /&gt;
Damit ist jeder Arduino-Code, der im Hintergrund dazukam, getilgt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Compiler mag shiften um Variablen nicht, also das (1 &amp;lt;&amp;lt; i). Es ist wesentlich besser, wenn man so etwas schreibt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t mask = (1 &amp;lt;&amp;lt; 0);&lt;br /&gt;
for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
{&lt;br /&gt;
    PORTD |= mask;            // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
    _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
    PORTD &amp;amp;= ~mask;           // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    mask = (mask &amp;lt;&amp;lt; 1);       // shift the bit to the left&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das ist erstens schneller und verbraucht zweitens weniger Speicher (im Beispiel nur noch 204 Bytes).&lt;br /&gt;
&lt;br /&gt;
== Weg von der Arduino-IDE ==&lt;br /&gt;
=== Auswahl der neuen IDE ===&lt;br /&gt;
So, nun ist man an dem Punkt angelangt, an welchem man sich dazu entscheiden kann (und &#039;&#039;meiner&#039;&#039; Meinung auch sollte), Abschied von der Arduino-IDE zu nehmen. Diese ist in vielerlei Hinsicht nicht optimal, sei es zum Beispiel beim highlighting von Code oder der mangelnden Konfigurationsmöglichkeit.&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Möglichkeiten, wie man nun weiter verfahren kann:&lt;br /&gt;
* bei der Arduino-IDE bleiben&lt;br /&gt;
* auf das [[Atmel Studio]] umsteigen (entweder Version 7 mit zahlreichen neuen Features, oder VErsion 4, falls es schnell und zuverlässig sein soll)&lt;br /&gt;
* auf eine andere IDE (z.B. [[eclipse]]) umsteigen&lt;br /&gt;
* Mittels [[AVR-GCC-Tutorial/Exkurs_Makefiles|Makefiles]] und einem Editor/einer IDE seiner Wahl arbeiten&lt;br /&gt;
&lt;br /&gt;
Ich persönlich habe mich nach langen arbeiten mit jeder dieser Möglichkeiten (abgesehen von der Arduino-IDE, diese habe ich mehr oder weniger direkt verworfen) für die letzte, für das Arbeiten mit Makefiles, entschieden. Dort hat man völlige Kontrolle über alles: was wird wann mit welchen Option kompiliert und was wird hinzugelinkt?&lt;br /&gt;
&lt;br /&gt;
Das sollte aber jeder für sich selber herausfinden. Die Liste oben ist von der Schwierigkeit her sortiert, das bedeutet, das Makefiles das anspruchsvollste sind.&lt;br /&gt;
&lt;br /&gt;
=== Einarbeiten in die neue Umgebung ===&lt;br /&gt;
Sobald man sich auf eine IDE festgelegt hat, sollte man sich in diese erst einmal Einarbeiten. Auf diesem Punkt kann in dieser Anleitung nicht eingegangen werden, da sich mögliche Tipps oder Ähnliches ja nach IDE unterscheiden würden.&lt;br /&gt;
&lt;br /&gt;
Am besten versucht man erstmal die für sich wichtigen Funktionen zu finden und mit der neuen Umgebung allgemein zurech zu kommen.&lt;br /&gt;
&lt;br /&gt;
Ziel ist auf jeden Fall, das obige Programm zu kompilieren zu bekommen.&lt;br /&gt;
&lt;br /&gt;
=== Das Programm übertragen ===&lt;br /&gt;
So weit, so gut. &lt;br /&gt;
&lt;br /&gt;
Der neue Editor/Die neue IDE läuft, der Code kompiliert.&lt;br /&gt;
&lt;br /&gt;
Doch wie bringt man nun den Code auf den AVR? Dazu gibt es unter Anderem zwei Möglichkeiten auf die ich hier eingehen möchte:&lt;br /&gt;
* mit extra [[AVR_In_System_Programmer|Programmer/Debugger]]&lt;br /&gt;
* mittels dem eingebrannten [[Bootloader]]&lt;br /&gt;
Was das ist wird hier nicht erklärt, dafür sind die Artikel verlinkt.&lt;br /&gt;
&lt;br /&gt;
==== Programmer/Debugger ====&lt;br /&gt;
Wer schon einen Programmer oder gar Debugger für AVRs sein Eigen nennen kann, der sollte diesen verwenden, da damit noch einmal der Speicherplatz für den Bootloader frei wird (Dadurch kann das Programm noch einmal ~2kB größer werden) und auch die Wartezeit nach jedem Reset entfällt.&lt;br /&gt;
&lt;br /&gt;
Wer noch keinen Programmer hat, der muss sich nicht unbedingt einen solchen kaufen, solange er mit den eben genannten Nachteilen leben kann. &lt;br /&gt;
&lt;br /&gt;
Wer aber jetzt in die Tasche greifen will, der kann sich überlegen, ob er vielleicht nicht lieber direkt einen vollwertigen Debugger kauft. Damit kann man, wie auch am PC, ein laufendes Programm anhalten, Werte von Registern anzeigen, etc. So etwas kann sehr hilfreich sein, wenn &amp;quot;unerklärliche&amp;quot; Phänomene auftreten.&lt;br /&gt;
&lt;br /&gt;
Wie man mit dem Programmer dann schließlich den AVR programmiert hängt wieder von der IDE ab. Beim Atmel Studio wird man sicherlich auf den Programming Dialog zurückgreifen, bei anderen IDEs wird wahrscheinlich ein Drittprogram wie [[AVRDUDE|avrdude]] verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Bootloader ====&lt;br /&gt;
Alle Arduinos kommen mit einem vorinstalliertem Bootloader. Mit diesem lässt sich der Prozessor auch ohne Programmer über USB direkt flashen.&lt;br /&gt;
&lt;br /&gt;
Also PC-Programm bietet sich dazu [[AVRDUDE|avrdude]] an. Dieses ist ein mehr oder weniger &amp;quot;Universales&amp;quot; Brennprogramm für fast alle AVR-Typen. Es beherrscht auch die Kommunikation mit dem Arduino-Bootloader. Damit kann man dann ganz einfach sein Programm übertragen. Die Kommandozeile ist leider je nach Arduino- und Bootloader-Versio etwas anderes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# beim Arduino mega ist es &lt;br /&gt;
$ avrdude -cwiring -patmega2560 -P&amp;lt;serial port&amp;gt; -b115200 -U flash:w:&amp;lt;file&amp;gt; -D&lt;br /&gt;
# andere Konfigurationen könnten sein (von mir ungetestet, gerne zu Vervollständigen)&lt;br /&gt;
$ avrdude -carduino -patmega328p -P&amp;lt;serial port&amp;gt; -b115200 -U flash:w:&amp;lt;file&amp;gt; -D&lt;br /&gt;
$ avrdude -carduino -patmega328p -P&amp;lt;serial port&amp;gt; -b57600 -U flash:w:&amp;lt;file&amp;gt; -D&lt;br /&gt;
$ avrdude -cstk500v2 -patmega328p -P&amp;lt;serial port&amp;gt; -b115200 -U flash:w:&amp;lt;file&amp;gt; -D&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arduino-Library Ersatz ==&lt;br /&gt;
Nachdem das Minimal-Programm von oben nun auf dem AVR-Board getestet wurde, geht es weiter. &lt;br /&gt;
&lt;br /&gt;
Wir haben uns von Arduino verabschiedet, damit aber auch von allen Arduino-Libraries! Das bedeutet, dass selbst so banale Sachen wie Serial.println() nicht mehr existieren. Diese müssen wir nun selber schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Erstellen eigener Libraries ===&lt;br /&gt;
Hier soll nun ein Beispiel mit einer Schritt-für-Schritt-Anleitung gegeben werden. Dazu habe ich mir das UART-Modul ausgesucht.&lt;br /&gt;
&lt;br /&gt;
==== Serielle Kommunikation mittels UART-Hardware ====&lt;br /&gt;
Das wird zwar dann die X-te UART library, aber zur Demonstration eignet sich das UART-Modul hervorragend.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Verlinkungen zu weiterführenden Artikeln, Beispiel für UART und LCD library selbst geschrieben, ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial]]&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;br /&gt;
[[Kategorie:Baustelle]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94739</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94739"/>
		<updated>2017-01-02T20:56:49Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Programmer/Bootloader und Libraries hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== C-Kenntnisse ===&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich nur wärmstens empfehlen, ein C-Buch oder wenigstens ein (gutes) C-Tutorial durchzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
=== Andere Vorkenntnisse ===&lt;br /&gt;
* [[Bitmanipulation]]&lt;br /&gt;
* [[Harvard-Architektur]]&lt;br /&gt;
* Wissen über [[AVR]] und [[Mikrocontroller]] allgemein kann nicht schaden&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. &lt;br /&gt;
Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der Arduino-Libraries ===&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der delay()-Aufrufen ====&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 828 Bytes (2%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der I/O-Aufrufe ====&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind. Wichtig sind dazu vor allem drei [[Register]]:&lt;br /&gt;
* PORT&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Register&lt;br /&gt;
* DDR&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Direction Register&lt;br /&gt;
* PIN&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Input Pin Register&lt;br /&gt;
Wobei das &#039;&#039;x&#039;&#039; für den Port steht. Welche Ports es gibt hängt vom jeweiligen AVR ab. Der Atmega328p hat zum Beispiel vier Stück: PORTA, PORTB, PORTC, PORTD. Ein ATmega2560 hingegen hat derer elf: PORTA - PORTH und PORTJ - PORTL.&lt;br /&gt;
Gemeinsam ist allen, dass ein Port maximal 8 Pins enthält (P&#039;&#039;XN&#039;&#039;, &#039;&#039;X&#039;&#039;=Port-Buchstabe, &#039;&#039;N&#039;&#039;=Port-Bit).&lt;br /&gt;
&lt;br /&gt;
Genaueres gibt es hier:&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_Register| Register-Zugriffe]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_IO-Ports| I/O-Ports]]&lt;br /&gt;
Eine Kurzfassung folgt nun:&lt;br /&gt;
&lt;br /&gt;
Um auf die I/O-Register (beziehungsweise Register allgemein) zugreifen zu können braucht man eine weiter Header-Datei:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels diesen Registern kann man dann jeden einzelnen Pin steuern. Die folgende Tabelle zeigt die Einstellungsmöglichkeiten:&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;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das übrige PINx-Register hat nun auch wieder zwei Einsatzmöglichkeiten. Wenn der Pin ein Input-Pin ist (DDxn = 0), dann gibt dieses Register den Zustand des Pins aus, eine 1 für High und eine 0 für Low. Ist der Pin jedoch als Ausgang konfiguriert, dann können neuere AVRs (praktisch alle auf Arduinos) den Pin direkt &amp;quot;togglen&amp;quot;, also umschalten: ist er aktuell High, dann wird er auf Low geschalten, und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Wissen können wir wieder unseren Code anpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
    {&lt;br /&gt;
        PORTD |= (1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);       // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 534 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man sieht: der Speicherverbrauch wurde nochmal gedrückt, und schneller wurde das Programm auch noch.&lt;br /&gt;
&lt;br /&gt;
Bleiben aber noch Fragen: Warum verbraucht dieses Mini-Programm immer noch so viel Flash? Un warum wird RAM verbraucht, obwohl keine einzige Variable verwendet wird?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Geschwindigkeit mittels Oszi messen &#039;&#039;(Darf gerne auch von jemand anderem gemacht werden)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== main()-Funktion statt setup() &amp;amp; loop() ===&lt;br /&gt;
Die Arduino-IDE hat im Vergleich zu anderen IDEs eine &amp;quot;Gemeinheit&amp;quot; eingebaut. Um es dem Benutzer einfacher zu manchen, ändert diese stillschweigend den Code (fügt etwa eine main()-Funktion hinzu und das include &amp;lt;Arduino.h&amp;gt;) und zieht Code mitein, selbst wenn dieser nicht genutzt wird. &lt;br /&gt;
&lt;br /&gt;
So zum Beispiel die Interrupt-Routine, die den Millisekunden-Timer für die delay()-Funktion bildet: Sowohl die Routine an sich, als auch die Konfigurierung des Interrupts und auch die generelle Erlaubnis aller ISRs geschieht automatisch, ohne das der User daran etwas ändern kann. &lt;br /&gt;
&lt;br /&gt;
Das ist im Normalfall auch in Ordnung, da sich der 08/15-Arduino-Benutzer gar nicht dafür interessiert.&lt;br /&gt;
&lt;br /&gt;
Bei uns ist das aber etwas anderes! Also wird das Programm an ein richtiges C-Programm angeglichen, also mit einer main()-Funktion, statt setup() und loop().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
        {&lt;br /&gt;
            PORTD |= (1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
            _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
            PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);       // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
        }&lt;br /&gt;
        _delay_ms(1000);              // waits for a second&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 222 Bytes (0%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 0 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2048 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voilà! Da haben wir es: Der Code-Verbrauch ist nochmal drastisch gesunken und vor allem: keine Varaible, kein RAM-Verbrauch!&lt;br /&gt;
&lt;br /&gt;
Damit ist jeder Arduino-Code, der im Hintergrund dazukam, getilgt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Compiler mag shiften um Variablen nicht, also das (1 &amp;lt;&amp;lt; i). Es ist wesentlich besser, wenn man so etwas schreibt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t mask = (1 &amp;lt;&amp;lt; 0);&lt;br /&gt;
for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
{&lt;br /&gt;
    PORTD |= mask;            // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
    _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
    PORTD &amp;amp;= ~mask;           // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    mask = (mask &amp;lt;&amp;lt; 1);       // shift the bit to the left&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das ist erstens schneller und verbraucht zweitens weniger Speicher (im Beispiel nur noch 204 Bytes).&lt;br /&gt;
&lt;br /&gt;
== Weg von der Arduino-IDE ==&lt;br /&gt;
=== Auswahl der neuen IDE ===&lt;br /&gt;
So, nun ist man an dem Punkt angelangt, an welchem man sich dazu entscheiden kann (und &#039;&#039;meiner&#039;&#039; Meinung auch sollte), Abschied von der Arduino-IDE zu nehmen. Diese ist in vielerlei Hinsicht nicht optimal, sei es zum Beispiel beim highlighting von Code oder der mangelnden Konfigurationsmöglichkeit.&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Möglichkeiten, wie man nun weiter verfahren kann:&lt;br /&gt;
* bei der Arduino-IDE bleiben&lt;br /&gt;
* auf das [[Atmel Studio]] umsteigen (entweder Version 7 mit zahlreichen neuen Features, oder VErsion 4, falls es schnell und zuverlässig sein soll)&lt;br /&gt;
* auf eine andere IDE (z.B. [[eclipse]]) umsteigen&lt;br /&gt;
* Mittels [[AVR-GCC-Tutorial/Exkurs_Makefiles|Makefiles]] und einem Editor/einer IDE seiner Wahl arbeiten&lt;br /&gt;
&lt;br /&gt;
Ich persönlich habe mich nach langen arbeiten mit jeder dieser Möglichkeiten (abgesehen von der Arduino-IDE, diese habe ich mehr oder weniger direkt verworfen) für die letzte, für das Arbeiten mit Makefiles, entschieden. Dort hat man völlige Kontrolle über alles: was wird wann mit welchen Option kompiliert und was wird hinzugelinkt?&lt;br /&gt;
&lt;br /&gt;
Das sollte aber jeder für sich selber herausfinden. Die Liste oben ist von der Schwierigkeit her sortiert, das bedeutet, das Makefiles das anspruchsvollste sind.&lt;br /&gt;
&lt;br /&gt;
=== Einarbeiten in die neue Umgebung ===&lt;br /&gt;
Sobald man sich auf eine IDE festgelegt hat, sollte man sich in diese erst einmal Einarbeiten. Auf diesem Punkt kann in dieser Anleitung nicht eingegangen werden, da sich mögliche Tipps oder Ähnliches ja nach IDE unterscheiden würden.&lt;br /&gt;
&lt;br /&gt;
Am besten versucht man erstmal die für sich wichtigen Funktionen zu finden und mit der neuen Umgebung allgemein zurech zu kommen.&lt;br /&gt;
&lt;br /&gt;
Ziel ist auf jeden Fall, das obige Programm zu kompilieren zu bekommen.&lt;br /&gt;
&lt;br /&gt;
=== Das Programm übertragen ===&lt;br /&gt;
So weit, so gut. &lt;br /&gt;
&lt;br /&gt;
Der neue Editor/Die neue IDE läuft, der Code kompiliert.&lt;br /&gt;
&lt;br /&gt;
Doch wie bringt man nun den Code auf den AVR? Dazu gibt es unter Anderem zwei Möglichkeiten auf die ich hier eingehen möchte:&lt;br /&gt;
* mit extra [[AVR_In_System_Programmer|Programmer/Debugger]]&lt;br /&gt;
* mittels dem eingebrannten [[Bootloader]]&lt;br /&gt;
Was das ist wird hier nicht erklärt, dafür sind die Artikel verlinkt.&lt;br /&gt;
&lt;br /&gt;
==== Programmer/Debugger ====&lt;br /&gt;
Wer schon einen Programmer oder gar Debugger für AVRs sein Eigen nennen kann, der sollte diesen verwenden, da damit noch einmal der Speicherplatz für den Bootloader frei wird (Dadurch kann das Programm noch einmal ~2kB größer werden) und auch die Wartezeit nach jedem Reset entfällt.&lt;br /&gt;
&lt;br /&gt;
Wer noch keinen Programmer hat, der muss sich nicht unbedingt einen solchen kaufen, solange er mit den eben genannten Nachteilen leben kann. &lt;br /&gt;
&lt;br /&gt;
Wer aber jetzt in die Tasche greifen will, der kann sich überlegen, ob er vielleicht nicht lieber direkt einen vollwertigen Debugger kauft. Damit kann man, wie auch am PC, ein laufendes Programm anhalten, Werte von Registern anzeigen, etc. So etwas kann sehr hilfreich sein, wenn &amp;quot;unerklärliche&amp;quot; Phänomene auftreten.&lt;br /&gt;
&lt;br /&gt;
Wie man mit dem Programmer dann schließlich den AVR programmiert hängt wieder von der IDE ab. Beim Atmel Studio wird man sicherlich auf den Programming Dialog zurückgreifen, bei anderen IDEs wird wahrscheinlich ein Drittprogram wie [[AVRDUDE|avrdude]] verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Bootloader ====&lt;br /&gt;
Alle Arduinos kommen mit einem vorinstalliertem Bootloader. Mit diesem lässt sich der Prozessor auch ohne Programmer über USB direkt flashen.&lt;br /&gt;
&lt;br /&gt;
Also PC-Programm bietet sich dazu [[AVRDUDE|avrdude]] an. Dieses ist ein mehr oder weniger &amp;quot;Universales&amp;quot; Brennprogramm für fast alle AVR-Typen. Es beherrscht auch die Kommunikation mit dem Arduino-Bootloader. Damit kann man dann ganz einfach sein Programm übertragen. Die Kommandozeile ist leider je nach Arduino- und Bootloader-Versio etwas anderes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# beim Arduino mega ist es &lt;br /&gt;
$ avrdude -cwiring -patmega2560 -P&amp;lt;serial port&amp;gt; -b115200 -U flash:w:&amp;lt;file&amp;gt; -D&lt;br /&gt;
# andere Konfigurationen könnten sein (von mir ungetestet, gerne zu Vervollständigen)&lt;br /&gt;
$ avrdude -carduino -patmega328p -P&amp;lt;serial port&amp;gt; -b115200 -U flash:w:&amp;lt;file&amp;gt; -D&lt;br /&gt;
$ avrdude -carduino -patmega328p -P&amp;lt;serial port&amp;gt; -b57600 -U flash:w:&amp;lt;file&amp;gt; -D&lt;br /&gt;
$ avrdude -cstk500v2 -patmega328p -P&amp;lt;serial port&amp;gt; -b115200 -U flash:w:&amp;lt;file&amp;gt; -D&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arduino-Library Ersatz ==&lt;br /&gt;
Nachdem das Minimal-Programm von oben nun auf dem AVR-Board getestet wurde, geht es weiter. &lt;br /&gt;
&lt;br /&gt;
Wir haben uns von Arduino verabschiedet, damit aber auch von allen Arduino-Libraries! Das bedeutet, dass selbst so banale Sachen wie Serial.println() nicht mehr existieren. Diese müssen wir nun selber schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Erstellen eigener Libraries ===&lt;br /&gt;
Hier soll nun ein Beispiel mit einer Schritt-für-Schritt-Anleitung gegeben werden. Dazu habe ich mir das UART-Modul ausgesucht.&lt;br /&gt;
&lt;br /&gt;
==== Serielle Kommunikation mittels UART-Hardware ====&lt;br /&gt;
Das wird zwar dann die X-te UART library, aber zur Demonstration eignet sich das UART-Modul hervorragend.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Verlinkungen zu weiterführenden Artikeln, Beispiel für UART und LCD library selbst geschrieben, ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial]]&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;br /&gt;
[[Kategorie:Baustelle]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94738</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94738"/>
		<updated>2017-01-02T17:50:13Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Fehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
== C-Buch ==&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich ihn nur wärmstens empfehlen.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
Was auch noch wichtig ist, ist ein Verständnis über Binär-, Dezimal- und Hexadezimalzahlen, sowie über [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. &lt;br /&gt;
Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der Arduino-Libraries ===&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der delay()-Aufrufen ====&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 828 Bytes (2%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der I/O-Aufrufe ====&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind. Wichtig sind dazu vor allem drei [[Register]]:&lt;br /&gt;
* PORT&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Register&lt;br /&gt;
* DDR&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Direction Register&lt;br /&gt;
* PIN&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Input Pin Register&lt;br /&gt;
Wobei das &#039;&#039;x&#039;&#039; für den Port steht. Welche Ports es gibt hängt vom jeweiligen AVR ab. Der Atmega328p hat zum Beispiel vier Stück: PORTA, PORTB, PORTC, PORTD. Ein ATmega2560 hingegen hat derer elf: PORTA - PORTH und PORTJ - PORTL.&lt;br /&gt;
Gemeinsam ist allen, dass ein Port maximal 8 Pins enthält (P&#039;&#039;XN&#039;&#039;, &#039;&#039;X&#039;&#039;=Port-Buchstabe, &#039;&#039;N&#039;&#039;=Port-Bit).&lt;br /&gt;
&lt;br /&gt;
Genaueres gibt es hier:&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_Register| Register-Zugriffe]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_IO-Ports| I/O-Ports]]&lt;br /&gt;
Eine Kurzfassung folgt nun:&lt;br /&gt;
&lt;br /&gt;
Um auf die I/O-Register (beziehungsweise Register allgemein) zugreifen zu können braucht man eine weiter Header-Datei:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels diesen Registern kann man dann jeden einzelnen Pin steuern. Die folgende Tabelle zeigt die Einstellungsmöglichkeiten:&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;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das übrige PINx-Register hat nun auch wieder zwei Einsatzmöglichkeiten. Wenn der Pin ein Input-Pin ist (DDxn = 0), dann gibt dieses Register den Zustand des Pins aus, eine 1 für High und eine 0 für Low. Ist der Pin jedoch als Ausgang konfiguriert, dann können neuere AVRs (praktisch alle auf Arduinos) den Pin direkt &amp;quot;togglen&amp;quot;, also umschalten: ist er aktuell High, dann wird er auf Low geschalten, und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Wissen können wir wieder unseren Code anpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
    {&lt;br /&gt;
        PORTD |= (1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);       // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 534 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man sieht: der Speicherverbrauch wurde nochmal gedrückt, und schneller wurde das Programm auch noch.&lt;br /&gt;
&lt;br /&gt;
Bleiben aber noch Fragen: Warum verbraucht dieses Mini-Programm immer noch so viel Flash? Un warum wird RAM verbraucht, obwohl keine einzige Variable verwendet wird?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Geschwindigkeit mittels Oszi messen.&lt;br /&gt;
&lt;br /&gt;
=== main()-Funktion statt setup() &amp;amp; loop() ===&lt;br /&gt;
Die Arduino-IDE hat im Vergleich zu anderen IDEs eine &amp;quot;Gemeinheit&amp;quot; eingebaut. Um es dem Benutzer einfacher zu manchen, ändert diese stillschweigend den Code (fügt etwa eine main()-Funktion hinzu und das include &amp;lt;Arduino.h&amp;gt;) und zieht Code mitein, selbst wenn dieser nicht genutzt wird. &lt;br /&gt;
&lt;br /&gt;
So zum Beispiel die Interrupt-Routine, die den Millisekunden-Timer für die delay()-Funktion bildet: Sowohl die Routine an sich, als auch die Konfigurierung des Interrupts und auch die generelle Erlaubnis aller ISRs geschieht automatisch, ohne das der User daran etwas ändern kann. &lt;br /&gt;
&lt;br /&gt;
Das ist im Normalfall auch in Ordnung, da sich der 08/15-Arduino-Benutzer gar nicht dafür interessiert.&lt;br /&gt;
&lt;br /&gt;
Bei uns ist das aber etwas anderes! Also wird das Programm an ein richtiges C-Programm angeglichen, also mit einer main()-Funktion, statt setup() und loop().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
        {&lt;br /&gt;
            PORTD |= (1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
            _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
            PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);       // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
        }&lt;br /&gt;
        _delay_ms(1000);              // waits for a second&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 222 Bytes (0%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 0 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2048 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voilà! Da haben wir es: Der Code-Verbrauch ist nochmal drastisch gesunken und vor allem: keine Varaible, kein RAM-Verbrauch!&lt;br /&gt;
&lt;br /&gt;
Damit ist jeder Arduino-Code, der im Hintergrund dazukam, getilgt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Compiler mag shiften um Variablen nicht, also das (1 &amp;lt;&amp;lt; i). Es ist wesentlich besser, wenn man so etwas schreibt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t mask = (1 &amp;lt;&amp;lt; 0);&lt;br /&gt;
        for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
        {&lt;br /&gt;
            PORTD |= mask;            // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
            _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
            PORTD &amp;amp;= ~mask;           // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
            mask = (mask &amp;lt;&amp;lt; 1);       // shift the bit to the left&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das ist erstens schneller und verbraucht zweitens weniger Speicher (im Beispiel nur noch 204 Bytes).&lt;br /&gt;
&lt;br /&gt;
== Weg von der Arduino-IDE ==&lt;br /&gt;
=== Auswahl der neuen IDE ===&lt;br /&gt;
So, nun ist man an dem Punkt angelangt, an welchem man sich dazu entscheiden kann (und &#039;&#039;meiner&#039;&#039; Meinung auch sollte), Abschied von der Arduino-IDE zu nehmen. Diese ist in vielerlei Hinsicht nicht optimal, sei es zum Beispiel beim highlighting von Code oder der mangelnden Konfigurationsmöglichkeit.&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Möglichkeiten, wie man nun weiter verfahren kann:&lt;br /&gt;
* bei der Arduino-IDE bleiben&lt;br /&gt;
* auf das [[Atmel Studio]] umsteigen (entweder Version 7 mit zahlreichen neuen Features, oder VErsion 4, falls es schnell und zuverlässig sein soll)&lt;br /&gt;
* auf eine andere IDE (z.B. [[eclipse]]) umsteigen&lt;br /&gt;
* Mittels [[AVR-GCC-Tutorial/Exkurs_Makefiles|Makefiles]] und einem Editor/einer IDE seiner Wahl arbeiten&lt;br /&gt;
&lt;br /&gt;
Ich persönlich habe mich nach langen arbeiten mit jeder dieser Möglichkeiten (abgesehen von der Arduino-IDE, diese habe ich mehr oder weniger direkt verworfen) für die letzte, für das Arbeiten mit Makefiles, entschieden. Dort hat man völlige Kontrolle über alles: was wird wann mit welchen Option kompiliert und was wird hinzugelinkt?&lt;br /&gt;
&lt;br /&gt;
Das sollte aber jeder für sich selber herausfinden. Die Liste oben ist von der Schwierigkeit her sortiert, das bedeutet, das Makefiles das anspruchsvollste sind.&lt;br /&gt;
&lt;br /&gt;
=== Einarbeiten in die neue Umgebung ===&lt;br /&gt;
Sobald man sich auf eine IDE festgelegt hat, sollte man sich in diese erst einmal Einarbeiten. Auf diesem Punkt kann in dieser Anleitung nicht eingegangen werden, da sich mögliche Tipps oder Ähnliches ja nach IDE unterscheiden würden.&lt;br /&gt;
&lt;br /&gt;
Am besten versucht man erstmal die für sich wichtigen Funktionen zu finden und mit der neuen Umgebung allgemein zurech zu kommen.&lt;br /&gt;
&lt;br /&gt;
Ziel ist auf jeden Fall, das obige Programm zu kompilieren zu bekommen.&lt;br /&gt;
&lt;br /&gt;
=== Flashen mittels AVRDUDE ===&lt;br /&gt;
So weit, so gut. &lt;br /&gt;
&lt;br /&gt;
Der neue Editor/Die neue IDE läuft, der Code kompiliert.&lt;br /&gt;
&lt;br /&gt;
Wie bringt man jetzt den Code auf den AVR?&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Verlinkungen zu weiterführenden Artikeln, Beispiel für UART und LCD library selbst geschrieben, ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C| ]]&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial| ]]&lt;br /&gt;
[[Kategorie:AVR| ]]&lt;br /&gt;
[[Kategorie:AVR-Boards| ]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;br /&gt;
[[Kategorie:Baustelle| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94737</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94737"/>
		<updated>2017-01-02T17:49:27Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Fehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
== C-Buch ==&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich ihn nur wärmstens empfehlen.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
Was auch noch wichtig ist, ist ein Verständnis über Binär-, Dezimal- und Hexadezimalzahlen, sowie über [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. &lt;br /&gt;
Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der Arduino-Libraries ===&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der delay()-Aufrufen ====&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 828 Bytes (2%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der I/O-Aufrufe ====&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind. Wichtig sind dazu vor allem drei [[Register]]:&lt;br /&gt;
* PORT&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Register&lt;br /&gt;
* DDR&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Direction Register&lt;br /&gt;
* PIN&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Input Pin Register&lt;br /&gt;
Wobei das &#039;&#039;x&#039;&#039; für den Port steht. Welche Ports es gibt hängt vom jeweiligen AVR ab. Der Atmega328p hat zum Beispiel vier Stück: PORTA, PORTB, PORTC, PORTD. Ein ATmega2560 hingegen hat derer elf: PORTA - PORTH und PORTJ - PORTL.&lt;br /&gt;
Gemeinsam ist allen, dass ein Port maximal 8 Pins enthält (P&#039;&#039;XN&#039;&#039;, &#039;&#039;X&#039;&#039;=Port-Buchstabe, &#039;&#039;N&#039;&#039;=Port-Bit).&lt;br /&gt;
&lt;br /&gt;
Genaueres gibt es hier:&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_Register| Register-Zugriffe]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_IO-Ports| I/O-Ports]]&lt;br /&gt;
Eine Kurzfassung folgt nun:&lt;br /&gt;
&lt;br /&gt;
Um auf die I/O-Register (beziehungsweise Register allgemein) zugreifen zu können braucht man eine weiter Header-Datei:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels diesen Registern kann man dann jeden einzelnen Pin steuern. Die folgende Tabelle zeigt die Einstellungsmöglichkeiten:&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;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das übrige PINx-Register hat nun auch wieder zwei Einsatzmöglichkeiten. Wenn der Pin ein Input-Pin ist (DDxn = 0), dann gibt dieses Register den Zustand des Pins aus, eine 1 für High und eine 0 für Low. Ist der Pin jedoch als Ausgang konfiguriert, dann können neuere AVRs (praktisch alle auf Arduinos) den Pin direkt &amp;quot;togglen&amp;quot;, also umschalten: ist er aktuell High, dann wird er auf Low geschalten, und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Wissen können wir wieder unseren Code anpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        DDRD |= (1 &amp;lt;&amp;lt; i);         // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 534 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man sieht: der Speicherverbrauch wurde nochmal gedrückt, und schneller wurde das Programm auch noch.&lt;br /&gt;
&lt;br /&gt;
Bleiben aber noch Fragen: Warum verbraucht dieses Mini-Programm immer noch so viel Flash? Un warum wird RAM verbraucht, obwohl keine einzige Variable verwendet wird?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Geschwindigkeit mittels Oszi messen.&lt;br /&gt;
&lt;br /&gt;
=== main()-Funktion statt setup() &amp;amp; loop() ===&lt;br /&gt;
Die Arduino-IDE hat im Vergleich zu anderen IDEs eine &amp;quot;Gemeinheit&amp;quot; eingebaut. Um es dem Benutzer einfacher zu manchen, ändert diese stillschweigend den Code (fügt etwa eine main()-Funktion hinzu und das include &amp;lt;Arduino.h&amp;gt;) und zieht Code mitein, selbst wenn dieser nicht genutzt wird. &lt;br /&gt;
&lt;br /&gt;
So zum Beispiel die Interrupt-Routine, die den Millisekunden-Timer für die delay()-Funktion bildet: Sowohl die Routine an sich, als auch die Konfigurierung des Interrupts und auch die generelle Erlaubnis aller ISRs geschieht automatisch, ohne das der User daran etwas ändern kann. &lt;br /&gt;
&lt;br /&gt;
Das ist im Normalfall auch in Ordnung, da sich der 08/15-Arduino-Benutzer gar nicht dafür interessiert.&lt;br /&gt;
&lt;br /&gt;
Bei uns ist das aber etwas anderes! Also wird das Programm an ein richtiges C-Programm angeglichen, also mit einer main()-Funktion, statt setup() und loop().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
        {&lt;br /&gt;
            PORTD |= (1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
            _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
            PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);       // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
        }&lt;br /&gt;
        _delay_ms(1000);              // waits for a second&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 222 Bytes (0%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 0 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2048 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voilà! Da haben wir es: Der Code-Verbrauch ist nochmal drastisch gesunken und vor allem: keine Varaible, kein RAM-Verbrauch!&lt;br /&gt;
&lt;br /&gt;
Damit ist jeder Arduino-Code, der im Hintergrund dazukam, getilgt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Compiler mag shiften um Variablen nicht, also das (1 &amp;lt;&amp;lt; i). Es ist wesentlich besser, wenn man so etwas schreibt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t mask = (1 &amp;lt;&amp;lt; 0);&lt;br /&gt;
        for(uint8_t i = 0; i &amp;lt; 8; i++) &lt;br /&gt;
        {&lt;br /&gt;
            PORTD |= mask;            // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
            _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
            PORTD &amp;amp;= ~mask;           // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
            mask = (mask &amp;lt;&amp;lt; 1);       // shift the bit to the left&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das ist erstens schneller und verbraucht zweitens weniger Speicher (im Beispiel nur noch 204 Bytes).&lt;br /&gt;
&lt;br /&gt;
== Weg von der Arduino-IDE ==&lt;br /&gt;
=== Auswahl der neuen IDE ===&lt;br /&gt;
So, nun ist man an dem Punkt angelangt, an welchem man sich dazu entscheiden kann (und &#039;&#039;meiner&#039;&#039; Meinung auch sollte), Abschied von der Arduino-IDE zu nehmen. Diese ist in vielerlei Hinsicht nicht optimal, sei es zum Beispiel beim highlighting von Code oder der mangelnden Konfigurationsmöglichkeit.&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Möglichkeiten, wie man nun weiter verfahren kann:&lt;br /&gt;
* bei der Arduino-IDE bleiben&lt;br /&gt;
* auf das [[Atmel Studio]] umsteigen (entweder Version 7 mit zahlreichen neuen Features, oder VErsion 4, falls es schnell und zuverlässig sein soll)&lt;br /&gt;
* auf eine andere IDE (z.B. [[eclipse]]) umsteigen&lt;br /&gt;
* Mittels [[AVR-GCC-Tutorial/Exkurs_Makefiles|Makefiles]] und einem Editor/einer IDE seiner Wahl arbeiten&lt;br /&gt;
&lt;br /&gt;
Ich persönlich habe mich nach langen arbeiten mit jeder dieser Möglichkeiten (abgesehen von der Arduino-IDE, diese habe ich mehr oder weniger direkt verworfen) für die letzte, für das Arbeiten mit Makefiles, entschieden. Dort hat man völlige Kontrolle über alles: was wird wann mit welchen Option kompiliert und was wird hinzugelinkt?&lt;br /&gt;
&lt;br /&gt;
Das sollte aber jeder für sich selber herausfinden. Die Liste oben ist von der Schwierigkeit her sortiert, das bedeutet, das Makefiles das anspruchsvollste sind.&lt;br /&gt;
&lt;br /&gt;
=== Einarbeiten in die neue Umgebung ===&lt;br /&gt;
Sobald man sich auf eine IDE festgelegt hat, sollte man sich in diese erst einmal Einarbeiten. Auf diesem Punkt kann in dieser Anleitung nicht eingegangen werden, da sich mögliche Tipps oder Ähnliches ja nach IDE unterscheiden würden.&lt;br /&gt;
&lt;br /&gt;
Am besten versucht man erstmal die für sich wichtigen Funktionen zu finden und mit der neuen Umgebung allgemein zurech zu kommen.&lt;br /&gt;
&lt;br /&gt;
Ziel ist auf jeden Fall, das obige Programm zu kompilieren zu bekommen.&lt;br /&gt;
&lt;br /&gt;
=== Flashen mittels AVRDUDE ===&lt;br /&gt;
So weit, so gut. &lt;br /&gt;
&lt;br /&gt;
Der neue Editor/Die neue IDE läuft, der Code kompiliert.&lt;br /&gt;
&lt;br /&gt;
Wie bringt man jetzt den Code auf den AVR?&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Verlinkungen zu weiterführenden Artikeln, Beispiel für UART und LCD library selbst geschrieben, ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C| ]]&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial| ]]&lt;br /&gt;
[[Kategorie:AVR| ]]&lt;br /&gt;
[[Kategorie:AVR-Boards| ]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;br /&gt;
[[Kategorie:Baustelle| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94736</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94736"/>
		<updated>2017-01-02T17:37:40Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: IDEs erweitert, AVRDUDE Kapitel angefangen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
== C-Buch ==&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich ihn nur wärmstens empfehlen.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
Was auch noch wichtig ist, ist ein Verständnis über Binär-, Dezimal- und Hexadezimalzahlen, sowie über [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. &lt;br /&gt;
Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der Arduino-Libraries ===&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der delay()-Aufrufen ====&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 828 Bytes (2%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Entfernen der I/O-Aufrufe ====&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind. Wichtig sind dazu vor allem drei [[Register]]:&lt;br /&gt;
* PORT&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Register&lt;br /&gt;
* DDR&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Direction Register&lt;br /&gt;
* PIN&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Input Pin Register&lt;br /&gt;
Wobei das &#039;&#039;x&#039;&#039; für den Port steht. Welche Ports es gibt hängt vom jeweiligen AVR ab. Der Atmega328p hat zum Beispiel vier Stück: PORTA, PORTB, PORTC, PORTD. Ein ATmega2560 hingegen hat derer elf: PORTA - PORTH und PORTJ - PORTL.&lt;br /&gt;
Gemeinsam ist allen, dass ein Port maximal 8 Pins enthält (P&#039;&#039;XN&#039;&#039;, &#039;&#039;X&#039;&#039;=Port-Buchstabe, &#039;&#039;N&#039;&#039;=Port-Bit).&lt;br /&gt;
&lt;br /&gt;
Genaueres gibt es hier:&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_Register| Register-Zugriffe]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_IO-Ports| I/O-Ports]]&lt;br /&gt;
Eine Kurzfassung folgt nun:&lt;br /&gt;
&lt;br /&gt;
Um auf die I/O-Register (beziehungsweise Register allgemein) zugreifen zu können braucht man eine weiter Header-Datei:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels diesen Registern kann man dann jeden einzelnen Pin steuern. Die folgende Tabelle zeigt die Einstellungsmöglichkeiten:&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;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das übrige PINx-Register hat nun auch wieder zwei Einsatzmöglichkeiten. Wenn der Pin ein Input-Pin ist (DDxn = 0), dann gibt dieses Register den Zustand des Pins aus, eine 1 für High und eine 0 für Low. Ist der Pin jedoch als Ausgang konfiguriert, dann können neuere AVRs (praktisch alle auf Arduinos) den Pin direkt &amp;quot;togglen&amp;quot;, also umschalten: ist er aktuell High, dann wird er auf Low geschalten, und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Wissen können wir wieder unseren Code anpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        DDRD |= (1 &amp;lt;&amp;lt; i);         // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 534 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man sieht: der Speicherverbrauch wurde nochmal gedrückt, und schneller wurde das Programm auch noch.&lt;br /&gt;
&lt;br /&gt;
Bleiben aber noch Fragen: Warum verbraucht dieses Mini-Programm immer noch so viel Flash? Un warum wird RAM verbraucht, obwohl keine einzige Variable verwendet wird?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Geschwindigkeit mittels Oszi messen.&lt;br /&gt;
&lt;br /&gt;
=== main()-Funktion statt setup() &amp;amp; loop() ===&lt;br /&gt;
Die Arduino-IDE hat im Vergleich zu anderen IDEs eine &amp;quot;Gemeinheit&amp;quot; eingebaut. Um es dem Benutzer einfacher zu manchen, ändert diese stillschweigend den Code (fügt etwa eine main()-Funktion hinzu und das include &amp;lt;Arduino.h&amp;gt;) und zieht Code mitein, selbst wenn dieser nicht genutzt wird. &lt;br /&gt;
&lt;br /&gt;
So zum Beispiel die Interrupt-Routine, die den Millisekunden-Timer für die delay()-Funktion bildet: Sowohl die Routine an sich, als auch die Konfigurierung des Interrupts und auch die generelle Erlaubnis aller ISRs geschieht automatisch, ohne das der User daran etwas ändern kann. &lt;br /&gt;
&lt;br /&gt;
Das ist im Normalfall auch in Ordnung, da sich der 08/15-Arduino-Benutzer gar nicht dafür interessiert.&lt;br /&gt;
&lt;br /&gt;
Bei uns ist das aber etwas anderes! Also wird das Programm an ein richtiges C-Programm angeglichen, also mit einer main()-Funktion, statt setup() und loop().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
            DDRD |= (1 &amp;lt;&amp;lt; i);         // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
            _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
            DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
        }&lt;br /&gt;
        _delay_ms(1000);              // waits for a second&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 222 Bytes (0%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 0 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2048 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voilà! Da haben wir es: Der Code-Verbrauch ist nochmal drastisch gesunken und vor allem: keine Varaible, kein RAM-Verbrauch!&lt;br /&gt;
&lt;br /&gt;
Damit ist jeder Arduino-Code, der im Hintergrund dazukam, getilgt.&lt;br /&gt;
&lt;br /&gt;
== Weg von der Arduino-IDE ==&lt;br /&gt;
=== Auswahl der neuen IDE ===&lt;br /&gt;
So, nun ist man an dem Punkt angelangt, an welchem man sich dazu entscheiden kann (und &#039;&#039;meiner&#039;&#039; Meinung auch sollte), Abschied von der Arduino-IDE zu nehmen. Diese ist in vielerlei Hinsicht nicht optimal, sei es zum Beispiel beim highlighting von Code oder der mangelnden Konfigurationsmöglichkeit.&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Möglichkeiten, wie man nun weiter verfahren kann:&lt;br /&gt;
* bei der Arduino-IDE bleiben&lt;br /&gt;
* auf das [[Atmel Studio]] umsteigen (entweder Version 7 mit zahlreichen neuen Features, oder VErsion 4, falls es schnell und zuverlässig sein soll)&lt;br /&gt;
* auf eine andere IDE (z.B. [[eclipse]]) umsteigen&lt;br /&gt;
* Mittels [[AVR-GCC-Tutorial/Exkurs_Makefiles|Makefiles]] und einem Editor/einer IDE seiner Wahl arbeiten&lt;br /&gt;
&lt;br /&gt;
Ich persönlich habe mich nach langen arbeiten mit jeder dieser Möglichkeiten (abgesehen von der Arduino-IDE, diese habe ich mehr oder weniger direkt verworfen) für die letzte, für das Arbeiten mit Makefiles, entschieden. Dort hat man völlige Kontrolle über alles: was wird wann mit welchen Option kompiliert und was wird hinzugelinkt?&lt;br /&gt;
&lt;br /&gt;
Das sollte aber jeder für sich selber herausfinden. Die Liste oben ist von der Schwierigkeit her sortiert, das bedeutet, das Makefiles das anspruchsvollste sind.&lt;br /&gt;
&lt;br /&gt;
=== Einarbeiten in die neue Umgebung ===&lt;br /&gt;
Sobald man sich auf eine IDE festgelegt hat, sollte man sich in diese erst einmal Einarbeiten. Auf diesem Punkt kann in dieser Anleitung nicht eingegangen werden, da sich mögliche Tipps oder Ähnliches ja nach IDE unterscheiden würden.&lt;br /&gt;
&lt;br /&gt;
Am besten versucht man erstmal die für sich wichtigen Funktionen zu finden und mit der neuen Umgebung allgemein zurech zu kommen.&lt;br /&gt;
&lt;br /&gt;
Ziel ist auf jeden Fall, das obige Programm zu kompilieren zu bekommen.&lt;br /&gt;
&lt;br /&gt;
=== Flashen mittels AVRDUDE ===&lt;br /&gt;
So weit, so gut. &lt;br /&gt;
&lt;br /&gt;
Der neue Editor/Die neue IDE läuft, der Code kompiliert.&lt;br /&gt;
&lt;br /&gt;
Wie bringt man jetzt den Code auf den AVR?&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Verlinkungen zu weiterführenden Artikeln, Beispiel für UART und LCD library selbst geschrieben, ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C| ]]&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial| ]]&lt;br /&gt;
[[Kategorie:AVR| ]]&lt;br /&gt;
[[Kategorie:AVR-Boards| ]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;br /&gt;
[[Kategorie:Baustelle| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94734</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94734"/>
		<updated>2017-01-02T17:16:37Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: main()-Funktion statt setup() and loop() hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
== C-Buch ==&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich ihn nur wärmstens empfehlen.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
Was auch noch wichtig ist, ist ein Verständnis über Binär-, Dezimal- und Hexadezimalzahlen, sowie über [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. &lt;br /&gt;
Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
== Entfernen der Arduino-Libraries ==&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der delay()-Aufrufen ===&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 828 Bytes (2%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der I/O-Aufrufe ===&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind. Wichtig sind dazu vor allem drei [[Register]]:&lt;br /&gt;
* PORT&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Register&lt;br /&gt;
* DDR&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Direction Register&lt;br /&gt;
* PIN&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Input Pin Register&lt;br /&gt;
Wobei das &#039;&#039;x&#039;&#039; für den Port steht. Welche Ports es gibt hängt vom jeweiligen AVR ab. Der Atmega328p hat zum Beispiel vier Stück: PORTA, PORTB, PORTC, PORTD. Ein ATmega2560 hingegen hat derer elf: PORTA - PORTH und PORTJ - PORTL.&lt;br /&gt;
Gemeinsam ist allen, dass ein Port maximal 8 Pins enthält (P&#039;&#039;XN&#039;&#039;, &#039;&#039;X&#039;&#039;=Port-Buchstabe, &#039;&#039;N&#039;&#039;=Port-Bit).&lt;br /&gt;
&lt;br /&gt;
Genaueres gibt es hier:&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_Register| Register-Zugriffe]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_IO-Ports| I/O-Ports]]&lt;br /&gt;
Eine Kurzfassung folgt nun:&lt;br /&gt;
&lt;br /&gt;
Um auf die I/O-Register (beziehungsweise Register allgemein) zugreifen zu können braucht man eine weiter Header-Datei:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels diesen Registern kann man dann jeden einzelnen Pin steuern. Die folgende Tabelle zeigt die Einstellungsmöglichkeiten:&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;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das übrige PINx-Register hat nun auch wieder zwei Einsatzmöglichkeiten. Wenn der Pin ein Input-Pin ist (DDxn = 0), dann gibt dieses Register den Zustand des Pins aus, eine 1 für High und eine 0 für Low. Ist der Pin jedoch als Ausgang konfiguriert, dann können neuere AVRs (praktisch alle auf Arduinos) den Pin direkt &amp;quot;togglen&amp;quot;, also umschalten: ist er aktuell High, dann wird er auf Low geschalten, und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Wissen können wir wieder unseren Code anpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        DDRD |= (1 &amp;lt;&amp;lt; i);         // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 534 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man sieht: der Speicherverbrauch wurde nochmal gedrückt, und schneller wurde das Programm auch noch.&lt;br /&gt;
&lt;br /&gt;
Bleiben aber noch Fragen: Warum verbraucht dieses Mini-Programm immer noch so viel Flash? Un warum wird RAM verbraucht, obwohl keine einzige Variable verwendet wird?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Geschwindigkeit mittels Oszi messen.&lt;br /&gt;
&lt;br /&gt;
== main()-Funktion statt setup() and loop() ==&lt;br /&gt;
Die Arduino-IDE hat im Vergleich zu anderen IDEs eine &amp;quot;Gemeinheit&amp;quot; eingebaut. Um es dem Benutzer einfacher zu manchen, ändert diese stillschweigend den Code (fügt etwa eine main()-Funktion hinzu und das include &amp;lt;Arduino.h&amp;gt;) und zieht Code mitein, selbst wenn dieser nicht genutzt wird. &lt;br /&gt;
&lt;br /&gt;
So zum Beispiel die Interrupt-Routine, die den Millisekunden-Timer für die delay()-Funktion bildet: Sowohl die Routine an sich, als auch die Konfigurierung des Interrupts und auch die generelle Erlaubnis aller ISRs geschieht automatisch, ohne das der User daran etwas ändern kann. &lt;br /&gt;
&lt;br /&gt;
Das ist im Normalfall auch in Ordnung, da sich der 08/15-Arduino-Benutzer gar nicht dafür interessiert.&lt;br /&gt;
&lt;br /&gt;
Bei uns ist das aber etwas anderes! Also wird das Programm an ein richtiges C-Programm angeglichen, also mit einer main()-Funktion, statt setup() und loop().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt; //neues Include: noetig fuer die Register&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
            DDRD |= (1 &amp;lt;&amp;lt; i);         // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
            _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
            DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
        }&lt;br /&gt;
        _delay_ms(1000);              // waits for a second&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 222 Bytes (0%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 0 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2048 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voilà! Da haben wir es: Der Code-Verbrauch ist nochmal drastisch gesunken und vor allem: keine Varaible, kein RAM-Verbrauch!&lt;br /&gt;
&lt;br /&gt;
Damit ist jeder Arduino-Code, der im Hintergrund dazukam, getilgt.&lt;br /&gt;
&lt;br /&gt;
== Weg von der Arduino-IDE ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Umstieg von der Aruino-IDE auf ATMEL Studio 7 mit der Sketch Funktion oder eine beliebige andere IDE. Verlinkungen zu weiterführenden Artikeln, Beispiel für UART und LCD library selbst geschrieben, ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C| ]]&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial| ]]&lt;br /&gt;
[[Kategorie:AVR| ]]&lt;br /&gt;
[[Kategorie:AVR-Boards| ]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;br /&gt;
[[Kategorie:Baustelle| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94733</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94733"/>
		<updated>2017-01-02T17:07:03Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
== C-Buch ==&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich ihn nur wärmstens empfehlen.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
Was auch noch wichtig ist, ist ein Verständnis über Binär-, Dezimal- und Hexadezimalzahlen, sowie über [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. &lt;br /&gt;
Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
== Entfernen der Arduino-Libraries ==&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der delay()-Aufrufen ===&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 828 Bytes (2%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der I/O-Aufrufe ===&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind. Wichtig sind dazu vor allem drei [[Register]]:&lt;br /&gt;
* PORT&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Register&lt;br /&gt;
* DDR&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Direction Register&lt;br /&gt;
* PIN&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Input Pin Register&lt;br /&gt;
Wobei das &#039;&#039;x&#039;&#039; für den Port steht. Welche Ports es gibt hängt vom jeweiligen AVR ab. Der Atmega328p hat zum Beispiel vier Stück: PORTA, PORTB, PORTC, PORTD. Ein ATmega2560 hingegen hat derer elf: PORTA - PORTH und PORTJ - PORTL.&lt;br /&gt;
Gemeinsam ist allen, dass ein Port maximal 8 Pins enthält (P&#039;&#039;XN&#039;&#039;, &#039;&#039;X&#039;&#039;=Port-Buchstabe, &#039;&#039;N&#039;&#039;=Port-Bit).&lt;br /&gt;
&lt;br /&gt;
Genaueres gibt es hier:&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_Register| Register-Zugriffe]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_IO-Ports| I/O-Ports]]&lt;br /&gt;
Eine Kurzfassung folgt nun:&lt;br /&gt;
&lt;br /&gt;
Um auf die I/O-Register (beziehungsweise Register allgemein) zugreifen zu können braucht man eine weiter Header-Datei:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels diesen Registern kann man dann jeden einzelnen Pin steuern. Die folgende Tabelle zeigt die Einstellungsmöglichkeiten:&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;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das übrige PINx-Register hat nun auch wieder zwei Einsatzmöglichkeiten. Wenn der Pin ein Input-Pin ist (DDxn = 0), dann gibt dieses Register den Zustand des Pins aus, eine 1 für High und eine 0 für Low. Ist der Pin jedoch als Ausgang konfiguriert, dann können neuere AVRs (praktisch alle auf Arduinos) den Pin direkt &amp;quot;togglen&amp;quot;, also umschalten: ist er aktuell High, dann wird er auf Low geschalten, und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Wissen können wir wieder unseren Code anpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        DDRD |= (1 &amp;lt;&amp;lt; i);         // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 534 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man sieht: der Speicherverbrauch wurde nochmal gedrückt, und schneller wurde das Programm auch noch.&lt;br /&gt;
&lt;br /&gt;
Bleiben aber noch Fragen: Warum verbraucht dieses Mini-Programm immer noch so viel Flash? Un warum wird RAM verbraucht, obwohl keine einzige Variable verwendet wird?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Geschwindigkeit mittels Oszi messen.&lt;br /&gt;
&lt;br /&gt;
== main()-Funktion statt setup() and loop() ==&lt;br /&gt;
Erklärung bezüglich Library-Setup etc.&lt;br /&gt;
&lt;br /&gt;
== Weg von der Arduino-IDE ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Umstieg von der Aruino-IDE auf ATMEL Studio 7 mit der Sketch Funktion oder eine beliebige andere IDE. Verlinkungen zu weiterführenden Artikeln, Beispiel für UART und LCD library selbst geschrieben, ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C| ]]&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial| ]]&lt;br /&gt;
[[Kategorie:AVR| ]]&lt;br /&gt;
[[Kategorie:AVR-Boards| ]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;br /&gt;
[[Kategorie:Baustelle| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94732</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94732"/>
		<updated>2017-01-02T17:05:18Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
== C-Buch ==&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich ihn nur wärmstens empfehlen.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
Was auch noch wichtig ist, ist ein Verständnis über Binär-, Dezimal- und Hexadezimalzahlen, sowie über [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. &lt;br /&gt;
Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. &lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* &lt;br /&gt;
Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
== Entfernen der Arduino-Libraries ==&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der delay()-Aufrufen ===&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 828 Bytes (2%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der I/O-Aufrufe ===&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind. Wichtig sind dazu vor allem drei [[Register]]:&lt;br /&gt;
* PORT&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Register&lt;br /&gt;
* DDR&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Data Direction Register&lt;br /&gt;
* PIN&#039;&#039;x&#039;&#039; - The Port &#039;&#039;x&#039;&#039; Input Pin Register&lt;br /&gt;
Wobei das &#039;&#039;x&#039;&#039; für den Port steht. Welche Ports es gibt hängt vom jeweiligen AVR ab. Der Atmega328p hat zum Beispiel vier Stück: PORTA, PORTB, PORTC, PORTD. Ein ATmega2560 hingegen hat derer elf: PORTA - PORTH und PORTJ - PORTL.&lt;br /&gt;
Gemeinsam ist allen, dass ein Port maximal 8 Pins enthält (P&#039;&#039;XN&#039;&#039;, &#039;&#039;X&#039;&#039;=Port-Buchstabe, &#039;&#039;N&#039;&#039;=Port-Bit).&lt;br /&gt;
&lt;br /&gt;
Genaueres gibt es hier:&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_Register| Register-Zugriffe]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#Zugriff_auf_IO-Ports| I/O-Ports]]&lt;br /&gt;
Eine Kurzfassung folgt nun:&lt;br /&gt;
&lt;br /&gt;
Um auf die I/O-Register (beziehungsweise Register allgemein) zugreifen zu können braucht man eine weiter Header-Datei:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels diesen Registern kann man dann jeden einzelnen Pin steuern. Die folgende Tabelle zeigt die Einstellungsmöglichkeiten:&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;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das übrige PINx-Register hat nun auch wieder zwei Einsatzmöglichkeiten. Wenn der Pin ein Input-Pin ist (DDxn = 0), dann gibt dieses Register den Zustand des Pins aus, eine 1 für High und eine 0 für Low. Ist der Pin jedoch als Ausgang konfiguriert, dann können neuere AVRs (praktisch alle auf Arduinos) den Pin direkt &amp;quot;togglen&amp;quot;, also umschalten: ist er aktuell High, dann wird er auf Low geschalten, und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Wissen können wir wieder unseren Code anpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;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;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5&lt;br /&gt;
#define LED_DDR DDRB&lt;br /&gt;
#define LED_PORT PORTB&lt;br /&gt;
#define LED_BIT PB5&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_BIT);    // sets the digital pin as output&lt;br /&gt;
    &lt;br /&gt;
    //die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_BIT);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        DDRD |= (1 &amp;lt;&amp;lt; i);         // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; i);        // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Der Sketch verwendet 534 Bytes (1%) des Programmspeicherplatzes. &lt;br /&gt;
Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, &lt;br /&gt;
2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man sieht: der Speicherverbrauch wurde nochmal gedrückt, und schneller Wurde das Programm auch noch.&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Geschwindigkeit mittels Oszi messen.&lt;br /&gt;
&lt;br /&gt;
== main()-Funktion statt setup() and loop() ==&lt;br /&gt;
Erklärung bezüglich Library-Setup etc.&lt;br /&gt;
&lt;br /&gt;
== Weg von der Arduino-IDE ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Umstieg von der Aruino-IDE auf ATMEL Studio 7 mit der Sketch Funktion oder eine beliebige andere IDE. Verlinkungen zu weiterführenden Artikeln, Beispiel für UART und LCD library selbst geschrieben, ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C| ]]&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial| ]]&lt;br /&gt;
[[Kategorie:AVR| ]]&lt;br /&gt;
[[Kategorie:AVR-Boards| ]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;br /&gt;
[[Kategorie:Baustelle| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94723</id>
		<title>Umstieg von Arduino auf AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=94723"/>
		<updated>2016-12-31T12:56:55Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Die Seite wurde neu angelegt: „&amp;#039;&amp;#039;von newgenertion&amp;#039;&amp;#039;  Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Mater…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von newgenertion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine kleine Hilfestellung für alle sein, die aktuell mit einem Arduino-Board arbeiten, sich aber mehr für die Materie interessieren und auf richtige Mikrocontroller-Programmierung umsteigen wollen. &lt;br /&gt;
&lt;br /&gt;
Um den Umstieg zu erleichtern werden hier einige kleine, aber hilfreiche Schritte aufgezeigt.&lt;br /&gt;
Diese Anleitung ist nur für die Arduinos mit einem 8bit-AVR als Prozessor (Uno, Mega, Leonardo, ...) gedacht und nicht für 32bit-Mikrocontroller (Due, ...).&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird in dieser Anleitung in C programmiert. Grund dafür ist die Verteilung von Programmiersprachen und deren Schwierigkeit zu erlernen.&lt;br /&gt;
Auf Mikrocontrollern gibt es hauptsächlich Assembler und C, wobei auch andere Sprachen im Kommen sind, so zum Beispiel C++ (das Arduino-Framework ist in C++ geschrieben). &lt;br /&gt;
&lt;br /&gt;
Trotzdem soll sich hier auf C beschränkt werden, weil&lt;br /&gt;
# C++ schwerer zu Beherrschen ist als C&lt;br /&gt;
# Die meisten Arduino-Sketches eher in C geschrieben sind, mit Ausnahme der Arduino-Libraries und derer Objekte&lt;br /&gt;
# Assembler nochmal eine ganz andere Sprache ist&lt;br /&gt;
&lt;br /&gt;
== C-Buch ==&lt;br /&gt;
Wer schon C programmieren kann - damit ist mehr als if-else- und Copy&amp;amp;Paste-Programmierung gemeint - kann diesen Punkt selbstverständlich überspringen. Allen anderen kann ich ihn nur wärmstens empfehlen.&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[C#PC-Programmierung|C]] stehen einige Links zu Tutorials und Einführungen zur Sprache C. Es dürfte einfacher sein, sich die C-Kenntnisse auf einem PC zu erarbeiten, da man dort viel mehr Möglichkeiten hat, sein Programm zu analysieren und auf Fehler zu reagieren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
Was auch noch wichtig ist, ist ein Verständnis über Binär-, Dezimal- und Hexadezimalzahlen, sowie über [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== Verändern des Arduino-Sketches ==&lt;br /&gt;
Als Erstes sollte man sich abgewöhnen von &#039;&#039;Sketchen&#039;&#039; zu reden, damit wird man nur belächelt. Es sind &#039;&#039;Programme&#039;&#039;, &#039;&#039;Anwendungen&#039;&#039;, &#039;&#039;Applikationen&#039;&#039;, ...&lt;br /&gt;
&lt;br /&gt;
=== Anpassung von int-Typen ===&lt;br /&gt;
Fast sämtliche Arduino-Beispiele sehen irgendwie so aus (hier ein kleines Lauflicht):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int ledPin = 13;                  // LED connected to digital pin 13&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(ledPin, OUTPUT);      // sets the digital pin as output&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(ledPin, HIGH);   // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fällt euch etwas auf? Nein?&lt;br /&gt;
Wie groß ist ein &#039;&#039;int&#039;&#039;? Genau mindestens 16 bit. Und es ist ein Typ mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Eine Variable vom Typ &#039;&#039;int&#039;&#039; kann auf einem AVR also Werte von -2^15 bis 2^15 - 1 annemhen. Das sind Zahlen zwischen -32768 und 32767. Und was wird in diesem Typ gespeichert? &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;Variable&#039;&#039;, deren Wert sich nie ändert: int ledPin = 13;&lt;br /&gt;
* Und zwei Laufvariablen von 0 bis 7. &lt;br /&gt;
Also beides nicht wirklich das, wofür man 16 bit Variablen braucht.&lt;br /&gt;
&lt;br /&gt;
Okay, dann hat man halt Variablen mit einem zu großen Typ definiert, was macht das? Schon etwas, denn der AVR ist ein 8bit-Mikrocontroller, das bedeutet grob, dass er immer nur 8bit-Zahlen auf einmal manipulieren kann, alles größere braucht mehrere Befehle und ist somit langsamer. Mikrocontroller mögen vorzeichenlose Zahlen auch lieber, als solche mit Vorzeichen. &lt;br /&gt;
&lt;br /&gt;
Man sollte also bei jeder Variable überlegen, welchen Wertebereich man benötigt und dann immer den Typen so klein wie möglich, aber so groß wie nötig nehmen.&lt;br /&gt;
&lt;br /&gt;
Der C-Standard bietet Typen mit genauer Bitbreite an, dafür muss nur eine Header-Datei eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In dieser werden dann unter anderem die folgenden Typen definiert:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Größe     || Vorzeichenlos || Vorzeichenbehaftet &lt;br /&gt;
|-&lt;br /&gt;
| 8 bit     || uint8_t       || int8_t&lt;br /&gt;
|-&lt;br /&gt;
| 16 bit    || uint16_t      || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| 32 bit    || uint32_t      || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| 64 bit    || uint64_t      || int64_t&lt;br /&gt;
|}&lt;br /&gt;
Die Nomenklatur ist eigentlich ganz einfach:&lt;br /&gt;
[u]int[bits]_t, wobei das [u] für unsigned, also vorzeichenlos, steht und [bits] eben die Anzahl der Bits für die Variable angibt.&lt;br /&gt;
&lt;br /&gt;
Der geänderte Source-Code sieht dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        delay(100);               // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    delay(1000);                  // waits for a second&lt;br /&gt;
}&lt;br /&gt;
/*Der Sketch verwendet 1006 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei diesem Minimal-Programm hat diese Änderung wie man sieht nichts gebracht, das zeigt aber &#039;&#039;&#039;nicht&#039;&#039;&#039;, dass diese Anpassung sinnlos ist, sondern, dass der Compiler sehr gut optimiert und diese unnötig großen Variablen eliminiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist dieses Programm. Es macht nichts außer eine volatile-Variable hochzuzählen. (Volatile zum verbieten der Optimierungen).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 64bit&lt;br /&gt;
volatile int64_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* Der Sketch verwendet 570 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 17 Bytes (0%) des dynamischen Speichers, 2031 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man jetzt die Variable verkleinert und auf unsigned ändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
// 8bit&lt;br /&gt;
volatile uint8_t a;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    a = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    a++;&lt;br /&gt;
}&lt;br /&gt;
/* Der Sketch verwendet 458 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.&lt;br /&gt;
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, 2038 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schon bei diesem Minimal-Programm sieht man einen kleinen Unterschied&lt;br /&gt;
&lt;br /&gt;
Bei größeren Programmen mit mehreren Modulen kann der Compiler aber nicht mehr alles überblicken, deswegen lohnt sich spätestens dort diese Änderung.&lt;br /&gt;
&lt;br /&gt;
== Entfernen der Arduino-Libraries ==&lt;br /&gt;
Wer seinen Mikrocontroller richtig verstehen will, der sollte auch versuchen sämtliche Hardware-Ansteuerung selber zu programmieren.&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der delay()-Aufrufen ===&lt;br /&gt;
Zuerst einmal: delays sind so gut wie immer schlecht! Während der Controller im delay() wartet, kann er nichts anderes mehr tun!&lt;br /&gt;
&lt;br /&gt;
Die Implementierung vom delay() in der Arduino-Bibliothek benutzt Interrupts und kann deswegen in Interrupts nicht funktionieren (Obwohl das sowieso eine sehr schlechte Idee ist). Um aber von Arduino und deren Library wegzukommen, benutzen wie eine andere Impementierung, nämlich die von der avr-libc. Diese bietet _delay_ms() und _delay_us() für taktgenaue Verzögerungen in Milli- bzw. Mikrosekunden-Bereich an. Dafür ist nur das Einbinden von &amp;lt;util/delay.h&amp;gt; nötig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 13                // ein Define erzeugt keinen Zusätzlichen Code, &lt;br /&gt;
                                  // es erfolgt schließlich nur eine Textersetzung.&lt;br /&gt;
                                  // Defines immer in GROSSBUCHSTABEN&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
    pinMode(LED_PIN, OUTPUT);     // sets the digital pin as output&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        pinMode(i, OUTPUT);       // sets the digital pin as output&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);  // sets the Board-LED on&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
        digitalWrite(i, HIGH);    // sets the LED on pin &amp;lt;i&amp;gt; on &lt;br /&gt;
        _delay_ms(100);           // waits 100 milliseconds&lt;br /&gt;
        digitalWrite(i, LOW);     // sets the LED on pin &amp;lt;i&amp;gt; off&lt;br /&gt;
    }&lt;br /&gt;
    _delay_ms(1000);              // waits for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Entfernen der I/O-Aufrufe ===&lt;br /&gt;
Dazu zählen unter anderem pinMode, digitalWrite und ditigalRead. Diese verbindet allesamt eines: Die eigenwillige Nummerierung der Pins.&lt;br /&gt;
&lt;br /&gt;
Auf dem Arduino-Board sind sie zwar logisch angeordnet, aber nicht unbedingt logisch mit dem Prozessor verbunden! Deswegen muss man einmal nach seinem arduino board + Pinout googlen, dann kommen schöne Bilder, die recht Anschaulich zeigen, was womit verbunden ist. Beim Arduino Uno ist das Ganze noch recht ordentlich, beim Arduino Mega erinnert es mehr an Chaos...&lt;br /&gt;
&lt;br /&gt;
Eine Seite, die viele Pinouts hat ist [https://libraries.io/github/Bouni/Arduino-Pinout libraries.io]. Dort sucht man sich einfach sein Board heraus und speichert sich am besten das Bild, denn das wird noch häufiger benötigt.&lt;br /&gt;
&lt;br /&gt;
Um jetzt wirklich starten zu können fehlt nur noch eins: das Datenblatt des Prozessors. Auf der Arduino-Seite steht, was für ein Prozessor dort verbaut ist, nach diesem Datenblatt sollte man dann bei Google oder direkt beim Hersteller Atmel suchen. Beim Arduino Uno ist es der [http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf ATmega328p]. &lt;br /&gt;
&lt;br /&gt;
Im Datenblatt gibt es ein Kaptiel &amp;quot;I/O-Ports&amp;quot;, wo haarklein erklärt wird, wie die Pins funktionieren und anzusteuern sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== main()-Funktion statt setup() and loop() ==&lt;br /&gt;
Erklärung bezüglich Library-Setup etc.&lt;br /&gt;
&lt;br /&gt;
== Interrupts ==&lt;br /&gt;
Siehe dazu [[Interrupt]]. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: Beispiel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;TODO&#039;&#039;&#039;&#039;&#039;: weitermachen, vor allem I/O-Ports und Interrupts ohne zu sehr andere Artikel zu überschneiden. Dazu auch noch Umstieg von der Aruino-IDE auf ATMEL Studio 7 mit der Sketch Funktion oder eine beliebige andere IDE. Verlinkungen zu weiterführenden Artikeln, ...&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=94705</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=94705"/>
		<updated>2016-12-30T11:59:33Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: JTAG Interface: (De-)Aktivierung in Software&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:AVR]]&lt;br /&gt;
Diese Seite soll als erste Anlaufstelle dienen, wenn der [[AVR]]-Mikrocontroller mal wieder nicht so will wie er soll. Es wird versucht, die Standardfehler und Probleme aufzulisten und zu erklären, was man dagegen tun kann.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Pinkompatibilität ===&lt;br /&gt;
&lt;br /&gt;
Wenn man einen anderen Controller als den im Schaltplan benutzt, sollte man daran denken, dass nur wenige AVR-Controller vollständig pinkompatibel und damit untereinander austauschbar sind. Manchmal liegen gar die am dringendsten benötigten Funktionen (ISP-Programmierung) bei anderen Controllern auf anderen Pins. Deshalb unbedingt vorher die Belegungen anhand der Datenblätter vergleichen!&lt;br /&gt;
&lt;br /&gt;
=== Fuses ===&lt;br /&gt;
&lt;br /&gt;
Die AVR-Controller haben &#039;Fuses&#039; (deutsch: &#039;Sicherungen&#039;), die das Verhalten des Prozessors auf grundlegender Ebene bestimmen. Ein häufiger Fehler ist beispielsweise, dass über die Fuse &amp;quot;CKSEL&amp;quot; (&amp;lt;i&amp;gt;clock select&amp;lt;/i&amp;gt;) die falsche Taktquelle gewählt wurde. Die meisten AVRs können mit dem internen Oszillator (&amp;lt;i&amp;gt;internal R/C&amp;lt;/i&amp;gt;), mit einem externen Oszillator (&amp;lt;i&amp;gt;external clock&amp;lt;/i&amp;gt;), mit einem Quarz (&amp;lt;i&amp;gt;external crystal&amp;lt;/i&amp;gt;) oder mit einem Resonator (&amp;lt;i&amp;gt;external R/C&amp;lt;/i&amp;gt;) betrieben werden. Wenn die Einstellung über die Fusebits nicht dazu passt (z. B. &amp;lt;i&amp;gt;external clock&amp;lt;/i&amp;gt; statt &amp;lt;i&amp;gt;external crystal&amp;lt;/i&amp;gt;), fehlt dem Controller unter Umständen der Systemtakt und er läuft nicht an, oder man bekommt auf der seriellen Schnittstelle Nonsens, oder die Timer bzw. Zeitschleifen im Programm laufen zu langsam oder zu schnell.&lt;br /&gt;
&lt;br /&gt;
Auch die Fuse &amp;quot;JTAGEN&amp;quot; (&amp;lt;i&amp;gt;JTAG enable&amp;lt;/i&amp;gt;) verdient besondere Beachtung: Wenn sie eingeschaltet ist, ist auf einem bestimmten Port (z.&amp;amp;nbsp;B. PORTC beim ATMega32) die JTAG-Unterstützung aktiviert. Dann funktionieren vier Bits dieses Ports nicht wie gewohnt, da sie für die JTAG-Schnittstelle reserviert werden.&lt;br /&gt;
&lt;br /&gt;
In dem zum STK500 gehörenden Entwicklungstool &#039;AVR Studio&#039; gibt es in der Programmer-Dialogbox einen Tab &#039;Fuses&#039;, der controllerabhängig den Status der Fusebits anzeigt und Änderungen ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[AVR Fuses]].&lt;br /&gt;
&lt;br /&gt;
=== ISP-Programmieradapter ===&lt;br /&gt;
&lt;br /&gt;
Bei ISP-Programmieradaptern für den Parallelport kann es zu Inkompatibilitäten mit manchen Ports kommen. Tritt das Problem auch auf, wenn der ISP-Adapter an einem anderen Rechner angeschlossen ist? Funktioniert es vielleicht mit einer anderen Software? Siehe auch: [[AVR In System Programmer]].&lt;br /&gt;
&lt;br /&gt;
Dauert bei einem seriellen Programmer mit eigenem Controller (STK500, Atmel AVRISP etc.) das Programmieren sehr lange, oder ist fehlerbehaftet, kann das an einer zu hohen ISP-Taktrate liegen. Sie darf 1/4 des Controllertaktes (F_CPU) nicht übersteigen. Abhilfe: ISP Taktrate heruntersetzen auf maximal 1/4 F&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beim Programmieren mit dem usbasp Programmieradapter muss die Geschwindigkeit richtig eingestellt werden. Bei einem AVR der auf den eingebauten 1 MHz läuft muss mit langsamer Geschwindigkeit (Jumper zu) programmiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Programmieren via SPI und angeschlossene SPI-Hardware ===&lt;br /&gt;
Wenn Peripherie über SPI angebunden ist, muss sich diese zum Programmierzeitpunkt auf dem Bus neutral verhalten. Normalerweise bedeutet dies, dass die Slave-Select/Chip-Select-Leitungen der Peripherie auf high gezogen werden müssen, wenn die Chips keinen internen Pull-Up haben. Werte von 10 kΩ bis 100 kΩ für normale Anwendungen haben sich bewährt.&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Der Pin AVCC ist der Versorgungsanschluss für den AD-Wandler (ADC, &amp;lt;i&amp;gt;analog digital converter&amp;lt;/i&amp;gt;) und den zugehörigen Port. Er ist nicht an allen AVRs vorhanden; wenn er aber existiert, so muss er auf jeden Fall angeschlossen sein, &amp;lt;i&amp;gt;auch wenn der AD-Wandler nicht benutzt wird.&amp;lt;/i&amp;gt; Wird der AD-Wandler verwendet, sollte zur Verbesserung der Genauigkeit der AVCC-Pin über einen Lowpass-Filter angeschlossen werden (siehe Datenblatt).&lt;br /&gt;
&lt;br /&gt;
Oft funktioniert die Programmierung des Controllers auch, wenn Vcc oder GND nicht richtig angeschlossen ist. Zur Sicherheit kann man mit einem Messgerät direkt an den Anschlüssen des AVRs kontrollieren (VCC-GND, AVCC-GND), ob die Verbindungen korrekt sind. Es empfiehlt sich, vor dem Einsetzen bzw. Einlöten des Controllers die Versorgungsanschlüsse nochmals zu prüfen, um sicherzustellen, dass man den IC nicht durch eine zu hohe Spannung aufgrund eines Fehlers in der Versorgung zerstört.&lt;br /&gt;
&lt;br /&gt;
Die VCC-Leitung eines Controllers zu unterbrechen (aus welchen Gründen auch immer, z. B. um ihn &amp;quot;komplett abzuschalten&amp;quot;) ist nicht ratsam. Falls noch irgendein Pin von einer externen Quelle auf H-Pegel gehalten wird, oder ein Pin über einen Widerstand mit VCC verbunden ist, wird der Controller laufen, weil er über diesen Pin mit Strom versorgt wird. Das ist möglich, weil der Strom über die interne Clamp-Diode des Pins nach VCC fließen kann (und das auch tut). Jeder Pin hat je eine interne Clamp-Diode gegen GND und eine gegen VCC zum Schutz vor zu niedrigen bzw. zu hohen Eingangsspannungen.&lt;br /&gt;
&lt;br /&gt;
=== Reset-Pin ===&lt;br /&gt;
&lt;br /&gt;
Der Reset-Pin am AVR ist &#039;active-low&#039;, d. h. wenn man ihn mit GND (Masse, &amp;lt;i&amp;gt;ground&amp;lt;/i&amp;gt;) verbindet, wird der Controller zurückgesetzt gehalten. Zwar haben die meisten(!) AVRs einen internen Pullup-Widerstand, der den Reset-Pin gegen VCC &amp;quot;zieht&amp;quot;, dieser ist jedoch relativ hochohmig (ca. 50 kΩ, vgl. Datenblatt) und reicht in extrem stark gestörter Umgebung nicht aus, um den Reset-Pin sicher &amp;quot;hochzuhalten&amp;quot;. Als Mindestbeschaltung empfiehlt sich daher ein externer Pullup-Widerstand (typisch 10 kΩ), der den Reset-Pin mit VCC verbindet. Er sollte nicht kleiner als 4,7 kΩ sein, da der Programmieradapter sonst eventuell den Reset-Pin während des Programmiervorgangs nicht sicher auf &amp;quot;low&amp;quot; ziehen kann. Mit einem Oszilloskop kann man gut überprüfen, ob der Pegel am Reset-Pin sauber zwischen H und L wechselt. Zusätzlich sollte man auch noch einen Kondensator 47 nF oder 100 nF zwischen Reset-Pin und GND anordnen. Dieses RC-Glied sorgt dafür, dass der Controller beim Einschalten der Versorgungsspannung für eine definierte Zeitspanne im Reset gehalten wird. Im laufenden Betrieb sorgt der Kondensator dafür, dass der Reseteingang unempfindlich gegenüber Spikes und Glitches wird. Er sollte deshalb unmittelbar in Pin-Nähe beim Prozessor untergebracht werden. Achtung: Wenn [[debugWIRE]] möglich sein soll, muss dieser Kondensator weggelassen werden. &lt;br /&gt;
&lt;br /&gt;
Atmel empfiehlt zusätzlich noch zum Schutz vor Überspannungen eine externe Diode nach VCC (&amp;quot;Clamp-Diode&amp;quot;), da für den Reset-Pin keine interne vorhanden ist. Mit dieser Diode funktionieren jedoch manche Programmieradapter nicht. Allerdings schützt sie den Controller davor, in den High-Voltage-Programming Mode zu schalten, zum Beispiel als Folge von Störspannung wegen EMV, und dadurch (schlimmstenfalls) den Programmspeicher zu überschreiben.&lt;br /&gt;
&lt;br /&gt;
=== Programmierung nur einmal möglich? ===&lt;br /&gt;
&lt;br /&gt;
Es kann vorkommen, dass ein AVR nur einmal programmiert werden kann, danach geht es nicht mehr (z. B. wird der Typ nicht mehr erkannt). Erst nachdem die Versorgungsspannung getrennt und wieder verbunden wurde, geht es erneut. In diesem Fall ist meistens der Reset-Pin kurzgeschlossen, daher lässt sich der AVR einmal programmieren.&lt;br /&gt;
&lt;br /&gt;
Bei korrekter Beschaltung weist der Reset-Pin eine Spannung nahe VCC auf (z. B. 4.9 V). Ist die Spannung nahe bei GND, ist der Pin kurzgeschlossen und verursacht das beschriebene Problem.&lt;br /&gt;
&lt;br /&gt;
=== Abblockkondensatoren ===&lt;br /&gt;
&lt;br /&gt;
Abblockkondensatoren dienen dazu, impulsartige Einbrüche der Betriebsspannung, die durch schnelle Schaltvorgänge verursacht werden können, zu minimieren. Sie verhindern unkontrollierte Brownouts, welche durch diese Spannungseinbrüche auftreten können. Diesen Zweck erfüllen sie optimal, wenn folgende Regeln eingehalten werden: &lt;br /&gt;
&lt;br /&gt;
* Ein Abblockkondensator sollte möglichst dicht am IC sitzen.&lt;br /&gt;
* Eine niederimpedante Anbindung sollte gegeben sein – Stegleitungen sind deshalb zu vermeiden. Dann &amp;lt;i&amp;gt;muss&amp;lt;/i&amp;gt; die Versorgungsspannung erst durch das Pad des Abblockkondensators fließen und wird dann weiter zum IC gereicht.&lt;br /&gt;
&lt;br /&gt;
* Jedes IC in einer Schaltung sollte einen Abblockkondensator besitzen.&lt;br /&gt;
&lt;br /&gt;
* Bei ICs mit mehreren Anschlüssen für VCC sollte jeder VCC-Pin mit einem eigenen Abblockkondensator beschaltet werden (z. B. AVRs in SMD-Bauform wie dem ATmega16A also mit vier Kondensatoren). Dabei ist darauf zu achten, dass jeder Abblockkondensator mit einem eigenen Via auf die niederimpedante (heißt Hochfrequenz gut leitende) großflächige, nicht unterbrochene Massefläche kontaktiert wird.&lt;br /&gt;
&lt;br /&gt;
* Die Länge der GND-Leitung vom Kondensator zum IC ist genau so wichtig wie die Länge der VCC-Leitung.&lt;br /&gt;
&lt;br /&gt;
* Es sollten keramische Kondensatoren mit einer Kapazität von maximal 100 nF verwendet werden. Größere Kondensatoren, etwa 10 µF-Elkos, sind für diese Aufgabe &amp;lt;i&amp;gt;nicht&amp;lt;/i&amp;gt; geeignet (und auch kein Dutzend µF-Keramikondensatoren), weil sie &amp;quot;zu langsam&amp;quot; sind. Ihre Impedanz ist bei hochfrequenten Spannungen zu groß – ein schneller, hochfrequenter Spannungsimpuls kann so nicht abgeleitet werden.&lt;br /&gt;
&lt;br /&gt;
=== Quarz oder Quarzoszillator? ===&lt;br /&gt;
&lt;br /&gt;
Die neueren AVRs haben einen internen [[Oszillator]], der im Auslieferungszustand über die entsprechenden Fuses eingeschaltet ist. In diesem Fall muss kein externer [[Quarze und AVR|Quarz]] mehr angeschlossen werden. Man kann in den [[AVR Fuses|Fuse-Bits]] aber einstellen, dass man einen externen Taktgenerator (&#039;&#039;external clock&#039;&#039;, z. B. Quarzoszillator) oder externen Quarz (&#039;&#039;external crystal&#039;&#039;) verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Werden seriell Daten ohne Clockleitung (also &#039;&#039;asynchron&#039;&#039;) übertragen, ist eine externe genauere Taktquelle meistens unverzichtbar. Zumindest sinnvoll sind sie bei UARTs (obwohl es auch ohne noch gehen mag). USB, CAN oder Ethernet funktionieren nicht ohne präzisen externen Takt. I2C/TWI oder SPI sind synchrone Übertragungsverfahren und brauchen keinen genauen Takt.&lt;br /&gt;
&lt;br /&gt;
Dann, oder wenn der AVR keinen internen Takt hat, wird an die entsprechenden Pins des Controllers ein Quarz (&#039;&#039;external crystal&#039;&#039;, Bauelement mit zwei Pads) oder Quarzoszillator (&#039;&#039;external clock&#039;&#039;, Bauelement mit vier Pads) angeschlossen. Im Falle eines Quarzes werden die XTAL-Pins mit den beiden Anschlüssen des Quarzes und jeweils mit einem Kondensator (ca. 12 bis 22 pF) (vgl. Datenblatt ATMega 8) gegen Masse angeschlossen. Im Falle eines Quarzoszillators reicht es aus, den Taktausgang mit dem XTAL1-Pin zu verbinden, und den XTAL2-Pin unbeschaltet zu lassen. Die Fuses sind entsprechend einzustellen.&lt;br /&gt;
&lt;br /&gt;
=== Ground-Anschlüsse ===&lt;br /&gt;
&lt;br /&gt;
Bei ICs mit mehreren Masse-Anschlüssen (GND, &amp;lt;i&amp;gt;ground&amp;lt;/i&amp;gt;) müssen immer alle Anschlüsse beschaltet werden. Siehe http://www.mikrocontroller.net/forum/read-1-107259.html&lt;br /&gt;
&lt;br /&gt;
=== Eingänge ===&lt;br /&gt;
&lt;br /&gt;
Taster müssen:&lt;br /&gt;
&lt;br /&gt;
* entprellt werden ([[Entprellung]])&lt;br /&gt;
&lt;br /&gt;
* einen [[AVR-GCC-Tutorial#Tasten_und_Schalter|Pullup-Widerstand]] besitzen, so sie &#039;&#039;active-low&#039;&#039; betrieben werden, d.h. wenn beim Tastendruck der Pin mit GND (Masse) verbunden wird (dies ist die übliche Anschaltung). Man kann einen externen Pull-Up Widerstand (typ. 10 kOhm) benutzen oder den internen aktivieren (DDR als Eingang also &amp;quot;0&amp;quot;, PORT auf &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Will man einen Taster &#039;&#039;active-high&#039;&#039; betreiben, soll also bei Tastendruck eine &amp;quot;1&amp;quot; in PIN gelesen werden, ist ein externer Pull-Down-Widerstand (typ. 10 kOhm) gegen GND anzuschließen, denn interne Pull-Downs sind nicht verfügbar.&lt;br /&gt;
&lt;br /&gt;
Symptome: Aufgrund des Prellens bekommt man bei einem Tastendruck statt eines Signals mehrere, und beim fehlenden Pullup fängt man sich Störungen (z.&amp;amp;nbsp;B. das 50 Hz-Netzbrummen) ein, da der Pin nicht auf einem &amp;quot;definierten Pegel&amp;quot; liegt, wenn der Taster nicht geschlossen ist. Soll z.&amp;amp;nbsp;B. bei einem Tastendruck eine LED angehen, dann leuchtet die LED durch das Netzbrummen plötzlich mit 50 Hz anstatt aus zu sein.&lt;br /&gt;
&lt;br /&gt;
* active low: ein Anschluss des Tasters an den Port-Pin, den anderen Taster-Anschluss an GND; internen Pull-Up-Widerstand aktivieren oder externen Widerstand zwischen Port-Pin und VCC.&lt;br /&gt;
&lt;br /&gt;
* active high: Taster zwischen Port-Pin und VCC; externen Widerstand zwischen Port-Pin und GND.&lt;br /&gt;
&lt;br /&gt;
=== Ausgänge ===&lt;br /&gt;
&lt;br /&gt;
Man sollte darauf achten, dass &amp;quot;kritische&amp;quot; Ausgänge, d.h. Ausgänge, über die nicht &amp;quot;nur&amp;quot; eine LED geschaltet wird, einen definierten Zustand haben, wenn der Portpin auf &amp;quot;Eingang&amp;quot; und damit hochohmig geschaltet ist. Dadurch wird sichergestellt, dass beim Einschalten nicht kurz ein Verbraucher geschaltet wird (z.&amp;amp;nbsp;B. &amp;quot;Zucken&amp;quot; eines Motors). Dies kann man bewerkstelligen, indem man extern Widerstände (auch hier Pull-Up bzw. Pull-Down genannt, typ. 10 kOhm) an den Ausgangs-Pins vorsieht, die den Ausgang auf den gewünschten Zustand ziehen.&lt;br /&gt;
&lt;br /&gt;
=== Besonderheiten bei ATmega128 und seinen Derivaten im 64-Pin-Gehäuse===&lt;br /&gt;
&lt;br /&gt;
[[Bild:isp.png|thumb|300px|right|ISP-Adapter]]&lt;br /&gt;
Der ATmega64 und der ATmega128 sowie alle vom ATMega128 abgeleiteten AVRs im 64-Pin-Gehäuse (ATMega641/1281/2561, AT90PWM2/3/2B/3B sowie AT90CAN32/64/128, Ausnahmen sind nur AT90USB64/128, die eine ganz andere Pinbelegung haben) haben besondere Fallstricke, über die man bei nicht ausreichendem Datenblattstudium leicht stolpert. &lt;br /&gt;
&lt;br /&gt;
* Der erste betrifft den Anschluss der ISP-Signale (MISO, MOSI, SCK, RESET). Dieser erfolgt nicht wie bei den meisten anderen AVR-Controllern an den gleichnamigen Pins, sondern an PDI, PDO, SCK und RESET. Die Pinzuordnung ist:&lt;br /&gt;
:* MOSI → PE0 (Pin 2)&lt;br /&gt;
:* MISO → PE1 (Pin 3)&lt;br /&gt;
:* SCK → PB1 (Pin 11)&lt;br /&gt;
:* RESET → RESET (Pin 20)&lt;br /&gt;
: PEN (Pin 1) hat für normale ISP-Adapter keine Bedeutung und kann offen gelassen oder direkt mit Vcc verbunden werden. Die Benutzung der Pins PDI und PDO anstelle von MOSI und MISO gilt für praktisch alle ATmega128-Derivate im 64-Pin-TQFP-Gehäuse, darunter AT90CAN32/64/128 und ATmega641/1281/2561. Im Zweifelsfall im Datenblatt (Pin Configuration) nachsehen, ob PE0 und PE1 mit &amp;quot;PDI&amp;quot; bzw. &amp;quot;PDO&amp;quot; beschriftet sind.&lt;br /&gt;
&lt;br /&gt;
* Die zweite kleine Gemeinheit betrifft die M103C-Fuse (ATmega103 Compatibility Mode, nur bei den ATmega-Typen, nicht beim AT90CAN32/64/128). Diese ist bei fabrikneuen Atmega64/128 gesetzt und sorgt dafür, dass sich diese wie ein Atmega103 verhalten.&lt;br /&gt;
** Dies hat zur Folge, dass ein für den ATmega64 oder ATmega128 geschriebenes Programm beim ersten RET abstürzt, da der SRAM an einer anderen Stelle endet als erwartet und somit der Prozessor keine gültige Rücksprungadresse vom Stack holen kann. &lt;br /&gt;
** Außerdem funktionieren einige IO-Pins an PORTC, PORTF und PORTG anders.&lt;br /&gt;
** Für weitere Infos bzgl. [[TWI]], [[UART]], [[Timer]], [[Bootloader]] und Kalibrierung des internen RC-Oszillators unbedingt das Datenblatt lesen.&lt;br /&gt;
&lt;br /&gt;
=== Lötstellen ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kalte&amp;quot;, d. h. schlechte Lötstellen verraten sich durch ihre matte Oberfläche (bei bleihaltigem Lot). Beschädigte Lötstellen erkennt man oft an einem Riss, der sich kreisförmig um die Mitte des Lötpunktes herum gebildet hat. Solche Stellen verursachen oft erst bei mechanischer Beanspruchung Probleme.&lt;br /&gt;
&lt;br /&gt;
Bei kleinen Abständen (SMD-Bauteile) müssen besonders Verbindungen zwischen benachbarten Lötungen kontrolliert werden.&lt;br /&gt;
&lt;br /&gt;
Bei Lochrasterplatinen kann man mit einem spitzen Messer (Bastelmesser) die Zwischenräume von möglichen leitenden Verbindungen befreien.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Mainschleife vorhanden? ===&lt;br /&gt;
&lt;br /&gt;
Insbesondere beim Testen von Interrupts kann es passieren, dass man keine eigentliche Programmschleife vorsieht, weil ja alles in den Interrupts passiert. Das führt dazu, dass der Controller nach Abarbeiten aller Befehle in &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main(void) {}&amp;lt;/syntaxhighlight&amp;gt; seine Arbeit einstellt und daher auch keine Interrupts mehr funktionieren. Demnach sollte bei rein Interrupt-basierten Programmen die Funktion mindestens so aussehen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main(void)&lt;br /&gt;
{&lt;br /&gt;
    // hier Interrupts definieren&lt;br /&gt;
    // und einschalten&lt;br /&gt;
    while (1){}&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alle Interruptvektoren definiert? ===&lt;br /&gt;
&lt;br /&gt;
Wenn man irgendwelche [[Interrupt]]vektoren verwendet, sollte man alle definieren, auch die nicht benutzten. Passiert es dann aufgrund eines Fehlers, dass ein Interrupt unbeabsichtigt ausgeführt wird, so führt der Controller dann eine definierte Aktion aus. Benutzt man eine Hochsprache wie C oder Basic, nimmt einem der Compiler diese Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
Außerdem sollte man immer im Datenblatt des Controllers nachsehen, wie die Interrupttabelle aufgebaut ist. Die kleinen AVRs verwenden ein RCALL zum Anspringen der Interrupts, welches 1 Wort lang ist. Die grossen AVRs mit mehr als 8 KiBi FLASH verwenden ein CALL, welches 2 Worte lang ist. Verwendet man nun  den falschen Befehl, verschieben sich die Einsprungadressen und das Chaos ist perfekt.&lt;br /&gt;
&lt;br /&gt;
In einem komplett interruptlosen Programm kann man auf die Interrupttabelle selbstverständlich verzichten (erkennbar daran, dass nirgendwo im Code Interrupts mittels Assembler-Befehl SEI eingeschaltet werden).&lt;br /&gt;
&lt;br /&gt;
Oft hilft es einen Catch All Interruptvektor zu definieren um herauszufinden ob ein Fehler (z.B. ein Neubeginn des Programms) vorliegt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR (BADISR_vect)&lt;br /&gt;
{&lt;br /&gt;
    // Hier eine Fehlerausgabe definieren.&lt;br /&gt;
    // Z.B. UART-Ausgabe oder ein PIN toggeln&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann findet man solche Fehler recht schnell.&lt;br /&gt;
&lt;br /&gt;
=== Alle Konfigurationsregister korrekt initialisiert? ===&lt;br /&gt;
&lt;br /&gt;
Alle benötigten Konfigurationsregister (auch &amp;quot;I/O-Register&amp;quot; genannt) eines Mikrocontrollers müssen korrekt initialisiert werden. Bei Fehlfunktionen sollten diese Konfigurationen noch einmal mit dem Datenblatt abgeglichen werden. &lt;br /&gt;
Manchmal ist es auch sinnvoll, bestimmte Funktionen explizit abzuwählen. Ein Beispiel hierfür ist der [[Analog-Komparator]] des AVR: Schaltet man diesen ab, wenn man ihn nicht benötigt, kann man dadurch ein wenig Strom sparen. &lt;br /&gt;
Wenn man besonders &amp;quot;sauber&amp;quot; programmieren möchte, initialisiert man Konfigurationsregister immer, d.h. auch wenn sie nicht im Programm verwendet werden. Dies verhindert mögliche zufällige Fehlkonfigurationen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stackpointer initialisiert? (Nur in Assembler relevant) ===&lt;br /&gt;
&lt;br /&gt;
Fehlerbeschreibung: &#039;&#039;Das Programm lief, bis ein &amp;quot;rcall&amp;quot; oder ein Interrupt eingefügt wurde. Danach ging plötzlich gar nichts mehr.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wahrscheinliche Ursache: Der Stack ist ein spezieller Bereich im RAM, der von Sprungbefehlen und Interruptaufrufen dazu verwendet wird, die Rücksprungadresse ins Hauptprogramm zu speichern.  Da der Stack bei den AVRs nach &amp;quot;unten&amp;quot; wächst, d.h. in Richtung Anfang des RAMs, wird er üblicherweise ans Ende des RAMs gelegt. Der Stack muss vor der ersten Benutzung, am besten direkt am Anfang des Programms, initialisiert werden (sonst ist nach einem Sprung in ein Unterprogramm die Rücksprungadresse undefiniert und das Programm wird an einer unvorhersehbaren Stelle weiter ausgeführt, was in der Regel einen Absturz zur Folge hat). &amp;quot;Den Stack initialisieren&amp;quot; bedeutet, den Stackpointer auf den gewünschten &amp;quot;Startwert&amp;quot; zu setzen. Meistens wird dafür die letzte RAM-Adresse gewählt. &lt;br /&gt;
&lt;br /&gt;
Die Initialisierung unterscheidet sich geringfügig je nach verwendetem AVR. Bei den alten AT90xxxx und den ATtinys ist sie mit zwei Zeilen erledigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
       ldi r16, RAMEND   ;Die Adresse der letzten Stelle im RAM in r16 laden&lt;br /&gt;
       out SPL, r16      ;Die Adresse in das Register SPL ausgeben&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Da die ATmegas mehr RAM haben, reicht das 8 bit-Register SPL nicht mehr, und es ist ein zweites (SPH) dazugekommen.  Die Initialisierung des Stacks erfordert hier vier Zeilen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
       ldi r16, LOW(RAMEND)    ;Untere 8 bit des 16 bit-Wertes RAMEND laden&lt;br /&gt;
       out SPL, r16&lt;br /&gt;
       ldi r16, HIGH(RAMEND)   ;Obere 8 bit laden&lt;br /&gt;
       out SPH, r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 16bit-Register in richtiger Reihenfolge geladen/gelesen? (Nur in Assembler relevant) ===&lt;br /&gt;
&lt;br /&gt;
Bei den 16-bit Registern (z.&amp;amp;nbsp;B. Timer1) genau die Hinweise im Kapitel &amp;quot;Accessing 16-bit Registers&amp;quot; beachten!&lt;br /&gt;
&lt;br /&gt;
So muss z.&amp;amp;nbsp;B. das High-Byte VOR dem Low-Byte geschrieben werden, weil mit dem Schreiben des Low Byte das gesamte Register &amp;quot;übernommen&amp;quot; wird.&lt;br /&gt;
Beim Lesen muss zuerst das Low-Byte gelesen werden, dann das High-Byte.&lt;br /&gt;
Es wird dadurch garantiert, dass sich zwischen den beiden einzelnen Befehlen nicht noch das Register weiter verändert, z.&amp;amp;nbsp;B. beim 16bit Counter.&lt;br /&gt;
Möglich wird das durch ein &amp;quot;temporary Register&amp;quot;, von dem es aber nur eines gibt - was beachtet werden muss, da zwischen diesen beiden einzelnen Lese-/Schreib-Befehlen kein Interrupt auftreten darf, der selber das temporary Rgegister benutzt.&lt;br /&gt;
&lt;br /&gt;
In C oder Basic kümmert sich der Compiler um das Problem - man liest oder beschreibt dann einfach z.&amp;amp;nbsp;B. TCNT1 anstatt TCNT1H und TCNT1L einzeln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Flag richtig gelöscht? ===&lt;br /&gt;
&lt;br /&gt;
Ein beliebter Fehler ist, dass man überliest, dass gesetzte Flags (z.&amp;amp;nbsp;B. die Interrupt-Flags) durch beschreiben mit einer &#039;1&#039; und nicht mit einer &#039;0&#039; gelöscht werden! &lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
* das Flag ist zuerst &#039;0&#039;&lt;br /&gt;
* das Ereignis (z.&amp;amp;nbsp;B. Zählerüberlauf, also Bit TOV0 in TIFR) tritt auf und setzt das jeweilige Bit im Register auf &#039;1&#039;&lt;br /&gt;
* wir haben auf die &#039;1&#039; gewartet und wollen das Bit nun wieder löschen und müssen dafür eine &#039;1&#039; (eins!) in das Register schreiben, &#039;&#039;&#039;keine&#039;&#039;&#039; &#039;0&#039;. Trotzdem wird das Bit dadurch &#039;0&#039; z.&amp;amp;nbsp;B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    TIFR = (1&amp;lt;&amp;lt;TOV0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ganze ist kein Fehler, sondern hat seine guten Gründe.&lt;br /&gt;
&lt;br /&gt;
Wenn Interrupts zugelassen sind (z.&amp;amp;nbsp;B. in TIMSK) und die Interruptroutine aufgerufen wird, werden diese Flags zumeist automatisch gelöscht.&lt;br /&gt;
&lt;br /&gt;
Der UART-Empfangs-Interrupt (RXC in UCSRA) jedoch nicht! Der wird gelöscht durch Auslesen des Empfangsregisters (UDR). Hier liegt wiederum ein beliebter Stolperstein: Man prüft oft zuerst in der Interruptroutine die Fehlerflags (z.&amp;amp;nbsp;B. Parity) und macht dann manchmal den Fehler das empfangene Zeichen im Fehlerfall nicht auszulesen. Das führt dann zum Absturz (der IRQ wird immer wieder aufgerufen) - man muss also immer das UDR lesen auch wenn etwas Fehlerhaftes drinsteht.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich ist zu beachten, dass in C die Interrupt-Flags &#039;&#039;&#039;nicht&#039;&#039;&#039; mit einer Veroderung des Registers (z.&amp;amp;nbsp;B. TIFR |= (1 &amp;lt;&amp;lt; TOV0)) gelöscht werden sollten, da bei dieser Operation alle anderen evtl. gesetzten Flags im betreffenden Register ebenfalls gelöscht werden. Es ist die Schreibweise von oben zu benutzen (also TIFR = (1 &amp;lt;&amp;lt; TOV0))!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alle Interrupt-Variablen als &#039;&#039;volatile&#039;&#039; bezeichnet? ===&lt;br /&gt;
&lt;br /&gt;
Variablen können im C-Quelltext mit dem Schlüsselwort &#039;&#039;volatile&#039;&#039; ausgezeichnet werden: Der Ausdruck &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;volatile int i&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
versieht die Integervariable i mit dem Attribut &#039;&#039;volatile&#039;&#039;. Dadurch wird der Compiler angewiesen, diese Variable nicht zu optimieren, sondern im Speicher abzulegen und zu beachten, dass sie von anderen Prozessen geändert werden kann. Normale Variablen können durch den Compiler auf Register reduziert werden, oder die Daten werden einmalig aus dem Speicher geladen und erst am Ende des Programmes wieder zurückgeschrieben. Das kann Probleme bereiten, wenn beispielsweise in einer [[Interrupt]]routine der Inhalt der Variablen verändert wird. Darum müssen alle globalen Variablen, die in einer ISR (&#039;&#039;interrupt service routine&#039;&#039;) geändert werden, als &#039;&#039;volatile&#039;&#039; gekennzeichnet werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo nötig Variablenzugriff atomar gestaltet? ===&lt;br /&gt;
Der Zugriff auf Variablen, die größer als 8 Bit sind und sowohl in der Hauptfunktion (&amp;quot;main&amp;quot;) als auch in einer (oder mehrerer) ISR genutzt werden, muss [[atomar]] erfolgen. Eine Verletzung dieser Regel kann zu schwer nachvollziehbaren Problemen führen.&lt;br /&gt;
&lt;br /&gt;
=== Programmierfrequenz passend? ===&lt;br /&gt;
&lt;br /&gt;
Sollte ein Programmieren nicht möglich sein erst einmal die Programmiergeschwindigkeit bei AVR dude mit der Option&lt;br /&gt;
-B bitclock anpassen&lt;br /&gt;
wobei bitclock die Perioden dauer in Millisekunden (floating-point Zahl) ist. Normalerweise -B 1 für Controller mit &amp;gt;=4MHz daher ist bei der Erstprogrammierung ein höherer Wert zu versuchen.&lt;br /&gt;
&lt;br /&gt;
== Serielle Verbindungen ==&lt;br /&gt;
&lt;br /&gt;
=== [[I²C]]/[[TWI]] ===&lt;br /&gt;
&lt;br /&gt;
Sind die Leitungen SCL und SDA mit einem Pullup-Widerstand ausgestattet? Die I²C-Bus-Leitungen SCL und SDA müssen über einen Pullup-Widerstand mit einem Wert von 4,7 kΩ bis 10 kΩ mit der Versorgungsspannung (+5 V) verbunden sein.&lt;br /&gt;
&lt;br /&gt;
=== UART/USART ===&lt;br /&gt;
&lt;br /&gt;
==== Übertragungsprobleme durch falschen oder ungenauen Takt ====&lt;br /&gt;
&lt;br /&gt;
* Der interne [[Oszillator]] ist recht ungenau und nicht temperaturstabil. Daher kann die Umgebungstemperatur auch den [[UART|USART]]-Takt verändern. Für serielle, asynchrone Kommunikation per UART sollte man deshalb immer einen Quarz oder einen Oszillator verwenden, egal bei welcher Baudrate: 3% Fehler sind immer 3% Fehler, egal ob bei 1200 oder 9600 [[Baud]]. Falls doch der interne Oszillator verwendet wird: Wurde er für die richtige Frequenz und Betriebsspannung kalibriert?&lt;br /&gt;
* Nicht mit allen Quarzen kann man alle Baudraten genau genug erzeugen. Deswegen gibt es [[Baudratenquarz]]e wie z.&amp;amp;nbsp;B. 3,6864 MHz. Näheres steht im Datenblatt.&lt;br /&gt;
* Geschieht die Konfiguration des U(S)ART automatisch durch die Programmiersprache (z.&amp;amp;nbsp;B. in [[Bascom AVR|BASCOM]], [[C]]), dann muss dort der Takt &#039;&#039;genau&#039;&#039; angegeben werden. Setzt man z.&amp;amp;nbsp;B. einen 3,6864 MHz-Quarz ein, darf man dort nicht einfach &amp;quot;4 MHz&amp;quot; angeben, weil dann die Abweichung mit ca. 8% zu hoch wäre. Damit funktioniert die Übertragung nicht mehr.&lt;br /&gt;
* Im AVR-Studio kann man die Taktfrequenz sowohl über ein &amp;lt;code&amp;gt;#define F_CPU&amp;lt;/code&amp;gt; im Quelltext als auch über das Optionsmenu oder das selbsterstellte Makefile einstellen. Es darf nur &#039;&#039;eine&#039;&#039; Variante verwendet werden!&lt;br /&gt;
* Wenn ein externer Oszillator oder Quarz angeschlossen ist: Sind die [[AVR Fuses | Fuses]] des Controllers so gesetzt, dass er auch verwendet wird?&lt;br /&gt;
* Ist die Fuse CLKDIV &#039;&#039;nicht&#039;&#039; programmiert?&lt;br /&gt;
* Es taucht auch des öfteren das Missverständnis auf, dass man nur F_CPU verändern muss, um den µC mit einem anderen Takt laufen zu lassen. Dem ist nicht so. Der µC-Takt wird durch die Fuses bzw. den eventuell angeschlossenen Quarz oder Quarzoszillator bestimmt. F_CPU dient nur dazu, die dadurch festgelegte Frequenz im C-Programm zur Verfügung zu haben. F_CPU ist nur eine Information, mit der man bei der Programmierung arbeiten kann. Aber ein anderer F_CPU-Wert führt nicht dazu, dass der µC dann magisch auf diese Frequenz umgestellt wird.&lt;br /&gt;
* Um zu prüfen, ob der externe Quarz auch wirklich verwendet wird, kann man  mittels _delay_ms() testweise eine LED im Sekundentakt blinken lassen. Den Unterschied zwischen Quarz und internem RC-Oszillator kann man bei größeren Frequenzunterschieden leicht sehen. Ebenso sieht man, ob versehentlich die CLKDIV Fuse gesetzt ist: die Blinkfrequenz ist dann achtmal langsamer. Allerdings muss man auch hier aufpassen. Siehe [[AVR-GCC-Tutorial#Warteschleifen (delay.h)|AVR-GCC-Tutorial: Warteschleifen]].&lt;br /&gt;
* Erscheinen im Terminalprogramm kryptische Zeichen anstatt ordentlichen Buchstaben (z.&amp;amp;nbsp;B. ü statt A), liegt das zu 99,9% an einer falsch eingestellten/erzeugten Baudrate im Mikrocontroller. Meistens wiederum liegt dies daran, dass der µC nicht mit der vermeintlichen Taktrate läuft und daher die Baudratenparameter falsch berechnet werden.&lt;br /&gt;
* URSEL-Bit in UCSRC: Bei der Initialisierung der UART beachtet, wenn das für den verwendeten AVR notwendig ist, siehe [[AVR-GCC-Tutorial/Der_UART#Die_UART-Register|AVR-GCC-Tutorial/Der UART: Die UART-Register]].&lt;br /&gt;
* In den Tutorials für [[AVR-Tutorial: UART |Assembler]] und [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_UART GCC] wird die Nutzung recht gut erklärt und mit Beispielen erläutert.&lt;br /&gt;
&lt;br /&gt;
===== Testprogramm =====&lt;br /&gt;
&lt;br /&gt;
Im folgenden Programm muss angepasst werden:&lt;br /&gt;
*Die vermeintliche Taktfrequenz F_CPU&lt;br /&gt;
*der Port und der Pin, an dem eine LED angeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Wird das Programm laufen gelassen, muss die LED 1 Sekunde ein/1 Sekunde aus sein. Stimmen die Zeiten nicht, ist das ein deutlicher Hinweis darauf, dass die tatsächlich vom µC verwendete Taktfrequenz nicht mit der in F_CPU angegebenen übereinstimmt. Das Programm muss mit aktivierter Optimierung &amp;lt;code&amp;gt;-Os&amp;lt;/code&amp;gt; compiliert werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Testprogramm für CPU Takt&lt;br /&gt;
// Hier die vermeintliche Taktrate des µC eintragen&lt;br /&gt;
// Im Beispiel hier: 1MHz&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 1000000&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Hier die tatsächlich verwendeten Parameter angeben&lt;br /&gt;
&lt;br /&gt;
#define LED_PORT    PORTB&lt;br /&gt;
#define LED_DDR     DDRB&lt;br /&gt;
#define LED_PIN     PB0&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   LED_DDR |= 1 &amp;lt;&amp;lt; LED_PIN;&lt;br /&gt;
&lt;br /&gt;
   while (1)&lt;br /&gt;
   {&lt;br /&gt;
      LED_PORT ^= 1 &amp;lt;&amp;lt; LED_PIN;&lt;br /&gt;
      _delay_ms(1000);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sonstige Fehlerquellen bei UART/USART ====&lt;br /&gt;
&lt;br /&gt;
* Funktioniert die Datenübertragung zum PC nur solange der Programmieradapter eingesteckt ist, deutet dies auf ein Problem mit der Masse hin (z.&amp;amp;nbsp;B. GND-Anschluss am RS232-Stecker nicht belegt oder dergleichen).&lt;br /&gt;
* Der Pegelwandler/Inverter (z.&amp;amp;nbsp;B. MAX232) muss mit Kondensatoren für die internen Ladungspumpen beschaltet werden. Beim MAX232 sind dies mindestens vier Kondensatoren ≥ 1 µF (Polung beachten!), beim MAX202, MAX232A und MAX3232 vier Kondensatoren ≥ 100 nF. Hinzu kommt der obligatorische Abblockkondensator von 100 nF keramisch zwischen VCC und GND des ICs. Das jeweilige Datenblatt gibt Auskunft über die Beschaltung bei &amp;quot;typischer Anwendung&amp;quot;.&lt;br /&gt;
* TX/RX vertauscht? Modem- oder Nullmodemkabel?&lt;br /&gt;
* Bei Kommunikation mit PC: Ist die serielle Schnittstelle richtig konfiguriert? Nicht nur Baudrate, Stopp- und Parity-Bits, sondern auch Handshakeverhalten muss stimmen (kein Hardwarehandshake bei ausschließlicher Verwendung der Pins RX/TX).&lt;br /&gt;
* Wird das Signal eventuell durch zusätzliche Chips invertiert? (EEPROM von FT232 falsch Programmiert)&lt;br /&gt;
* Die Hardware und Verkabelung kann man schnell prüfen, indem man den Pin R1OUT bzw. R2OUT mit T1IN bzw. T2IN am MAX232 miteinander verbindet (je nachdem welches Pinpaar verwendet wird). Dann sollte man auf dem PC ein Terminalprogramm wie Hyperterminal starten und nach dem Eingeben von Zeichen diese sofort angezeigt bekommen, egal mit welcher Baudrate. Lediglich die Flusssteuerung muss auf &amp;quot;Kein&amp;quot; eingestellt werden.&lt;br /&gt;
* Man muss aber beachten, dass T1IN bzw. T2IN für diesen Test &#039;&#039;nicht&#039;&#039; mit dem Mikrocontroller verbunden sein darf, weil sonst zwei Ausgänge miteinander verbunden sind, siehe [[Ausgangsstufen Logik-ICs]]. Wenn der µC gesockelt ist, kann man ihn dafür einfach aus dem Sockel nehmen und die RX/TX Pins direkt im µC-Sockel mit einem Stück Draht verbinden.&lt;br /&gt;
* Ist der UART TXD-Pin als Output konfiguriert?&lt;br /&gt;
* Liegt Spannung an Pin 15 und 16 an? (Falsche Zeichen kommen an, aber in der richtigen Reihenfolge. Beim Test durch Kurzschluss von T1IN und R1OUT kommt nichts an)&lt;br /&gt;
&lt;br /&gt;
=== SPI (Hardware) ===&lt;br /&gt;
* Master Mode: SS Pin als Ausgang oder auf High gelegt? (siehe hier: [http://www.holger-klabunde.de/avr/avrhelp.htm] )&lt;br /&gt;
* SPI zu schnell&lt;br /&gt;
* Hängen andere SPI-Devices am Bus, die undefiniertes CS haben?&lt;br /&gt;
* Sind die DDR-Register der SPI-Ports richtig gesetzt?&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
&lt;br /&gt;
* Sind die Pullup-Widerstände deaktiviert? (im allgemeinen)&lt;br /&gt;
* (im speziellen) Bei einige Controllern liegt der JTAG mit auf den ADC-Pins. Die betroffenen ADC-Kanäle werden erst richtig funktionieren, wenn der JTAG deaktiviert ist. Das geht per Fuse oder - wenn man an die Fuses nicht mehr herankommen sollte, weil man mit einem Bootloader arbeitet - auch per Software:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* File jtag_utils.h           *&lt;br /&gt;
 * Author N.G. (newgeneration) */&lt;br /&gt;
#ifndef JTAG_UTILS_H_&lt;br /&gt;
#define JTAG_UTILS_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/atomic.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Check for the JTAG-disable-Bit (JTD)&lt;br /&gt;
#if defined(JTD)&lt;br /&gt;
&lt;br /&gt;
// Es gibt (mindestens) zwei Moeglichkeiten, in welchem Register&lt;br /&gt;
// das JTD-Bit steckt: bei aelteren AVRS im MCUCSR (MCU Control &lt;br /&gt;
// and Status Register), bei neueren im MCUCR (MCU Control Register)&lt;br /&gt;
#ifdef MCUCSR&lt;br /&gt;
#define JTD_REGISTER MCUCSR&lt;br /&gt;
#else&lt;br /&gt;
#define JTD_REGISTER MCUCR&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static inline void jtag_disable() __attribute__((always_inline));&lt;br /&gt;
static inline void jtag_enable() __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
static inline void jtag_disable() &lt;br /&gt;
{&lt;br /&gt;
    // Auszug aus dem Datenblatt:&lt;br /&gt;
    /* In order to avoid unintentional disabling or enabling    *&lt;br /&gt;
     * of the JTAG interface, a timed sequence must be followed *&lt;br /&gt;
     * when changing this bit: The application software must    *&lt;br /&gt;
     * write this bit to the desired value twice within four    *&lt;br /&gt;
     * cycles to change its value.                              */&lt;br /&gt;
    &lt;br /&gt;
    // Damit das Bit auch wirklich innerhalb von 4 Zyklen zwei mal&lt;br /&gt;
    // gesetzt wird, werden die Interrupts verboten und es wird &lt;br /&gt;
    // inline-assembler verwendet. Damit ist man unabhängig von der&lt;br /&gt;
    // Optimierung des Compilers.&lt;br /&gt;
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) &lt;br /&gt;
    {&lt;br /&gt;
        uint8_t tmp;&lt;br /&gt;
        __asm__ __volatile__ (&lt;br /&gt;
            &amp;quot;in %[tmp], %[reg]   \n\t&amp;quot;&lt;br /&gt;
            &amp;quot;ori %[tmp], %[jtd]  \n\t&amp;quot;&lt;br /&gt;
            &amp;quot;out %[reg], %[tmp]  \n\t&amp;quot;&lt;br /&gt;
            &amp;quot;out %[reg], %[tmp]  \n\t&amp;quot; :&lt;br /&gt;
            [tmp] &amp;quot;=&amp;amp;d&amp;quot; (tmp) :&lt;br /&gt;
            [reg] &amp;quot;I&amp;quot; (_SFR_IO_ADDR(JTD_REGISTER)), [jtd] &amp;quot;M&amp;quot; (1 &amp;lt;&amp;lt; JTD)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static inline void jtag_enable() &lt;br /&gt;
{&lt;br /&gt;
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) &lt;br /&gt;
    {&lt;br /&gt;
        uint8_t tmp;&lt;br /&gt;
        __asm__ __volatile__ (&lt;br /&gt;
            &amp;quot;in %[tmp], %[reg]   \n\t&amp;quot;&lt;br /&gt;
            &amp;quot;andi %[tmp], %[jtd] \n\t&amp;quot;&lt;br /&gt;
            &amp;quot;out %[reg], %[tmp]  \n\t&amp;quot;&lt;br /&gt;
            &amp;quot;out %[reg], %[tmp]  \n\t&amp;quot; :&lt;br /&gt;
            [tmp] &amp;quot;=&amp;amp;d&amp;quot; (tmp) :&lt;br /&gt;
            [reg] &amp;quot;I&amp;quot; (_SFR_IO_ADDR(JTD_REGISTER)), [jtd] &amp;quot;M&amp;quot; ((uint8_t)~(1 &amp;lt;&amp;lt; JTD))&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#undef JTD_REGISTER&lt;br /&gt;
&lt;br /&gt;
#else /* !defined(JTD) */&lt;br /&gt;
#warning &amp;quot;Has this device a JTAG-Interface?&amp;quot;&lt;br /&gt;
#error   &amp;quot;The device does not support JTAG disabling in software!&amp;quot;&lt;br /&gt;
#endif /* defined(JTD) */&lt;br /&gt;
&lt;br /&gt;
#endif /* defined(JTAG_UTILS_H_) */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.atmel.com/Images/Atmel-2521-AVR-Hardware-Design-Considerations_ApplicationNote_AVR042.pdf Application Note AVR042: AVR Hardware Design Considerations]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1619.pdf Application Note AVR040: EMC Design Considerations]&lt;br /&gt;
* [http://www.youtube.com/watch?v=AP_FSyWGpoE Youtube-Video zum Thema Abblockkondensatoren]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C&amp;diff=94676</id>
		<title>C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C&amp;diff=94676"/>
		<updated>2016-12-27T11:48:32Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: C-Standards hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;C ist eine universelle Programmiersprache in der auch hardwarenah programmiert werden kann, ursprünglich als eine Art maschinenunabhängiger Makroassembler gedacht. C ist neben Assembler die bei Mikrocontrollern am häufigsten verwendete Programmiersprache, wird aber auch außerhalb dieses Feldes häufig eingesetzt, etwa in der Anwendungs- und System-Programmierung (der Linux-Kernel ist in C geschrieben).&lt;br /&gt;
&lt;br /&gt;
Die Entstehung von C hängt sehr mit der Entwicklung von [[Unix]] zusammen. Dennis Ritchie arbeitete Anfang der 70er bei Bell Laboratories (heute AT&amp;amp;T) an diesem neuen Betriebssystem. Ursprünglich wurde in Assembler programmiert, aber später wurde das gesamte System neu in der ersten Version von der Programmiersprache C implementiert, weil C Hardware-unabhängig(er als Assembler) ist und ein Compiler fast auf jedem System existiert oder leicht portiert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Sprachstandards ==&lt;br /&gt;
&lt;br /&gt;
Vor 1989 gab es keine standardisierte Sprache C, nur den de-facto Standard des K&amp;amp;R Buches &amp;quot;The C Programming Language&amp;quot;. Dieser &amp;quot;Standard&amp;quot; unterschied sich noch sehr von der aktuellen Sprache:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* K%R C */&lt;br /&gt;
&lt;br /&gt;
/* Argumente wurden anders definiert, es gibt keine Prototypen */&lt;br /&gt;
print(str)&lt;br /&gt;
char *str;&lt;br /&gt;
{&lt;br /&gt;
    printf(&amp;quot;%s\n&amp;quot;, str);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* es wird implizit int angenommen, void gibt es nicht */&lt;br /&gt;
main() &lt;br /&gt;
{&lt;br /&gt;
     print(&amp;quot;Hallo Welt!&amp;quot;);&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1989 wurde der erste C-Standard verabschiedet, der unter den Namen ANSI C oder C89 lief. Diese Norm galt jedoch nur in den USA, deshalb wurde ein Jahr später C90 von der ISO verabschiedet. C89 und C90 beziehen sich aber auf die selbe Version von C.&lt;br /&gt;
&lt;br /&gt;
Abgesehen von kleinen Verbesserungen vor allem bei den Character Sets im Jahre 1995 bleib C auch gleich.&lt;br /&gt;
&lt;br /&gt;
1999 wurde ein neuer Standard verabschiedet, unter dem Namen C99. Dieser fügte viele neue Dinge hinzu, die oftmals schon von Compilern als Erweiterung bereitgestellt wurden, zum Beispiel inline-Functionen, größere Datentypen, etc.&lt;br /&gt;
C99 ist fast vollständig kompatibel zu C90, allerdings etwas strenger bei der Auslegung der Sprachelemente. &lt;br /&gt;
&lt;br /&gt;
Als letztes gibt es den aktuellsten Standard C11, der hauptsächlich die C-Library erweiterte und Multithreading, sowie Atomic-Typen hinzufügte.&lt;br /&gt;
&lt;br /&gt;
Streng genommen verlieren mit jeder neuen Version des Standards alle vorherigen Version ihre Gültigkeit. Soweit die Theorie, in der Praxis sieht es allerdings so aus, dass viele Compiler nur C99 unterstützen, wenn überhaupt (Microsofts offizieller C-Compiler ist bekannt dafür etwas aus der Reihe zu tanzen).&lt;br /&gt;
&lt;br /&gt;
== C-Tutorials/Einführungen ==&lt;br /&gt;
C ist zwar universell, kann vom Supercomputer bis zum kleinsten 8bit-Controller eingesetzt werden, aber trotzdem unterscheidet sich die Arte der Programmierung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
=== PC-Programmierung ===&lt;br /&gt;
* [https://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf The C Programming Language] (Orginal K&amp;amp;R für ANSI C) als PDF&lt;br /&gt;
* [http://www.c-howto.de Einführung in C] von E. Fischer&lt;br /&gt;
* [http://www.schellong.de/c.htm C-Tutorial] von H. Schellong&lt;br /&gt;
* [http://www.c-plusplus.de/c.htm verschiedene Tutorials] zum Download&lt;br /&gt;
* [http://www.manderc.com/ Mander]: Online-Referenc für C und C++&lt;br /&gt;
* [http://www.tutorials.at/ tutorials.at] auch für Pascal, Basic&lt;br /&gt;
* [http://suparum.rz.uni-mannheim.de/manuals/c/cde.htm C-Tutorial von C. Wirth] &lt;br /&gt;
* [http://www.strath.ac.uk/IT/Docs/Ccourse/ C programming] by S. Holmes&lt;br /&gt;
* [http://www.haw-hamburg.de/rzbt/dankert/c_tutor.html/ C und C++ für UNIX, DOS und MS-Windows] von J. Dankert, zum download&lt;br /&gt;
* [http://openbook.galileocomputing.de/c_von_a_bis_z/ online Version des Buchs &amp;quot;C von A bis Z&amp;quot;] von J. Wolf&lt;br /&gt;
* [http://home.fhtw-berlin.de/~junghans/cref/ C-Referenz] von M. Leslie/G.Junghanns&lt;br /&gt;
* [http://info.baeumle.com/ansic.html &amp;quot;Einiges zu Ansi-C&amp;quot;] von B. Baeumle-Courth&lt;br /&gt;
* [http://www2.informatik.uni-wuerzburg.de/dclc-faq/ FAQ der Newsgroup de.comp.lang.c]&lt;br /&gt;
* [http://www.coding-guidelines.com/cbook/cbook1_0a.pdf Derek M. Jones:  The New C Standard] e-Buch, engl., &amp;gt;1600 Seiten, mehr als &amp;quot;nur&amp;quot; Einführung/Tutorial&lt;br /&gt;
&lt;br /&gt;
=== Mikrocontroller-spezifisch ===&lt;br /&gt;
* [[AVR-GCC-Tutorial]] &lt;br /&gt;
* [http://roboternetz.de/download/c_tutorial.zip Download umfangreiches C-Tutorial mit Beispielen für RN-Control und andere AVR-Boards im ZIP-Archiv] von A.Seeger&lt;br /&gt;
* [http://playground.boxtec.ch/doku.php/tutorials/start playground.boxtec.ch] verschiedene Tutorials für AVR mit Hardware und I2C Bus (siehe playground / tutorial)&lt;br /&gt;
&lt;br /&gt;
== Weitere Links ==&lt;br /&gt;
* [http://en.cppreference.com/w/c C Referenz] auf cppreferece.com&lt;br /&gt;
* [http://www.crasseux.com/books/ctutorial/Precedence-of-operators.html#Precedence%20of%20operators Liste aller Operatoren und ihrer Prioritäten]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programmiersprachen]]&lt;br /&gt;
[[Category:C| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C&amp;diff=94675</id>
		<title>C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C&amp;diff=94675"/>
		<updated>2016-12-27T11:26:39Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Entstehung hinzugefügt, Links geordnet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;C ist eine universelle Programmiersprache in der auch hardwarenah programmiert werden kann, ursprünglich als eine Art maschinenunabhängiger Makroassembler gedacht. C ist neben Assembler die bei Mikrocontrollern am häufigsten verwendete Programmiersprache, wird aber auch außerhalb dieses Feldes häufig eingesetzt, etwa in der Anwendungs- und System-Programmierung (der Linux-Kernel ist in C geschrieben).&lt;br /&gt;
&lt;br /&gt;
Die Entstehung von C hängt sehr mit der Entwicklung von [[Unix]] zusammen. Dennis Ritchie arbeitete Anfang der 70er bei Bell Laboratories (heute AT&amp;amp;T) an diesem neuen Betriebssystem. Ursprünglich wurde in Assembler programmiert, aber später wurde das gesamte System neu in der ersten Version von der Programmiersprache C implementiert, weil C Hardware-unabhängig(er als Assembler) ist und ein Compiler fast auf jedem System existiert oder leicht portiert werden kann.&lt;br /&gt;
&lt;br /&gt;
== C-Tutorials/Einführungen/Refernezen ==&lt;br /&gt;
C ist zwar universell, kann vom Supercomputer bis zum kleinsten 8bit-Controller eingesetzt werden, aber trotzdem unterscheidet sich die Arte der Programmierung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Tutorials, vor allem die in deutscher Sprache, sollten teilweise Hinterfragt werden. Oftmals schreibt der Autor einfach nur seine (zum Teil begrenzte) Sicht der Dinge. Es kann nicht schaden, mehr als ein Tutorial zu lesen und bei Diskrepanzen den C-Standard zu Rate zu ziehen.&lt;br /&gt;
&lt;br /&gt;
=== PC-Programmierung ===&lt;br /&gt;
* [https://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf The C Programming Language] (Orginal K&amp;amp;R für ANSI C) als PDF&lt;br /&gt;
* [http://en.cppreference.com/w/c C Referenz] auf cppreferece.com&lt;br /&gt;
* [http://www.c-howto.de Einführung in C] von E. Fischer&lt;br /&gt;
* [http://www.schellong.de/c.htm C-Tutorial] von H. Schellong&lt;br /&gt;
* [http://www.c-plusplus.de/c.htm verschiedene Tutorials] zum Download&lt;br /&gt;
* [http://www.manderc.com/ Mander]: Online-Referenc für C und C++&lt;br /&gt;
* [http://www.tutorials.at/ tutorials.at] auch für Pascal, Basic&lt;br /&gt;
* [http://suparum.rz.uni-mannheim.de/manuals/c/cde.htm C-Tutorial von C. Wirth] &lt;br /&gt;
* [http://www.strath.ac.uk/IT/Docs/Ccourse/ C programming] by S. Holmes&lt;br /&gt;
* [http://www.haw-hamburg.de/rzbt/dankert/c_tutor.html/ C und C++ für UNIX, DOS und MS-Windows] von J. Dankert, zum download&lt;br /&gt;
* [http://openbook.galileocomputing.de/c_von_a_bis_z/ online Version des Buchs &amp;quot;C von A bis Z&amp;quot;] von J. Wolf&lt;br /&gt;
* [http://home.fhtw-berlin.de/~junghans/cref/ C-Referenz] von M. Leslie/G.Junghanns&lt;br /&gt;
* [http://info.baeumle.com/ansic.html &amp;quot;Einiges zu Ansi-C&amp;quot;] von B. Baeumle-Courth&lt;br /&gt;
* [http://www2.informatik.uni-wuerzburg.de/dclc-faq/ FAQ der Newsgroup de.comp.lang.c]&lt;br /&gt;
* [http://www.coding-guidelines.com/cbook/cbook1_0a.pdf Derek M. Jones:  The New C Standard] e-Buch, engl., &amp;gt;1600 Seiten, mehr als &amp;quot;nur&amp;quot; Einführung/Tutorial&lt;br /&gt;
&lt;br /&gt;
=== Mikrocontroller-spezifisch ===&lt;br /&gt;
* [[AVR-GCC-Tutorial]] &lt;br /&gt;
* [http://roboternetz.de/download/c_tutorial.zip Download umfangreiches C-Tutorial mit Beispielen für RN-Control und andere AVR-Boards im ZIP-Archiv] von A.Seeger&lt;br /&gt;
* [http://playground.boxtec.ch/doku.php/tutorials/start playground.boxtec.ch] verschiedene Tutorials für AVR mit Hardware und I2C Bus (siehe playground / tutorial)&lt;br /&gt;
&lt;br /&gt;
== Weitere Links ==&lt;br /&gt;
* [http://www.crasseux.com/books/ctutorial/Precedence-of-operators.html#Precedence%20of%20operators Liste aller Operatoren und ihrer Prioritäten]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programmiersprachen]]&lt;br /&gt;
[[Category:C| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=94672</id>
		<title>AVR-GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=94672"/>
		<updated>2016-12-25T16:22:30Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: /* Selbst bauen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;avr-gcc ist ein freier [[C]]-Cross-[[Compiler]] für [[AVR]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
avr-gcc kann von der Leistungsfähigkeit kommerzieller [[Compiler]] gut mithalten. Sogar C++-Programme sind möglich; in der aktuellen Fassung wird C++ jedoch nur eingeschränkt unterstützt (Stand 3/2012).&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
Die Toolchain (Werkzeugsammlung) besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung, siehe [[AVR-GCC-Tutorial/Exkurs Makefiles|AVR-GCC-Tutorial: Exkurs Makefiles]]. &lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* AVR-Libc: Die C-Standardbibliothek mit AVR-spezifischen Headerdateien und Funktionen.&lt;br /&gt;
* [[AVRDUDE]]: universelle AVR-Programmiersoftware, kein eigentlicher Teil der Toolchain, aber oft verwendet&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Linux/Unix ===&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Wenn keine aktuelle avr-gcc-Version als Paket (Paketname ist, zumindest bei Debian, gcc-avr) für die verwendete Distribution zur Verfügung steht, dann können sich [[Unix]]/[[Linux]]-Nutzer den Sourcecode herunterladen und selbst kompilieren, dazu gibt es Schritt-für-Schritt-Anleitungen&amp;lt;ref&amp;gt;[http://www.nongnu.org/avr-libc/user-manual/install_tools.html AVR-Libc: Building and Installing under Linux, FreeBSD, and Others]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.roboternetz.de/wissen/index.php/Avr-gcc_und_avrdude_installieren www.roboternetz.de: avr-gcc und avrdude installieren]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das [http://www.femtoos.org FemtoOS]-Paket beinhaltet Scripte zum automatischen Herunterladen und Bauen einer avr-gcc Version 4.3.3.&lt;br /&gt;
&lt;br /&gt;
Empfehlenswert ist auch [http://cdk4avr.sf.net CDK4AVR], das die entsprechenden Tools als einfach installierbare Linux-Pakete bereitstellt. Leider ist das Projekt schon etwas älter, im Forum findet sich ein [http://www.mikrocontroller.net/topic/130972 Beitrag], aktuellere Sourcen mit den entsprechenden Patches zu versehen und zu kompilieren. Patches zu den Binutils und GCC-Sourcen sind unumgänglich, da die offiziellen Sourcen aufgrund des Umfangs an Prozessortargets den aktuellsten Entwicklungen hinterherhinken und damit bereits bekannte Fehler eventuell noch nicht behoben sind. Weitere Tipps zur AVR-Programmierung unter Linux stehen im Artikel [[AVR und Linux]].&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Die beste fertige Toolchain ist das [http://www.obdev.at/crosspack/ Crosspack]. Dieses enthält auch die AVR-Libc, avrdude und avarice. Leider gab es bei Mac OS 10.5.6 eine tiefgreifende Änderung beim fork()-Systemcall, der bewirkt, dass avarice mit JTAGICE mkII und Dragon nicht funktioniert. Geräte mit Serial-USB-Konvertern (AVRISP clones etc) funktionieren dagegen problemlos. &lt;br /&gt;
&lt;br /&gt;
Wer die Toolchain von Hand bauen möchte kann das natürlich auch tun, dazu einfach den unter &amp;quot;Linux/Unix&amp;quot; verlinkten Anleitungen folgen. Unter [[Mac OS X]] muss man dazu zuerst die [http://developer.apple.com/Tools/ Apple Developer Tools] installieren.&lt;br /&gt;
&lt;br /&gt;
Teile der Toolchain (AVR-Libc und avrdude) kann folgendermaßen installieren:&lt;br /&gt;
&lt;br /&gt;
==== Mit MacPorts ====&lt;br /&gt;
Wenn man [http://www.macports.org/ MacPorts] benutzt kann man folgendes in das Terminal eingeben, um den Toolchain zu installieren:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avr-libc&lt;br /&gt;
&lt;br /&gt;
Das Programmiertool avrdude bekommt man genauso:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avrdude&lt;br /&gt;
&lt;br /&gt;
==== Mit Hombrew ====&lt;br /&gt;
Mit dem neueren Tool [http://brew.sh Homebrew] funktioniert das folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
avrdude kann sofort installiert werden:&lt;br /&gt;
&lt;br /&gt;
 brew install avrdude&lt;br /&gt;
&lt;br /&gt;
Für den restlichen Toolchain muss man erst ein &#039;Tap&#039; hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 brew tap larsimmisch/homebrew-avr&lt;br /&gt;
&lt;br /&gt;
und kann dann den eigentlichen Toolchain installieren:&lt;br /&gt;
&lt;br /&gt;
 brew install avr-libc&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
&lt;br /&gt;
* [http://tinkerlog.com/2007/09/29/programming-avr-with-a-macbook/ Programming AVR with a MacBook] (engl.)&lt;br /&gt;
* [http://www.ladyada.net/library/avrdevtut/setup-mac.html AVR Tutorial from Lady Ada] (engl.)&lt;br /&gt;
* [http://www.obdev.at/crosspack/ Crosspack]&lt;br /&gt;
* [http://www.digithink.com/OSX-AVR OSX-AVR (nicht mehr aktuell)]&lt;br /&gt;
* [http://www.definefalsetrue.com/index.php/Mac-OS-X/bootfeedx.html BootFeedX Bootloaderfrontend]&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Man kann sich auch für Windows den GCC selbst bauen oder man sucht von anderen erstellte Binaries.&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an. Allerdings ohne &amp;quot;make&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der alte Klassiker [[WinAVR]] wird seit 2010 nicht mehr gepflegt und funktioniert&lt;br /&gt;
ab Windows 8 nur noch eingeschränkt.&lt;br /&gt;
&lt;br /&gt;
Die Firma SysProgs bietet aktuelle Versionen der [http://gnutoolchains.com GNU Toolchain]&lt;br /&gt;
einschließlich &amp;quot;make&amp;quot; für viele Systemarchitekturen zum Download an.&lt;br /&gt;
&lt;br /&gt;
==== Selbst bauen ====&lt;br /&gt;
&lt;br /&gt;
Zuerst sei einmal die offizielle (englische) Anleitung genannt: [http://www.nongnu.org/avr-libc/user-manual/install_tools.html Building and Installing avr-gcc]&lt;br /&gt;
&lt;br /&gt;
Das hier ist die etwas ausführlichere Beschreibung, die mir Johann L. gegeben hat, damit ich meinen Compiler erstellen konnte. Der Post dazu findet sich [https://www.mikrocontroller.net/topic/384825?goto=4394391#4394606 hier]. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal braucht man am besten ein Linux, zum Beispiel ein aktuelles Ubuntu. dort müssen diverse Programme wie gcc, autoconf, subversion usw. installiert sein. Wenn etwas fehlt meckert configure, das einfach aufmerksam lesen und dann die Programme nachinstallieren. Danach erneut configure aufrufen.&lt;br /&gt;
Um die Toolchain für Windows zu bauen brauchen wir noch mingw32 (aktueller Name in den meisten Paketquellen: mingw32-w64-gcc oder gcc-w64-mingw32). Eventuell findet sich das in den Paketquellen eurer Distribution, sonst kann ich auf [http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/ diese Seite] verweisen.&lt;br /&gt;
&lt;br /&gt;
===== Vorbereitungen =====&lt;br /&gt;
Wie schon gesagt brauchen wir ein Linux, zum Beispiel in einer VM. Ein minimales Linux-Hintergrundwissen wären auch gut, aber es geht notfalls (Google &amp;amp; co. sind die Freunde) auch ohne.&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Auf diesem Linux darf kein avr-gcc und keine avr-libc vorhanden sein!&lt;br /&gt;
Dazu brauchen wir die folgende Software:&lt;br /&gt;
* GNU Binutils: [https://www.sourceware.org/binutils/ Download], am besten die neueste Version (runter scrollen, aktuell ist 2.27)&lt;br /&gt;
* GCC Sourcen: [https://gcc.gnu.org/ Download], diese sollten aus dem svn kommen (svn co svn://gcc.gnu.org/svn/gcc/branches/&#039;&#039;branchname&#039;&#039; gcc ,mit &#039;&#039;branchname&#039;&#039; gcc-&#039;&#039;version&#039;&#039;-branch, aktuell ist gcc-6-branch) oder aus dem aktuellen &#039;&#039;trunk&#039;&#039; (svn co svn://gcc.gnu.org/svn/gcc/trunk).&lt;br /&gt;
* Die AVR-libc: [http://download.savannah.gnu.org/releases/avr-libc/ Download]. &#039;&#039;Achtung:&#039;&#039; Ab gcc-Version 5 muss mindestens eine avr-libc-Version &amp;gt;= 2.0.0 verwendet werden. Ältere GCCs brauchen natürlich auch eine avr-libc vor dieser Version.&lt;br /&gt;
&lt;br /&gt;
Alles herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
Zu den Downloads kommen dann noch 2 Umgebungsvariablen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ PREFIX=$HOME/local/avr&lt;br /&gt;
$ export PREFIX&lt;br /&gt;
$ PATH=$PATH:$PREFIX/bin&lt;br /&gt;
$ export PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit legt ihr das Installationsverzeichnis fest und fügt auch gleich das Verzeichnis für die ausführbaren Dateien zum Pfad hinzu.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden gehe ich von diesem Ordner-Layout aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$HOME&lt;br /&gt;
|&lt;br /&gt;
+ BuildToolchain&lt;br /&gt;
   |&lt;br /&gt;
   + Downloads&lt;br /&gt;
   |   |&lt;br /&gt;
   |   + binutils&lt;br /&gt;
   |   + gcc&lt;br /&gt;
   |   + avr-libc&lt;br /&gt;
   |&lt;br /&gt;
   + buildLinux&lt;br /&gt;
   |   |&lt;br /&gt;
   |   + binutils&lt;br /&gt;
   |   + gcc&lt;br /&gt;
   |   + avr-libc&lt;br /&gt;
   |&lt;br /&gt;
   + buildWindows&lt;br /&gt;
      |&lt;br /&gt;
      + binutils&lt;br /&gt;
      + gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Erstellen der Binutils =====&lt;br /&gt;
Wechselt in das Verzeichnis BuildToolchain/buildLinux/binutils.&lt;br /&gt;
Von dort aus werden wir die binutils konfigurieren und erstellen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; man darf weder GCC noch die Binutils in einem Verzeichnis innerhalb des Quellordners der Downloads konfigurieren, sonst kommen wirre Fehler. Wer sich an die Anleitung hält kann diesen Fehler (fast) nicht machen.&lt;br /&gt;
&lt;br /&gt;
Also, wir sind soweit. Jetzt geht es ans Konfigurieren der binutils und danach ans kompilieren, aber das ist ganz leicht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/binutils/configure --prefix=$PREFIX --target=avr --disable-nls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn configure fehlende Programme meldet: nachinstallieren und erneut versuchen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sind die binutils für Linux fertig. Ihr könnt nachkontrollieren, ob die binutils da sind: Im Ordner $PREFIX/bin sollten sich die Dateien befinden, darunter avr-objcopy, avr-as, avr-size, etc.&lt;br /&gt;
&lt;br /&gt;
===== Erstellen vom GCC =====&lt;br /&gt;
Als erstes muss sich der GCC noch ein paar zusätzliche Dateien herunterladen, das geschieht automatisch mit dem Befehl (ausgeführt in BuildToolchain/Downloads/gcc):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./contrib/download_prerequisites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildLinux/gcc&lt;br /&gt;
Dort führt ihr das Folgende aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/gcc/configure --prefix=$PREFIX --target=avr \&lt;br /&gt;
    --enable-languages=c,c++,lto --disable-nls --disable-libssp --with-dwarf2&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Erstellen der avr-libc =====&lt;br /&gt;
Als erstes muss die avr-libs zum konfigurieren bereit gemacht werden:&lt;br /&gt;
Im Verzeichnis BuildToolchain/Downloads/avr-libc die Datei bootstrap ausführen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./bootstrap&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Danach wechselt ihr ins Verzeichnis BuildToolchain/buildLinux/avr-libc&lt;br /&gt;
Dort führt ihr das Folgende aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/avr-libc/configure --prefix=$PREFIX --build=`./config.guess` --host=avr&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Testen unter Linux =====&lt;br /&gt;
So, jetzt seit ihr schon bei der Hälfte: Der Compiler läuft schon unter Linux! &lt;br /&gt;
Das testet ihr am besten schon mit ein paar einfachen LED-blink-Programmen, damit auch sichergestellt ist, dass bis hierhin alles geklappt hat.&lt;br /&gt;
Das einfachste und wichtigste Kommando dürfte sein&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ avr-gcc --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dort sollte die Versionsnummer der GCC stehen. Wenn eine ältere Nummer dasteht, hab ihr entweder einen alten Download bemüht, oder eine andere Version vom avr-gcc war noch installiert.&lt;br /&gt;
Wenn der Fehler kommt, dass das Programm nicht gefunden werden kann, dann befindet sich avr-gcc nicht im PATH, das bedeutet ihr habt die Umgebungsvariablen nicht richtig gesetzt (siehe oben).&lt;br /&gt;
&lt;br /&gt;
===== Bau für Windows =====&lt;br /&gt;
Ihr müsst keine neuen Dateien runter laden, lediglich die Programme nochmal etwas anders konfigurieren.&lt;br /&gt;
Die Schritte davor &#039;&#039;&#039;müssen&#039;&#039;&#039; jedoch ausgeführt werden!&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildWindows/binutils und führt das Folgende aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Download/binutils/configure --prefix=$HOME/local/avr4win --target=avr --disable-nls \&lt;br /&gt;
    --host=plattform-w64-mingw32 --build=plattform-linux-gnu&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wobei &#039;&#039;plattform&#039;&#039; euer Ziel-System ist, also entweder i686 oder x86_64, je nach dem, was ihr für ein mingw installiert habt und ob ihr den Compiler für 32bit (i686) oder 64bit (x86_64) baut.&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildWindows/gcc und führt das Folgende aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/gcc/configure --prefix=$HOME/local/avr4win --target=avr --disable-nls \&lt;br /&gt;
    --host=plattform-w64-mingw32 --build=plattform-linux-gnu --enable-languages=c,c++,lto --with-gnu-as \&lt;br /&gt;
    --with-gnu-ld --disable-shared --with-dwarf2&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildLinux/avr-libc und führt den folgenden Befehl aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make install prefix=$HOME/local/avr4win&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich ist der Compiler auch &amp;quot;schon&amp;quot; fertig. Aber in den Binaries sind noch die gesamten Symbole enthalten, was die .exe-Dateien aufbläht. Um diese los zu werden, kann man einfach noch diesen Befehl ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ find . -name &#039;*.exe&#039; -exec plattform-w64-mingw32-strip {} &#039;;&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sollten ihr im Ordner $HOME/local/avr4win die gesamte Toolchain haben. Diesen Ordner müsst ihr nur noch auf euren Windows-PC kopieren.&lt;br /&gt;
Für das klassische WinAVR fehlt noch Programmers Notepad, sowie die Utility-Programme, vor allem avrdude und make. Diese kann man entweder seperat downloaden oder aus einer WinAVR-Installation kopieren. Die Versionen davon spielen keine Rolle.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
&lt;br /&gt;
Win32:&lt;br /&gt;
* [[AVR-Studio]]: ab Version 4.12 mit WinAVR-Unterstützung, integrierter Simulator, Debugger, rudimentäre Projektverwaltung&lt;br /&gt;
* Programmers-Notepad: wird bei [[WinAVR]] mitgeliefert, ein guter Editor mit einer rudimentären Projektverwaltung&lt;br /&gt;
* [http://www.myavr.info/download/benutzerhandbuch_sisy_avr.pdf SiSy-AVR]: ein CASE-Tool mit WinAVR-Unterstützung, das eine Entwicklungsumgebung bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Plattformunabhängig:&lt;br /&gt;
* [http://www.eclipse.org/ Eclipse] mit CDT und dem [http://avr-eclipse.sourceforge.net/index.html AVR Eclipse Plugin]&lt;br /&gt;
* [[Code::Blocks]]: vielseitige, freie Entwicklungsumgebung für Windows und Linux&lt;br /&gt;
* [http://www.netbeans.org/ Netbeans] in der C++ - Version mit [[WinAVR]] oder [[avr-gcc]] als Toolchain&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
*[http://sourceforge.net/projects/kontrollerlab/?_test=b KontrollerLab] ist eine freie Entwicklungsumgebung für AVR momentan aber noch im Beta-stadium.&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken / Libraries ==&lt;br /&gt;
&lt;br /&gt;
Die [http://www.nongnu.org/avr-libc/ AVR-Libc] ist die gebräuchliche &amp;quot;Laufzeitbibliothek&amp;quot; zum avr-gcc C-Compiler, welche den Zugriff auf die AVR-Hardware erheblich erleichtert. Die offizielle Dokumentation zur avr-libc mit vielen Hinweisen auch zum Compiler avr-gcc und verschiedener Tools (z.&amp;amp;nbsp;B. [[AVRDUDE]]) findet man [http://www.nongnu.org/avr-libc/user-manual/index.html hier].&lt;br /&gt;
&lt;br /&gt;
Auch die [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] enthält nützlichen Code z.&amp;amp;nbsp;B. für UART, LCD,.... Bei der Procyon AVRlib ist die Lizenz zu beachten (in Kurzform: man muss dritten auf Verlangen den gesamten Quellcode der Firmware zur Verfügung stellen, falls Teile der Procyon Bibliothek genutzt werden).&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf interne Funktionen oder externe Peripherie existieren einige fertige Komponenten. Z.B. &amp;quot;Projects&amp;quot;-Bereich von [http://www.avrfreaks.net/ avrfreaks.net] (Anmeldung erforderlich (kostenlos)). &lt;br /&gt;
&lt;br /&gt;
Die Erstellung eigener Bibliotheken ist im Artikel  [[Libraries]] erklärt.&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
Eine Liste mit einigen Hinweisen:&lt;br /&gt;
&lt;br /&gt;
* 07.10.11 → es kann Probleme mit der aktuellen Eclipse-Version (Indigo) und WinAVR geben. Falls ihr Indigo installiert habt und Eclipse die Definitionen wie z.B. DDRA nicht kennt, jedoch kompillieren kann, dann müsst ihr auf die Version Helios SR2 wechseln. Danach läuft alles wie gehabt!&lt;br /&gt;
&lt;br /&gt;
* Keine &amp;quot;antiken&amp;quot; Versionen verwenden. Für MS-Windows-Nutzer: aktuelles WinAVR installieren. Für Linux/Unix-Nutzer: letzte stabile Version selbst kompilieren oder aus &amp;quot;Distribution-Packages&amp;quot; installieren (z.&amp;amp;nbsp;B. [http://cdk4avr.sourceforge.net/ cdk4avr]).&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen zuerst in die [http://www.nongnu.org/avr-libc/user-manual/index.html Anleitung] der avr-libc schauen. Insbesondere die FAQ lesen.&lt;br /&gt;
&lt;br /&gt;
* Sicherstellen, dass der MCU-Parameter (zum Compiler/Linker, meist im Makefile defniert) mit dem Zielprozessor übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-GCC-Tutorial]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Im Zweifel nicht INTERRUPT(...) sondern SIGNAL(...) nutzen. In neueren Versionen der avr-libc wurde &amp;quot;ISR&amp;quot; als Ersatz für SIGNAL eingeführt und sollte genutzt werden (SIGNAL und INTERRUPT werden langfristig entfallen). Darauf achten, dass die Vektor- bzw. Signal-Namen (&amp;quot;Parameter&amp;quot;) zu ISR bzw. SIGNAL (und INTERRUPT wenn denn unbedingt erforderlich) richtig geschrieben sind. Die Namen sind in der in der entsprechenden Header-Datei (ioxxx.h) für den Controller und der avr-libc-Dokumenation aufgelistet. Im Zweifel den erzeugten Interrupt-Vektor im Assembler-Listing prüfen, es darf &#039;&#039;&#039;kein&#039;&#039;&#039; SIG_&#039;&#039;xxx&#039;&#039; oder xxx_vect mehr zu sehen sein, sondern _vector_&#039;&#039;N&#039;&#039; (wobei &#039;&#039;N&#039;&#039; eine Zahl ist). Neuere Versionen der avr-gcc zeigen eine Warnung, falls etwas falsch geschrieben wurde, ältere Versionen nicht.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf Daten(-Tabellen) im Programmspeicher (Flash) erfolgt über Program-Space-Funktionen (pgm_read*). Lediglich die Definition einer Variablen/eines Feldes mit dem PROGMEM Attribut zu versehen, reicht (im Gegensatz zu Codevision, IAR, Imagecraft) nicht aus.&lt;br /&gt;
&lt;br /&gt;
* Nicht alle AVRs werden vollständig von der avr-libc bzw. dem Compiler unterstützt. Bei Problemen hilft oft ein Blick in den erzeugten Assembler-Code. Die Anzahl der unterstützen Controller steigt jedoch mit Version zu Version von binutils, avr-libc und avrdude. Evtl. reicht einfach ein Update auf neuere Software-Versionen (z.&amp;amp;nbsp;B. im jeweils aktuellen WinAVR-Packet).&lt;br /&gt;
&lt;br /&gt;
* inp(), outp(), sbi() und cbi() werden in der aktuellen Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle Header-Datei einbinden(deprecated.h). Es wird schon seit längerem empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen kann einfach z.&amp;amp;nbsp;B. DDRB=0xfe bzw. foo=PINB geschrieben werden.  Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &amp;amp;= ~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei (1&amp;lt;&amp;lt;x)). Die ersten beiden Varianten erzeugen bei eingeschalteter Optimierung und passenden Parametern (wie hier im Beispiel Register im &amp;quot;unteren&amp;quot; Speicherbereich) die SBI bzw. CBI Prozessorbefehle.&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-nm erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit &lt;br /&gt;
::&amp;lt;pre&amp;gt;avr-nm --size-sort --print-size -r -td &amp;lt;your_ELF_file&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aufgerufen und gibt eine vierspaltige Liste aus: Die erste Spalte ist die Adresse, die zweite die benötigte Größe, die dritte der Typ und die vierte der Name des Symbols. Alle Symbole vom Typ &amp;quot;T&amp;quot; (globale Funktionen), &amp;quot;t&amp;quot; (lokale Funktionen) und letztlich auch die mit einem &amp;quot;D&amp;quot; oder &amp;quot;d&amp;quot; (globale bzw. lokale Daten mit Initialisierungswerten im ROM) betreffen das FLASH-ROM. Typen &amp;quot;B&amp;quot; und &amp;quot;b&amp;quot; brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). (vgl. [http://www.mikrocontroller.net/topic/59960#467920 Forenbeitrag] von Jörg Wunsch)&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-size erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]]&lt;br /&gt;
* [[GCC: unbenutzte Funktionen entfernen]]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Avr-gcc/Interna AVR-GCC Interna]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://winavr.sourceforge.net/install_config_WinAVR.pdf Tutorial von C. O&#039;Flynn und E. Weddington] Einstieg in die Nutzung des avr-gcc unter MS-Windows mit WinAVR (englisch)&lt;br /&gt;
* [http://www.linuxfocus.org/Deutsch/November2004/article352.shtml AVR-GCC und Linux]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum auf mikrocontroller.net]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Compiler]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=94671</id>
		<title>AVR-GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=94671"/>
		<updated>2016-12-25T16:13:37Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: bash-Kommandos angeglichen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;avr-gcc ist ein freier [[C]]-Cross-[[Compiler]] für [[AVR]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
avr-gcc kann von der Leistungsfähigkeit kommerzieller [[Compiler]] gut mithalten. Sogar C++-Programme sind möglich; in der aktuellen Fassung wird C++ jedoch nur eingeschränkt unterstützt (Stand 3/2012).&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
Die Toolchain (Werkzeugsammlung) besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung, siehe [[AVR-GCC-Tutorial/Exkurs Makefiles|AVR-GCC-Tutorial: Exkurs Makefiles]]. &lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* AVR-Libc: Die C-Standardbibliothek mit AVR-spezifischen Headerdateien und Funktionen.&lt;br /&gt;
* [[AVRDUDE]]: universelle AVR-Programmiersoftware, kein eigentlicher Teil der Toolchain, aber oft verwendet&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Linux/Unix ===&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Wenn keine aktuelle avr-gcc-Version als Paket (Paketname ist, zumindest bei Debian, gcc-avr) für die verwendete Distribution zur Verfügung steht, dann können sich [[Unix]]/[[Linux]]-Nutzer den Sourcecode herunterladen und selbst kompilieren, dazu gibt es Schritt-für-Schritt-Anleitungen&amp;lt;ref&amp;gt;[http://www.nongnu.org/avr-libc/user-manual/install_tools.html AVR-Libc: Building and Installing under Linux, FreeBSD, and Others]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.roboternetz.de/wissen/index.php/Avr-gcc_und_avrdude_installieren www.roboternetz.de: avr-gcc und avrdude installieren]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das [http://www.femtoos.org FemtoOS]-Paket beinhaltet Scripte zum automatischen Herunterladen und Bauen einer avr-gcc Version 4.3.3.&lt;br /&gt;
&lt;br /&gt;
Empfehlenswert ist auch [http://cdk4avr.sf.net CDK4AVR], das die entsprechenden Tools als einfach installierbare Linux-Pakete bereitstellt. Leider ist das Projekt schon etwas älter, im Forum findet sich ein [http://www.mikrocontroller.net/topic/130972 Beitrag], aktuellere Sourcen mit den entsprechenden Patches zu versehen und zu kompilieren. Patches zu den Binutils und GCC-Sourcen sind unumgänglich, da die offiziellen Sourcen aufgrund des Umfangs an Prozessortargets den aktuellsten Entwicklungen hinterherhinken und damit bereits bekannte Fehler eventuell noch nicht behoben sind. Weitere Tipps zur AVR-Programmierung unter Linux stehen im Artikel [[AVR und Linux]].&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Die beste fertige Toolchain ist das [http://www.obdev.at/crosspack/ Crosspack]. Dieses enthält auch die AVR-Libc, avrdude und avarice. Leider gab es bei Mac OS 10.5.6 eine tiefgreifende Änderung beim fork()-Systemcall, der bewirkt, dass avarice mit JTAGICE mkII und Dragon nicht funktioniert. Geräte mit Serial-USB-Konvertern (AVRISP clones etc) funktionieren dagegen problemlos. &lt;br /&gt;
&lt;br /&gt;
Wer die Toolchain von Hand bauen möchte kann das natürlich auch tun, dazu einfach den unter &amp;quot;Linux/Unix&amp;quot; verlinkten Anleitungen folgen. Unter [[Mac OS X]] muss man dazu zuerst die [http://developer.apple.com/Tools/ Apple Developer Tools] installieren.&lt;br /&gt;
&lt;br /&gt;
Teile der Toolchain (AVR-Libc und avrdude) kann folgendermaßen installieren:&lt;br /&gt;
&lt;br /&gt;
==== Mit MacPorts ====&lt;br /&gt;
Wenn man [http://www.macports.org/ MacPorts] benutzt kann man folgendes in das Terminal eingeben, um den Toolchain zu installieren:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avr-libc&lt;br /&gt;
&lt;br /&gt;
Das Programmiertool avrdude bekommt man genauso:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avrdude&lt;br /&gt;
&lt;br /&gt;
==== Mit Hombrew ====&lt;br /&gt;
Mit dem neueren Tool [http://brew.sh Homebrew] funktioniert das folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
avrdude kann sofort installiert werden:&lt;br /&gt;
&lt;br /&gt;
 brew install avrdude&lt;br /&gt;
&lt;br /&gt;
Für den restlichen Toolchain muss man erst ein &#039;Tap&#039; hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 brew tap larsimmisch/homebrew-avr&lt;br /&gt;
&lt;br /&gt;
und kann dann den eigentlichen Toolchain installieren:&lt;br /&gt;
&lt;br /&gt;
 brew install avr-libc&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
&lt;br /&gt;
* [http://tinkerlog.com/2007/09/29/programming-avr-with-a-macbook/ Programming AVR with a MacBook] (engl.)&lt;br /&gt;
* [http://www.ladyada.net/library/avrdevtut/setup-mac.html AVR Tutorial from Lady Ada] (engl.)&lt;br /&gt;
* [http://www.obdev.at/crosspack/ Crosspack]&lt;br /&gt;
* [http://www.digithink.com/OSX-AVR OSX-AVR (nicht mehr aktuell)]&lt;br /&gt;
* [http://www.definefalsetrue.com/index.php/Mac-OS-X/bootfeedx.html BootFeedX Bootloaderfrontend]&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Man kann sich auch für Windows den GCC selbst bauen oder man sucht von anderen erstellte Binaries.&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an. Allerdings ohne &amp;quot;make&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der alte Klassiker [[WinAVR]] wird seit 2010 nicht mehr gepflegt und funktioniert&lt;br /&gt;
ab Windows 8 nur noch eingeschränkt.&lt;br /&gt;
&lt;br /&gt;
Die Firma SysProgs bietet aktuelle Versionen der [http://gnutoolchains.com GNU Toolchain]&lt;br /&gt;
einschließlich &amp;quot;make&amp;quot; für viele Systemarchitekturen zum Download an.&lt;br /&gt;
&lt;br /&gt;
==== Selbst bauen ====&lt;br /&gt;
&lt;br /&gt;
Zuerst sei einmal die offizielle (englische) Anleitung genannt: [http://www.nongnu.org/avr-libc/user-manual/install_tools.html Building and Installing avr-gcc]&lt;br /&gt;
&lt;br /&gt;
Das hier ist die etwas ausführlichere Beschreibung, die mir Johann L. gegeben hat, damit ich meinen Compiler erstellen konnte. Der Post dazu findet sich [https://www.mikrocontroller.net/topic/384825?goto=4394391#4394606 hier]. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal braucht man am besten ein Linux, zum Beispiel ein aktuelles Ubuntu. dort müssen diverse Programme wie gcc, autoconf, subversion usw. installiert sein. Wenn etwas fehlt meckert configure, das einfach aufmerksam lesen und dann die Programme nachistallieren. Danach erneut configure aufrufen.&lt;br /&gt;
Um die Toolchain für Windows zu bauen brauchen wir noch mingw32. Eventuell findet sich das in den Paketquellen eurer Distribution, sonst kann ich auf [http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/ diese Seite] verweisen.&lt;br /&gt;
&lt;br /&gt;
===== Vorbereitungen =====&lt;br /&gt;
Wie schon gesagt brauchen wir ein Linux, zum Beispiel in einer VM. Ein paar Linux-Hintergrundinfos wären auch gut, kann man aber auch ergooglen.&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Auf diesem Linux darf kein avr-gcc und keine avr-libc vorhanden sein!&lt;br /&gt;
Dazu brauchen wir die folgende Software:&lt;br /&gt;
* GNU Binutils: [https://www.sourceware.org/binutils/ Download], am besten die neueste Version (runter scrollen, aktuell ist 2.27)&lt;br /&gt;
* GCC Sourcen: [https://gcc.gnu.org/ Download], diese sollten aus dem svn kommen (svn co svn://gcc.gnu.org/svn/gcc/branches/&#039;&#039;branchname&#039;&#039; gcc ,mit &#039;&#039;branchname&#039;&#039; gcc-&#039;&#039;version&#039;&#039;-branch, aktuell ist gcc-6-branch) oder aus dem aktuellen &#039;&#039;trunk&#039;&#039; (svn co svn://gcc.gnu.org/svn/gcc/trunk).&lt;br /&gt;
* Die AVR-libc: [http://download.savannah.gnu.org/releases/avr-libc/ Download]. &#039;&#039;Achtung:&#039;&#039; Ab gcc-Version 5 muss mindestens eine avr-libc-Version &amp;gt;= 2.0.0 verwendet werden. Ältere GCCs brauchen natürlich auch eine avr-libc vor dieser Version.&lt;br /&gt;
&lt;br /&gt;
Alles herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
Zu den Downloads kommen dann noch 2 Umgebungsvariablen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ PREFIX=$HOME/local/avr&lt;br /&gt;
$ export PREFIX&lt;br /&gt;
$ PATH=$PATH:$PREFIX/bin&lt;br /&gt;
$ export PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit legt ihr das Installationsverzeichnis fest und fügt auch gleich das Verzeichnis für die ausführbaren Dateien zum Pfad hinzu.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden gehe ich von diesem Ordner-Layout aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$HOME&lt;br /&gt;
|&lt;br /&gt;
+ BuildToolchain&lt;br /&gt;
	|&lt;br /&gt;
	+ Downloads&lt;br /&gt;
	|	|&lt;br /&gt;
	|	+ binutils&lt;br /&gt;
	|	+ gcc&lt;br /&gt;
	|	+ avr-libc&lt;br /&gt;
	|&lt;br /&gt;
	+ buildLinux&lt;br /&gt;
	|	|&lt;br /&gt;
	|	+ binutils&lt;br /&gt;
	|	+ gcc&lt;br /&gt;
	|	+ avr-libc&lt;br /&gt;
	|&lt;br /&gt;
	+ buildWindows&lt;br /&gt;
		|&lt;br /&gt;
		+ binutils&lt;br /&gt;
		+ gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Erstellen der Binutils =====&lt;br /&gt;
Wechselt in das Verzeichnis BuildToolchain/buildLinux/binutils.&lt;br /&gt;
Von dort aus werden wir die binutils konfigurieren und erstellen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; man darf weder GCC noch die Binutils in einem Verzeichnis innerhalb des Quellordners der Downloads konfigurieren, sonst kommen wirre Fehler.&lt;br /&gt;
&lt;br /&gt;
Also, wir sind soweit. Jetzt geht es ans Konfigurieren und erstellen, aber das ist ganz leicht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/binutils/configure --prefix=$PREFIX --target=avr --disable-nls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn configure fehlende Programme meldet: nachinstallieren und erneut versuchen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sind die Binutils fertig. Ihr könnt nachkontrollieren, ob die binutils da sind: Im Ordner $PREFIX/bin sollten sich die Dateien befinden, darunter avr-objcopy, avr-as, avr-size, etc.&lt;br /&gt;
&lt;br /&gt;
===== Erstellen vom GCC =====&lt;br /&gt;
Als erstes muss sich der GCC noch ein paar zusätzliche Dateien herunterladen, das geschieht automatisch mit dem Befehl (ausgeführt in BuildToolchain/Downloads/gcc):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./contrib/download_prerequisites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildLinux/gcc&lt;br /&gt;
Dort führt ihr das Folgende aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/gcc/configure --prefix=$PREFIX --target=avr \&lt;br /&gt;
    --enable-languages=c,c++,lto --disable-nls --disable-libssp --with-dwarf2&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Erstellen der avr-libc =====&lt;br /&gt;
Als erstes muss die avr-libs zum konfigurieren bereit gemacht werden:&lt;br /&gt;
Im Verzeichnis BuildToolchain/Downloads/avr-libc die Datei bootstrap ausführen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./bootstrap&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Danach wechselt ihr ins Verzeichnis BuildToolchain/buildLinux/avr-libc&lt;br /&gt;
Dort führt ihr das Folgende aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/avr-libc/configure --prefix=$PREFIX --build=`./config.guess` --host=avr&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Testen unter Linux =====&lt;br /&gt;
So, jetzt seit ihr schon bei der Hälfte: Der Compiler läuft schon unter Linux! &lt;br /&gt;
Das testet ihr am besten schon mit ein paar einfachen LED-blink-Programmen, damit auch sichergestellt ist, dass bis hierhin alles geklappt hat.&lt;br /&gt;
Das einfachste und wichtigste Kommando dürfte sein&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ avr-gcc --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dort sollte die Versionsnummer der GCC stehen. Wenn eine ältere Nummer dasteht, hab ihr entweder einen alten Download bemüht, oder eine andere Version vom avr-gcc war noch installiert.&lt;br /&gt;
Wenn der Fehler kommt, dass das Programm nicht gefunden werden kann, dann befindet sich avr-gcc nicht im PATH, das bedeutet ihr habt die Umgebungsvariablen nicht richtig gesetzt (siehe oben).&lt;br /&gt;
&lt;br /&gt;
===== Bau für Windows =====&lt;br /&gt;
Ihr müsst keine neuen Dateien runter laden, lediglich die Programme nochmal etwas anders konfigurieren.&lt;br /&gt;
Die Schritte davor &#039;&#039;&#039;müssen&#039;&#039;&#039; jedoch ausgeführt werden!&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildWindows/binutils und führt das Folgende aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Download/binutils/configure --prefix=$HOME/local/avr4win --target=avr --disable-nls \&lt;br /&gt;
    --host=plattform-w64-mingw32 --build=plattform-linux-gnu&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wobei &#039;&#039;plattform&#039;&#039; euer Ziel-System ist, also entweder i686 oder x86_64, je nach dem, was ihr für ein mingw installiert habt und ob ihr den Compiler für 32bit (i686) oder 64bit (x86_64) baut.&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildWindows/gcc und führt das Folgende aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/gcc/configure --prefix=$HOME/local/avr4win --target=avr --disable-nls \&lt;br /&gt;
    --host=plattform-w64-mingw32 --build=plattform-linux-gnu --enable-languages=c,c++,lto --with-gnu-as \&lt;br /&gt;
    --with-gnu-ld --disable-shared --with-dwarf2&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildLinux/avr-libc und führt den folgenden Befehl aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make install prefix=$HOME/local/avr4win&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich ist der Compiler auch &amp;quot;schon&amp;quot; fertig. Aber in den Binaries sind noch die gesamten Symbole enthalten, was die .exe-Dateien aufbläht. Um diese los zu werden, kann man einfach noch diesen Befehl ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ find . -name &#039;*.exe&#039; -exec plattform-w64-mingw32-strip {} &#039;;&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sollten ihr im Ordner $HOME/local/avr4win die gesamte Toolchain haben. Diesen Ordner müsst ihr nur noch auf euren Windows-PC kopieren.&lt;br /&gt;
Für das klassische WinAVR fehlt noch Programmers Notepad, sowie die Utility-Programme, vor allem avrdude und make. Diese kann man entweder seperat downloaden oder aus einer WinAVR-Installation kopieren. Die Versionen davon spielen keine Rolle.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
&lt;br /&gt;
Win32:&lt;br /&gt;
* [[AVR-Studio]]: ab Version 4.12 mit WinAVR-Unterstützung, integrierter Simulator, Debugger, rudimentäre Projektverwaltung&lt;br /&gt;
* Programmers-Notepad: wird bei [[WinAVR]] mitgeliefert, ein guter Editor mit einer rudimentären Projektverwaltung&lt;br /&gt;
* [http://www.myavr.info/download/benutzerhandbuch_sisy_avr.pdf SiSy-AVR]: ein CASE-Tool mit WinAVR-Unterstützung, das eine Entwicklungsumgebung bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Plattformunabhängig:&lt;br /&gt;
* [http://www.eclipse.org/ Eclipse] mit CDT und dem [http://avr-eclipse.sourceforge.net/index.html AVR Eclipse Plugin]&lt;br /&gt;
* [[Code::Blocks]]: vielseitige, freie Entwicklungsumgebung für Windows und Linux&lt;br /&gt;
* [http://www.netbeans.org/ Netbeans] in der C++ - Version mit [[WinAVR]] oder [[avr-gcc]] als Toolchain&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
*[http://sourceforge.net/projects/kontrollerlab/?_test=b KontrollerLab] ist eine freie Entwicklungsumgebung für AVR momentan aber noch im Beta-stadium.&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken / Libraries ==&lt;br /&gt;
&lt;br /&gt;
Die [http://www.nongnu.org/avr-libc/ AVR-Libc] ist die gebräuchliche &amp;quot;Laufzeitbibliothek&amp;quot; zum avr-gcc C-Compiler, welche den Zugriff auf die AVR-Hardware erheblich erleichtert. Die offizielle Dokumentation zur avr-libc mit vielen Hinweisen auch zum Compiler avr-gcc und verschiedener Tools (z.&amp;amp;nbsp;B. [[AVRDUDE]]) findet man [http://www.nongnu.org/avr-libc/user-manual/index.html hier].&lt;br /&gt;
&lt;br /&gt;
Auch die [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] enthält nützlichen Code z.&amp;amp;nbsp;B. für UART, LCD,.... Bei der Procyon AVRlib ist die Lizenz zu beachten (in Kurzform: man muss dritten auf Verlangen den gesamten Quellcode der Firmware zur Verfügung stellen, falls Teile der Procyon Bibliothek genutzt werden).&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf interne Funktionen oder externe Peripherie existieren einige fertige Komponenten. Z.B. &amp;quot;Projects&amp;quot;-Bereich von [http://www.avrfreaks.net/ avrfreaks.net] (Anmeldung erforderlich (kostenlos)). &lt;br /&gt;
&lt;br /&gt;
Die Erstellung eigener Bibliotheken ist im Artikel  [[Libraries]] erklärt.&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
Eine Liste mit einigen Hinweisen:&lt;br /&gt;
&lt;br /&gt;
* 07.10.11 → es kann Probleme mit der aktuellen Eclipse-Version (Indigo) und WinAVR geben. Falls ihr Indigo installiert habt und Eclipse die Definitionen wie z.B. DDRA nicht kennt, jedoch kompillieren kann, dann müsst ihr auf die Version Helios SR2 wechseln. Danach läuft alles wie gehabt!&lt;br /&gt;
&lt;br /&gt;
* Keine &amp;quot;antiken&amp;quot; Versionen verwenden. Für MS-Windows-Nutzer: aktuelles WinAVR installieren. Für Linux/Unix-Nutzer: letzte stabile Version selbst kompilieren oder aus &amp;quot;Distribution-Packages&amp;quot; installieren (z.&amp;amp;nbsp;B. [http://cdk4avr.sourceforge.net/ cdk4avr]).&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen zuerst in die [http://www.nongnu.org/avr-libc/user-manual/index.html Anleitung] der avr-libc schauen. Insbesondere die FAQ lesen.&lt;br /&gt;
&lt;br /&gt;
* Sicherstellen, dass der MCU-Parameter (zum Compiler/Linker, meist im Makefile defniert) mit dem Zielprozessor übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-GCC-Tutorial]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Im Zweifel nicht INTERRUPT(...) sondern SIGNAL(...) nutzen. In neueren Versionen der avr-libc wurde &amp;quot;ISR&amp;quot; als Ersatz für SIGNAL eingeführt und sollte genutzt werden (SIGNAL und INTERRUPT werden langfristig entfallen). Darauf achten, dass die Vektor- bzw. Signal-Namen (&amp;quot;Parameter&amp;quot;) zu ISR bzw. SIGNAL (und INTERRUPT wenn denn unbedingt erforderlich) richtig geschrieben sind. Die Namen sind in der in der entsprechenden Header-Datei (ioxxx.h) für den Controller und der avr-libc-Dokumenation aufgelistet. Im Zweifel den erzeugten Interrupt-Vektor im Assembler-Listing prüfen, es darf &#039;&#039;&#039;kein&#039;&#039;&#039; SIG_&#039;&#039;xxx&#039;&#039; oder xxx_vect mehr zu sehen sein, sondern _vector_&#039;&#039;N&#039;&#039; (wobei &#039;&#039;N&#039;&#039; eine Zahl ist). Neuere Versionen der avr-gcc zeigen eine Warnung, falls etwas falsch geschrieben wurde, ältere Versionen nicht.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf Daten(-Tabellen) im Programmspeicher (Flash) erfolgt über Program-Space-Funktionen (pgm_read*). Lediglich die Definition einer Variablen/eines Feldes mit dem PROGMEM Attribut zu versehen, reicht (im Gegensatz zu Codevision, IAR, Imagecraft) nicht aus.&lt;br /&gt;
&lt;br /&gt;
* Nicht alle AVRs werden vollständig von der avr-libc bzw. dem Compiler unterstützt. Bei Problemen hilft oft ein Blick in den erzeugten Assembler-Code. Die Anzahl der unterstützen Controller steigt jedoch mit Version zu Version von binutils, avr-libc und avrdude. Evtl. reicht einfach ein Update auf neuere Software-Versionen (z.&amp;amp;nbsp;B. im jeweils aktuellen WinAVR-Packet).&lt;br /&gt;
&lt;br /&gt;
* inp(), outp(), sbi() und cbi() werden in der aktuellen Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle Header-Datei einbinden(deprecated.h). Es wird schon seit längerem empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen kann einfach z.&amp;amp;nbsp;B. DDRB=0xfe bzw. foo=PINB geschrieben werden.  Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &amp;amp;= ~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei (1&amp;lt;&amp;lt;x)). Die ersten beiden Varianten erzeugen bei eingeschalteter Optimierung und passenden Parametern (wie hier im Beispiel Register im &amp;quot;unteren&amp;quot; Speicherbereich) die SBI bzw. CBI Prozessorbefehle.&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-nm erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit &lt;br /&gt;
::&amp;lt;pre&amp;gt;avr-nm --size-sort --print-size -r -td &amp;lt;your_ELF_file&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aufgerufen und gibt eine vierspaltige Liste aus: Die erste Spalte ist die Adresse, die zweite die benötigte Größe, die dritte der Typ und die vierte der Name des Symbols. Alle Symbole vom Typ &amp;quot;T&amp;quot; (globale Funktionen), &amp;quot;t&amp;quot; (lokale Funktionen) und letztlich auch die mit einem &amp;quot;D&amp;quot; oder &amp;quot;d&amp;quot; (globale bzw. lokale Daten mit Initialisierungswerten im ROM) betreffen das FLASH-ROM. Typen &amp;quot;B&amp;quot; und &amp;quot;b&amp;quot; brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). (vgl. [http://www.mikrocontroller.net/topic/59960#467920 Forenbeitrag] von Jörg Wunsch)&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-size erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]]&lt;br /&gt;
* [[GCC: unbenutzte Funktionen entfernen]]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Avr-gcc/Interna AVR-GCC Interna]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://winavr.sourceforge.net/install_config_WinAVR.pdf Tutorial von C. O&#039;Flynn und E. Weddington] Einstieg in die Nutzung des avr-gcc unter MS-Windows mit WinAVR (englisch)&lt;br /&gt;
* [http://www.linuxfocus.org/Deutsch/November2004/article352.shtml AVR-GCC und Linux]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum auf mikrocontroller.net]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Compiler]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=94670</id>
		<title>AVR-GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=94670"/>
		<updated>2016-12-25T16:07:36Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Fehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;avr-gcc ist ein freier [[C]]-Cross-[[Compiler]] für [[AVR]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
avr-gcc kann von der Leistungsfähigkeit kommerzieller [[Compiler]] gut mithalten. Sogar C++-Programme sind möglich; in der aktuellen Fassung wird C++ jedoch nur eingeschränkt unterstützt (Stand 3/2012).&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
Die Toolchain (Werkzeugsammlung) besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung, siehe [[AVR-GCC-Tutorial/Exkurs Makefiles|AVR-GCC-Tutorial: Exkurs Makefiles]]. &lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* AVR-Libc: Die C-Standardbibliothek mit AVR-spezifischen Headerdateien und Funktionen.&lt;br /&gt;
* [[AVRDUDE]]: universelle AVR-Programmiersoftware, kein eigentlicher Teil der Toolchain, aber oft verwendet&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Linux/Unix ===&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Wenn keine aktuelle avr-gcc-Version als Paket (Paketname ist, zumindest bei Debian, gcc-avr) für die verwendete Distribution zur Verfügung steht, dann können sich [[Unix]]/[[Linux]]-Nutzer den Sourcecode herunterladen und selbst kompilieren, dazu gibt es Schritt-für-Schritt-Anleitungen&amp;lt;ref&amp;gt;[http://www.nongnu.org/avr-libc/user-manual/install_tools.html AVR-Libc: Building and Installing under Linux, FreeBSD, and Others]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.roboternetz.de/wissen/index.php/Avr-gcc_und_avrdude_installieren www.roboternetz.de: avr-gcc und avrdude installieren]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das [http://www.femtoos.org FemtoOS]-Paket beinhaltet Scripte zum automatischen Herunterladen und Bauen einer avr-gcc Version 4.3.3.&lt;br /&gt;
&lt;br /&gt;
Empfehlenswert ist auch [http://cdk4avr.sf.net CDK4AVR], das die entsprechenden Tools als einfach installierbare Linux-Pakete bereitstellt. Leider ist das Projekt schon etwas älter, im Forum findet sich ein [http://www.mikrocontroller.net/topic/130972 Beitrag], aktuellere Sourcen mit den entsprechenden Patches zu versehen und zu kompilieren. Patches zu den Binutils und GCC-Sourcen sind unumgänglich, da die offiziellen Sourcen aufgrund des Umfangs an Prozessortargets den aktuellsten Entwicklungen hinterherhinken und damit bereits bekannte Fehler eventuell noch nicht behoben sind. Weitere Tipps zur AVR-Programmierung unter Linux stehen im Artikel [[AVR und Linux]].&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Die beste fertige Toolchain ist das [http://www.obdev.at/crosspack/ Crosspack]. Dieses enthält auch die AVR-Libc, avrdude und avarice. Leider gab es bei Mac OS 10.5.6 eine tiefgreifende Änderung beim fork()-Systemcall, der bewirkt, dass avarice mit JTAGICE mkII und Dragon nicht funktioniert. Geräte mit Serial-USB-Konvertern (AVRISP clones etc) funktionieren dagegen problemlos. &lt;br /&gt;
&lt;br /&gt;
Wer die Toolchain von Hand bauen möchte kann das natürlich auch tun, dazu einfach den unter &amp;quot;Linux/Unix&amp;quot; verlinkten Anleitungen folgen. Unter [[Mac OS X]] muss man dazu zuerst die [http://developer.apple.com/Tools/ Apple Developer Tools] installieren.&lt;br /&gt;
&lt;br /&gt;
Teile der Toolchain (AVR-Libc und avrdude) kann folgendermaßen installieren:&lt;br /&gt;
&lt;br /&gt;
==== Mit MacPorts ====&lt;br /&gt;
Wenn man [http://www.macports.org/ MacPorts] benutzt kann man folgendes in das Terminal eingeben, um den Toolchain zu installieren:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avr-libc&lt;br /&gt;
&lt;br /&gt;
Das Programmiertool avrdude bekommt man genauso:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avrdude&lt;br /&gt;
&lt;br /&gt;
==== Mit Hombrew ====&lt;br /&gt;
Mit dem neueren Tool [http://brew.sh Homebrew] funktioniert das folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
avrdude kann sofort installiert werden:&lt;br /&gt;
&lt;br /&gt;
 brew install avrdude&lt;br /&gt;
&lt;br /&gt;
Für den restlichen Toolchain muss man erst ein &#039;Tap&#039; hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 brew tap larsimmisch/homebrew-avr&lt;br /&gt;
&lt;br /&gt;
und kann dann den eigentlichen Toolchain installieren:&lt;br /&gt;
&lt;br /&gt;
 brew install avr-libc&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
&lt;br /&gt;
* [http://tinkerlog.com/2007/09/29/programming-avr-with-a-macbook/ Programming AVR with a MacBook] (engl.)&lt;br /&gt;
* [http://www.ladyada.net/library/avrdevtut/setup-mac.html AVR Tutorial from Lady Ada] (engl.)&lt;br /&gt;
* [http://www.obdev.at/crosspack/ Crosspack]&lt;br /&gt;
* [http://www.digithink.com/OSX-AVR OSX-AVR (nicht mehr aktuell)]&lt;br /&gt;
* [http://www.definefalsetrue.com/index.php/Mac-OS-X/bootfeedx.html BootFeedX Bootloaderfrontend]&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Man kann sich auch für Windows den GCC selbst bauen oder man sucht von anderen erstellte Binaries.&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an. Allerdings ohne &amp;quot;make&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der alte Klassiker [[WinAVR]] wird seit 2010 nicht mehr gepflegt und funktioniert&lt;br /&gt;
ab Windows 8 nur noch eingeschränkt.&lt;br /&gt;
&lt;br /&gt;
Die Firma SysProgs bietet aktuelle Versionen der [http://gnutoolchains.com GNU Toolchain]&lt;br /&gt;
einschließlich &amp;quot;make&amp;quot; für viele Systemarchitekturen zum Download an.&lt;br /&gt;
&lt;br /&gt;
==== Selbst bauen ====&lt;br /&gt;
&lt;br /&gt;
Zuerst sei einmal die offizielle (englische) Anleitung genannt: [http://www.nongnu.org/avr-libc/user-manual/install_tools.html Building and Installing avr-gcc]&lt;br /&gt;
&lt;br /&gt;
Das hier ist die etwas ausführlichere Beschreibung, die mir Johann L. gegeben hat, damit ich meinen Compiler erstellen konnte. Der Post dazu findet sich [https://www.mikrocontroller.net/topic/384825?goto=4394391#4394606 hier]. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal braucht man am besten ein Linux, zum Beispiel ein aktuelles Ubuntu. dort müssen diverse Programme wie gcc, autoconf, subversion usw. installiert sein. Wenn etwas fehlt meckert configure, das einfach aufmerksam lesen und dann die Programme nachistallieren. Danach erneut configure aufrufen.&lt;br /&gt;
Um die Toolchain für Windows zu bauen brauchen wir noch mingw32. Eventuell findet sich das in den Paketquellen eurer Distribution, sonst kann ich auf [http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/ diese Seite] verweisen.&lt;br /&gt;
&lt;br /&gt;
===== Vorbereitungen =====&lt;br /&gt;
Wie schon gesagt brauchen wir ein Linux, zum Beispiel in einer VM. Ein paar Linux-Hintergrundinfos wären auch gut, kann man aber auch ergooglen.&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Auf diesem Linux darf kein avr-gcc und keine avr-libc vorhanden sein!&lt;br /&gt;
Dazu brauchen wir die folgende Software:&lt;br /&gt;
* GNU Binutils: [https://www.sourceware.org/binutils/ Download], am besten die neueste Version (runter scrollen, aktuell ist 2.27)&lt;br /&gt;
* GCC Sourcen: [https://gcc.gnu.org/ Download], diese sollten aus dem svn kommen (svn co svn://gcc.gnu.org/svn/gcc/branches/&#039;&#039;branchname&#039;&#039; gcc ,mit &#039;&#039;branchname&#039;&#039; gcc-&#039;&#039;version&#039;&#039;-branch, aktuell ist gcc-6-branch) oder aus dem aktuellen &#039;&#039;trunk&#039;&#039; (svn co svn://gcc.gnu.org/svn/gcc/trunk).&lt;br /&gt;
* Die AVR-libc: [http://download.savannah.gnu.org/releases/avr-libc/ Download]. &#039;&#039;Achtung:&#039;&#039; Ab gcc-Version 5 muss mindestens eine avr-libc-Version &amp;gt;= 2.0.0 verwendet werden. Ältere GCCs brauchen natürlich auch eine avr-libc vor dieser Version.&lt;br /&gt;
&lt;br /&gt;
Alles herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
Zu den Downloads kommen dann noch 2 Umgebungsvariablen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ PREFIX=$HOME/local/avr&lt;br /&gt;
$ export PREFIX&lt;br /&gt;
$ PATH=$PATH:$PREFIX/bin&lt;br /&gt;
$ export PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit legt ihr das Installationsverzeichnis fest und fügt auch gleich das Verzeichnis für die ausführbaren Dateien zum Pfad hinzu.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden gehe ich von diesem Ordner-Layout aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$HOME&lt;br /&gt;
|&lt;br /&gt;
+ BuildToolchain&lt;br /&gt;
	|&lt;br /&gt;
	+ Downloads&lt;br /&gt;
	|	|&lt;br /&gt;
	|	+ binutils&lt;br /&gt;
	|	+ gcc&lt;br /&gt;
	|	+ avr-libc&lt;br /&gt;
	|&lt;br /&gt;
	+ buildLinux&lt;br /&gt;
	|	|&lt;br /&gt;
	|	+ binutils&lt;br /&gt;
	|	+ gcc&lt;br /&gt;
	|	+ avr-libc&lt;br /&gt;
	|&lt;br /&gt;
	+ buildWindows&lt;br /&gt;
		|&lt;br /&gt;
		+ binutils&lt;br /&gt;
		+ gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Erstellen der Binutils =====&lt;br /&gt;
Wechselt in das Verzeichnis BuildToolchain/buildLinux/binutils.&lt;br /&gt;
Von dort aus werden wir die binutils konfigurieren und erstellen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; man darf weder GCC noch die Binutils in einem Verzeichnis innerhalb des Quellordners der Downloads konfigurieren, sonst kommen wirre Fehler.&lt;br /&gt;
&lt;br /&gt;
Also, wir sind soweit. Jetzt geht es ans Konfigurieren und erstellen, aber das ist ganz leicht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/binutils/configure --prefix=$PREFIX --target=avr --disable-nls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn configure fehlende Programme meldet: nachinstallieren und erneut versuchen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sind die Binutils fertig. Ihr könnt nachkontrollieren, ob die binutils da sind: Im Ordner $PREFIX/bin sollten sich die Dateien befinden, darunter avr-objcopy, avr-as, avr-size, etc.&lt;br /&gt;
&lt;br /&gt;
===== Erstellen vom GCC =====&lt;br /&gt;
Als erstes muss sich der GCC noch ein paar zusätzliche Dateien herunterladen, das geschieht automatisch mit dem Befehl (ausgeführt in BuildToolchain/Downloads/gcc):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./contrib/download_prerequisites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildLinux/gcc&lt;br /&gt;
Dort führt ihr das Folgende aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/gcc/configure --prefix=$PREFIX --target=avr \&lt;br /&gt;
    --enable-languages=c,c++,lto --disable-nls --disable-libssp --with-dwarf2&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Erstellen der avr-libc =====&lt;br /&gt;
Als erstes muss die avr-libs zum konfigurieren bereit gemacht werden:&lt;br /&gt;
Im Verzeichnis BuildToolchain/Downloads/avr-libc die Datei bootstrap ausführen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./bootstrap&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Danach wechselt ihr ins Verzeichnis BuildToolchain/buildLinux/avr-libc&lt;br /&gt;
Dort führt ihr das Folgende aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/avr-libc/configure --prefix=$PREFIX --build=`./config.guess` --host=avr&lt;br /&gt;
$make&lt;br /&gt;
$make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Testen unter Linux =====&lt;br /&gt;
So, jetzt seit ihr schon bei der Hälfte: Der Compiler läuft schon unter Linux! &lt;br /&gt;
Das testet ihr am besten schon mit ein paar einfachen LED-blink-Programmen, damit auch sichergestellt ist, dass bis hierhin alles geklappt hat.&lt;br /&gt;
Das einfachste und wichtigste Kommando dürfte sein&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
avr-gcc --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dort sollte die Versionsnummer der GCC stehen. Wenn eine ältere Nummer dasteht, hab ihr entweder einen alten Download bemüht, oder eine andere Version vom avr-gcc war noch installiert.&lt;br /&gt;
Wenn der Fehler kommt, dass das Programm nicht gefunden werden kann, dann befindet sich avr-gcc nicht im PATH, das bedeutet ihr habt die Umgebungsvariablen nicht richtig gesetzt (siehe oben).&lt;br /&gt;
&lt;br /&gt;
===== Bau für Windows =====&lt;br /&gt;
Ihr müsst keine neuen Dateien runter laden, lediglich die Programme nochmal etwas anders konfigurieren.&lt;br /&gt;
Die Schritte davor &#039;&#039;&#039;müssen&#039;&#039;&#039; jedoch ausgeführt werden!&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildWindows/binutils und führt das Folgende aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Download/binutils/configure --prefix=$HOME/local/avr4win --target=avr --disable-nls \&lt;br /&gt;
    --host=plattform-w64-mingw32 --build=plattform-linux-gnu&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wobei &#039;&#039;plattform&#039;&#039; euer Ziel-System ist, also entweder i686 oder x86_64, je nach dem, was ihr für ein mingw installiert habt und ob ihr den Compiler für 32bit (i686) oder 64bit (x86_64) baut.&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildWindows/gcc und führt das Folgende aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../Downloads/gcc/configure --prefix=$HOME/local/avr4win --target=avr --disable-nls \&lt;br /&gt;
    --host=plattform-w64-mingw32 --build=plattform-linux-gnu --enable-languages=c,c++,lto --with-gnu-as \&lt;br /&gt;
    --with-gnu-ld --disable-shared --with-dwarf2&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildLinux/avr-libc und führt den folgenden Befehl aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make install prefix=$HOME/local/avr4win&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich ist der Compiler auch &amp;quot;schon&amp;quot; fertig. Aber in den Binaries sind noch die gesamten Symbole enthalten, was die .exe-Dateien aufbläht. Um diese los zu werden, kann man einfach noch diesen Befehl ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
find . -name &#039;*.exe&#039; -exec plattform-w64-mingw32-strip {} &#039;;&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sollten ihr im Ordner $HOME/local/avr4win die gesamte Toolchain haben. Diesen Ordner müsst ihr nur noch auf euren Windows-PC kopieren.&lt;br /&gt;
Für das klassische WinAVR fehlt noch Programmers Notepad, sowie die Utility-Programme, vor allem avrdude und make. Diese kann man entweder seperat downloaden oder aus einer WinAVR-Installation kopieren. Die Versionen davon spielen keine Rolle.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
&lt;br /&gt;
Win32:&lt;br /&gt;
* [[AVR-Studio]]: ab Version 4.12 mit WinAVR-Unterstützung, integrierter Simulator, Debugger, rudimentäre Projektverwaltung&lt;br /&gt;
* Programmers-Notepad: wird bei [[WinAVR]] mitgeliefert, ein guter Editor mit einer rudimentären Projektverwaltung&lt;br /&gt;
* [http://www.myavr.info/download/benutzerhandbuch_sisy_avr.pdf SiSy-AVR]: ein CASE-Tool mit WinAVR-Unterstützung, das eine Entwicklungsumgebung bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Plattformunabhängig:&lt;br /&gt;
* [http://www.eclipse.org/ Eclipse] mit CDT und dem [http://avr-eclipse.sourceforge.net/index.html AVR Eclipse Plugin]&lt;br /&gt;
* [[Code::Blocks]]: vielseitige, freie Entwicklungsumgebung für Windows und Linux&lt;br /&gt;
* [http://www.netbeans.org/ Netbeans] in der C++ - Version mit [[WinAVR]] oder [[avr-gcc]] als Toolchain&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
*[http://sourceforge.net/projects/kontrollerlab/?_test=b KontrollerLab] ist eine freie Entwicklungsumgebung für AVR momentan aber noch im Beta-stadium.&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken / Libraries ==&lt;br /&gt;
&lt;br /&gt;
Die [http://www.nongnu.org/avr-libc/ AVR-Libc] ist die gebräuchliche &amp;quot;Laufzeitbibliothek&amp;quot; zum avr-gcc C-Compiler, welche den Zugriff auf die AVR-Hardware erheblich erleichtert. Die offizielle Dokumentation zur avr-libc mit vielen Hinweisen auch zum Compiler avr-gcc und verschiedener Tools (z.&amp;amp;nbsp;B. [[AVRDUDE]]) findet man [http://www.nongnu.org/avr-libc/user-manual/index.html hier].&lt;br /&gt;
&lt;br /&gt;
Auch die [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] enthält nützlichen Code z.&amp;amp;nbsp;B. für UART, LCD,.... Bei der Procyon AVRlib ist die Lizenz zu beachten (in Kurzform: man muss dritten auf Verlangen den gesamten Quellcode der Firmware zur Verfügung stellen, falls Teile der Procyon Bibliothek genutzt werden).&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf interne Funktionen oder externe Peripherie existieren einige fertige Komponenten. Z.B. &amp;quot;Projects&amp;quot;-Bereich von [http://www.avrfreaks.net/ avrfreaks.net] (Anmeldung erforderlich (kostenlos)). &lt;br /&gt;
&lt;br /&gt;
Die Erstellung eigener Bibliotheken ist im Artikel  [[Libraries]] erklärt.&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
Eine Liste mit einigen Hinweisen:&lt;br /&gt;
&lt;br /&gt;
* 07.10.11 → es kann Probleme mit der aktuellen Eclipse-Version (Indigo) und WinAVR geben. Falls ihr Indigo installiert habt und Eclipse die Definitionen wie z.B. DDRA nicht kennt, jedoch kompillieren kann, dann müsst ihr auf die Version Helios SR2 wechseln. Danach läuft alles wie gehabt!&lt;br /&gt;
&lt;br /&gt;
* Keine &amp;quot;antiken&amp;quot; Versionen verwenden. Für MS-Windows-Nutzer: aktuelles WinAVR installieren. Für Linux/Unix-Nutzer: letzte stabile Version selbst kompilieren oder aus &amp;quot;Distribution-Packages&amp;quot; installieren (z.&amp;amp;nbsp;B. [http://cdk4avr.sourceforge.net/ cdk4avr]).&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen zuerst in die [http://www.nongnu.org/avr-libc/user-manual/index.html Anleitung] der avr-libc schauen. Insbesondere die FAQ lesen.&lt;br /&gt;
&lt;br /&gt;
* Sicherstellen, dass der MCU-Parameter (zum Compiler/Linker, meist im Makefile defniert) mit dem Zielprozessor übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-GCC-Tutorial]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Im Zweifel nicht INTERRUPT(...) sondern SIGNAL(...) nutzen. In neueren Versionen der avr-libc wurde &amp;quot;ISR&amp;quot; als Ersatz für SIGNAL eingeführt und sollte genutzt werden (SIGNAL und INTERRUPT werden langfristig entfallen). Darauf achten, dass die Vektor- bzw. Signal-Namen (&amp;quot;Parameter&amp;quot;) zu ISR bzw. SIGNAL (und INTERRUPT wenn denn unbedingt erforderlich) richtig geschrieben sind. Die Namen sind in der in der entsprechenden Header-Datei (ioxxx.h) für den Controller und der avr-libc-Dokumenation aufgelistet. Im Zweifel den erzeugten Interrupt-Vektor im Assembler-Listing prüfen, es darf &#039;&#039;&#039;kein&#039;&#039;&#039; SIG_&#039;&#039;xxx&#039;&#039; oder xxx_vect mehr zu sehen sein, sondern _vector_&#039;&#039;N&#039;&#039; (wobei &#039;&#039;N&#039;&#039; eine Zahl ist). Neuere Versionen der avr-gcc zeigen eine Warnung, falls etwas falsch geschrieben wurde, ältere Versionen nicht.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf Daten(-Tabellen) im Programmspeicher (Flash) erfolgt über Program-Space-Funktionen (pgm_read*). Lediglich die Definition einer Variablen/eines Feldes mit dem PROGMEM Attribut zu versehen, reicht (im Gegensatz zu Codevision, IAR, Imagecraft) nicht aus.&lt;br /&gt;
&lt;br /&gt;
* Nicht alle AVRs werden vollständig von der avr-libc bzw. dem Compiler unterstützt. Bei Problemen hilft oft ein Blick in den erzeugten Assembler-Code. Die Anzahl der unterstützen Controller steigt jedoch mit Version zu Version von binutils, avr-libc und avrdude. Evtl. reicht einfach ein Update auf neuere Software-Versionen (z.&amp;amp;nbsp;B. im jeweils aktuellen WinAVR-Packet).&lt;br /&gt;
&lt;br /&gt;
* inp(), outp(), sbi() und cbi() werden in der aktuellen Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle Header-Datei einbinden(deprecated.h). Es wird schon seit längerem empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen kann einfach z.&amp;amp;nbsp;B. DDRB=0xfe bzw. foo=PINB geschrieben werden.  Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &amp;amp;= ~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei (1&amp;lt;&amp;lt;x)). Die ersten beiden Varianten erzeugen bei eingeschalteter Optimierung und passenden Parametern (wie hier im Beispiel Register im &amp;quot;unteren&amp;quot; Speicherbereich) die SBI bzw. CBI Prozessorbefehle.&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-nm erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit &lt;br /&gt;
::&amp;lt;pre&amp;gt;avr-nm --size-sort --print-size -r -td &amp;lt;your_ELF_file&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aufgerufen und gibt eine vierspaltige Liste aus: Die erste Spalte ist die Adresse, die zweite die benötigte Größe, die dritte der Typ und die vierte der Name des Symbols. Alle Symbole vom Typ &amp;quot;T&amp;quot; (globale Funktionen), &amp;quot;t&amp;quot; (lokale Funktionen) und letztlich auch die mit einem &amp;quot;D&amp;quot; oder &amp;quot;d&amp;quot; (globale bzw. lokale Daten mit Initialisierungswerten im ROM) betreffen das FLASH-ROM. Typen &amp;quot;B&amp;quot; und &amp;quot;b&amp;quot; brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). (vgl. [http://www.mikrocontroller.net/topic/59960#467920 Forenbeitrag] von Jörg Wunsch)&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-size erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]]&lt;br /&gt;
* [[GCC: unbenutzte Funktionen entfernen]]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Avr-gcc/Interna AVR-GCC Interna]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://winavr.sourceforge.net/install_config_WinAVR.pdf Tutorial von C. O&#039;Flynn und E. Weddington] Einstieg in die Nutzung des avr-gcc unter MS-Windows mit WinAVR (englisch)&lt;br /&gt;
* [http://www.linuxfocus.org/Deutsch/November2004/article352.shtml AVR-GCC und Linux]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum auf mikrocontroller.net]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Compiler]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=94629</id>
		<title>Cortex-A</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=94629"/>
		<updated>2016-12-19T13:35:47Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: /* Unterschiede zum Cortex-M */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ARM Cortex-A sind von [[ARM]] konstruierte Prozessorkerne, 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;
ARM bezeichnet die Prozessorlinien folgendermaßen&amp;lt;ref&amp;gt;http://arm.com/products/processors/index.php&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
;ARM Cortex Embedded Processors: Cortex-M Series – Cost-sensitive solutions for deterministic microcontroller applications&lt;br /&gt;
;ARM Cortex Real-time Embedded Processors: Cortex-R Series – Exceptional performance for real-time applications&lt;br /&gt;
;ARM Cortex Application Processors: Cortex™-A and Cortex-A50 Series – High performance processors for open Operating Systems&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 Betriebssystemen Linux (z.B. Debian, Arch Linux ARM, Android), Windows Mobile etc. eingesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ Offizielle Beschreibungen aller Cortex-A Prozessoren von ARM&lt;br /&gt;
|-&lt;br /&gt;
! ARM Core   || Key Benefits&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A5  || &lt;br /&gt;
* ARM’s smallest application processor with Uniprocessor (UP) and Multiprocessor (MP) licensing options &lt;br /&gt;
* Extremely configurable processor with optional NEON, optional FPU and L1 caches configurable from 4K-64KB&lt;br /&gt;
* Full feature set of Cortex-A9 processor at one third the area and power&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A7  || &lt;br /&gt;
* ARMv7-A architectural extensions (40-bit physical addressing, hardware virtualization support)&lt;br /&gt;
* More than 20% improvement in single thread integer performance compared to Cortex-A5&lt;br /&gt;
* Integrated L2 cache subsystem provides improved area efficiency and up to 43% improvements in memory streaming performance&lt;br /&gt;
* Proven successful design, now well matched to the needs of wearable mobile devices and other UI-based consumer products&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A8  || &lt;br /&gt;
* Large increase in single thread performance over it’s predecessor, the ARM11&lt;br /&gt;
* ARMv7-A support including NEON and TrustZone&lt;br /&gt;
* Widely deployed in mobile and embedded, with numerous low-cost 3rd party development platforms. A great processor on which to learn the ARM architecture.&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A9  || &lt;br /&gt;
* Scalable performance and power efficiency for a broad range of 32-bit consumer, networking, enterprise and mobile applications&lt;br /&gt;
* Support the wide ARMv7-A 32-bit software eco-system&lt;br /&gt;
* Mature and silicon proven in multiple process technologies&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A15 || &lt;br /&gt;
* Established ARMv7-A processor with NEON-VFP configurability&lt;br /&gt;
* Reliable 32-bit infrastructure computing with 1TB addressing&lt;br /&gt;
* Support for multi-tenant software virtualization&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A17 || &lt;br /&gt;
* Highest performance for ARMv7-A software ecosystem&lt;br /&gt;
* Cost efficiency with premium 32-bit performance for mass-market devices&lt;br /&gt;
* Mature and shipped in a wide range of consumer and embedded markets&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A32 || &lt;br /&gt;
* ARMv8-A architectural enhancements, full backwards compatibility with ARMv7-A software&lt;br /&gt;
* Higher efficiency and performance compared to Cortex-A7 processor&lt;br /&gt;
* New idle power management features&lt;br /&gt;
* Highly scalable 32-bit processor with new configuration options&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A35 || &lt;br /&gt;
* Most efficient 64-bit ARMv8-A processor with full ARMv7-A compatibility&lt;br /&gt;
* Efficiency improvements compared to the Cortex-A7: Less active power, improved performance&lt;br /&gt;
* Highly scalable ARMv8-A processor with new configuration options&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A53 || &lt;br /&gt;
* High efficiency CPU for wide range of applications in mobile, DTV, automotive, networking, and more&lt;br /&gt;
* ARMv8-A architecture at low cost for standalone entry level designs&lt;br /&gt;
* Versatile enough to pair with any ARMv8 core in a big.LITTLE pairing, including Cortex-A57, Cortex-A72, or even other Cortex-A53 or Cortex-A35 CPU clusters&lt;br /&gt;
* Mature product with high volume shipment&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A57 || &lt;br /&gt;
* Established ARMv8-A 64-bit processor&lt;br /&gt;
* Reliable 64-bit infrastructure computing with 16TB addressing&lt;br /&gt;
* Proven functional safety documentation package&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A72 || &lt;br /&gt;
* ARM’s state-of-the-art high-performance processor for infrastructure, mobile, and automotive&lt;br /&gt;
* Market-leading compute density across all application form factors&lt;br /&gt;
* Improved performance and efficiency, with full ARMv8-A 64b support.&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A73 || &lt;br /&gt;
* Highest performance in mobile power envelope. Up to 30% higher performance than previous generation.&lt;br /&gt;
* Up to 2.8GHz frequency for highest peak performance&lt;br /&gt;
* New levels of sustained usage for the best user experience. Up to 30% increased power efficiency&lt;br /&gt;
* Smallest premium ARMv8-A processor ever. Premium CPU under 0.65mm2 per core.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zum Cortex-M ==&lt;br /&gt;
&lt;br /&gt;
Die Unterschiede zu den Cortex-M Mikrocontrollern sind unter anderem folgende:&lt;br /&gt;
* Teilweise 64 bit Prozessoren, mit vergrößertem Adressraum (44 bit oder mehr statt 32 bit)&lt;br /&gt;
* Kein On-Chip Speicher (meist ein geringes RAM vorhanden, aber ein externes ist so gut wie immer trotzdem nötig) macht externes Speicherinterface nötig, was viele Pins nutzt. Auch braucht man natürlich extra Speicher- und (DDR)-SDRAM-ICs.&lt;br /&gt;
* Mehrere Levels von Data und Instruction Caches&lt;br /&gt;
* Gehäuse mit wesentlich mehr Pins, meist im BGA&lt;br /&gt;
* Höhere Taktfrequenz (mehr als 500 MHz sind keine Seltenheit, aktuell maximal 2.8 GHz)&lt;br /&gt;
* ARM big.LITTLE Konzept: mehrere &amp;quot;kleine&amp;quot; Cortex-A-Cores werden zusammen mit mehreren &amp;quot;großen&amp;quot; Cores verschalten, um Enegie zu sparen: wenn wenig Leistung nötig ist werden die energieeffizierteren Cores benutzt, bei hohen Leistungsanforderungen übernehmen die anderne Cores&lt;br /&gt;
* ARM Jazelle für die beschleunigte Ausführung von Java-Code&lt;br /&gt;
* Sicherheitsmechanismen, wie eine [[MMU]] oder die ARM TrustZone Technologie&lt;br /&gt;
* Optional eine NEON™ Media Processing Engine&lt;br /&gt;
* Schnellere und präzisere [[FPU]]&lt;br /&gt;
* Kryptographie, wie AES- und SHA-Algorithmen, True-Random-Generators&lt;br /&gt;
* Digitale Interfaces, die man eher aus dem PC-Bereich kennt, wie HS-USB-Hosts, schnelles Ethernet, SD/MMC Interface, Kamera- oder Video-Dekoder, I²S, ...&lt;br /&gt;
* Dazu kommen aber auch klassische Mikrocontroller-Interfaces, wie UART, I²C, SPIs, interne ADCs und DACs, sowie Timer&lt;br /&gt;
&#039;&#039;(für alle oben genannten Fälle gibt es natürlich auch Ausnahmen)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einige der oben genannten Punkte finden sich neuerdings auch in Cortex-M7-Controllern, die damit die Brücke zwischen Mikrocontrollern und Anwendungsprozessoren schlagen.&lt;br /&gt;
&lt;br /&gt;
Größter Nachteil für diese Leistungsfähigen Controller wird das fehlen von On-Chip Flash und RAM sein, weil man so extra ICs braucht, was wiederum das Layouten erschwert, da ein DDR3-RAM-Design nicht mehr sonderlich einfach ist.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-a/index.php?tab=Multicore Offizielle ARM Seite zu der Cortex-A Serie]&lt;br /&gt;
* [[Linux Boards]]&lt;br /&gt;
* [[Raspberry Pi Einführung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=FPU&amp;diff=94117</id>
		<title>FPU</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=FPU&amp;diff=94117"/>
		<updated>2016-10-08T18:20:46Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Artikel etwas erweitert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;F&#039;&#039;&#039;loating &#039;&#039;&#039;P&#039;&#039;&#039;oint &#039;&#039;&#039;U&#039;&#039;&#039;nit&lt;br /&gt;
&lt;br /&gt;
Zu deutsch Gleitkommaeinheit. Diese ist Teil eines Prozessors, der spezielle Befehle für Berechnungen mit [[Gleitkommazahlen]] unterstützt. Diese Befehle beziehen sich meist auf den IEEE 754 Standard &amp;lt;ref&amp;gt;http://www.csee.umbc.edu/~tsimo1/CMSC455/IEEE-754-2008.pdf IEEE Standard for Floating-Point&lt;br /&gt;
Arithmetic&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch eine solche Einheit werden die Operationen mit [[Gleitkommazahlen]] (in [[C]] die Datentypen float (&#039;&#039;single precision&#039;&#039;, 32bit), double (&#039;&#039;double precision&#039;&#039;, 64bit) und long double (&#039;&#039;extended precision&#039;&#039;, oftmals 80bit)) wesentlich schneller, weil in Hardware, durchgeführt. &lt;br /&gt;
Ist keine FPU verfügbar müssen die Operationen durch die libc der Toolchain &amp;quot;zu Fuß&amp;quot; emuliert werden, was natürlich mehr Befehle und damit mehr Laufzeit bedeutet.&lt;br /&gt;
&lt;br /&gt;
Einfachere [[Mikrocontroller]], wie zum Beispiel der AVR, besitzen im Allgemeinen keine FPU, weshalb man, wenn es um Geschwindigkeit und Speicherverbrauch geht, auf [[Festkommaarithmetik]] setzen sollte. Damit kann man komplett auf Gleitkommazahlen und den damit verbundenen Overhead bei der Berechnung verzichten.&lt;br /&gt;
&lt;br /&gt;
Neuere komplexere Prozessoren wie die ARM Cortex-Mikrocontroller können eine FPU eingebaut haben. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! ARM-Cortex-M !! FPU&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M0 || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M1 || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M3 || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M4 || Optional (&#039;&#039;single precision&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-M7 || Optional (&#039;&#039;single precision&#039;&#039;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die wesentlich leistungsfähigeren Application-Prozessoren von [[ARM]], die [[Cortex-A]], bieten im allgemeinen immer eine FPU, oftmals auch mit &#039;&#039;double precision&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Gleitkommazahlen&amp;diff=94114</id>
		<title>Gleitkommazahlen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Gleitkommazahlen&amp;diff=94114"/>
		<updated>2016-10-08T11:50:30Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Erstellung der Seite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gleitkommazahlen sind eine Möglichkeit für Computer und Mikrocontroller mit rationalen Zahlen (also Brüche und Kommazahlen) zu rechnen. Die damit verbundene Gleitkommaarithmetik ist das Gegenstück zur [[Festkommaarithmetik]].&lt;br /&gt;
&lt;br /&gt;
Um effizient mit Gleitkommazahlen zu rechnen empfiehlt sich ein Controller mit eingebauter [[FPU]], da dieser Hardware-Befehle zum Umgang mit diesen besitzt. Sonst muss die Toolchain alle Gleitkommaoperationen mittels mehrerer Hardwarebefehle nachbilden, was Zeit und Speicher kostet.&lt;br /&gt;
&lt;br /&gt;
== Darstellung von Zahlen ==&lt;br /&gt;
Anders als gewohnt werden die Zahlen nicht binär gespeichert, sondern nach dem IEEE-754-Format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{x} = \big( -1 \big)^{\text{s}} \cdot \text{m} \cdot \text{b}^{\text{e}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ist die gewünschte Zahl im Gleitkommaformat&lt;br /&gt;
* &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; ist das Vorzeichen-bit: 0 entspricht +, 1 entspricht -&lt;br /&gt;
* &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ist die sogenannte Mantisse, sie speichert die Ziffern der Zahl&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; ist die Basis (heute fast ausschließlich 2) und&lt;br /&gt;
* &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; ist der Exponent, dieser gibt die Position des Kommas an&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Bits für Exponent und Mantisse hängen von der gewünschten Genauigkeit ab.&lt;br /&gt;
Die Programmiersprache [[C]] (und die davon abgeleiteten) kennen folgende Genauigkeiten:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Datentyp !! Anzahl Bits !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;float&#039;&#039; || 32 Bit || &#039;&#039;single precision&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;double&#039;&#039; || 64 Bit || &#039;&#039;double precision&#039;&#039;&lt;br /&gt;
Achtung: Abweichend vom Standard sind double beim [[AVR-GCC]] und der avr-libc auch nur 32 Bit!&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;long double&#039;&#039; || 80 Bit || &#039;&#039;extendend precision&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
* hoher Dynamikbereich: je nach dem wie viele Bits genutzt werden können sehr sehr kleine und sehr große Werte dargestellt werden&lt;br /&gt;
* Extra definierte Zahlen für -INF (minus Unendlich), INF (plus Unendlich) und NaN (not a number), die bei Rechenoperationen herauskommen können und somit geprüft werden können. So sind (immer bei Gleitkommarechnungen, nicht Integer) eine Zahl (ungleich 0) / 0 immer INF (+ oder - je nach dem ob die Zahl größer oder kleiner 0 war). 0/0 entspricht immer NaN. Bei Integerrechnungen sind diese Operationen undefiniert.&lt;br /&gt;
* Formeln können mehr oder weniger komplett und direkt übernommen werden. Es muss nur darauf geachtet werden, dass die Operationen auch in float/double ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Ein kleines Beispielprogramm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    double a = 5 / 3; &lt;br /&gt;
    printf(&amp;quot;5 / 3 = %.10f (Berechnung mittels int)\n&amp;quot;, a);&lt;br /&gt;
    double b = 5.0 / 3.0;&lt;br /&gt;
    printf(&amp;quot;5 / 3 = %.10f (Berechnung mittels double)\n&amp;quot;, b);&lt;br /&gt;
    double c = (double)5 / 3;&lt;br /&gt;
    printf(&amp;quot;5 / 3 = %.10f (Berechnung mittels cast auf double)&amp;quot;, c);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses hat die folgende Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pre&amp;quot;&amp;gt;&lt;br /&gt;
5 / 3 = 1.0000000000 (Berechnung mittels int)&lt;br /&gt;
5 / 3 = 1.6666666667 (Berechnung mittels double)&lt;br /&gt;
5 / 3 = 1.6666666667 (Berechnung mittels cast auf double)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nachteile ==&lt;br /&gt;
* Unterläufe von sehr kleinen Zahlen auf 0&lt;br /&gt;
* Auslöschung bei Subtraktion: Bei zwei fast gleich großen Zahlen wird das Ergebnis falsch&lt;br /&gt;
* Prüfen auf Gleichheit: siehe [http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison hier]&lt;br /&gt;
* Absorption, dazu wieder ein kleines Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    float little =    0.0000001F;&lt;br /&gt;
    float huge = 100000.0000000F;&lt;br /&gt;
    printf(&amp;quot;little        = %17.10f\n&amp;quot;, little);&lt;br /&gt;
    printf(&amp;quot;huge          = %17.10f\n&amp;quot;, huge);&lt;br /&gt;
    printf(&amp;quot;little + huge = %17.10f&amp;quot;, little + huge);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses hat die folgende Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pre&amp;quot;&amp;gt;&lt;br /&gt;
little        =      0.0000001000&lt;br /&gt;
huge          = 100000.0000000000&lt;br /&gt;
little + huge = 100000.0000000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wie man sehen kann: Durch die viel kleinere Zahl und den damit verbundenen Ungenauigkeiten bei der Rechnung ändert die Rechnung nichts.&lt;br /&gt;
&lt;br /&gt;
* Ungenaue Darstellung von Zahlen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    // ich habe dieses Beispiel gewählt, weil meine &amp;quot;tolle und hochgenaue&amp;quot; Taschenrechner App dieses Ergebnis ausgab&lt;br /&gt;
    printf(&amp;quot;6,4 - 6,85 = %.15f&amp;quot;, 6.4 - 6.85);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pre&amp;quot;&amp;gt;&lt;br /&gt;
6,4 - 6,85 = -0.449999999999999&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sollte ja eigentlich -0,45 sein. Aber weil der Computer mit der Basis 2, wie Menschen im allgemeinen mit der Basis 10 rechnen, sind diese für uns einfachen Zahlen für einen Computer eben nicht genau darzustellen. Und dann passieren bei Rechnungen solche Fehler&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
Gleitkommazahlen sind kein Allheilmittel, im Gegenteil. Sie sollten nur mit bedacht eingesetzt werden.&lt;br /&gt;
Das Problem ist, das viele Leute gar nicht wissen, was Gleitkommazahlen eigentlich sind und vor allem wie sie Aufgebaut sind.&lt;br /&gt;
&lt;br /&gt;
Bei Problemen mit kleinem oder gar keinem Dynamikbereich ist oftmals [[Festkommaarithmetik]] die bessere Wahl.&lt;br /&gt;
&lt;br /&gt;
Wenn man Gleitkommazahlen jedoch mit bedacht einsetzt und immer die möglichen Fehler im Kopf hat, dann sind diese sehr mächtig.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html What Every Computer Scientist Should Know About Floating-Point Arithmetic]&lt;br /&gt;
* [https://www.cs.berkeley.edu/~wkahan/MathSand.pdf Abhandlung von 1983 über Gleitkommazahlen in Taschenrechnern (HP-15C) und anderen präzisen Berechnungen (8087 FPU)]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=WordClock_mit_WS2812&amp;diff=94032</id>
		<title>WordClock mit WS2812</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=WordClock_mit_WS2812&amp;diff=94032"/>
		<updated>2016-09-20T04:22:05Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel ist der Nachfolger der beiden Projekte [[Word_Clock]] und [[WordClock24h]]. Diese Projekte werden hier zusammengefasst und mit ein- und derselben Hard- und Software realisiert. Es ist damit der Bau einer 12-Stunden WordClock und einer minutengenauen 24-Stunden WordClock möglich.&lt;br /&gt;
&lt;br /&gt;
Um die beiden Varianten zu unterscheiden, wird die 12-Stunden-Variante im folgenden &#039;&#039;&#039;WordClock12h&#039;&#039;&#039; und die 24-Stunden-Variante &#039;&#039;&#039;WordClock24h&#039;&#039;&#039; genannt.&lt;br /&gt;
&lt;br /&gt;
Zugehöriger Thread im Forum: https://www.mikrocontroller.net/topic/385955&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WordClock12h und WordClock24h:&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:wordclock-frontplatte-v2.png|400px|left|WordClock12h]] &lt;br /&gt;
|| [[Datei:WordClock24h-Frontplatte-800x800.png|400px|right|WordClock24h]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
Die Software ist sowohl auf dem STM32F401RE oder STM32F411RE [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]] als auch auf einem [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]] lauffähig.&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
&lt;br /&gt;
Die Software wird ständig weiterentwickelt. Folgende Punkte wurden bereits umgesetzt:&lt;br /&gt;
&lt;br /&gt;
* Lauffähig auf STM32F401 [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo]], STM32F411 [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo]] und [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]]&lt;br /&gt;
* Anbindung eines [[WordClock_mit_WS2812#ESP8266|ESP8266]]-WLAN-Moduls mit speziell abgestimmter Firmware&lt;br /&gt;
* Konfiguration über [[WordClock_mit_WS2812#Web-Interface|Webserver-Interface]]&lt;br /&gt;
* Fernsteuerung über IR-Fernbedienung mittels [[IRMP]]&lt;br /&gt;
* Fernsteuerung per [[WordClock_mit_WS2812#Android_App|Android App]]&lt;br /&gt;
* Einstellen des Anzeigemodus (&amp;quot;Sprache&amp;quot;), Helligkeit und der Farbe per IR-Fernbedienung/App/Web&lt;br /&gt;
* Konfigurierbare Nachtschaltzeiten - d.h. automatisches Abschalten zur Nachtzeit&lt;br /&gt;
* Anbindung von LED-Stripes des Typs [[WordClock_mit_WS2812#WS2812|WS2812]] und [[WordClock_mit_WS2812#WS2812|WS2812B]]&lt;br /&gt;
* Optionale Unterstützung von LED-Stripes des Typs APA102&lt;br /&gt;
* Optionale Unterstützung von LED-Stripes des Typs SK6812 (RGBW-LEDs)&lt;br /&gt;
* Sanftes Überblenden der Uhrzeiten oder verschiedene Animationen bei Uhrzeitwechsel, zB. &amp;quot;Explode&amp;quot; oder &amp;quot;Matrix&amp;quot;&lt;br /&gt;
* Farbanimationen, z.B. Automatischer Farbverlauf durch alle Regenbogenfarben (&amp;quot;Rainbow&amp;quot;)&lt;br /&gt;
* Automatische Helligkeitsregelung mittels [[WordClock_mit_WS2812#LDR|LDR]] (optional)&lt;br /&gt;
* Anbindung einer externen DS3231-[[WordClock_mit_WS2812#RTC_und_EEPROM|RTC]]&lt;br /&gt;
* Anbindung eines externen I2C-[[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROM]]&lt;br /&gt;
* Holen der Uhrzeit per NTP-Protokoll aus dem Internet&lt;br /&gt;
* Optionaler Anschluss eines [[WordClock_mit_WS2812#DCF77|DCF77]]-Moduls&lt;br /&gt;
* Manuelles Stellen der Uhrzeit per [[WordClock_mit_WS2812#Web-Interface|Webserver-Interface]] oder [[WordClock_mit_WS2812#Android_App|Android App]], wenn kein Internet/DCF77 verfügbar&lt;br /&gt;
* Optionale Temperaturmessung und -Anzeige mit [[WordClock_mit_WS2812#Temperatur-Sensor|DS18xxx-Sensor]]&lt;br /&gt;
* Optionale Wetteranzeige über openweathermap.org&lt;br /&gt;
* Separate Farbauswahl für Display und Ambilight&lt;br /&gt;
* Ambilight mit auswählbaren Animationen: Keine, &amp;quot;Clock&amp;quot; (Umlaufende Sekundenanzeige) und &amp;quot;Rainbow&amp;quot;&lt;br /&gt;
* Optionale Steuerung der Stromversorgung für die LED-Stripes&lt;br /&gt;
&lt;br /&gt;
=== Bugs ===&lt;br /&gt;
&lt;br /&gt;
ESP-Firmware Version 2.1.0:&lt;br /&gt;
&lt;br /&gt;
* Anzeigefehler - beim Wechseln in den AP-Modus wird fälschlicherweise &amp;quot;0.0.0.0&amp;quot; als IP-Adresse statt 192.168.4.1 ausgegeben. Wurde korrigiert in ESP-Version 2.1.0a.&lt;br /&gt;
* Umlaute in Wetteranzeigen werden nicht dargestellt. Wurde korrigiert in ESP-Version 2.1.0b.&lt;br /&gt;
&lt;br /&gt;
STM32-Firmware Version 2.1.0:&lt;br /&gt;
&lt;br /&gt;
* SK6812: Rot und Grün vertauscht. Behoben in STM32-Version 2.1.0a.&lt;br /&gt;
* Nach dem Setzen eines neuen LDR-Max-Wertes wird dieser nicht zurück an das Web-Interface übertragen und deshalb dort (bis zum nächsten Reboot) ein alter Max-Wert angezeigt. Wird korrigiert in STM32-Version 2.1.1.&lt;br /&gt;
&lt;br /&gt;
=== Geplante Features ===&lt;br /&gt;
&lt;br /&gt;
Für Version 2.2.0:&lt;br /&gt;
&lt;br /&gt;
* Anzeige des aktuellen Datums über Laufschrift&lt;br /&gt;
* Anzeige von Wetterdaten über Piktogramme, Einblendung automatisch z.B. zu jeder halben/vollen Stunde&lt;br /&gt;
&lt;br /&gt;
Weitere geplante Features:&lt;br /&gt;
&lt;br /&gt;
* Anzeigen von Piktogrammen an bestimmten Tagen wie Geburtstag/Weihnachten etc.&lt;br /&gt;
* Animation &amp;quot;Matrix&amp;quot;: Einstellung: In aktueller Displayfarbe oder in grün.&lt;br /&gt;
* Animation &amp;quot;Matrix&amp;quot;: Ausblenden der Buchstaben per Strahl, Einblenden der Buchstaben durch 2. Strahl&lt;br /&gt;
* Snake Animation frisst nicht nur die alte Uhrzeit, sondern baut die neue Uhrzeit gleichzeitig oder in 2. Durchlauf hinter sich auf&lt;br /&gt;
* Neue Animation &amp;quot;Implode&amp;quot;&lt;br /&gt;
* Neue Animation &amp;quot;Flicker&amp;quot; (Flackern wie bei einer Leuchtstoffröhre)&lt;br /&gt;
* Ambilight: Sekundenzeiger mit Fading über mehrere LEDs&lt;br /&gt;
* Mood-Light-Funktion&lt;br /&gt;
* Hintergrundfarbe/Helligkeit für Display bzw. Ambilight&lt;br /&gt;
* Vereinfachtes Bedienkonzept für IR-Fernbedienung&lt;br /&gt;
* Spiele wie TRON, TETRIS, PONG&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ab Version 2.2.0 ist es unbedingt erforderlich, dass die aktuelle ESP8266-Firmware zur STM32-Firmware eingespielt wird! Ältere ESP8266-Firmware-Versionen führen auf jeden Fall zu Fehlverhalten!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EM::Blocks-Projekt, Version 2.2.0 vom 17.09.2016:&#039;&#039;&#039; [http://www.mikrocontroller.net/svnbrowser/wordclock24h/?view=tar Tarball]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN hier auf mikrocontroller.net:&#039;&#039;&#039; svn://mikrocontroller.net/wordclock24h/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repo-Browser&#039;&#039;&#039;: [http://www.mikrocontroller.net/svnbrowser/wordclock24h/ WordClock24h im SVN]&lt;br /&gt;
&lt;br /&gt;
Hex-Dateien, wenn man - ohne zu compilieren - direkt flashen will:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WC12h&#039;&#039;&#039; Version 2.2.0 Nucleo401-Board: [[Datei:Wc12h-nucleo401.hex]]&lt;br /&gt;
* &#039;&#039;&#039;WC12h&#039;&#039;&#039; Version 2.2.0 Nucleo411-Board: [[Datei:Wc12h-nucleo411.hex]]&lt;br /&gt;
* &#039;&#039;&#039;WC12h&#039;&#039;&#039; Version 2.2.0 STM32F103-Board: [[Datei:Wc12h-STM32F103.hex]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WC24h&#039;&#039;&#039; Version 2.2.0 Nucleo401-Board: [[Datei:Wc24h-nucleo401.hex]]&lt;br /&gt;
* &#039;&#039;&#039;WC24h&#039;&#039;&#039; Version 2.2.0 Nucleo411-Board: [[Datei:Wc24h-nucleo411.hex]]&lt;br /&gt;
* &#039;&#039;&#039;WC24h&#039;&#039;&#039; Version 2.2.0 STM32F103-Board: [[Datei:Wc24h-STM32F103.hex]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ESP8266 Firmware&#039;&#039;&#039; Version 2.2.0 vom 17.09.2016: [[Datei:ESP-WordClock.bin]] (&#039;&#039;&#039;NEU!&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[WordClock_mit_WS2812#Android_App|Android App]]&#039;&#039;&#039; 2.1.0 vom 23.08.2016: [[Datei:WC24h.apk]]&lt;br /&gt;
&lt;br /&gt;
Wie man diese APK unter Android installiert, kann man hier nachlesen:&lt;br /&gt;
&lt;br /&gt;
http://www.pcwelt.de/ratgeber/Android-Smartphones-Apps-ausserhalb-des-Android-Market-installieren-1929591.html&lt;br /&gt;
&lt;br /&gt;
Am einfachsten erlaubt man die Installation von Apps &amp;quot;aus unbekannten Quellen&amp;quot; und klickt anschließend direkt auf dem Android-Gerät auf den [[WordClock_mit_WS2812#Download|Download]]-Link. Dann kann man das Programm direkt nach dem Download installieren.&lt;br /&gt;
&lt;br /&gt;
=== Software für Windows ===&lt;br /&gt;
&lt;br /&gt;
Die Software zum Flashen des Programms:&lt;br /&gt;
&lt;br /&gt;
* ST-Link/V2 , siehe: http://www.st.com/web/catalog/tools/FM146/CL1984/SC724/SS1677/PF251168&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das STM32MiniBoard auch über UART geflashed werden. Dann braucht man keinen ST-Link und verwendet folgende Software: http://www.st.com/web/en/catalog/tools/PF257525&lt;br /&gt;
&lt;br /&gt;
Alternativer Link:&lt;br /&gt;
&lt;br /&gt;
http://www2.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/flasher-stm32.html&lt;br /&gt;
&lt;br /&gt;
Die Software für das Flashen über UART wird auch zum Aufspielen der ESP8266 Firmware des WLAN-Moduls benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Möchte man die Sources selber übersetzen:&lt;br /&gt;
&lt;br /&gt;
* EM::Blocks IDE, siehe http://www.emblocks.org/&lt;br /&gt;
&lt;br /&gt;
Möchte man die Debug- und Log-Meldungen als Entwickler oder zur Diagnose verfolgen, braucht man noch&lt;br /&gt;
&lt;br /&gt;
* STM32 Virtual COM Port Driver: http://www.st.com/web/en/catalog/tools/PF257938 für das Nucleo-Board&lt;br /&gt;
* oder einen zusätzlichen USB-UART Adapter nebst Treiber für das STM32F103 Mini Development Board&lt;br /&gt;
* PuTTY (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) oder andere Terminal-Emulation&lt;br /&gt;
&lt;br /&gt;
=== WordClock-Quellcode selbst übersetzen ===&lt;br /&gt;
&lt;br /&gt;
Dieser Vorgang ist nur notwendig, wenn man an den Quellen etwas ändern möchte. Im Normalfall braucht man lediglich eine der oben im [[WordClock_mit_WS2812#Download|Download]]-Kapitel angegebenen Hex-Dateien auszuwählen und diese auf den Prozessor flashen.&lt;br /&gt;
&lt;br /&gt;
Wenn man an dem Programm etwas ändern oder erweitern möchte, dann startet man die zuvor installierte EM::Blocks-IDE. Aus dem SVN lädt man sich den Tarball (Link siehe Kapitel [[WordClock_mit_WS2812#Download|Download]]) und entpackt diesen unter C:\EmBlocksProjects.&lt;br /&gt;
&lt;br /&gt;
Nach dem Entpacken findet man dann im Unterverzeichnis wclock24h die Projekt-Datei &#039;&#039;&#039;wclock24h.ebp&#039;&#039;&#039;, um den Quellcode für ein [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]] zu compilieren. In der EM::Blocks-Ide kann man nun mit &#039;&#039;&#039;File -&amp;gt; Open&#039;&#039;&#039; die Projekt-Datei laden.&lt;br /&gt;
&lt;br /&gt;
Möchte man jedoch den Quellcode für das [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Board]] übersetzen, dann lädt man die Projektdatei &#039;&#039;&#039;wclock24h-F103.ebp&#039;&#039;&#039; aus dem Unterverzeichnis &#039;&#039;&#039;wclock24h-F103&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Anschließend wählt man in der oberen Zeile in der Mitte das Ziel aus, wofür man den Quellcode übersetzen möchte.&lt;br /&gt;
&lt;br /&gt;
Beim [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo]]-Projekt werden folgende Alternativen angeboten:&lt;br /&gt;
&lt;br /&gt;
WC24h:&lt;br /&gt;
&lt;br /&gt;
* WC24h-Nucleo401-Debug&lt;br /&gt;
* WC24h-Nucleo401-Release&lt;br /&gt;
&lt;br /&gt;
* WC24h-Nucleo411-Debug&lt;br /&gt;
* WC24h-Nucleo411-Release&lt;br /&gt;
&lt;br /&gt;
WC12h:&lt;br /&gt;
&lt;br /&gt;
* WC12h-Nucleo401-Debug&lt;br /&gt;
* WC12h-Nucleo401-Release&lt;br /&gt;
&lt;br /&gt;
* WC12h-Nucleo411-Debug&lt;br /&gt;
* WC12h-Nucleo411-Release&lt;br /&gt;
&lt;br /&gt;
In der F103-Projektdatei können folgende Varianten ausgewählt werden:&lt;br /&gt;
&lt;br /&gt;
WC24h:&lt;br /&gt;
&lt;br /&gt;
* WC24h-STM32F103-Debug&lt;br /&gt;
* WC24h-STM32F103-Release&lt;br /&gt;
&lt;br /&gt;
WC12h:&lt;br /&gt;
&lt;br /&gt;
* WC12h-STM32F103-Debug&lt;br /&gt;
* WC12h-STM32F103-Release&lt;br /&gt;
&lt;br /&gt;
Die Debug-Varianten sind lediglich für die Bugsuche im Programm vonnöten. Es empfiehlt sich daher im Normalfall, die entsprechende Release-Variante auszuwählen.&lt;br /&gt;
&lt;br /&gt;
Nach der Auswahl kann man dann unter &#039;&#039;&#039;Build -&amp;gt; Rebuild all target files&#039;&#039;&#039; den Übersetzungsvorgang starten. Danach findet man im Unterverzeichnis bin\\Release die dazugehörige Hex-Datei mit dem ST-Link-Programm dann auf dem Ziel geflasht werden kann. Das wars!&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== STM32F103C8T6 Mini-Development Board ==&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Dieses Board wird für die &amp;quot;klassische&amp;quot; 10x11 WordClock12h empfohlen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein kleines, platzsparendes Board mit ausreichendem 32Bit-Mikrocontroller. Der STM32F103C8T6 hat 64 KB Flash und 20KB RAM. Bei ebay ist er für kleines Geld (unter 4 EUR) zu haben: Einfach dort nach &amp;quot;STM32F103C8T6&amp;quot; suchen. Die Anbieter sind meist in China. Aber es gibt auch Anbieter aus Deutschland, wo das bestellte Board dann auch schon nach 2 Tagen im Briefkasten steckt. Meist sind die deutschen Anbieter aber etwas teurer.&lt;br /&gt;
&lt;br /&gt;
Während die [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Boards]] bereits den &amp;quot;Programmer&amp;quot; ST-Link-V2 zum Programmieren des Flashs on-Board haben, ist dies hier nicht der Fall. Hier muss ein separates ST-Link-V2 zum einmaligen Programmieren verwendet werden. Hat man schon ein [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]] zuhause, kann der darauf befindliche ST-Link verwendet werden. Oder man beschafft sich einen eigenen Programmer. Bei eBay erhält man sie bereits im einstelligen Euro-Bereich, wenn man nach &amp;quot;ST-Link V2&amp;quot; sucht.&lt;br /&gt;
&lt;br /&gt;
Der Vorteil dieses Boards gegenüber dem Nucleo ist der geringe Platzbedarf. Es müssen lediglich ein paar Verbindungen zu den weiter unten erläuterten Modulen wie [[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROM und RTC]] sowie [[WordClock_mit_WS2812#ESP8266|ESP8266]] ESP01 gezogen werden.&lt;br /&gt;
&lt;br /&gt;
Rechts ist der Anschluss eines ST-Link V2-Clones zum Flashen und die Anschluss-Skizze der WordClock an das [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]] zu sehen.&lt;br /&gt;
|| [[Datei:STM32F103C8T6.png|miniatur|STM32F103C8T6 Mini-Development Board]]&lt;br /&gt;
[[Datei:STM32F103C8T6 MiniDevBoard Schematic.png|mini|MiniDevBoard Schaltplan]]&lt;br /&gt;
[[Datei:STM32F103 MiniBoard STLink.jpg|mini|Flashen per ST-Link V2-Clone]]&lt;br /&gt;
[[Datei:WordClock24h-an-STM32F103-C8T6.png|mini|STM32F103C8T6 an STM32F103 Mini-Development Board]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== STM32F401RE Nucleo und STM32F411RE Nucleo ==&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Es kann sowohl das 401er als auch das 411er [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]] verwendet werden. Beide werden identisch genutzt.&lt;br /&gt;
&lt;br /&gt;
Damit das Board später für den Einbau nur noch (incl. Shield) 2cm hoch ist, sollte man die überstehenden Enden der Steckerleisten auf der &#039;&#039;&#039;Unterseite&#039;&#039;&#039; mit einer Kneifzange kürzen. Die beiden Jumper auf der Unterseite (beim ST-Link-Device-Teil) können dabei auf die Oberseite gesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Es gibt mittlerweile drei verschiedene Revisionen von den Nucleo-Boards:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;MB1136 C01&amp;quot;: Der STM32F4x1 läuft nur mit dem ungenauen internen Oszillator&lt;br /&gt;
* &amp;quot;MB1136 C02 &amp;amp; C03&amp;quot;: Der STM32F4x1 erhält seinen 8MHz Takt vom ST-Link-Device&lt;br /&gt;
&lt;br /&gt;
Damit auch das Board mit der Revision &amp;quot;MB1136 C01&amp;quot; zuverlässig im HSE-Modus mit 84MHz läuft, sind folgende Hardware-Änderungen notwendig:&lt;br /&gt;
&lt;br /&gt;
* Lötbrücken SB54 und SB55 entfernen (mit Lötkolben erhitzen und wegschnippen)&lt;br /&gt;
* Lötbrücken SB16 und SB50 entfernen (dito)&lt;br /&gt;
* R35 und R37 jeweils mit einem Stück Draht oder 0R-Widerstand bestücken&lt;br /&gt;
* Quarz X3 (8 MHz) einlöten&lt;br /&gt;
* C33 und C34 mit jeweils 22pF bestücken.&lt;br /&gt;
&lt;br /&gt;
C33 und C34 können auch normale THT-Bauteile sein, wenn man die Drähte vorher kürzt. Ich habe sie auf der Unterseite direkt an den Quarz-Anschlüssen angebracht, siehe Foto rechts. Es geht aber auch auf der Oberseite direkt an den dafür vorgesehenen Lötstellen - dann aber vorzugsweise mit 0603 SMD-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Man sollte auf jeden Fall erst die beiden Drahtbrücken R35 &amp;amp; R37 einlöten, bevor man den Quarz bestückt. Dann hat man wesentlich mehr Platz für den Lötkolben ;-)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich jedoch, diese Änderungen auch mit dem Board der Revision &amp;quot;MB1136 C02&amp;quot; bzw. C03 durchzuführen, da wir später für die endgültige Uhr den ST-Link-Teil der Platine absägen werden. Dafür ist extra eine Bruchstelle vorgesehen. Nur so ist das Board dann schmal genug, damit es hinter den 7,5cm schmalen Rand der Frontplatte passt.&lt;br /&gt;
&lt;br /&gt;
Nicht wundern: Je nach Revision des Boards sind einige der oben genannten Lötbrücken erst gar nicht bestückt. Dann braucht da auch nichts entfernt zu werden. Das hier beschriebene stellt also den gewünschten Endzustand dar.&lt;br /&gt;
&lt;br /&gt;
Diese Arbeit ist in ca. 10 Minuten erledigt. Besondere SMD-Lötkenntnisse benötigt man dafür nicht.&lt;br /&gt;
&lt;br /&gt;
Damit das Board (nach dem Abtrennen des ST-Link) über die Stiftleiste mit Spannung versorgt werden kann (z.B. durch das Nucleo-Shield), muss &amp;quot;JP5&amp;quot; noch von &amp;quot;U5V&amp;quot; auf &amp;quot;E5V&amp;quot; umgesteckt werden.&lt;br /&gt;
(Zusätzlich auf dem ST-Link &amp;quot;JP1&amp;quot; entfernen, falls noch nicht abgetrennt.)&lt;br /&gt;
|| [[Datei:WC24h-Nucleo-Oberseite.jpg|miniatur|Nucleo: Zusätzliche Drahtbrücken R35 + R37 + 8MHz Quarz]]&lt;br /&gt;
[[Datei:WC24h-Nucleo-Unterseite.jpg|miniatur|Nucleo: Zu entfernende Lötbrücken + anzulötende 22pf Kondensatoren]]&lt;br /&gt;
[[Datei:WC24h-Nucleo-Shield.jpg|miniatur|Prototyp-Shield für das Nucleo-Board mit TSOP, ESP8266 und 3,3V Spannungsregler, später noch Anschluss für EEPROM/RTC]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anschluss TSOP31238 ==&lt;br /&gt;
&lt;br /&gt;
Zum optionalen Steuern per IR-Fernbedienung.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Anschlüsse am [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]:&lt;br /&gt;
&lt;br /&gt;
   TSOP-Pin1 an GND, TSOP-Pin2 an 3,3 oder 5V, TSOP-Pin3 an PC10&lt;br /&gt;
&lt;br /&gt;
Anschlüsse am [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]]:&lt;br /&gt;
&lt;br /&gt;
   TSOP-Pin1 an GND, TSOP-Pin2 an 3,3V oder 5V, TSOP-Pin3 an PB3&lt;br /&gt;
&lt;br /&gt;
Dabei ist vorzugsweise ein Tiefpassfilter (C/R) - wie auch im Datenblatt angegeben - zu verwenden. Siehe dazu auch Schaltbild rechts.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Wird kein IRMP-Empfänger benutzt, sollte ein 100 kOhm Pullup-Widerstand am Eingangspin des µC-Eingangs angeschlossen werden.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:irmp-empfaenger.png|miniatur|Anschluß eines IR-Empfängers an µC]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anschluss WS2812 ==&lt;br /&gt;
Bei der WordClock24h wird eine 16x18-Matrix verwendet, bei der WordClock12h eine 10x11-Matrix.&lt;br /&gt;
&lt;br /&gt;
Die [[WordClock_mit_WS2812#WS2812|WS2812]]-LEDs werden dabei folgendermaßen verdrahtet:&lt;br /&gt;
&lt;br /&gt;
==== Anschluss WS2812-Streifen für WordClock12h ====&lt;br /&gt;
&lt;br /&gt;
Hier wird eine Spezialanfertigung von WS2812-Stripes eingesetzt - nämlich mit einem Rastermaß von 28,1mm. Damit ist die WordClock12h von den Maßen her kompatibel zum bisherigen [[Word_Clock]]-Projekt. Das hat den Vorteil, dass bisherige Frontplatten und Zwischenböden weiterverwendet werden können.&lt;br /&gt;
&lt;br /&gt;
Bei der Wordclock12h steht jeder zweite Streifen &amp;quot;auf dem Kopf&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
          M4                                   +-------+        M1&lt;br /&gt;
           O---------+              µC --------| R220  |--------O&lt;br /&gt;
           |         |                         +-------+        |&lt;br /&gt;
           |         |                                          |&lt;br /&gt;
           |         1  2  3  4  ...              11            |&lt;br /&gt;
           |         O--O--O--O--O--O--O--O--O--O--O--+         |&lt;br /&gt;
           |                                          |         |&lt;br /&gt;
           |        22                            12  |         |&lt;br /&gt;
           |         O--O--O--O--O--O--O--O--O--O--O--+         |&lt;br /&gt;
           |         |                                          |&lt;br /&gt;
           |         |                                          |&lt;br /&gt;
           |         O--O--O--O--O--O--O--O--O--O--O--          |&lt;br /&gt;
           |       23 24 ....                                   |&lt;br /&gt;
           |                                                    |&lt;br /&gt;
           |                                                    |&lt;br /&gt;
           O----------------------------------------------------O&lt;br /&gt;
          M3                                                    M2&lt;br /&gt;
&lt;br /&gt;
[[Datei:LEDS-Datakabel.jpg|miniatur]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei sind M1-M4 die 4 Minutenpunkte in den Ecken. Es wird keine Status-LED wie bei der WordClock24 verwendet. Tatsächlich werden hier dafür die Minutenpunkte zur zusätzlichen Statusausgabe mitbenutzt.&lt;br /&gt;
&lt;br /&gt;
Beim Nucleo-Board werden bis zu 100 weitere LEDs, beim STM32-Mini-Board werden 60 weitere LEDs als Ambilight hinter der Buchstabenkette unterstützt. Diese müssen einfach hinter der LED für den letzten Buchstaben in der Kette angeschlossen werden. Die Anzahl ist variabel, maximal 100/60 Ambilight-LEDs sind möglich. Wegen des Ambilight-Modus&#039; &amp;quot;Clock&amp;quot; (ab Software-Version 2.0.0) sind exakt 60 LEDs als Ambilight sinnvoll - auf jeder Seite 15. Dann können diese nämlich zur Sekunden-Anzeige verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== Anschluss WS2812-Streifen für WordClock24h ====&lt;br /&gt;
Verwendet werden Standard-WS2812-Stripes mit &#039;&#039;&#039;60 LEDs pro Meter&#039;&#039;&#039;. Dabei steht - wie bei der WC12h - jeder zweite Streifen &amp;quot;auf dem Kopf&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
               +-------------------------------------------------------+&lt;br /&gt;
               |                                                       |&lt;br /&gt;
               1  2  3  4  ...                              18         |&lt;br /&gt;
               O--O--O--O--O--O--O--O--O--O--O--O--O--O--O--O--+       |&lt;br /&gt;
                                                               |       |&lt;br /&gt;
               36                                       20  19 |       |&lt;br /&gt;
               O--O--O--O--O--O--O--O--O--O--O--O--O--O--O--O--+       |&lt;br /&gt;
               |                                                       |&lt;br /&gt;
               |                                                       |&lt;br /&gt;
               O--O--O--O--O--O--O--O--O--O--O--O--O--O--O--O--        |&lt;br /&gt;
              37 38 ....                                               |&lt;br /&gt;
                                                                       |&lt;br /&gt;
                                                                       |&lt;br /&gt;
            +-------+             Status-LED                           |&lt;br /&gt;
  µC -------| R220  |------------------O-------------------------------+&lt;br /&gt;
            +-------+&lt;br /&gt;
&lt;br /&gt;
Auch hier können bis zu 100 Ambilight LEDs beim Nucleo Board, bis zu 60 Ambilight LEDs beim STM32-Mini-Board, hinter der LED für den letzten Buchstaben in der Kette angeschlossen werden. Wegen des Ambilight-Modus&#039; &amp;quot;Clock&amp;quot; (ab Software-Version 2.0.0) sind exakt 60 LEDs als Ambilight sinnvoll - auf jeder Seite 15. Dann können diese nämlich zur Sekunden-Anzeige verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Anschlüsse am [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]:&lt;br /&gt;
&lt;br /&gt;
* Stripe +5V an externe Stromversorgung +5V&lt;br /&gt;
* Stripe DI über einen Serienwiderstand von 220 Ohm an PC6&lt;br /&gt;
* Stripe GND an externe Stromversorgung GND und(!) an GND des Boards&lt;br /&gt;
&lt;br /&gt;
Anschlüsse am [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]]:&lt;br /&gt;
&lt;br /&gt;
* Stripe +5V an externe Stromversorgung +5V&lt;br /&gt;
* Stripe DI über einen Serienwiderstand von 220 Ohm an PA8&lt;br /&gt;
* Stripe GND an externe Stromversorgung GND und(!) an GND des Boards&lt;br /&gt;
&lt;br /&gt;
== Anschluss Temperatur-Sensor ==&lt;br /&gt;
&#039;&#039;&#039;Optional:&#039;&#039;&#039; [[WordClock_mit_WS2812#Temperatur-Sensor|DS18xxx]] als Temperatur-Sensor&lt;br /&gt;
&lt;br /&gt;
Es werden unterstützt:&lt;br /&gt;
&lt;br /&gt;
* DS1820&lt;br /&gt;
* DS18S20&lt;br /&gt;
* DS1822&lt;br /&gt;
* DS18B20&lt;br /&gt;
&lt;br /&gt;
Anschlüsse am [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]:&lt;br /&gt;
&lt;br /&gt;
* DS18xx-GND (Pin 1) an GND&lt;br /&gt;
* DS18xx-DQ  (Pin 2) an PD2 und über Pullup 4,7k an DS18xx-VDD&lt;br /&gt;
* DS18xx-VDD (Pin 3) an Board-interne oder externe 3,3V&lt;br /&gt;
&lt;br /&gt;
Anschlüsse am STM32F103 [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]]:&lt;br /&gt;
&lt;br /&gt;
* DS18xx-GND (Pin 1) an GND&lt;br /&gt;
* DS18xx-DQ  (Pin 2) an PB5 und über Pullup 4,7k an DS18xx-VDD&lt;br /&gt;
* DS18xx-VDD (Pin 3) an Board-interne oder externe 3,3V&lt;br /&gt;
&lt;br /&gt;
Aufgrund der geringen Eigenerwärmung der DS18XX Sensoren wird empfohlen, den Sensor mit Wärmeleitpad/-kleber auf ein kleines Kühlblech zu kleben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ist kein DS18xx Temperatur-Sensor angeschlossen, wird die Temperatur über die RTC (DS3231) ermittelt.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Anschluss LDR ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;: Fotowiderstand (LDR) zur Lichtstärkenmessung was eine Variation der Leuchtstärke der LEDs in Abhängigkeit des Umgebungslichtes ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Schaltung: &lt;br /&gt;
&lt;br /&gt;
            AGND -----+&lt;br /&gt;
                      |&lt;br /&gt;
                      R = 10K&lt;br /&gt;
                      |&lt;br /&gt;
            µC  ------+&lt;br /&gt;
                      |&lt;br /&gt;
                     LDR (Reichelt: &amp;quot;A 906032&amp;quot;)&lt;br /&gt;
                      |&lt;br /&gt;
            3,3V -----+&lt;br /&gt;
&lt;br /&gt;
Wird noch der alte LDR07 von Reichelt eingesetzt, ist R = 1K besser.&lt;br /&gt;
&lt;br /&gt;
Anschluss am [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]: PC4&lt;br /&gt;
Anschluss am STM32F103 Board: PA5&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wird kein [[WordClock_mit_WS2812#LDR|LDR]] benutzt, muss der µC-Eingang per 10k-Pullup auf 3,3V gelegt werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== DCF77 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;: DCF77 Modul&lt;br /&gt;
&lt;br /&gt;
Anschlüsse am Nucleo Board:&lt;br /&gt;
&lt;br /&gt;
* DCF77 GND an GND&lt;br /&gt;
* DCF77 V+ an 3,3V&lt;br /&gt;
* DCF77 Out an PC11&lt;br /&gt;
* DCF77 PON an PC12&lt;br /&gt;
&lt;br /&gt;
Anschlüsse am STM32F103 Mini Development Board:&lt;br /&gt;
&lt;br /&gt;
* DCF77 GND an GND&lt;br /&gt;
* DCF77 V+ an 3,3V&lt;br /&gt;
* DCF77 Out an PB8&lt;br /&gt;
* DCF77 PON an PB9&lt;br /&gt;
&lt;br /&gt;
Getestet wurde die Software mit dem Reichelt-DCF77-Modul, das aber lediglich ein befriedigendes Empfangsverhalten hat. PON kann beim Reichelt-Modul offen bleiben, beim Pollin DFCF77-1 sollte man PON jedoch anschließen.&lt;br /&gt;
&lt;br /&gt;
Wird ein DCF77-Modul benutzt, welches einen Open-Collector-Ausgang verwendet, muss an PC11 noch ein 100k Pullup (zu 3,3V) angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wird KEIN DCF-Modul verwendet, sollte der µC-Eingang per 100k Pullup auf 3,3V gelegt werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Anschluss ESP8266 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;: [[WordClock_mit_WS2812#ESP8266|ESP8266]] ESP-01: WLAN Modul&lt;br /&gt;
&lt;br /&gt;
[[Datei:WC24h-ESP8266-ESP-01.png|miniatur|Anschlussbelegung ESP8266 ESP-01 - Bauteilseite!]]&lt;br /&gt;
&lt;br /&gt;
Anschlüsse [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]:&lt;br /&gt;
&lt;br /&gt;
* ESP8266 GND an GND&lt;br /&gt;
* ESP8266 VCC   an &#039;&#039;&#039;externe&#039;&#039;&#039; 3,3V (Vorsicht: Modul zieht bis zu 200mA!)&lt;br /&gt;
* ESP8266 CH_PD an PA6&lt;br /&gt;
* ESP8266 RST   an PA7&lt;br /&gt;
* ESP8266 GPIO0 an PA4 (&#039;&#039;&#039;NEU!&#039;&#039;&#039;)&lt;br /&gt;
* ESP8266 TXD   an USART6 RX (PA12)&lt;br /&gt;
* ESP8266 RXD   an USART6 TX (PA11)&lt;br /&gt;
&lt;br /&gt;
Anschlüsse [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]]:&lt;br /&gt;
&lt;br /&gt;
* ESP8266 GND an GND&lt;br /&gt;
* ESP8266 VCC   an &#039;&#039;&#039;externe&#039;&#039;&#039; 3,3V (Vorsicht: Modul zieht bis zu 200mA!)&lt;br /&gt;
* ESP8266 CH_PD an PA1&lt;br /&gt;
* ESP8266 RST   an PA0&lt;br /&gt;
* ESP8266 GPIO0 an PA4 (&#039;&#039;&#039;NEU!&#039;&#039;&#039;)&lt;br /&gt;
* ESP8266 TXD   an USART2 RX (PA3)&lt;br /&gt;
* ESP8266 RXD   an USART2 TX (PA2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wird KEIN [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Modul verwendet, ist nichts weiter zu beachten, da die Erkennung automatisch erfolgt.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Anschluss RTC und EEPROM ==&lt;br /&gt;
&lt;br /&gt;
I2C-Modul mit DS3231 als RTC und EEPROM&lt;br /&gt;
&lt;br /&gt;
[[Datei:WC24h-DS3231-EEPROM.png|miniatur|DS3231 RTC + EEPROM]]&lt;br /&gt;
&lt;br /&gt;
Dieses Modul (siehe auch Foto rechts) findet man bei eBay oder Amazon ab ca. 2 EUR, wenn man als Suchbegriff &amp;quot;DS3231 EEPROM&amp;quot; eingibt. Es wird als Echtzeituhr und für die Speicherung der Konfigurationsparameter verwendet. Ist kein DS18xx als Temperatursensor angeschlossen, wird die RTC auch zur Temperaturmessung genutzt.&lt;br /&gt;
&lt;br /&gt;
Anschlüsse [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]:&lt;br /&gt;
&lt;br /&gt;
* I2C GND an GND&lt;br /&gt;
* I2C VCC an Board-interne oder externe 3,3V&lt;br /&gt;
* I2C SCL an PA8&lt;br /&gt;
* I2C SDA an PC9&lt;br /&gt;
&lt;br /&gt;
Anschlüsse [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]]:&lt;br /&gt;
&lt;br /&gt;
* I2C GND an GND&lt;br /&gt;
* I2C VCC an Board-interne oder externe 3,3V&lt;br /&gt;
* I2C SCL an PB6&lt;br /&gt;
* I2C SDA an PB7&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEU: AB Version 1.0 werden auch ältere [[WordClock_mit_WS2812#RTC_und_EEPROM|RTC/EEPROM]]-Module mit DS1307 erkannt.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Da die Module aus China teilweise auch ohne bestückte Batterien gesendet werden, sollte man sich&lt;br /&gt;
genau überlegen, ob man die Batterie CR2032 oder den Akku LiR2032 einbaut.&lt;br /&gt;
      &lt;br /&gt;
Sind sowohl die Diode 1N4148 als auch der Widerstand neben dem [[WordClock_mit_WS2812#RTC_und_EEPROM|RTC]]-IC bestückt, dann kann man auch den Akku (relativ teuren) LiR2032 einsetzen. In diesem Fall muss das Modul aber mit +5V statt 3,3V betreiben, damit der Akku überhaupt geladen wird. Sonst ist er aufgrund der Selbstendladung irgendwann leer.&lt;br /&gt;
&lt;br /&gt;
Sinnvollerweise sollte man das Modul eher mit einer CR2032 Batterie betreiben. &#039;&#039;&#039;Dann sollte man aber sicherheitshalber die Diode oder den Widerstand (neben der Diode) auf dem Modul entfernen (falls vorhanden, siehe Bild), damit keine Ladung (und Überhitzung) der Batterie passiert&#039;&#039;&#039;. Das ist zwar eigentlich erst ab einer Betriebsspannung von ca. 3,7V möglich, aber sicher ist sicher. Im Normalfall reicht eine CR2032 Batterie für 5-10 Jahre.&lt;br /&gt;
&lt;br /&gt;
== Anschluss USB-UART-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Man benötigt in folgenden Fällen einen USB-UART-Adapter:&lt;br /&gt;
&lt;br /&gt;
* Logging der Meldungen auf dem PC&lt;br /&gt;
* Flashen des ESP8266 über das verwendete STM32-Board&lt;br /&gt;
&lt;br /&gt;
Beim Nucleo ist ein USB-UART-Adapter bereits integriert - und zwar im oberen ST-Link-V2-Teil des Boards. Hier ist also kein weiterer Anschluss notwendig. Erst wenn das ST-Link-V2-Teil vom Rest des Boards abgetrennt wird, müssen RX und TX wieder verbunden werden, wenn man den UART-Adapter nutzen will. Also einfach das Board mit dem PC über USB verbinden - fertig. Eventuell muss man noch den STM32 Virtual COM Port Driver installieren. Der entsprechende Link zum Herunterladen steht unter [[WordClock_mit_WS2812#Download|Download]].&lt;br /&gt;
&lt;br /&gt;
Beim Mini-Development Board wird ein externer USB-UART-Adapter benötigt. Dabei schließt man ihn folgendermaßen an:&lt;br /&gt;
&lt;br /&gt;
* USB-UART TX an PA10 (RX)&lt;br /&gt;
* USB-UART RX an PA9 (TX)&lt;br /&gt;
* UAB-UART GND an GND&lt;br /&gt;
&lt;br /&gt;
Solche Adapter (am besten einen, der mit 3,3V-Pegeln arbeitet) gibt es bei eBay oder Amazon für unter 5 EUR.&lt;br /&gt;
&lt;br /&gt;
== Anschlusstabelle ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Anschlüsse&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Device || [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]] || [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103-Mini-Development-Board]]&lt;br /&gt;
|-&lt;br /&gt;
| [[WordClock_mit_WS2812#TSOP31238|TSOP31238]] ([[IRMP]])  || GPIO:   PC10               || GPIO:   PB3&lt;br /&gt;
|- &lt;br /&gt;
| [[WordClock_mit_WS2812#Temperatur-Sensor|DS18xxx]]       || GPIO:   PD2                || GPIO:   PB5&lt;br /&gt;
|- &lt;br /&gt;
| [[WordClock_mit_WS2812#LDR|LDR]]                         || GPIO:   PC4                || GPIO:   PA5&lt;br /&gt;
|- &lt;br /&gt;
| WordClock-Logger (USB)                                   || USART2: TX=PA2  RX=PA3 (bereits integriert)    || USART1: TX=PA9  RX=PA10 (externer USB-UART-Adapter)&lt;br /&gt;
|- &lt;br /&gt;
| [[WordClock_mit_WS2812#ESP8266|ESP8266]]  (UART)         || USART6: TX=PA11 RX=PA12    || USART2: TX=PA2  RX=PA3&lt;br /&gt;
|- &lt;br /&gt;
| [[WordClock_mit_WS2812#ESP8266|ESP8266]]  (GPIO)         || GPIO:   RST=PA7 CH_PD=PA6  || GPIO:   RST=PA0 CH_PD=PA1&lt;br /&gt;
|- &lt;br /&gt;
| [[WordClock_mit_WS2812#ESP8266|ESP8266]]  (FLASH)        || GPIO:   GPIO0=PA4 (&#039;&#039;&#039;NEU ab V1.8.0&#039;&#039;&#039;) || GPIO: GPIO0=PA4 (&#039;&#039;&#039;NEU ab V1.8.0&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| [[WordClock_mit_WS2812#DCF77|DCF77]]                                                    || GPIO:   DATA=PC11 PON=PC12 || GPIO:   DATA=PB8  PON=PB9 &lt;br /&gt;
|-&lt;br /&gt;
| [[WordClock_mit_WS2812#RTC_und_EEPROM|RTC / EEPROM]]     || I2C3:   SCL=PA8 SDA=PC9    || I2C1:   SCL=PB6 SDA=PB7&lt;br /&gt;
|-&lt;br /&gt;
| [[WordClock_mit_WS2812#WS2812|WS2812]]                   || DMA1:   PC6                || DMA1:   PA8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Auf dem Nucleo-Board ist USART2 bereits fest mit dem auf dem ST-Link-V2-Teil des Boards integrierten UART-USB-Adapter verbunden. Hier sind also keine extra Verbindungen mehr notwendig - erst wenn das ST-Link-V2-Teil abgesägt wird. Und auch dann kann man den USB-UART-Adapter vom ST-Link-V2 weiterverwenden.&lt;br /&gt;
&lt;br /&gt;
Beim Mini-Development Board benötigt man allerdings einen externen USB-UART-Adapter - am besten einen, der mit 3,3V-Pegeln arbeitet. Diese findet man zuhauf bei Amazon oder eBay für ca. 5 EUR.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Teileliste für WC12h oder WC24h und Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:35%&amp;quot; | Bezeichnung || Bezugsquelle&lt;br /&gt;
|-&lt;br /&gt;
| Board&lt;br /&gt;
||  &lt;br /&gt;
STM32 MiniBoard (empfohlen für WC12h)&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?&amp;amp;SearchText=STM32F103C8T6 AliExpress]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.ebay.de/sch/i.html?&amp;amp;_nkw=STM32F103C8T6 eBay]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.watterott.com/de/STM32F103C8T6-Minimum-System-Board Watterott]&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;oder&#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
STM32 Nucleo&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?&amp;amp;SearchText=nucleo AliExpress]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.ebay.de/sch/i.html?&amp;amp;_nkw=STM32F411%20Nucleo eBay]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.watterott.com/de/Nucleo-STM32F411 Watterott]&lt;br /&gt;
|-&lt;br /&gt;
| USB-UART-Adapter - NUR für MiniBoard in Kombination mit ESP8266-WLAN-Modul notwendig&lt;br /&gt;
||&amp;lt;br&amp;gt;[http://www.ebay.de/sch/i.html?&amp;amp;_nkw=USB%20UART%20Adapter eBay]&lt;br /&gt;
|-&lt;br /&gt;
| STM32 ST-Link - NUR für MiniBoard notwendig&lt;br /&gt;
||&amp;lt;br&amp;gt;&lt;br /&gt;
Prinzipiell reicht USB-UART-Adapter aus aber ein ST-Link wird zusätzlich empfohlen:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?&amp;amp;SearchText=st-link+v2 AliExpress]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.ebay.de/sch/i.html?&amp;amp;_nkw=ST-Link%20v2 eBay]&lt;br /&gt;
|-&lt;br /&gt;
| STM32 MiniBoard Shield - NUR für MiniBoard notwendig&lt;br /&gt;
|| Das per [[WordClock_mit_WS2812#Sammelbestellung_LED_Stripes.2C_Zwischenb.C3.B6den.2C_Shields | Sammelbestellung]] erhältliche Shield enthält sämtliche Anschlüsse um alle benötigten Module mit einander zu verbinden. Der STM32F103 wird direkt in das Shield gesteckt und verlötet - er wird nicht gesockelt!&amp;lt;br&amp;gt;&lt;br /&gt;
Folgende Komponenten werden (zusätzlich zu den bei LDR, TSOP31238, DS1820 genannten) für den Aufbau der Shield benötigt:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/METALL-220/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11627&amp;amp;artnr=METALL+220 Reichelt Widerstand 220 Ohm]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/metallschicht-widerstand-220-axial-bedrahtet-0207-06-w-yageo-mf0207fte52-220r-1-st-1417626.html Conrad Widerstand 220 Ohm]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/RAD-105-4-7-100/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=44857&amp;amp;artnr=RAD+105+4%2C7%2F100 Reichelt Elko 4,7uF]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/elektrolyt-kondensator-radial-bedrahtet-25-mm-47-f-100-vdc-20-x-h-5-mm-x-11-mm-yageo-se100m4r70azf-0511-1-st-445587.html Conrad Elko 4,7uF]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/METALL-10-0K/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11449&amp;amp;artnr=METALL+10%2C0K Reichelt Widerstand 10,0k]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/metallschicht-widerstand-10-k-axial-bedrahtet-0207-06-w-1-st-418374.html Conrad Widerstand 10,0k]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/KERKO-100N/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=9265&amp;amp;artnr=KERKO+100N 2x Reichelt Kerko 100nF]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/keramik-kondensator-radial-bedrahtet-100-nf-50-vdc-10-holystone-rdcx104k050dka-1-st-531855.html 2x Conrad Kerko 100nF]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/MPE-094-2-008/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=119928&amp;amp;artnr=MPE+094-2-008 Reichelt Buchsenleiste 8 polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/buchsenleiste-standard-anzahl-reihen-2-polzahl-je-reihe-4-mpe-garry-156-3-008-0-nfx-ys0-1-st-741222.html Conrad Buchsenleiste 8 polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/SL-1X36G-2-54/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=19504&amp;amp;artnr=SL+1X36G+2%2C54 Reichelt Stiftleiste gerade 36-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/stiftleiste-standard-anzahl-reihen-1-polzahl-je-reihe-36-connfly-1-st-1390107.html Conrad Stiftleiste gerade 36-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/SL-1X36W-2-54/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=19505&amp;amp;artnr=SL+1X36W+2%2C54 Reichelt Stiftleiste gewinkelt 36-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/stiftleiste-standard-anzahl-reihen-1-polzahl-je-reihe-36-bkl-electronic-10120185-1-st-741373.html Conrad Stiftleiste gewinkelt 36-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/WSL-16G/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=22822&amp;amp;artnr=WSL+16G Reichelt Wannenstecker 16-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/stiftleiste-rastermass-254-mm-polzahl-gesamt-16-w-p-products-1-st-739616.html Conrad  Wannenstecker 16-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/PFL-16/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=14573&amp;amp;artnr=PFL+16 Reichelt Pfostenstecker 16-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/pfosten-steckverbinder-steckverbinder-besonderheiten-mit-zugentlastung-rastermass-254-mm-polzahl-gesamt-16-connfly-1-st-1389904.html Conrad  Pfostenstecker 16-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/AKL-101-02/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=36605&amp;amp;artnr=AKL+101-02 Reichelt Anschlußklemme 2-polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.conrad.de/de/schraubklemmblock-2-mm-polzahl-2-dg126-50-02p-14-00ah-degson-gruen-1-st-1327203.html Conrad Anschlußklemme 2-polig]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
ohne IRMP (TSOP31238) wird folgender Widerstand als PullUp empfohlen:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/METALL-100K/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11458&amp;amp;artnr=METALL+100K Reichelt Widerstand 100 kOhm]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
ohne DCF wird folgender Widerstand als PullUp benötigt:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/METALL-100K/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11458&amp;amp;artnr=METALL+100K Reichelt Widerstand 100 kOhm]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
mit DCF werden folgende Teile für die Stabilisierungsschaltung benötigt:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/METALL-680/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11942&amp;amp;artnr=METALL+680 Reichelt Widerstand 680 Ohm]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/LM-358-DIP/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=10483&amp;amp;artnr=LM+358+DIP Reichelt Operationsverstärker LM358]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/GS-8P/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=8231&amp;amp;artnr=GS+8P Reichelt IC-Sockel 8polig]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/LED-5MM-2MA-RT/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=21627&amp;amp;artnr=LED+5MM+2MA+RT Reichelt LED 5mm low current]&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| STM32 Nucleo Shield - NUR für Nucleo-Board notwendig&lt;br /&gt;
|| Diese per [[WordClock_mit_WS2812#Sammelbestellung_LED_Stripes.2C_Zwischenb.C3.B6den.2C_Shields | Sammelbestellung]] erhältliche Adapterplatine wird auf das Nucleo-Board aufgesteckt. Sie enthält sämtliche Anschlüsse für alle vorgesehen Module.&amp;lt;br&amp;gt;&lt;br /&gt;
Die zusätzlich für den Aufbau des Shield benötigten Komponenten sind in einem Reichelt Warenkorb zusammengefasst:&amp;lt;br&amp;gt;&lt;br /&gt;
[https://secure.reichelt.de/index.html?&amp;amp;ACTION=20&amp;amp;LA=5010&amp;amp;AWKID=1198506&amp;amp;PROVID=2084 Reichelt Warenkorb]&lt;br /&gt;
|-&lt;br /&gt;
| WS2812 LED Stripes &lt;br /&gt;
|| Für die WC12h sind Stripes mit einem Sonderformat über die [[WordClock_mit_WS2812#WC12h_Sammelbestellung_LED_Stripes_und_Zwischenb.C3.B6den|Sammelbestellung]] erhältlich.&amp;lt;br&amp;gt;&lt;br /&gt;
Für die WC24h können Standard Stiles mit 60 LEDs / Meter verwendet werden.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.aliexpress.com/wholesale?&amp;amp;SearchText=ws2812+60+ip30 AliExpress]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.ebay.de/sch/i.html?&amp;amp;_nkw=WS2812%2060%20ip30 eBay]&lt;br /&gt;
|-&lt;br /&gt;
| Frontplatte&lt;br /&gt;
|| Für die WC12h sind Frontplatten über eine Sammelbestellung aus [[WordClock_mit_WS2812#WC12h_Sammelbestellung_Frontplatten | Plexiglas ]] oder [[Word_Clock#Sammelbestellung_.28Edelstahl.29 | Edelstahl]] erhältlich.&amp;lt;br&amp;gt;&lt;br /&gt;
Für die WC24h gibt es eine Sammelbestellung von Frontplatten aus &lt;br /&gt;
[[WordClock_mit_WS2812#WC24h_Sammelbestellung_Frontplatten | Plexiglas]].&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Wird kein Rahmen (siehe unten) verwendet werden zusätzliche Teile (z.B. [[Word_Clock_Variante_1_-_getrennte_Steuerplatine#Befestigung_der_Frontplatte_.28.E2.80.9CPlexiglasvariante.E2.80.9D.29_an_der_Zwischenplatte| Magnete]]) zur Befestigung der Frontplatte benötigt.&lt;br /&gt;
|-&lt;br /&gt;
| Zwischenboden&lt;br /&gt;
|| Für die WC12h und WC24h sind Zwischenböden über eine [[WordClock_mit_WS2812#Sammelbestellung_LED_Stripes.2C_Zwischenb.C3.B6den.2C_Shields | Sammelbestellung]] erhältlich.&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Alu-Platte&lt;br /&gt;
|| Aluminiumblech,  1 mm Stärke. Für WC24h mit neuem Zwischenbodens (&amp;quot;V2&amp;quot;) und alle WC12h Maße 310mmx310mm, für WC24h mit &amp;quot;altem&amp;quot; Zwischenboden 300mmx300mm &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.ebay.de/sch/(aluminium%2C+alu)+(blech%2C+platte) ebay]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DS3231 RTC &lt;br /&gt;
||&amp;lt;br&amp;gt;[http://www.aliexpress.com/wholesale?&amp;amp;SearchText=ds3231 AliExpress]&lt;br /&gt;
[http://www.ebay.de/sch/i.html?&amp;amp;_nkw=DS3231 eBay]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Falls bei dem Modul keine Batterie mitgeliefert wird, wird zusätzlich folgende Knopfzelle benötigt:&lt;br /&gt;
[http://www.reichelt.de/directlink/CR2032/index.html?&amp;amp;ACTION=3&amp;amp;ARTICLE=26550&amp;amp;GROUPID=4241&amp;amp;ARTNR=CR+2032&amp;amp;&amp;amp;SHOW=1&amp;amp;SID=12UXp5iH8AAAIAAAE-gdod799e4cf62d5cd255e52464fe671b8ea Reichelt CR2032]&lt;br /&gt;
|-&lt;br /&gt;
| Netzteil&lt;br /&gt;
||&amp;lt;br&amp;gt;[http://www.pollin.de/shop/dt/NjQ1ODQ2OTk-/Stromversorgung/Netzgeraete/Festspannungs_Netzgeraete/Schaltnetzteil_FSP020_DGAA1_5_V_4_A.html Pollin Netzteil 5V 4A]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Optional: ESP8266 ESP-01 (WLAN-Modul)&lt;br /&gt;
||&amp;lt;br&amp;gt;[http://www.aliexpress.com/wholesale?&amp;amp;SearchText=esp8266%20esp-01 AliExpress]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.ebay.de/sch/i.html?&amp;amp;_nkw=esp8266%20ESP-01 eBay]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.watterott.com/de/ESP8266-WiFi-Serial-Transceiver-Modul Watterott]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Anschließen des ESP8266 ESP-01 wird zusätzlich ein AMS1117 3,3 V Drop Down Spannungsregler benötigt:&lt;br /&gt;
&amp;lt;br&amp;gt;[http://www.aliexpress.com/wholesale?&amp;amp;SearchText=ams1117%203.3V AliExpress]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.ebay.de/sch/i.html?&amp;amp;_nkw=AMS1117%203.3V eBay]&lt;br /&gt;
|-&lt;br /&gt;
| Optional: Infrarot-Decoder (IRMP)&lt;br /&gt;
||&amp;lt;br&amp;gt;[http://www.reichelt.de/TSOP-31238/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=107210&amp;amp;artnr=TSOP+31238&amp;amp;SEARCH=TSOP31238 Reichelt TSOP31238]&lt;br /&gt;
[http://www.reichelt.de/RAD-105-4-7-100/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=44857&amp;amp;artnr=RAD+105+4%2C7%2F100&amp;amp;SEARCH=rad+105+4%2C7%2F100 Reichelt Elko 4,7uF]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/METALL-100/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11457&amp;amp;artnr=METALL+100&amp;amp;SEARCH=metall+100 Reichelt Widerstand 100 Ohm]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Zusätzlich wird noch eine [http://www.dx.com/p/24-key-wireless-infrared-ir-remote-controller-for-rgb-led-light-bulb-1-cr2025-47019#.V0CsuCFgfs0 IR-Fernbedienung] benötigt, die optional mit einer [[WordClock_mit_WS2812#IR-Fernbedienung|Folie]] versehen werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| Optional: Rahmen&lt;br /&gt;
||&lt;br /&gt;
Innenmaße 450x450 mm&amp;lt;br&amp;gt;&lt;br /&gt;
Funktioniert nicht zusammen mit Ambilight&amp;lt;br&amp;gt;&lt;br /&gt;
Z. B. [https://www.alutech.de/alu---zuschnitt-profil-18.html Alurahmen]&lt;br /&gt;
|-&lt;br /&gt;
| Optional: Ambilight&lt;br /&gt;
||Mittels zusätzlicher WS2812 LED Stripes per &amp;lt;br&amp;gt;[[WordClock_mit_WS2812#Sammelbestellung_LED_Stripes.2C_Zwischenb.C3.B6den.2C_Shields | Sammelbestellung]]&lt;br /&gt;
Funktioniert nicht zusammen mit einem Rahmen. Erfordert Zwischenboden mit entsprechender Ausfräsung (bisher nur für WC12 per Sammelbestellung verfügbar)&lt;br /&gt;
|-&lt;br /&gt;
| Optional: Fotowiderstand (LDR) zur Lichtmessung&lt;br /&gt;
||&amp;lt;br&amp;gt;[http://www.reichelt.de/A-906032/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=47510&amp;amp;artnr=A+906032&amp;amp;SEARCH=fotowiderstand Reichelt A 906032]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/METALL-1-00K/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11403&amp;amp;artnr=METALL+1%2C00K&amp;amp;SEARCH=metall+1%2C00k Reichelt Widerstand 1,0k] (bei Verwendung des nicht mehr erhältlichen LDR07)&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.reichelt.de/METALL-10-0K/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11449&amp;amp;artnr=METALL+10%2C0K&amp;amp;SEARCH=metall+10%2C0k Reichelt Widerstand 10,0k] (bei Verwendung des A 906032 und auch bei Nicht-Anschluss des LDRs)&lt;br /&gt;
|-&lt;br /&gt;
| Optional: Temperatur-Sensor&lt;br /&gt;
||&amp;lt;br&amp;gt;[http://www.reichelt.de/DS-18S20/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=7207&amp;amp;artnr=DS+18S20&amp;amp;SEARCH=ds1820 Reichelt DS1820]&lt;br /&gt;
[http://www.reichelt.de/METALL-4-70K/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=11784&amp;amp;artnr=METALL+4%2C70K&amp;amp;SEARCH=metall+4%2C70k Reichelt Widerstand 4,7k]&lt;br /&gt;
|-&lt;br /&gt;
| Optional: DCF77-Empfänger&lt;br /&gt;
||&amp;lt;br&amp;gt;[http://www.pollin.de/shop/dt/NTQ5OTgxOTk-/Bausaetze_Module/Module/DCF_Empfangsmodul_DCF1.html Pollin DCF77 Empfänger]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Start =&lt;br /&gt;
&lt;br /&gt;
Dieses Kapitel beschreibt den Download der Software auf das verwendete Board und die erstmalige Prüfung und Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Geflasht wird mit dem ST-Link-Programm, siehe oben.&lt;br /&gt;
&lt;br /&gt;
Zur Überprüfung sämtlicher Funktionen und zur Konfiguration dient die [[WordClock_mit_WS2812#Web-Interface|Web-Oberfläche]]. Dazu nimmt man eine WLAN-Verbindung mit dem ESP8266-Modul auf. Für die erste Konfiguaration wird das ESP8266 zunächst als eigener Access-Point gestartet. Anschließend kann man über das [[WordClock_mit_WS2812#Web-Interface|Web-Interface]] die Zugangsdaten zu dem eigenen WLAN-Router einstellen. Im folgenden läuft das ESP8266-Modul dann als WLAN-Client.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler und zur Diagnose kann man man ein Terminal-Emulationsprogramm (wie zum Beispiel PuTTY) verwenden, um über ein Mini-USB-Kabel Debug- und Log-Meldungen mitzuschneiden. Laut http://www.mikrocontroller.net/topic/356203#3979181 sollte man dabei die &amp;quot;blauen&amp;quot; USB3.0-Buchsen möglichst meiden.&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
&lt;br /&gt;
* [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]] und PC mit Mini-USB-Kabel verbinden (zum Flashen, Debuggen und als COM-Schnittstelle)&lt;br /&gt;
* Wenn man die EM::Blocks-IDE einsetzt: Nach [[WordClock_mit_WS2812#WordClock-Quellcode_selbst_.C3.BCbersetzen|Anleitung: WordClock-Quellcode selbst übersetzen]] vorgehen&lt;br /&gt;
* Die entsprechende Hex-Datei (aus dem Ordner wclock24h\bin\Release oder direkt hier herunterladen) flashen&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Ablauf ist nur notwendig, wenn man die Log-Meldungen aus Diagnose-Zwecken mitschneiden möchte.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* PuTTY starten&lt;br /&gt;
* PuTTY einstellen: Auswahl &amp;quot;Serial&amp;quot;, Serial Line: COM11 (kann abweichen, s.u.), Speed: 115200&lt;br /&gt;
* Einen Session-Namen eingeben, z.B. &amp;quot;Nucleo&amp;quot;&lt;br /&gt;
* Auf SAVE klicken, dann kann man die Session später wieder auswählen&lt;br /&gt;
* Open anklicken&lt;br /&gt;
* RESET-Button am [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]] drücken&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig für [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]:&#039;&#039;&#039;: Die COM-Schnittstelle ist immer aktiv, egal, ob das Programm gerade läuft oder nicht. Wird PuTTY erst nach dem Programmstart gestartet, sieht man im Terminal nicht die bereits ausgegebenen Log-Meldungen. Um den Ablauf des Programms von Anfang an zu verfolgen, drückt man auf dem Board einfach den Reset-Knopf. Dann beginnt die Ausgabe ganz von vorn.&lt;br /&gt;
&lt;br /&gt;
Sollte man Probleme mit dem Finden der richtigen COM-Schnittstelle haben, hilft der Geräte-Manager aus der Systemsteuerung weiter.&lt;br /&gt;
&lt;br /&gt;
Der Hintergrund im PuTTY ist normalerweise schwarz. Möchte man lieber eine Ausgabe in schwarz auf weiß, kann man das folgendermaßen umstellen:&lt;br /&gt;
&lt;br /&gt;
   Change Settings -&amp;gt; Window -&amp;gt; Colours:&lt;br /&gt;
&lt;br /&gt;
      Default Foreground: 2 2 2&lt;br /&gt;
      Default Bold Foreground: 0 0 0&lt;br /&gt;
      Default Background: 245 245 245&lt;br /&gt;
      Default Bold Background: 255 255 255&lt;br /&gt;
      Cursor Text: 0 0 0&lt;br /&gt;
      Cursor Color: 255 0 0&lt;br /&gt;
      (Rest kann man so lassen)&lt;br /&gt;
&lt;br /&gt;
Anschließend zurück über &amp;quot;Session&amp;quot; oben links und: &amp;quot;Save&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des WLAN-Moduls ==&lt;br /&gt;
&lt;br /&gt;
=== Flash des WLAN-Moduls ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Für das ESP8266-Wlan-Modul wird aus Stabilitäts- und Geschwindigkeitsgründen eine spezielle auf die WordClock-Anwendung abgestimmte Firmware benutzt (siehe [[WordClock_mit_WS2812#Download|Download]]), die über das STM32-Board geflasht werden kann. Das ESP8266 kann also während des Flashens in der WordClock-Schaltung verbleiben.&lt;br /&gt;
&lt;br /&gt;
Beim Nucleo wird der integrierte USB-UART-Adapter verwendet. Beim Anschluss des Nucleo-Board per USB an den PC wird automatisch ein COM-Device angelegt, z.B. COM12. Dafür braucht man aber den entsprechenden Virtual COM Port Driver, siehe [[WordClock_mit_WS2812#Software_f.C3.BCr_Windows|Software für Windows]].&lt;br /&gt;
&lt;br /&gt;
Beim [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|STM32F103 Mini Development Board]] wird ein externer USB-UART-Adapter, welcher mit 3,3V-Pegeln arbeitet, verwendet. Wie er angeschlossen wird, sieht man in der [[WordClock_mit_WS2812#STM32F103C8T6_Mini-Development_Board|Anschluss-Skizze]] und auch in obiger [[WordClock_mit_WS2812#Anschlusstabelle|Anschlusstabelle]].&lt;br /&gt;
&lt;br /&gt;
Zum eigentlichen Flashen lädt man am besten das sehr einfach gehaltene Programm &#039;&#039;&#039;[https://github.com/Stadslab/ESP8266_example/raw/master/ESP8266_flasher_V00170901_00_Cloud%20Update%20Ready/esp8266_flasher.exe esp8266_flasher.exe]&#039;&#039;&#039; herunter.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:WordClock-ESP-Flasher.png|miniatur|esp8266_flasher.exe für das ESP8266-Modul]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Alternativ dazu kann man auch  von der Espressif-Seite zunächst die ESP8266-Flash-Software &#039;&#039;&#039;FLASH_DOWNLOAD_TOOLS_v2.4_150924.rar&#039;&#039;&#039; (http://bbs.espressif.com/download/file.php?id=856) herunterladen und das Archiv an geeigneter Stelle entpacken. Es müssen dann als Einstellungen die im Bild rechts markierten Einstellungen vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Dann ist das weitere Vorgehen:&lt;br /&gt;
&lt;br /&gt;
* Eventuell gestartetes PuTTY beenden, um COM-Schnittstelle freizugeben&lt;br /&gt;
* Reset-Taste drücken und &#039;&#039;&#039;festhalten&#039;&#039;&#039;&lt;br /&gt;
* Blaue User-Taste auf dem Nucleo-Board drücken und &#039;&#039;&#039;festhalten&#039;&#039;&#039;, alternativ beim STM32F103-Mini-Development Board PA6 mit einem Taster mit Masse verbinden und &#039;&#039;&#039;festhalten&#039;&#039;&#039;&lt;br /&gt;
* Reset-Taste loslassen&lt;br /&gt;
* User-Taste nach 2 Sekunden loslassen&lt;br /&gt;
&lt;br /&gt;
Das WordClock-Programm auf dem STM32 versetzt dann das [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Modul in den Flash-Modus und verbindet dann die beiden UARTs softwaremäßig 1:1, d.h. die Daten werden vom USB-Anschluss transparent an das [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Modul weitergegeben.&lt;br /&gt;
&lt;br /&gt;
Nun startet man das Programm &#039;&#039;&#039;esp8266_flasher.exe&#039;&#039;&#039; (bzw. ESP_DOWNLOAD_TOOL_V2.4.exe) und wählt durch Klick auf die Schaltfläche &#039;&#039;&#039;Bin&#039;&#039;&#039; die Datei &#039;&#039;&#039;ESP-WordClock.bin&#039;&#039;&#039; aus - siehe [[WordClock_mit_WS2812#Download|Download]]. Außerdem muss der COM-Port an den tatsächlichen Anschluss angepasst werden.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:WC-ESP8266-FLASH.png|miniatur|Alternative: ESP FLASH DOWNLOAD TOOL]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nach Drücken auf &#039;&#039;&#039;Download&#039;&#039;&#039; (bzw. &#039;&#039;&#039;Start&#039;&#039;&#039; beim Alternativprogramm) sollte nun das Flashen des [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Moduls beginnen. Eine eventuell am Ende auftretende Fehlermeldung &amp;quot;Failed to leave Flash mode&amp;quot; kann dabei getrost ignoriert werden. Anschließend startet man den STM32 (und damit auch das WLAN-Modul) neu durch kurzes Drücken der Reset-Taste.&lt;br /&gt;
&lt;br /&gt;
=== Start als Access-Point ===&lt;br /&gt;
&lt;br /&gt;
Um für die Konfiguration der WLAN-Daten (Zugang zum WLAN-Router oder -Gateway) mit dem ESP8266 Kontakt aufzunehmen, muss man zunächst dafür sorgen, dass das [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Modul als Access-Point arbeitet. Dafür drückt man die blaue User-Taste auf dem Nucleo-Board, alternativ verbindet man beim STM32F103-Mini-Development Board PA6 kurz über einen Taster mit Masse.&lt;br /&gt;
&lt;br /&gt;
Unmittelbar nach dem Drücken der Taste erscheint die IP-Adresse des [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Moduls als Laufschrift - und auch im Log. Nun sucht man auf dem PC oder Tablet nach dem WLAN-Netz mit dem Namen &amp;quot;wordclock&amp;quot; und verbindet das Gerät mit diesem Netz. Als Netzwerkschlüssel gibt man &amp;quot;1234567890&amp;quot; ein. Sobald die Verbindung hergestellt ist, startet man einen Browser und gibt als URL die ausgegebene IP-Adresse ein, z.B. http://192.168.4.1/ .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: Durch einen Anzeigefehler in der aktuellen ESP-Firmware 2.1.0 könnte an dieser Stelle auch fälschlicherweise &amp;quot;0.0.0.0&amp;quot; als IP-Adresse ausgegeben werden. In diesem Fall ist die zu verwendende IP-Adresse 192.168.4.1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobald die [[WordClock_mit_WS2812#Web-Interface|Web-Oberfläche]] erscheint, wählt man den Menüpunkt &amp;quot;Network&amp;quot; aus, wählt &amp;quot;Wlan-Client&amp;quot; aus und gibt die SSID (&amp;quot;AP&amp;quot;) und den Key des WLAN-Routers ein und bestätigt die Eingabe mit &amp;quot;Save&amp;quot;. Das [[WordClock_mit_WS2812#ESP8266|ESP8266]]-WLAN-Modul wird nun als WLAN-Client umkonfiguriert. War das erfolgreich, erscheint nun auf dem Display die neue IP-Adresse. Die Browser-Seite wird dann ungültig. Man kann seinen PC nun wieder mit dem bisherigen WLAN-Gateway verbinden und im folgenden die neue IP-Adresse verwenden.&lt;br /&gt;
&lt;br /&gt;
Gibt es an dem Ort, wo die Uhr betrieben werden soll, kein WLAN, kann das [[WordClock_mit_WS2812#ESP8266|ESP8266]]-WLAN-Modul auch weiterhin als Accesspoint (&amp;quot;AP&amp;quot;) betrieben werden, damit man es über WLAN fernsteuern kann. In diesem Fall sollte nicht &amp;quot;WLAN-Client&amp;quot;, sondern &amp;quot;AP&amp;quot; ausgewählt werden, eine entsprechende SSID und einen mindestens 10 Zeichen langen Key einstellen. Anschließend kann man sich mit PC/Handy/Tablet in das neue WLAN einklinken, um die Uhr per Browser oder Android-App fernzusteuern. Ein Zugriff auf einen externen Timeserver ist dann selbstverständlich nicht mehr möglich.&lt;br /&gt;
&lt;br /&gt;
=== Start als WLAN-Client ===&lt;br /&gt;
&lt;br /&gt;
Bei jedem folgenden Start wird nur noch die Einstellung &amp;quot;WLAN-Client&amp;quot; verwendet. Sobald sich das [[WordClock_mit_WS2812#ESP8266|ESP8266]]-WLAN-Modul mit dem gewünschten Access-Point (&amp;quot;AP&amp;quot;) verbunden hat, wird auf dem LED-Display die neue IP-Adresse des Moduls in Laufschrift ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp&#039;&#039;&#039;: Viele WLAN-Router sorgen automatisch dafür, dass ein WLAN-Client auch noch nach Tagen dieselbe IP-Adresse hat. Wenn das nicht der Fall sein sollte, kann man meist in den Router-Einstellungen dafür sorgen, dass der Client mit der MAC-Adresse xx-xx-xx-xx-xx-xx immer dieselbe IP-Adresse vom WLAN-Router zugeteilt bekommt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Web-Interface ==&lt;br /&gt;
&lt;br /&gt;
=== Main ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Neben der Ausgabe der installierten Firmware-Version sieht man hier unter anderem auch, ob das EEPROM erkannt wurde. Es wird entweder &amp;quot;online&amp;quot; oder &amp;quot;offline&amp;quot; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Hat man keine Verbindung zum Internet, kann man auf der Hauptseite Datum und Uhrzeit auch manuell eingeben. Außerdem kann man hier einen Ticker-Text angeben, welcher dann auf dem Display als Laufschrift ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Mit den Schaltflächen &amp;quot;Power on&amp;quot; bzw. &amp;quot;Power off&amp;quot; kann das LED-Display ein- und ausgeschaltet werden. Mit dem Klick auf &amp;quot;Learn IR remote control&amp;quot; kann eine IR-Fernbedienung angelernt werden.&lt;br /&gt;
|| [[Datei:Wordclock24h-Web-Main.png|miniatur|Web-Interface: Hauptmenü]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Hier wird die aktuelle IP-Adresse und die Firmware-Version des ESP8266-Moduls angezeigt. Auch kann man hier die Verbindung zu einem WLAN-Gateway oder -Router eingeben. In diesem Fall ist der Modus von &amp;quot;AP&amp;quot; auf &amp;quot;WLAN-Client&amp;quot; umzustellen und SSID und Key einzugeben. Nach Änderung wird die gewünschte Verbindung aufgebaut und die evtl. neue IP-Adresse auf dem LED-Display als Laufschrift eingeblendet.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man hier den [[WordClock_mit_WS2812#Timeserver|Timeserver]] und die [[WordClock_mit_WS2812#Timeserver|Zeitzone]] konfigurieren, siehe entsprechendes [[WordClock_mit_WS2812#Timeserver|Kapitel]].&lt;br /&gt;
&lt;br /&gt;
Mit der Schaltfläche &amp;quot;Get net time&amp;quot; kann die aktuelle Uhrzeit von dem konfigurierten Timeserver ad hoc abgerufen werden. Das ist aber im Normalfall nicht notwendig, da dies ohnehin alle 3800 Sekunden automatisch geschieht. &lt;br /&gt;
|| [[Datei:Wordclock24h-Web-Network.png|miniatur|Web-Interface: Netzwerk-Konfiguration]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Temperature ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Hier wird die aktuelle Temperatur von RTC und DS18xx (sofern vorhanden) ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Wegen der Selbsterwärmung der Sensoren werden meist zu hohe Werte gemessen. Dagegen hilft beim DS18xx zum Beispiel ein Kühlkörper. Sollte das nicht möglich oder nicht gewünscht sein, kann hier sowohl für RTC als auch für DS18xx eine Korrektur in 0,5°C Schritten angegeben werden. Bei Eingabe von beispielsweise &amp;quot;5&amp;quot; werden 2,5°C von der Messung abgezogen. Die Korrekturwerte sollte man frühestens nach einigen Minuten Betrieb wählen, damit RTC/DS18xx auch die endgültige Betriebstemperatur erreicht haben.&lt;br /&gt;
&lt;br /&gt;
Beim Betätigen der Schaltfläche &amp;quot;Display temperature&amp;quot; wird die aktuelle Temperatur auf dem LED-Display entweder als Laufschrift (WordClock12h) oder als Wort-Anzeige (Word-Clock24h) eingeblendet. Diese Anzeige kann in einem gewissen Zeitintervall auch automatisch erfolgen, siehe &#039;&#039;&#039;[[WordClock_mit_WS2812#Display|Display]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:Wordclock24h-Web-Temperature.png|miniatur|Web-Interface: Temperatur-Konfiguration]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Weather ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Um Wetterdaten auf der Uhr ausgeben zu können, braucht man eine sogenannte APPID (auch API-Id genannt), die man durch eine Registrierung bei http://openweathermap.org kostenlos beziehen kann. Am einfachsten findet man sie über den Menü-Eintrag &amp;quot;Price&amp;quot;. Dort kann man dann eine API-Id in der Free-Version generieren lassen.&lt;br /&gt;
&lt;br /&gt;
Diese APPID wird dann hier eingetragen. Desweiteren ist notwendig:&lt;br /&gt;
&lt;br /&gt;
* entweder die Angabe eines Ortes&lt;br /&gt;
* oder die Angabe von Geo-Koordinaten (Longitude/Lattitude)&lt;br /&gt;
&lt;br /&gt;
Gerade bei Großstädten ist es sinnvoll, die genauen Koordinaten des eigenen Wohnorts anzugeben, da das Wetter bereits lokal unterschiedlich sein kann. Werden sowohl Ort als auch die Geo-Koordinaten angegeben, haben die Koordinaten Priorität. Auch kann es sein, dass bei kleineren Ortschaften der Ort selbst bei openweathermap.org unbekannt ist. Im Zweifel sollte man sich besser für die Koordinaten-Variante entscheiden. Wichtig bei der Angabe eines Ortes ist es, die Stadt in der eigenen Landessprache anzugeben, also z.B. &amp;quot;Koeln&amp;quot; oder &amp;quot;Muenchen&amp;quot;. Die Angabe von z.B. &amp;quot;Cologne&amp;quot; ist nicht zielführend, weil dies ein kleiner Ort in Italien ist ;-)&lt;br /&gt;
&lt;br /&gt;
Kennt man die Geo-Koordinaten vom gewünschten Standort nicht, kann man sie über Google-Earth ermitteln. Dafür muss man nicht unbedingt Google-Earth herunterladen, es reicht das Aufrufen von Google-Maps im Browser. Anschließend kann man dann unten links auf die Web-Version von Google-Earth wechseln. Ein Klick auf den eigenen Standort lässt dann die gewünschten Koordinaten erscheinen. Dabei ist die erste Zahl (irgendetwas um die 50) die Lattitude und die zweite Zahl (in der Größenordnung 7) die Longitude. Die Zahlen sollen mit Dezimalpunkt und nicht Dezimalkomma eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Ein abschließender Klick auf die Schaltfläche &amp;quot;Get weather&amp;quot; bezieht dann von openweathermap.org das aktuelle Wetter vom gewünschten Standort. Die Wetterdaten (Temperatur und Wetterlage) werden dann als Laufschrift auf dem Display ausgegeben. Diese Anzeige kann in einer kommenden Version über ein einstellbares Zeitintervall dann auch automatisch erfolgen.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:Wordclock24h-Web-Weather.png|miniatur|Web-Interface: Wetterdaten-Konfiguration]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LDR ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Die Seite zeigt den aktuellen Wert an, den der ADC am LDR misst. Um den Helligkeitsbereich bei der automatischen Helligkeitssteuerung komplett auszunutzen, kann hier eine Kalibrierung vorgenommen werden. Dazu betätigt man einmal die Minimum-Schaltfläche bei verdunkeltem Raum und einmal die Maximum-Schaltfläche bei maximaler Raumhelligkeit. Die automatische Helligkeitssteuerung verwendet dann bei einer Helligkeitsmessung diese Min-/Max-Werte zum Vergleich.&lt;br /&gt;
&lt;br /&gt;
Mittels Aktivierung von &amp;quot;Automatic Brightness&amp;quot; wird die automatische Helligkeitssteerung scharfgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Es ist nicht sinnvoll, bei der Max-Messung einfach eine Taschenlampe direkt vor den LDR zu halten. Da der LDR normalerweise hinter der Frontplatte sitzt, wird so eine Helligkeit in der Praxis niemals erreicht. Die Folge wäre, dass die LEDs der Uhr dann zu dunkel leuchten würden.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:Wordclock24h-Web-LDR.png|miniatur|Web-Interface: LDR-Kalibrierung]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Display ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Unter &amp;quot;Display Mode&amp;quot; können verschiedene Sprachvarianten, die regionale Unterschiede beim Gebrauch der Uhrzeit berücksichtigen, ausgewählt werden.&lt;br /&gt;
&lt;br /&gt;
Mit dem Schieberegler &amp;quot;Brightness&amp;quot; kann die Grundhelligkeit eingestellt werden. Dieser wird deaktiviert, wenn die automatische Helligkeitssteuerung aktiviert wurde. Die eigentlichen Farben des Displays stellt man dann mit den Schiebereglern &amp;quot;R&amp;quot;, &amp;quot;G&amp;quot; und &amp;quot;B&amp;quot; ein.&lt;br /&gt;
&lt;br /&gt;
Stellt man für das Ambilight &amp;quot;Use Display Colors&amp;quot; ein, dann werden die Einstellungen für Helligkeit und Farben auch für das Ambilight verwendet, das heißt die Farben laufen synchron.&lt;br /&gt;
&lt;br /&gt;
Auch hier gibt es nochmal die Schaltflächen zum Ein- und Ausschalten des LED-Displays. Mit der Schaltfläche &amp;quot;Test Display&amp;quot; werden sämtliche LEDs bei halber (subjektiver) Helligkeit eingeschaltet (benötigt ca. 1/4 des theoretisch möglichen Maximalstroms) und einige Farben zur Kontrolle der Funktionsfähigkeit aller LEDs durchprobiert.&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;Temp Display Interval&amp;quot; lässt sich ein Zeitintervall wählen, bei weilchem die aktuell gemessene Temperatur eingeblendet werden soll. Bei Angabe von &amp;quot;1&amp;quot; passiert das jede Minute, nämlich immer bei hh:mm:30 Uhr. Bei Angabe von beispielsweise &amp;quot;5&amp;quot; wird die Temperatur dann nur noch alle 5 Minuten eingeblendet.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:Wordclock24h-Web-Display.png|miniatur|Web-Interface: Einstellungen des LED-Displays]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Animationen werden immer dann ausgeführt, wenn sich die Anzeige ändert, zum Beispiel bei einem Uhrzeitwechsel. Hier kann man sich die gewünschte Animation aussuchen und auch die dazugehörige Geschwindigkeit eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Folgende Animationen sind verfügbar:&lt;br /&gt;
&lt;br /&gt;
* None - Keine Animation&lt;br /&gt;
* Fade - Langsames Überblenden der Buchstaben&lt;br /&gt;
* Roll - Rollen der Wörter von links/rechts/oben/unten&lt;br /&gt;
* Explode - Die Wörter wandern schnell vom Mittelpunkt sternförmig auf ihren Platz&lt;br /&gt;
* Snake - Eine Schlange &amp;quot;frisst&amp;quot; die zuletzt angezeigten Wörter weg&lt;br /&gt;
* Teletype - Die Wörter werden in &amp;quot;Schreibmaschinen-Geschwindigkeit&amp;quot; ausgegeben&lt;br /&gt;
* Cube - Ein Rahmen &amp;quot;fällt&amp;quot; von außen nach innen, um die Anzeige zu löschen&lt;br /&gt;
* Matrix - Matrix-Animation aus dem gleichnamigen Film&lt;br /&gt;
* Drop - Buchstaben alter Wörter fallen aus der Anzeige, Buchstaben neuer Wörter fallen von oben in die Anzeige hinein&lt;br /&gt;
* Squeeze - Die Wörter werden einmal kurz &amp;quot;gequetscht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit ist die Animation &amp;quot;Random&amp;quot;. Hier wird mit Hilfe eines Zufallsgenerators jedesmal eine andere Animation ausgewählt. Deklariert man eine Animation als Favoriten, dann wird diese von der Zufallsanimation &amp;quot;Random&amp;quot; genutzt. Anderenfalls wird sie von &amp;quot;Random&amp;quot; ignoriert.&lt;br /&gt;
&lt;br /&gt;
Die Geschwindigkeit kann man in 15 Stufen einstellen. Bei Klick auf die Schaltfläche &amp;quot;Default&amp;quot; wird die Geschwindigkeit auf einen sinnvollen Standardwert gesetzt.&lt;br /&gt;
&lt;br /&gt;
Als zusätzliche Farbanimation kann noch &amp;quot;Rainbow&amp;quot; ausgewählt und konfiguriert werden. Dann wechselt das Display fließend die Farben der LEDs.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:Wordclock24h-Web-Animations.png|miniatur|Web-Interface: Einstellungen der Animationen]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ambilight ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Hier kann eine separate Animation für das Ambilight eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Bei dem Ambilight-Modus &amp;quot;Clock&amp;quot; werden 20, 30 oder 60 Ambilight-LEDs als umlaufende Sekundenanzeige verwendet. Mit &amp;quot;#LEDs&amp;quot; kann man einstellen, wieviele Ambilight-LEDs sich im &amp;quot;Kreis&amp;quot; befinden. Sinnvoll sind hier 20, 30 oder 60. Ausserdem lässt sich mit &amp;quot;Offset of second = 0&amp;quot; diejenige LED einstellen, die mittig oben als Sekunde 0 angebracht ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Beginnt das Ambilight mit 60 LEDs links unten und ist im Uhrzeigersinn angebracht, dann wäre die LED mit Sekunde 0 die Nr. 22. Diese Zahl ist dann hier einzutragen.&lt;br /&gt;
&lt;br /&gt;
Der Ambilight-Modus &amp;quot;Clock2&amp;quot; entspricht dem Modus &amp;quot;Clock&amp;quot;. Jedoch wird hier ein zu-/abnehmender Vollkreis dargestellt.&lt;br /&gt;
&lt;br /&gt;
Bei dem Ambilight-Modus &amp;quot;Rainbow&amp;quot; durchlaufen die Ambilight-LEDs langsam (über mehrere Minuten hinweg) alle Farben des Regenbogens. Dieser läuft unabhängig von der Farbanimation &amp;quot;Rainbow&amp;quot; des Displays.&lt;br /&gt;
&lt;br /&gt;
Ist auf der Display-Webseite eingestellt, dass die Ambilight-Farben nicht synchronisiert werden sollen, dann kann man hier auch unhabhängig von dem Display eine eigene Helligkeit und einen anderen RGB-Wert wählen.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:Wordclock24h-Web-Ambilight.png|miniatur|Web-Interface: Einstellungen des LED-Displays]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Timers ===&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Mit bis zu acht Timern kann man einstellen, wann die Uhr aus- bzw. eingeschaltet werden soll. Die Einstellung kann in Abhängigkeit der Wochentage eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel rechts wird in der Woche abends die Uhr um 22:30 Uhr abgeschaltet. Eingeschaltet wird dann morgens wieder um 07:00 Uhr. Nach dem Frühstück wird die Uhr dann um 08:00 Uhr wieder abgeschaltet, um dann abends um 17:00 Uhr wieder eingeschaltet zu werden.&lt;br /&gt;
&lt;br /&gt;
Am Wochenende sieht das dann anders aus: Hier ist die Uhr abends länger eingeschaltet, nämlich bis 23:30 Uhr. Morgens geht es erst dann um 09:00 Uhr wieder weiter.&lt;br /&gt;
 || [[Datei:Wordclock24h-Web-Timers.png|miniatur|Web-Interface: Timer]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timeserver ==&lt;br /&gt;
&lt;br /&gt;
Der Timeserver muss ein RFC 958 konformer NTP-Server sein. Voreingestellt ist ntp3.ptb.de (192.53.103.103). Alternative Timeserver sind zum Beispiel ntp1.ptb.de (192.53.103.108), ntp2.ptb.de (192.53.103.104) oder time.nist.gov (216.229.0.179).&lt;br /&gt;
&lt;br /&gt;
Eine Liste von europäischen Timeservern findet man u.a. hier: http://www.pool.ntp.org/zone/europe&lt;br /&gt;
&lt;br /&gt;
Den Timeserver konfiguriert man folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
Im Browser gibt man als URL die ausgegebene IP-Adresse ein, also z.B. http://192.168.10.1/ . Anschließend wählt man den Menüpunkt &amp;quot;Network&amp;quot; an und gibt in der entsprechenden Zeile die IP-Adresse des Wunsch-Timeservers ein und bestätigt mit &amp;quot;Save&amp;quot;. Nun wird zunächst geprüft, ob der Timeserver das NTP-Protokoll unterstützt.&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Uhrzeit wird alle 3800 Sekunden vom Timeserver geholt. Im [[WordClock_mit_WS2812#Web-Interface|Web-Interface]] kann man die Übertragung auch jederzeit per Mausklick starten. Das funktioniert auch mit einer angelernten IR-Fernbedienung.&lt;br /&gt;
&lt;br /&gt;
=== Zeitzone ===&lt;br /&gt;
&lt;br /&gt;
Im [[WordClock_mit_WS2812#Web-Interface|Web-Interface]] Menüpunkt &amp;quot;Network&amp;quot; auswählen, in der Zeile &amp;quot;Timezone&amp;quot; die Abweichung von GMT eingeben. Für die mitteleuropäische Zeitzone wäre das einfach eine 1. Dies entspricht dann GMT+1. Bei einer negativen Abweichung wie GMT-1 muss dann entsprechend -1 eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IR-Fernbedienung ==&lt;br /&gt;
&lt;br /&gt;
In den ersten 3 Sekunden leuchtet die Status-LED mit der Farbe weiß, um zu signalisieren, dass nun eine IR-Fernbedienung angelernt werden kann. Wird währenddessen irgendein gültiger IR-Code empfangen, wechselt die Status-LED für eine Sekunde auf rot (FB-Knopf loslassen!) und es wird in die Anlernroutine gesprungen. Wird kein IR-Signal empfangen, startet das Programm wie gewohnt. Die Anlernroutine kann auch über die [[WordClock_mit_WS2812#Web-Interface|Web-Oberfläche]] (Menü &amp;quot;Main&amp;quot;) gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Man wird nun über eine Laufschrift auf dem LED-Display aufgefordert, folgende FB-Tasten zu drücken:&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Tasten für IR-Fernbedienung&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Taste || Funktion || Laufschrift&lt;br /&gt;
|-&lt;br /&gt;
| Power || Anzeige ein/aus                           || power off/on&lt;br /&gt;
|- &lt;br /&gt;
| OK    || Speichern der Einstellungen               || ok&lt;br /&gt;
|- &lt;br /&gt;
| MODE- || Anzeigemodus erniedrigen                  || decrement display mode&lt;br /&gt;
|- &lt;br /&gt;
| MODE+ || Anzeigemodus erhöhen                      || increment display mode&lt;br /&gt;
|- &lt;br /&gt;
| ANIM- || Animation erniedrigen                     || decrement animation mode&lt;br /&gt;
|- &lt;br /&gt;
| ANIM+ || Animation erhöhen                         || increment animation mode&lt;br /&gt;
|- &lt;br /&gt;
| HOUR- || Stunde erniedrigen                        || decrement hour&lt;br /&gt;
|- &lt;br /&gt;
| HOUR+ || Stunde erhöhen                            || increment hour&lt;br /&gt;
|- &lt;br /&gt;
| MIN-  || Minute erniedrigen                        || decrement minute&lt;br /&gt;
|- &lt;br /&gt;
| MIN+  || Minute erhöhen                            || increment minute&lt;br /&gt;
|- &lt;br /&gt;
| RED-  || Helligkeit der Farbe Rot erniedrigen      || decrement red brightness&lt;br /&gt;
|- &lt;br /&gt;
| RED+  || Helligkeit der Farbe Rot erhöhen          || increment red brightness&lt;br /&gt;
|- &lt;br /&gt;
| GREEN- || Helligkeit der Farbe Grün erniedrigen    || decrement green brightness&lt;br /&gt;
|- &lt;br /&gt;
| GREEN+ || Helligkeit der Farbe Grün erhöhen        || increment green brightness&lt;br /&gt;
|- &lt;br /&gt;
| BLUE-  || Helligkeit der Farbe Blau erniedrigen    || decrement blue brightness&lt;br /&gt;
|- &lt;br /&gt;
| BLUE+  || Helligkeit der Farbe Blau erhöhen        || increment blue brightness&lt;br /&gt;
|- &lt;br /&gt;
| BRIGHT-  || Grundhelligkeit erniedrigen            || decrement global brightness&lt;br /&gt;
|- &lt;br /&gt;
| BRIGHT+  || Grundhelligkeit erhöhen                || increment global brightness&lt;br /&gt;
|- &lt;br /&gt;
| AUTO+  || Automatische Helligkeitsregelung ein/aus || toggle auto brightness&lt;br /&gt;
|- &lt;br /&gt;
| TEMP   || Anzeige der Temperatur für 5 Sekunden    || get temperature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sind die FB-Tasten angelernt, kann man die Uhrzeit, den Anzeigemodus und auch die Farben mittels IR-Fernbedienung einstellen.&lt;br /&gt;
&lt;br /&gt;
Es sind nur die gebräuchlichsten IR-Protokolle aktiviert, nämlich:&lt;br /&gt;
&lt;br /&gt;
* SIRCS (Sony)&lt;br /&gt;
* NEC (Viele Hersteller, sehr verbreitet)&lt;br /&gt;
* SAMSUNG&lt;br /&gt;
* MATSUSHITA&lt;br /&gt;
* KASEIKYO&lt;br /&gt;
&lt;br /&gt;
[[IRMP]] &amp;quot;versteht&amp;quot; jedoch bis zu 40 Protokolle. Braucht man weitere - wie RC5 oder RC6 - kann man sie in irmp/irmp-config.h freischalten. Bei Problemen empfiehlt sich die Lektüre des [[IRMP]]-Artikels.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine passende Fernbedienung gibt es bei &#039;&#039; [http://www.dealextreme.com/p/24-key-wireless-infrared-ir-remote-controller-for-rgb-led-light-bulb-1-cr2025-47019 DX] &#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Passend beschriftet werden kann die Fernbedienung mit einem der folgenden Labels &amp;lt;br&amp;gt;&lt;br /&gt;
[[Datei:Fernbedienung Folie ZW.pdf]] &amp;lt;br&amp;gt; &lt;br /&gt;
[[Datei:Fernbedienung Folie ZW2.pdf]] &amp;lt;br&amp;gt;&lt;br /&gt;
(sie unterscheiden sich in der Anordnung des Power- und Save-Knopfes). Einfach auf eine selbstklebende Folie drucken, ausschneiden und aufkleben. Die unterste Reihe ist für weitere zusätzliche Optionen (z.B. Ambilight, usw.) noch offen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Android App ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Ist ein [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Modul angeschlossen und korrekt konfiguriert, kann die Uhr per [[WordClock_mit_WS2812#Android_App|Android App]] ferngesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Momentan können folgende Einstellungen vorgenommen werden:&lt;br /&gt;
&lt;br /&gt;
* Ein-/Ausschalten der Uhr&lt;br /&gt;
* Manuelles Stellen von Datum/Uhrzeit über Menü -&amp;gt; Synchronisieren&lt;br /&gt;
* Anzeige der WordClock-Temperatur&lt;br /&gt;
* Einstellen der Farben (&#039;&#039;&#039;Neu&#039;&#039;&#039;: nun auch RGBW)&lt;br /&gt;
* Manuelle Einstellung einer Grundhelligkeit&lt;br /&gt;
* Automatische Helligkeitsregelung per [[WordClock_mit_WS2812#LDR|LDR]] ein/aus&lt;br /&gt;
* Einstellung des Anzeigemodus&lt;br /&gt;
* Einstellung der Farbanimation, z.B. &amp;quot;Rainbow&amp;quot; (&#039;&#039;&#039;Neu&#039;&#039;&#039;)&lt;br /&gt;
* Einstellung der Animation (Überblenden, Rollen, Explosion etc.)&lt;br /&gt;
* Einstellung, ob WC24h oder WC12h ferngesteuert werden soll&lt;br /&gt;
&lt;br /&gt;
Bevor man mit der App Daten senden kann, muss man die IP-Adresse, die das [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Modul bekommen hat, in der App einstellen. Dies geht über den Menü-Eintrag &amp;quot;Einstellungen&amp;quot;. Bei älteren Android-Versionen ist dafür zunächst die spezielle Menü-Taste zu drücken, bei neueren Android-Versionen geht das auch über die Menüschaltfläche mit den drei übereinanderliegenden Punkten - siehe Bild rechts oben.&lt;br /&gt;
&lt;br /&gt;
In den Einstellungen kann gewählt werden, ob eine WC24h oder eine WC12h ferngesteuert werden soll. Dies betrifft die Liste der möglichen Anzeige-Modi. Wenn SK6812 als RGBW-LEDs eingesetzt werden, dann sollte auch das Häkchen für RGBW gesetzt werden, um zusätzlich auch die Farbe &amp;quot;Weiß&amp;quot; steuern zu können.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:Wc24h-Android.png|miniatur|WC24h Android App]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Mechanik =&lt;br /&gt;
&lt;br /&gt;
== Anbringung der WS2812-Streifen ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;WordClock24h:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Am besten verwendet man eine Alu-Platte mit den Maßen 300mmx300mm und 1mm Stärke. Darauf lassen sich nicht nur einfach die WS2812-LED-Streifen aufkleben, auch dient die Alu-Platte der Wärmeabfuhr. Die Alu-Platte kann man sich von einem der eBay-Händler entweder direkt erstehen oder für ca. 3,50 Euro zurechtschneiden lassen.&lt;br /&gt;
&lt;br /&gt;
Den LED-Streifen schneidet man 16 Streifen à 18 LEDs. Bevor man sie auf die LED-Platte klebt, sollte man senkrecht je einen Tesa-Streifen links und rechts auf die Alu-Platte kleben, da sich gezeigt hat, dass die Schnittkanten der Streifen gern einen Kurzschluss mit der Alu-Platte bilden.&lt;br /&gt;
&lt;br /&gt;
Die LED-Streifen werden dann im Zieharmonika-Verfahren aufgeklebt. Dabei steht jeder 2. Streifen auf dem Kopf. Das hat den Vorteil, dass die Verbindungen zwischen den Streifen möglichst kurz sind. Auf der rechten Seite verbindet man dann die Anschlüsse +5V mit +5V, GND mit GND und DO mit DI - siehe Bild. Man verbindet also den ersten mit dem zweiten Streifen, den dritten mit dem vierten Streifen usw.&lt;br /&gt;
&lt;br /&gt;
Auf der linken Seite verbindet man lediglich DO mit DI, also den zweiten Streifen mit dem dritten, den vierten mit dem fünften usw. An den verbleibenden Lötpunkten +5V und GND lötet man an jedem *zweiten* Streifen (1, 3, 5 usw.) die Spannungsversorgung  an. Praktisch ist die Verwendung eines 16-poligen Flachbandkabels, welches man auf einen Flachbandkabel-Stecker aufquetscht. Pin 1 und 2 gehen dann an 5V/GND des ersten Streifens, 3 und 4 an 5V/GND des dritten Streifens usw.&lt;br /&gt;
&lt;br /&gt;
Dann kann man mittels 16-poligem Wannenstecker, den man auf eine Lochrasterplatine lötet, die Spannungsversorgung einfach verpolungssicher anstecken. Unter der Lochrasterplatine werden die geradzahligen Pins und die ungeraden Pins je mit einem Kupferdraht verbunden. Mit einer 2-poligen Schraubklemme auf der Lochrasterplatine kann dann das Netzteil angeschlossen werden - siehe Bild rechts.&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:Wclock24h-WS2812-auf-Alu-Platte.jpg|miniatur|16 WS2812-Streifen auf Alu-Platte]]&lt;br /&gt;
[[Datei:Wclock24h-16-pol-Wanne.png|miniatur|16pol Wanne zum Verbinden des Netzteils und der Streifen]]&lt;br /&gt;
[[Datei:Wclock24h-Spannungsvergung-Streifen.jpg|miniatur|Anschluss der Streifen an die Spannungsversorgung]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;WordClock12h:&#039;&#039;&#039;&lt;br /&gt;
Der Aufbau ist analog zu der WordClock 24h zu betrachten. Der Unterschied liegt darin, dass bei der WC12h die LED Streifen mit dem Sonderabstand benutzt werden und dieser in 10 Streifen a 11 LEDs geteilt wird. Sowie in 4 Einzel LEDs für die Minutenanzeigen in den Ecken.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Verbindung der Streifen erfolgt dann analog zu der oben beschriebenen Weise.&lt;br /&gt;
|| &lt;br /&gt;
[[Datei:Aufbau WC12h WS2812.jpg|mini]]&lt;br /&gt;
Aufgebaute WC12h mit WS2812 Streifen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Zwischenböden ==&lt;br /&gt;
Es gibt insgesamt 3 Varianten der Zwischenböden.&amp;lt;br&amp;gt;&lt;br /&gt;
Zwei Varianten für die WordClock 12h (mit und ohne Ambilight Ausparungen) und eine Variante für die WordClock 24h&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| WordClock 12h OHNE Ambilight Aussparungen&lt;br /&gt;
|-&lt;br /&gt;
|[[Datei:WC12h Boden ohne Hinten.jpeg|mini|Rückseite]]&lt;br /&gt;
||[[Datei:WC12h Boden ohne Vorne.jpeg|mini|Vorderseite]]&lt;br /&gt;
||&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| WordClock 12h MIT Ambilight Aussparungen&lt;br /&gt;
|-&lt;br /&gt;
|[[Datei:WC12h Boden mit Hinten.jpeg|mini|Rückseite]]&lt;br /&gt;
||[[Datei:WC12h Boden mit Vorne.jpeg|mini|Vorderseite]]&lt;br /&gt;
||&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| WordClock 24h v2&lt;br /&gt;
|-&lt;br /&gt;
|[[Datei:WC24h Boden Rueckseite.jpeg|mini|Rückseite]]&lt;br /&gt;
||[[Datei:WC24h Boden Vorderseite.jpeg|mini|Vorderseite]]&lt;br /&gt;
||[[Datei:WC24h Boden Rueckseite schraeg.jpeg|mini|Rückseite schräg]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Frontplatten ==&lt;br /&gt;
&lt;br /&gt;
(in Arbeit)&lt;br /&gt;
&lt;br /&gt;
== Shield für STM32 MiniDevBoard ==&lt;br /&gt;
Vorgestellt wird hier das Shield für das MiniDevBoard.&lt;br /&gt;
Zunächst die veralte Version1 (V1):&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Das Board ist 38x110mm und verbindet alle Komponenten miteinander.&amp;lt;br&amp;gt;Dieses Board ist die optimale Variante für die klassische 10x11 WordClock. Es enthält alle Schnittstellen für die WordClock und ist für die WC12 als auch für die WC24 Variante geeinget.&lt;br /&gt;
|| [[Datei:MiniShield Vorderseite.jpg|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Das Board von der Rückseite&lt;br /&gt;
||[[Datei:MiniShield Rueckseite.jpg|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Das Board soweit bestückt - es fehlt hier noch das STM32. Das STM32 MiniDevBoard sollte direkt ohne weiteren Sockel auf das Shield gelötet werden.&lt;br /&gt;
||[[Datei:MiniShield Bestueckt.jpg|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Hier nun das vollbestückte Shield, incl STM32, ESP8266, RTC, DS1820, AMS1117&lt;br /&gt;
||[[Datei:MiniShield Bestueckt incl STM32.jpg|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Der Schaltplan des MiniDevBoards:&amp;lt;br&amp;gt;Einzige Abweichung: +5V ist an die UART Schnittstelle mit raus geführt.&lt;br /&gt;
||[[Datei:MiniShield Schaltplan.jpg|mini]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt nun eine neue v2 vom Shield für das MiniDevBoard.&lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Die v2 enthält folgende Anpassungen:&lt;br /&gt;
* am UART ist nun auch +5V ausgeführt&lt;br /&gt;
* Rastabstand bei DS3231, TSOP, LDR, Data sind nun einheitlich und können somit mit einem durchgehenden PinHeader bestückt werden&lt;br /&gt;
* die Pins für das DS3231 sind gespiegelt. Damit liegt die Batterie nun oben und steht nicht mehr nach unten über&lt;br /&gt;
* Es wurde die Abschaltschaltung für die 5V Versorgung der WS2812 Streifen eingebaut. Somit kann optional die Versorgungsspannung geschaltet werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|| [[Datei:MiniDev v2 TOP.jpg|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Das Board von der Rückseite.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Im Lieferzustand ist die Abschaltschlaltung gebrückt. Wird die Abschaltschaltung eingebaut, muss auf der Unterseite eine Leiterbahn durchtrennt werden! Diese ist hier rot umrandet!&#039;&#039;&#039;&lt;br /&gt;
||[[Datei:MiniDev v2 BOTTOM.jpg|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Bestückte Bilder folgen noch.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Der Schaltplan des MiniDevBoards als V2:&lt;br /&gt;
||[[Datei:MiniDev v2 Schematic.jpg|mini]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Shield für nucleo-Board ==&lt;br /&gt;
Vorgestellt wird hier ein shield für das nucleo-Board. &lt;br /&gt;
{|&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| Das shield ist 90mm*55mm klein und wird auf das nucleo-Board aufgesteckt. Es enthält alle bekannten Schnittstellen für die WordClock (egal ob 12h oder 24h) und ist zusammengebaut ca 19mm hoch.&lt;br /&gt;
Es passt somit problemlos in eine Aussparung des Zwischenbodens.&lt;br /&gt;
|| [[Datei:Ns-Bild1.JPG|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Ebenfalls integriert sind Anschlüsse, um den abgesägten ST-link zur Programmierung oder Kommunikation über UART mit dem PC zu verbinden. &lt;br /&gt;
||[[Datei:Ns-stl1a.JPG|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Beschreibung der Schnittstellen:&lt;br /&gt;
Die Belegung der meisten Schnittstellen ergibt sich aus den nebenstehenden Bildern.&lt;br /&gt;
Um das RTC Modul, welches entweder ein DS3231 oder ein DS1307 sein kann, mit Spannung zu versorgen, gibt es die Stiftleiste St-07, welche mit einem Jumper die Spannung am RTC Modul auf 3,3V oder 5V einstellt.&lt;br /&gt;
Die Stiftleiste St-04 kann per Pfostenfeldbuchse und Flachbandkabel insgesamt 8 mal die Spannung in die WS2812 Streifen einspeisen (siehe Beispiel weiter oben im Artikel).&lt;br /&gt;
||[[Datei:Ns-sh2.JPG|mini]]&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|Und so schaut das bestückte Nucleo Board aus&lt;br /&gt;
||[[Datei:Nucleo_bestueckt.JPG|mini]]&lt;br /&gt;
|}&lt;br /&gt;
Seit Juli 2016 wird das Nucleo-shield in der Version V2.1a ausgeliefert.&lt;br /&gt;
[[Datei:IMG 0366mod.jpg|mini]]&lt;br /&gt;
Es enthält jetzt auch die Möglichkeit, die Abschaltung der WS2812 LEDs per Hardware vorzunehmen. Dazu wurde die entsprechenden Bauteile auf das Board gepackt.&lt;br /&gt;
Außer dem Leistungs MOSFET IRF9310 wurde alles in bedrahteter Technik ausgeführt.&lt;br /&gt;
Wer die Bauteile für die Abschaltung (T1, T2, D1, R7, R8 und R9) NICHT einbaut, muss, wie in nebenstehendem Bild gezeigt, vier Lötbrücken einbauen.&lt;br /&gt;
&lt;br /&gt;
Analog dazu muss derjenige, der die Abschaltung einbaut, die Lötbrücken offen lassen (siehe unteres Bild, roter Kreis).&lt;br /&gt;
&lt;br /&gt;
[[Datei:NS Bug-1.jpg|mini]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Leider haben sich zwei Bugs in den Platinenentwurf eingeschlichen.&lt;br /&gt;
Zum einen gibt es Kurzschlüsse an den Pluspolen der Kondensatoren C1 und C3. Der Workaround besteht darin, das Bohrloch etwas aufzuweiten, um die ungewünschte Verbindung zu Masse zu trennen (siehe Bild)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:NS Bug-2.jpg|mini]]&lt;br /&gt;
&lt;br /&gt;
Der zweite Bug betrifft nur diejenigen, die die hardwaremässige Abschaltung der WS2812 LEDs einbauen.&lt;br /&gt;
Hier muss, wie im nebenstehenden Bild gezeigt, eine kleine Verbindung mit einem Stück Kabel hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das shield muss über St-08 mit 5V versorgt werden. Die für die Schnittstellen benötigten 3,3V wird auf dem shield selbst mit einem LM3940-3.3 erzeugt.&lt;br /&gt;
&lt;br /&gt;
Hier findet ihr die Stückliste zum nucleo-Board und den link zum öffentlichen Reichelt Warenkorb (noch ohne T1, T2, D1, R7, R8 und R9).&lt;br /&gt;
 [[Datei:Wc24wk.pdf]]&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
= Sammelbestellungen =&lt;br /&gt;
&lt;br /&gt;
== Sammelbestellung LED Stripes, Zwischenböden, Shields ==&lt;br /&gt;
Für die WC12h Variante der WordClock werden WS2812 Stripes als Spezialanfertigung mit einem Rastermaß von 28,1mm eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Es werden folgende &#039;&#039;&#039;WS2812 Pakete&#039;&#039;&#039; angeboten (WC12h):&lt;br /&gt;
* Paket 5 (Uhr - STM32 Basis - WS2812) - 40,80Eur : 120 WS2812-LEDs als Stripe im Sonderabstand&lt;br /&gt;
* Paket 6 (Ambilight - STM32 Basis - WS2812) - 20,40Eur : 60 WS2812-LEDs als Stripe im Sonderabstand&lt;br /&gt;
(durch die Umstellung des Ambilight Paketes auf 60 LEDs, kann die umlaufende Sekundenanzeige realisiert werden)&lt;br /&gt;
&lt;br /&gt;
Für die WC24h werden die WS2812 Stripes nicht über eine Sammelbestellung bestellt, da hier das Standardformat genutzt wird.&lt;br /&gt;
&lt;br /&gt;
Es werden folgende &#039;&#039;&#039;Zwischenböden&#039;&#039;&#039; angeboten:&lt;br /&gt;
* Zwischenboden (WC12h) mit Ambilightausfräsung (MDF 19mm gefräst) - 37,50Eur&lt;br /&gt;
* Zwischenboden (WC12h) ohne Ambilightausfräsung (MDF 19mm gefräst) - 37,50Eur&lt;br /&gt;
* Zwischenboden (WC24h) ohne Ambilightausfräsung (MDF 19mm gefräst) - 59,50Eur&lt;br /&gt;
&lt;br /&gt;
Es werden folgende &#039;&#039;&#039;Shields&#039;&#039;&#039; angeboten:&lt;br /&gt;
* Shield für STM32 MiniDevBoard - 3,50Eur&lt;br /&gt;
* Shield für STM32 NucleoBoard - 5,50Eur&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;Versand der Shields&#039;&#039;&#039; erfolgt als Großbrief:&lt;br /&gt;
* innerhalb BRD – 4,00Eur&lt;br /&gt;
* Österreich – 6,00Eur&lt;br /&gt;
* Schweiz - 6,00Eur&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;Versand der WS2812-Stripes&#039;&#039;&#039; erfolgt als kleines Paket:&lt;br /&gt;
* innerhalb BRD (ohne Inseln) – 6,50Eur&lt;br /&gt;
* Österreich – 15,50Eur&lt;br /&gt;
* Schweiz – in die Schweiz kann nur als normales Paket versendet werden, Kosten hierzu siehe unten&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;Versand mit Zwischenboden&#039;&#039;&#039; erfolgt als normales Paket:&amp;lt;br&amp;gt;&lt;br /&gt;
* innerhalb BRD (ohne Inseln) - 10,00Eur (bis 2 Böden)&lt;br /&gt;
* innerhalb BRD (ohne Inseln) - 12,00Eur (bis 4 Böden)&lt;br /&gt;
* innerhalb BRD (ohne Inseln) - 18,00Eur (ab 5 Böden)&lt;br /&gt;
* Österreich – 20,00Eur (bis 2 Böden)&lt;br /&gt;
* Österreich – 25,00Eur (bis 4 Böden)&lt;br /&gt;
* Schweiz - 31,00Eur (bis 2 Böden)&lt;br /&gt;
* Schweiz - 40,00Eur (bis 4 Böden)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Es fallen jeweils nur die höheren Versandkosten an.&amp;lt;br&amp;gt;&lt;br /&gt;
Werden mehrere Pakete bestellt, können die tatsächlichen Versandkosten von den hier gezeigten Versandkosten abweichen. Diese ist dann von der bestellten Menge und dem Gewicht abhängig und wird dann entsprechend mitgeteilt.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Interesse bitte per PN melden (Benutzer [http://www.mikrocontroller.net/user/show/wawibu wawibu])&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Zeitplanung&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Datum&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Aktion&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bis 07.Oktober 2016&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sammeln der Bestellungen&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;10.Oktober 2016&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bestellung geht raus&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;~09.November 2016&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Anlieferung bei mir&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;~14.November 2016&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Versand&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== WC12h Sammelbestellung Frontplatten ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Wordclock-front-dia.jpg|miniatur|Frontplatte: Dia]]&lt;br /&gt;
[[Datei:Wordclock-front-full.jpg|miniatur|Frontplatte: Vollansicht]]&lt;br /&gt;
[[Datei:WordClock-gelb.jpg|miniatur|4-sprachige Frontplatte]]&lt;br /&gt;
&lt;br /&gt;
Die Frontplatten bleiben identisch zu denen aus dem früheren [[Word Clock|WordClock]]-Projekt. &lt;br /&gt;
&lt;br /&gt;
Die aktuelle Version, die auch für die Sammelbestellung gilt:&lt;br /&gt;
&lt;br /&gt;
 E S K I S T L F Ü N F    &amp;lt;nowiki&amp;gt;==&amp;gt; ES IST FÜNF&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 Z E H N Z W A N Z I G    &amp;lt;nowiki&amp;gt;==&amp;gt; ZEHN ZWANZIG&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 D R E I V I E R T E L    &amp;lt;nowiki&amp;gt;==&amp;gt; DREI|VIERTEL&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 T G N A C H V O R J M    &amp;lt;nowiki&amp;gt;==&amp;gt; NACH VOR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 H A L B Q Z W Ö L F P    &amp;lt;nowiki&amp;gt;==&amp;gt; HALB ZWÖLF&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 Z W E I N S I E B E N    &amp;lt;nowiki&amp;gt;==&amp;gt; ZW|EI|N|S|IEBEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 K D R E I R H F Ü N F    &amp;lt;nowiki&amp;gt;==&amp;gt; DREI FÜNF&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 E L F N E U N V I E R    &amp;lt;nowiki&amp;gt;==&amp;gt; ELF NEUN VIER&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 W A C H T Z E H N R S    &amp;lt;nowiki&amp;gt;==&amp;gt; ACHT ZEHN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 B S E C H S F M U H R    &amp;lt;nowiki&amp;gt;==&amp;gt; SECHS UHR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Damit ist es möglich, vier regionale Sprechweisen darzustellen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wessi-Modus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  es ist ein uhr&lt;br /&gt;
  es ist fünf nach eins&lt;br /&gt;
  es ist zehn nach eins&lt;br /&gt;
  es ist viertel nach eins&lt;br /&gt;
  es ist zehn vor halb zwei&lt;br /&gt;
  es ist fünf vor halb zwei&lt;br /&gt;
  es ist halb zwei&lt;br /&gt;
  es ist fünf nach halb zwei&lt;br /&gt;
  es ist zehn nach halb zwei&lt;br /&gt;
  es ist viertel vor zwei&lt;br /&gt;
  es ist zehn vor zwei&lt;br /&gt;
  es ist fünf vor zwei&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rhein-Ruhr-Modus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  es ist ein uhr&lt;br /&gt;
  es ist fünf nach eins&lt;br /&gt;
  es ist zehn nach eins&lt;br /&gt;
  es ist viertel nach eins&lt;br /&gt;
  es ist zwanzig nach eins&lt;br /&gt;
  es ist fünf vor halb zwei&lt;br /&gt;
  es ist halb zwei&lt;br /&gt;
  es ist fünf nach halb zwei&lt;br /&gt;
  es ist zwanzig vor zwei&lt;br /&gt;
  es ist viertel vor zwei&lt;br /&gt;
  es ist zehn vor zwei&lt;br /&gt;
  es ist fünf vor zwei&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ossi-Modus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  es ist ein uhr&lt;br /&gt;
  es ist fünf nach eins&lt;br /&gt;
  es ist zehn nach eins&lt;br /&gt;
  es ist viertel zwei&lt;br /&gt;
  es ist zehn vor halb zwei&lt;br /&gt;
  es ist fünf vor halb zwei&lt;br /&gt;
  es ist halb zwei&lt;br /&gt;
  es ist fünf nach halb zwei&lt;br /&gt;
  es ist zehn nach halb zwei&lt;br /&gt;
  es ist dreiviertel zwei&lt;br /&gt;
  es ist zehn vor zwei&lt;br /&gt;
  es ist fünf vor zwei&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schwaben-Modus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  es ist ein uhr&lt;br /&gt;
  es ist fünf nach eins&lt;br /&gt;
  es ist zehn nach eins&lt;br /&gt;
  es ist viertel zwei&lt;br /&gt;
  es ist zwanzig nach halb zwei&lt;br /&gt;
  es ist fünf vor halb zwei&lt;br /&gt;
  es ist halb zwei&lt;br /&gt;
  es ist fünf nach halb zwei&lt;br /&gt;
  es ist zwanzig vor halb zwei&lt;br /&gt;
  es ist dreiviertel zwei&lt;br /&gt;
  es ist zehn vor zwei&lt;br /&gt;
  es ist fünf vor zwei&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sammelbestellung Stand August 2016:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Aus der letzten Sammelbestellung sind noch Frontplatten übrig. Interessenten können sich bei mir (Benutzer [http://www.mikrocontroller.net/user/show/ukw &#039;&#039;&#039;ukw&#039;&#039;&#039;]) melden. &lt;br /&gt;
&lt;br /&gt;
Die Platten bestehen aus einer Plexi-Scheibe (3mm) in der Größe 45cm x 45cm und werden im Siebdruckverfahren bedruckt. Dabei wird die Scheibe von hinten zunächst mit einer Mehrfach-Schicht schwarzer Farbe bedruckt, damit sie lichtdicht ist. Lediglich die Buchstaben und Minutenpunkte bleiben frei. Anschließend kommt noch optional eine dünne weiße Schicht komplett deckend über die schwarze Farbe, sodass sie als Diffusor für die Buchstaben und Minutenpunkte wirkt.&lt;br /&gt;
&lt;br /&gt;
Diese Variante heisst nun &#039;WC12h&#039;:&lt;br /&gt;
&lt;br /&gt;
  - WC12h: 45cm x 45cm mit weißer Schicht als Diffusor&lt;br /&gt;
&lt;br /&gt;
Der Preis dafür beträgt pro Stück 42,- EUR.&lt;br /&gt;
&lt;br /&gt;
Hinzu kommen noch 10 EUR Versandkosten für bis zu 4 Stück in einem Paket. Bei Versand in ein EU-Land kommen weitere 10 EUR hinzu, also insgesamt 20 EUR.&lt;br /&gt;
&lt;br /&gt;
Die Frontplatte beinhalt alle 4 Sprachversionen:&lt;br /&gt;
&lt;br /&gt;
* Wessi-Modus (viertel nach/vor)&lt;br /&gt;
* Ossi-Modus (viertel/dreiviertel)&lt;br /&gt;
* Rhein-Ruhr-Modus (viertel nach/vor, zwanzig nach/vor)&lt;br /&gt;
* Schwaben-Modus (viertel/dreiviertel, zwanzig nach/vor)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Frontplatte wird mit einer kaum wahrnehmbaren Schutzfolie auf der Vorder- &#039;&#039;&#039;und&#039;&#039;&#039; Rückseite geliefert. Wenn man das nicht weiß, kann es so aussehen, als ob die Frontplatte &amp;quot;verkratzt&amp;quot; sei. Diese &amp;quot;Kratzer&amp;quot; sind aber nur auf der Schutzfolie, nicht auf der Platte selbst. Daher hier nochmal der ausdrückliche Hinweis: Bitte die Schutzfolie unmittelbar vor der Montage abziehen und sich dann freuen :-)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kleber welcher den Aufdruck nicht beschädigt:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- UHU plus endfest 300 2K-Epoxidkleber&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== WC24h Sammelbestellung LED Stripes ==&lt;br /&gt;
&lt;br /&gt;
Eine Sammelbstellung der LED-Stripes für die WC24h ist derzeit nicht geplant, da hier WS2812-Stripes mit dem Standard-Rastermaß von 60 LEDs/m benötigt werden. Diese sind sehr einfach bei eBay oder Amazon erhältlich.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== WC24h Sammelbestellung Zwischenböden ==&lt;br /&gt;
&lt;br /&gt;
Wir können nun auch die WC24h Zwischenböden über die Sammelbestellung anbieten.&lt;br /&gt;
&lt;br /&gt;
* Zwischenboden für Wordclock 24h (MDF 19mm gefräst) - 59,50Eur&lt;br /&gt;
&lt;br /&gt;
Alle Details zu der Sammelbestellung ist weiter oben bei der [[WordClock_mit_WS2812#WC12h_Sammelbestellung_LED_Stripes_und_Zwischenb.C3.B6den|WC12h Sammelbestellung beschrieben]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== WC24h Sammelbestellung Frontplatten ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:WordClock24h-Frontplatte-800x800.png|400px|right|WordClock24h]]&lt;br /&gt;
&lt;br /&gt;
Die Frontplatte beinhalt über ein Dutzend Sprachvarianten:&lt;br /&gt;
&lt;br /&gt;
* hh mm (12)&lt;br /&gt;
* hh mm (24)&lt;br /&gt;
* hh und mm (12)&lt;br /&gt;
* hh und mm (24)&lt;br /&gt;
* mm nach hh (12+)&lt;br /&gt;
* mm nach hh (24)&lt;br /&gt;
* Ossi/Berlin (12)&lt;br /&gt;
* Ossi/Berlin (12+)&lt;br /&gt;
* Oesi (12)&lt;br /&gt;
* Oesi (12+)&lt;br /&gt;
* Rhein/Ruhr (12)&lt;br /&gt;
* Rhein/Ruhr (12+)&lt;br /&gt;
* Schwaben (12)&lt;br /&gt;
* Schwaben (12+)&lt;br /&gt;
* Wessi (12)&lt;br /&gt;
* Wessi (12+)&lt;br /&gt;
* Countdown bis Mitternacht&lt;br /&gt;
* Temperatur&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stand der Sammelbestellung August 2016:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Aus der letzten Sammelbestellung sind noch Frontplatten übrig. Interessenten können sich bei mir (Benutzer [http://www.mikrocontroller.net/user/show/ukw &#039;&#039;&#039;ukw&#039;&#039;&#039;]) melden. &lt;br /&gt;
&lt;br /&gt;
Die Platten bestehen aus einer Plexi-Scheibe (3mm) in der Größe 45cm x 45cm und werden im Siebdruckverfahren bedruckt. Dabei wird die Scheibe von hinten zunächst mit einer Mehrfach-Schicht schwarzer Farbe bedruckt, damit sie lichtdicht ist. Lediglich die Buchstaben und Minutenpunkte bleiben frei. Anschließend kommt noch optional eine dünne weiße Schicht komplett deckend über die schwarze Farbe, sodass sie als Diffusor für die Buchstaben und Minutenpunkte wirkt.&lt;br /&gt;
&lt;br /&gt;
Diese Variante mit 16x18 Buchstaben heisst hier &#039;WC24h&#039;:&lt;br /&gt;
&lt;br /&gt;
  - WC24h: 45cm x 45cm mit weißer Schicht als Diffusor&lt;br /&gt;
&lt;br /&gt;
Der Preis dafür beträgt pro Stück 44,- EUR.&lt;br /&gt;
&lt;br /&gt;
Hinzu kommen noch 10 EUR für Verpackungs- und Versandkosten für bis zu 4 Stück in einem Paket. Bei Versand in ein EU-Land kommen weitere 10 EUR hinzu, also insgesamt 20 EUR.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Frontplatte wird mit einer kaum wahrnehmbaren Schutzfolie auf der Vorder- &#039;&#039;&#039;und&#039;&#039;&#039; Rückseite geliefert. Wenn man das nicht weiß, kann es so aussehen, als ob die Frontplatte &amp;quot;verkratzt&amp;quot; sei. Diese &amp;quot;Kratzer&amp;quot; sind aber nur auf der Schutzfolie, nicht auf der Platte selbst. Daher hier nochmal der ausdrückliche Hinweis: Bitte die Schutzfolie unmittelbar vor der Montage abziehen und sich dann freuen :-)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kleber welcher den Aufdruck nicht beschädigt:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- UHU plus endfest 300 2K-Epoxidkleber&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
=== Historie der Software-Versionen ===&lt;br /&gt;
&lt;br /&gt;
==== Android App ====&lt;br /&gt;
&lt;br /&gt;
Version 2.1.0:&lt;br /&gt;
&lt;br /&gt;
* Alle aktuell vorgesehenen Animationen können nun vollständig über die App ausgewählt werden&lt;br /&gt;
* RGBW-LED-Unterstützung: Unter dem Menü &amp;quot;Einstellungen&amp;quot; kann nun eingestellt werden, dass RGBW-LEDs eingesetzt werden.&lt;br /&gt;
* Die Oberfläche ist nun &amp;quot;scrollable&amp;quot;, kann also bei kleineren Mobilgeräten, wo nicht alles draufpasst, gerollt werden.&lt;br /&gt;
&lt;br /&gt;
Version 1.9.0:&lt;br /&gt;
&lt;br /&gt;
* Neue Animationen Snake, Teletype und Cube nun auch über die App einstellbar&lt;br /&gt;
&lt;br /&gt;
Version 1.8.0:&lt;br /&gt;
&lt;br /&gt;
* Manuelles Stellen von Datum/Uhrzeit über Menü -&amp;gt; Synchronisieren&lt;br /&gt;
* Auswählen der Farbanimation &amp;quot;Rainbow&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Version 1.7.0:&lt;br /&gt;
&lt;br /&gt;
* Button für Temperaturanzeige eingebaut&lt;br /&gt;
&lt;br /&gt;
==== ESP8266 ESP-01 Firmware ====&lt;br /&gt;
&lt;br /&gt;
Version 2.2.0:&lt;br /&gt;
&lt;br /&gt;
* Diverse Verbesserungen bei der Kommunikation zwischen STM32 und ESP8266&lt;br /&gt;
&lt;br /&gt;
Version 2.1.0b:&lt;br /&gt;
&lt;br /&gt;
* Bugfix - Umlaute in Wettertexten wurden nicht korrekt gezeigt. Konvertierung der Umlaute von openweathermap-Inhalten von UTF8 nach ISO8859 nachgeholt.&lt;br /&gt;
&lt;br /&gt;
Version 2.1.0a:&lt;br /&gt;
&lt;br /&gt;
* Bugfix - beim Wechseln in den AP-Modus wurde fälschlicherweise &amp;quot;0.0.0.0&amp;quot; als IP-Adresse statt 192.168.4.1 ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Version 2.1.0:&lt;br /&gt;
&lt;br /&gt;
* Auslagerung des HTML-Codegenerators auf den ESP8266&lt;br /&gt;
* Auslagerung der Schnittstelle zu Android-Geräten (Kommando-Interpreter) auf den ESP8266&lt;br /&gt;
&lt;br /&gt;
Version 1.2.0:&lt;br /&gt;
&lt;br /&gt;
* Neu: Ausgabe des WLAN-Modus: WLAN-Client oder AP&lt;br /&gt;
&lt;br /&gt;
Version 1.1.0:&lt;br /&gt;
&lt;br /&gt;
* Fehler im NTP-Client behoben: Bei vorherigen Timeouts kann eine alte Uhrzeit ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
==== STM32 WordClock Software ====&lt;br /&gt;
&lt;br /&gt;
===== Version 2.2.0 =====&lt;br /&gt;
&lt;br /&gt;
* Bugfix: Die Anzeigedauer der Temperatur ist nun nicht mehr von der Dauer der Animation abhängig.&lt;br /&gt;
* Bugfix Ambilight: Nach &amp;quot;Test Display&amp;quot; wurde die ursprüngliche Helligkeit des Ambilight nicht wieder hergestellt.&lt;br /&gt;
* Bugfix AP-Mode: Durch einen Timeout bei der ESP8266-Kommmunikation wurden die Vorgabewerte fürs Web-Interface nicht übertragen.&lt;br /&gt;
* RX-Ringbuffer ESP8266 -&amp;gt; STM32 von 128 auf 256 vergrößert.&lt;br /&gt;
* Timeout-Behandlung bei der Kommunikation zwischen STM32 und ESP8266 verbessert. &lt;br /&gt;
* Web-Interface: Checkbox &amp;quot;Use display colors&amp;quot; wurde auf die Seite &amp;quot;Ambilight&amp;quot; verschoben.&lt;br /&gt;
* WC12h Bugfix: Umlaute werden in der Laufschrift immer als Großbuchstaben angezeigt.&lt;br /&gt;
* WC12h: Font zur Laufschriftanzeige durch besser lesbaren Font ersetzt.&lt;br /&gt;
* WC24h: Korrektur der Anzeige von &amp;quot;ES IST EINS UHR&amp;quot; nach &amp;quot;ES IST EIN UHR&amp;quot; in bestimmten Anzeigemodi.&lt;br /&gt;
* Bugfix SK6812: Rot und Grün vertauscht.&lt;br /&gt;
* Bugfix LDR: Nach dem Setzen eines neuen LDR-Max-Wertes wurde dieser nicht zurück an das Web-Interface übertragen und deshalb dort (bis zum nächsten Reboot) ein alter Max-Wert angezeigt.&lt;br /&gt;
&lt;br /&gt;
===== Version 2.1.0 =====&lt;br /&gt;
&lt;br /&gt;
* Auslagerung des HTML-Codegenerators auf den ESP8266, damit Code-Ersparnis auf dem STM32 von 14KB Flash.&lt;br /&gt;
* Auslagerung der Schnittstelle zu Android-Geräten (Kommando-Interpreter) auf den ESP8266&lt;br /&gt;
* Optional: Laufschrift mit dem aktuellen Wetter (über openweathermap.org)&lt;br /&gt;
* Unterstützung SK6812 (optional, RGBW-LEDs)&lt;br /&gt;
* Verbesserungen bei der LDR-Umgebungshelligkeitsmessung&lt;br /&gt;
* Wegfall der Schaltfläche &amp;quot;Save all&amp;quot; im Web-Interface. Nun werden sämtliche geänderten Konfigurationsdaten sofort auch im EPROM neu gespeichert.&lt;br /&gt;
* Bugfix: DS18xx-Temperatur-Korrekturwert wurde bisher als RTC-Temperatur-Korrekturwert im EEPROM gespeichert.&lt;br /&gt;
* Bugfix: Bei der manuellen Eingabe des aktuellen Datums/Uhrzeit im Webinterface wurde das Jahr bisher als &amp;quot;Zufallszahl&amp;quot; gespeichert, wenn der ESP8266 im AP-Modus läuft, weil kein WLAN vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
===== Version 2.0.7 =====&lt;br /&gt;
&lt;br /&gt;
* URL-Fehler im Web-Interface korrigiert für Rainbow-Geschwindigkeit und Temperatur-Anzeige-Intervall&lt;br /&gt;
* Fehlende Berücksichtung der Animation-Geschwindigkeiten in &amp;quot;Random&amp;quot; eingebaut&lt;br /&gt;
* Default-Werte für einstellbare Verzögerungen der Animationen auf WC12h verdoppelt&lt;br /&gt;
&lt;br /&gt;
===== Version 2.0.6 =====&lt;br /&gt;
&lt;br /&gt;
* Neue Animation &amp;quot;Drop&amp;quot;&lt;br /&gt;
* Neue Animation &amp;quot;Squeeze&amp;quot;&lt;br /&gt;
* Geschwindigkeitsregler für sämtliche Animationen&lt;br /&gt;
* Angaben von Favoriten für die Animationen, die dann bei der Random-Animation ausgewählt werden sollen&lt;br /&gt;
* Geschwindigkeitsregler für Rainbow - sowohl für Display als auch für Ambilight&lt;br /&gt;
* Angabe von Temperaturkorrekturen für DS18xx als auch für RTC in Schritten von 0,5°C bei Selbsterwärmung&lt;br /&gt;
* LED-Kalibrierung durch Messen vom dunkelsten und hellsten Wert manuell im Web-Interface möglich - ungetestet!&lt;br /&gt;
* Clock und Clock2 auf dem Ambilight laufen nun je nach Einstellung in der Display-Farbe oder selbstständig in der Ambilight-Farbe&lt;br /&gt;
* Temperatur-Anzeige auf der WC12h nun nicht mehr als Laufschrift, sondern durch zwei große Ziffern auf dem Display. Wenn die Temperatur xx,5°C und nicht xx,0°C beträgt, wird das &amp;quot;standesgemäß&amp;quot; auf der WC12h durch zwei leuchtende Minuten-LEDs angezeigt. Die Anzeige der Minuten-LEDs ist ungetestet.&lt;br /&gt;
* Angabe eines Intervalls, wie oft die Temperatur automatisch eingeblendet werden soll. Bei &amp;quot;1&amp;quot; wird die Temperatur einmal pro Minute eingeblendet, nämlich immer um hh:mm:30. Bei Angabe von z.B. &amp;quot;5&amp;quot; passiert das dann halt nur noch alle 5 Minuten. Wird 0 oder nichts eingegeben, wird keine Temperatur automatisch eingeblendet.&lt;br /&gt;
&lt;br /&gt;
===== Version 2.0.5 =====&lt;br /&gt;
&lt;br /&gt;
* Neue Animation: &amp;quot;Matrix&amp;quot;.&lt;br /&gt;
* Bugfix: Fehler in Timerfunktion am Wochenende behoben.&lt;br /&gt;
* Bugfix: Fehlerhafte Offset-Berechnung in Ambilight-Animation &amp;quot;Clock2&amp;quot; korrigiert.&lt;br /&gt;
&lt;br /&gt;
===== Version 2.0.4 =====&lt;br /&gt;
&lt;br /&gt;
* Bugfix: Ambilight leuchtete im Synchronmodus in Rainbow-Animation nach Abschalten durch Timer weiter. Die LEDs werden nun komplett abgeschaltet.&lt;br /&gt;
* Bugfix: Getrennte Helligkeitssteuerung des Ambilights wurde durch Helligkeitssteuerung des Displays beeinträchtigt. Nun sind beide Helligkeiten komplett unabängig.&lt;br /&gt;
* Bugfix: Wenn die Uhr gem. Timer aus ist, liefen einige Animationen teilweise trotzdem alle 5 Minuten. Ist nun behoben.&lt;br /&gt;
* Bugfix: Keine Webserver-Kommunikation möglich, wenn der ESP-01 im AP-Modus ist und in der RTC die Uhrzeit noch nicht initialisiert wurde. Ist nun behoben.&lt;br /&gt;
* Neu: Anzeige von Laufschriften&lt;br /&gt;
* Ambilight: Sekundenzeiger nun auch für 20 oder 30 LEDs, die Zahl der Ambilight-LEDs ist nun im Webinterface konfigurierbar.&lt;br /&gt;
* Ambilight: Neue Sekundenanzeige mit zunehmendem/abnehmendem Vollkreis.&lt;br /&gt;
* Ambilight: Sekundenzeiger-Animationen: Start-LED nun über Webinterface konfigurierbar&lt;br /&gt;
* Web-Konfiguration: Erweiterung der Schieberegler um numerische Anzeige (zwecks besserer Reproduzierfähikeit von RGB-Werten)&lt;br /&gt;
&lt;br /&gt;
===== Version 2.0.3 =====&lt;br /&gt;
&lt;br /&gt;
* Bugfix: einminütiges Abschalten des Displays nach Cube-Animation behoben.&lt;br /&gt;
&lt;br /&gt;
===== Version 2.0.2 =====&lt;br /&gt;
&lt;br /&gt;
* Um unnötige Animationen zur vollen Minute bei der WC12h zu vermeiden, wird die DCF77-Zeit nun um hh:mm:15 verzögert ausgeliefert. Timeserver-Zugriffe pendeln sich im Laufe der Zeit auf hh:mm:30 (alle 3780 Sekunden) ein, RTC-Zugriffe werden jede Minute um hh:mm:45 ausgeführt.&lt;br /&gt;
* Power-Taste auf der IR-Fernbedienung kann nun beim Anlernen als Skip-Taste verwendet werden.&lt;br /&gt;
* DCF77-Messung: Die Zeit der vorherigen Minute wird nun als zusätzliche Plausibilitätsprüfung herangezogen&lt;br /&gt;
* Snake-Animation: Es werden nun gezielt die Wörter der alten Uhrzeit &amp;quot;gefressen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== Version 2.0.1 =====&lt;br /&gt;
&lt;br /&gt;
* Konfiguration von &amp;quot;ES IST&amp;quot;-Anzeige korrigiert: nun auch jede halbe Stunde.&lt;br /&gt;
* Bugfix bei der &amp;quot;ES IST&amp;quot;-Anzeige auf WC12h: Die Anzeige wird nun 5 Minuten lang beibehalten - und nicht nur ein Minute.&lt;br /&gt;
* Bugfix: Farbanimationen bzw. Ambilight-Animationen verhinderten das Abschalten des Ambilights bei Power-Off.&lt;br /&gt;
* Umgebungs-Helligkeitsmessungen werden nun nur noch durchgeführt, wenn keine Übergangs-Animation läuft.&lt;br /&gt;
* Anzahl der möglichen Ambilight-LEDs nun bei Verwendung eines Nucleo-Board gleich 100, sonst 60.&lt;br /&gt;
* Power-Off-Signal, um LED-Spannungsversorgung abzuschalten, nun beim Mini-Board (STM32F103) auf Pin PB0.&lt;br /&gt;
* Fading-Effekt durch kleinere Farbänderungsschritte verstärkt.&lt;br /&gt;
&lt;br /&gt;
===== Version 2.0.0 =====&lt;br /&gt;
&lt;br /&gt;
* Bugfix: Abschalten des Ambilights bei Power-Off-Befehl funktionierte bisher nicht.&lt;br /&gt;
* Bugfix: Ein-/Ausschalten der Spannungsversorgung für LED-Stripe.&lt;br /&gt;
* Anzeige des Wortes &amp;quot;UHR&amp;quot; zur vollen Stunde hinzugefügt - dort, wo es bisher fehlte. Betrifft nur WC24h.&lt;br /&gt;
* Neue Einstellung, ob &amp;quot;ES IST&amp;quot; permanent leuchten soll oder nur zur vollen Stunde.&lt;br /&gt;
* Verbesserung der Rainbow-Animation (Dank an Ralf Hammeran).&lt;br /&gt;
* Dynamische Anpassung der automatischen Helligkeitssteuerung an die Umgebungshelligkeit (Dank an Ralf Hammeran).&lt;br /&gt;
* Neue Übergangs-Animationen: &amp;quot;Snake&amp;quot;, &amp;quot;Teletype&amp;quot; und &amp;quot;Cube&amp;quot;.&lt;br /&gt;
* Anzahl der möglichen Ambilight-LEDs auf 60 Stück begrenzt, siehe auch Ambilight-Modus &amp;quot;Clock&amp;quot; (umlaufende Sekundenanzeige).&lt;br /&gt;
* Neue Seite &amp;quot;Ambilight&amp;quot; in der Web-Konfiguration.&lt;br /&gt;
* Neue Einstellung, ob Ambilight-Farben synchron zu den Display-Farben angepasst werden sollen oder separat gesteuert werden sollen.&lt;br /&gt;
* Neue separate Farbauswahl und Helligkeitssteuerung für Ambilight.&lt;br /&gt;
* Neuer Ambilight-Modus &amp;quot;Clock&amp;quot;: Umlaufende Sekundenanzeige.&lt;br /&gt;
* Neuer Ambilight-Modus &amp;quot;Rainbow&amp;quot;: Regenbogenfarben-Animation jetzt auch im Ambilight möglich.&lt;br /&gt;
* Diverse kleinere Bugfixes&lt;br /&gt;
&lt;br /&gt;
===== Version 1.9.0 =====&lt;br /&gt;
&lt;br /&gt;
* Neu: Automatischer Farbwechselmodus: Rainbow&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.9 =====&lt;br /&gt;
&lt;br /&gt;
* Stellen der Uhrzeit über Web-Interface&lt;br /&gt;
* Konfiguration über Web-Interface, ob ESP8266 im AP- oder WLan-Client-Modus arbeiten soll&lt;br /&gt;
* Einstellung SSID und Key für AP-Modus&lt;br /&gt;
* Steuerung der LED-Stripe-Spannungsversorgung (ungetestet)&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.8 =====&lt;br /&gt;
&lt;br /&gt;
* Für WC12h kleineren Font (5x8) für Laufschriften zwecks besserer Lesbarkeit integriert&lt;br /&gt;
* Auswertung des Temperatur-Anzeige-Kommandos per Android App (ab Version 1.7.0)&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.7 =====&lt;br /&gt;
&lt;br /&gt;
* Fehler in der Wochentagsberechnung korrigiert&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.6 =====&lt;br /&gt;
&lt;br /&gt;
* Verzögerte Reaktion der Minuten-LEDs (WC12h) bei Farbwechsel behoben&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.5 =====&lt;br /&gt;
&lt;br /&gt;
* STM32F103 Mini Development Board: Abschalten des JTAGS, um PB3 u.a. als GPIO für z.B. [[IRMP]] nutzen zu können (nicht relevant für Nucleo-Variante)&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.4 =====&lt;br /&gt;
&lt;br /&gt;
* Korrektur der ESP8266 Flash-Pin-Definition für das STM32F103 Mini Development Board (nicht relevant für Nucleo-Variante)&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.3 =====&lt;br /&gt;
&lt;br /&gt;
* Bugfix bei der Temperatur-Anzeige: Es wurde immer die DS3231-Temperatur statt der DS128xx-Temperatur gezeigt&lt;br /&gt;
* Falsche Temperatur-Anzeige im Modus &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
* Bezeichnungen der Anzeigemodi für WC24 gekürzt&lt;br /&gt;
* Manuelle Aktivierung des LDRs aus Weboberfläche entfernt. LDR-Messung ist nun immer aktiv, egal ob angeschlossen oder nicht&lt;br /&gt;
* Unterstützung des DCF77-Moduls wieder eingebaut&lt;br /&gt;
* Anzahl der Nachtschaltzeiten auf 8 erhöht - unter Berücksichtigung der Wochentage&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.2 =====&lt;br /&gt;
&lt;br /&gt;
* Hangup-Problem bei Aktivieren des LDRs beseitigt&lt;br /&gt;
* Neu: Nachtschaltzeiten in der Weboberfläche&lt;br /&gt;
* Optimierung des HTML-Code-Generators&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.1 =====&lt;br /&gt;
&lt;br /&gt;
* Fehler bei HTTP-Get-Parameter-Übergabe von Leerzeichen in SSID behoben&lt;br /&gt;
&lt;br /&gt;
===== Version 1.8.0 =====&lt;br /&gt;
&lt;br /&gt;
* Spezielle Firmware für ESP8266-Modul, da die Espressif-Firmware zu instabil ist und zuviele Varianten existieren&lt;br /&gt;
* Kommunikationsprotokoll an neue ESP-Firmware angepasst&lt;br /&gt;
* Direktes Flashen des ESP8266 in der WordClock-Schaltung über das verwendete STM32-Board&lt;br /&gt;
* Diverse kleinere Bugfixes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Änderung: Damit das ESP8266-Modul direkt über das STM32-Board geflasht werden kann, ist die Verbindung ESP8266-GPIO0 zu STM32 PA4 herzustellen, siehe auch: [[WordClock_mit_WS2812#Anschluss_ESP8266|Anschluss ESP8266]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Version 1.7.0 =====&lt;br /&gt;
&lt;br /&gt;
* [[MCURSES]]-Monitor durch [[WordClock_mit_WS2812#Web-Interface|WEB-Server]] ersetzt&lt;br /&gt;
* Laufschriften-Ausgabe der aktuellen IP-Adresse&lt;br /&gt;
* Kleinere Änderungen/Optimierungen&lt;br /&gt;
* DCF77-Decoder mangels Interesse/Notwendigkeit entfernt&lt;br /&gt;
* Laufschriften-Ausgabe auf dem LED-Display beim Anlernen einer IR-Fernbedienung&lt;br /&gt;
&lt;br /&gt;
===== Version 1.6.3 =====&lt;br /&gt;
&lt;br /&gt;
* WordClock12h: Anzeige der Temperatur durch Laufschrift&lt;br /&gt;
* Neue Anschlusspins für TSOP und DS18xxx am STM32F103&lt;br /&gt;
* Optimierung des WS2812-DMA-Transfers für STM32F103&lt;br /&gt;
* Temperaturmessung mit DS3231, wenn kein DS18xx angeschlossen&lt;br /&gt;
* Umstrukturierung der C-Sources&lt;br /&gt;
&lt;br /&gt;
===== Version 1.6.2 =====&lt;br /&gt;
&lt;br /&gt;
* Problem beim Verbindungsaufbau Andoid App -&amp;gt; WordClock behoben&lt;br /&gt;
&lt;br /&gt;
===== Version 1.6.1 =====&lt;br /&gt;
&lt;br /&gt;
* Zusätzliche Unterstützung der &amp;quot;klassischen&amp;quot; WordClock12h mit 10x11 LEDs&lt;br /&gt;
* Anpassung der [[MCURSES]]-Monitor-Oberfläche an WordClock12h-Variante&lt;br /&gt;
* Portierung auf STM32F103 abgeschlossen (IDE-Projekt folgt mit 1.6.2)&lt;br /&gt;
* Zusätzliche Unterstützung von neueren [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Firmware-Versionen 1.0.1, 1.4.0 und 1.5.0.&lt;br /&gt;
* Optionales [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Debugging auf zusätzlichem USART - nur für Entwickler&lt;br /&gt;
&lt;br /&gt;
===== Version 1.6.0 =====&lt;br /&gt;
&lt;br /&gt;
* Neben dem TIME-Protokoll (TCP) wird nun auch NTP (UDP) unterstützt - für ESP-Firmware-Versionen ab 0018000902.&lt;br /&gt;
&lt;br /&gt;
===== Version 1.5.9 =====&lt;br /&gt;
&lt;br /&gt;
* Unterstützung der neueren ESP Versionen 0020000903 und AT 0.21.0.0&lt;br /&gt;
* Vergrößerung der UART-FIFOs&lt;br /&gt;
* Verallgemeinerung der UART-Funktionen zwecks besserer Konfiguration&lt;br /&gt;
* Überarbeitung der [[MCURSES]]-Monitor-Oberfläche&lt;br /&gt;
&lt;br /&gt;
===== Version 1.5.8 =====&lt;br /&gt;
&lt;br /&gt;
* Bugfix: Fehler in 1.5.7 (Falsche Behandlung des DMA-Buffers) wurde behoben&lt;br /&gt;
* Neu: Bis zu 100 weitere LEDs hinter der Buchstabenkette werden als Ambilight angesteuert&lt;br /&gt;
&lt;br /&gt;
===== Version 1.5.7 =====&lt;br /&gt;
&lt;br /&gt;
* Bug in uart-Code für STM32F103 beseitigt - irrelevant für Nucleo STM324xx&lt;br /&gt;
* Timing für WS2812B angepasst, es werden nun WS2812 und WS2812B unterstützt&lt;br /&gt;
* Anzahl der möglichen [[WordClock_mit_WS2812#WS2812|WS2812]]-LEDs ist nun variabel gehalten. Das ist Voraussetzung für das demnächst verfügbare Ambilight.&lt;br /&gt;
&lt;br /&gt;
===== Version 1.5.6 =====&lt;br /&gt;
&lt;br /&gt;
* Unterstützung von [[WordClock_mit_WS2812#ESP8266|ESP8266]] mit neuerer Firmware, welche \r\n statt \r erwartet&lt;br /&gt;
* Unterstützung von verschiedenen Baudraten des [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Moduls&lt;br /&gt;
* Automatische Umschaltung von 9600Bd auf 115200Bd beim [[WordClock_mit_WS2812#ESP8266|ESP8266]]&lt;br /&gt;
&lt;br /&gt;
===== Version 1.5.5 =====&lt;br /&gt;
&lt;br /&gt;
* Optimierungen im LED-Display-Code&lt;br /&gt;
* Diverse Anpassungen an STM32F103&lt;br /&gt;
&lt;br /&gt;
===== Version 1.5.4 =====&lt;br /&gt;
&lt;br /&gt;
* Automatische IR-Anlernroutine in den ersten 3 Sekunden ab Programmstart&lt;br /&gt;
* Kleiner Bugfix bei den möglichen Helligkeitsstufen (Dimmer)&lt;br /&gt;
&lt;br /&gt;
===== Version 1.5.2 =====&lt;br /&gt;
&lt;br /&gt;
* Anzeige der Firmware-Version des [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Moduls im [[MCURSES]]-Monitor&lt;br /&gt;
* Korrektur in den Worttabellen für die Wörter ACHT und VIER in der zehnten Reihe&lt;br /&gt;
&lt;br /&gt;
===== Version 1.5.1 =====&lt;br /&gt;
&lt;br /&gt;
* Manuelle Helligkeitsregelung per [[MCURSES]]-Monitor / IR-Fernbedienung / [[WordClock_mit_WS2812#Android_App|Android App]] eingebaut&lt;br /&gt;
* Automatische Helligkeitsregelung per [[WordClock_mit_WS2812#LDR|LDR]] nun über [[MCURSES]]-Monitor / IR-Fernbedienung / [[WordClock_mit_WS2812#Android_App|Android App]] ein-/ausschaltbar&lt;br /&gt;
&lt;br /&gt;
===== Version 1.4.2 =====&lt;br /&gt;
&lt;br /&gt;
* Die geladenen aus dem [[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROM]] RGB-Werte wurden nach dem Boot nicht mehr sofort übernommen. Ist korrigiert.&lt;br /&gt;
&lt;br /&gt;
===== Version 1.4.1 =====&lt;br /&gt;
&lt;br /&gt;
* Initialisierung des ADC korrigiert&lt;br /&gt;
* Automatische Helligkeitsregelung dunkelt nicht mehr so stark ab.&lt;br /&gt;
&lt;br /&gt;
===== Version 1.4.0 =====&lt;br /&gt;
&lt;br /&gt;
* Automatische Helligkeitsregelung mittels [[WordClock_mit_WS2812#LDR|LDR]]&lt;br /&gt;
* Helligkeitsstufen von 32 auf 64 erhöht&lt;br /&gt;
* LED-Testprogramm eingebaut (Taste &#039;T&#039; im [[MCURSES]]-Monitor)&lt;br /&gt;
* Anzeige des [[WordClock_mit_WS2812#Temperatur-Sensor|DS18xxx]]-Typs im [[MCURSES]]-Monitor)&lt;br /&gt;
* Unterstützung für Status-LED &#039;&#039;&#039;(beachte geändertes LED-Anschluss-Schema!)&#039;&#039;&#039;&lt;br /&gt;
* [[WordClock_mit_WS2812#Android_App|Android App]] an 64 Helligkeitsstufen angepasst&lt;br /&gt;
&lt;br /&gt;
===== Version 1.3.1 =====&lt;br /&gt;
&lt;br /&gt;
* Sporaisches Hangup-Problem nach Auslesen der Temperatur behoben&lt;br /&gt;
* Fehler bei der Erkennung des Family-Codes für [[WordClock_mit_WS2812#Temperatur-Sensor|DS18xxx]] beseitigt&lt;br /&gt;
* Optimierung des Zeitverhaltens beim Zugriff auf OneWire-Bus&lt;br /&gt;
* Optimierung des [[WordClock_mit_WS2812#WS2812|WS2812]]-Codes&lt;br /&gt;
&lt;br /&gt;
===== Version 1.3.0 =====&lt;br /&gt;
&lt;br /&gt;
* Unterstützung von [[WordClock_mit_WS2812#Temperatur-Sensor|DS18xxx]]-Temperatursensoren&lt;br /&gt;
* Temperatur-Anzeige innerhalb +10°C und 39,5°C&lt;br /&gt;
* Korrektur Sommerzeitumstellung&lt;br /&gt;
* Keine Unterstützung mehr von STM32F4-Discovery&lt;br /&gt;
&lt;br /&gt;
===== Version 1.2.0 =====&lt;br /&gt;
&lt;br /&gt;
* IRMP-Konfigurationsfehler behoben&lt;br /&gt;
&lt;br /&gt;
===== Version 1.1.0 =====&lt;br /&gt;
&lt;br /&gt;
* Animationen hinzugefügt&lt;br /&gt;
* Neue Tabellen für Uhrzeit und Temperatur&lt;br /&gt;
&lt;br /&gt;
===== Version 1.0.0 =====&lt;br /&gt;
&lt;br /&gt;
* Test auf verschiedene Adressen des I2C-[[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROMs]]&lt;br /&gt;
* [[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROM]]-Speicherplatzverbrauch minimiert&lt;br /&gt;
* [[WordClock_mit_WS2812#RTC_und_EEPROM|RTC]] DS3231-Routinen auf DS1307 verallgemeinert&lt;br /&gt;
* Network Listener (UDP) zum Fernsteuern der Uhr über WLAN&lt;br /&gt;
* [[WordClock_mit_WS2812#Android_App|Android App]] zum Fernsteuern der Uhr (Ein/Aus, Farben, Anzeigemodus)&lt;br /&gt;
&lt;br /&gt;
===== Version 0.9.1 =====&lt;br /&gt;
&lt;br /&gt;
* [[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROM]]-Hexdump im [[MCURSES]]-Monitor eingebaut&lt;br /&gt;
* Zusätzliche Waitstates beim Beschreiben des [[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
===== Version 0.9 =====&lt;br /&gt;
&lt;br /&gt;
* Zusätzlicher Anschluss von RST und CH_PD des [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Moduls&lt;br /&gt;
* Verbesserung der [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Konfiguration dank Hardware-Reset&lt;br /&gt;
* Nutzung des Stromsparmodus im [[WordClock_mit_WS2812#ESP8266|ESP8266]], wenn die Anzeige abgeschaltet wird&lt;br /&gt;
* Konfiguration der Zeitzone über [[MCURSES]]-Monitor&lt;br /&gt;
* Test und Überarbeitung der [[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROM]] und [[WordClock_mit_WS2812#RTC_und_EEPROM|RTC]]-Funktionen&lt;br /&gt;
* Synchronisation der [[WordClock_mit_WS2812#RTC_und_EEPROM|RTC]]-Zeit mit dem µC-Timer&lt;br /&gt;
* Speichern folgender Daten im [[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROM]]:&lt;br /&gt;
&lt;br /&gt;
     EEPROM-Version&lt;br /&gt;
     IRMP-Daten einer angelernten IR-Fernbedienung&lt;br /&gt;
     Aktuell eingestellte Farben und Anzeigemodus&lt;br /&gt;
     IP-Adresse des Timeservers&lt;br /&gt;
     Zeitzone&lt;br /&gt;
&lt;br /&gt;
===== Version 0.8 =====&lt;br /&gt;
&lt;br /&gt;
* Neue IR-Fernbedienungs-Tasten POWER und OK&lt;br /&gt;
* Einbau einer konfigurierbaren &amp;quot;Nachtzeit&amp;quot;, in der sich die Uhr selbstständig abschaltet&lt;br /&gt;
* Konfiguration des Timeservers über [[MCURSES]]-Monitor&lt;br /&gt;
* Speichern/Laden sämtlicher Konfigurations-Daten in externem EEPROM&lt;br /&gt;
* Initialisierung des [[WordClock_mit_WS2812#ESP8266|ESP8266]] verbessert (warten, bis nach PowerOn eine WLAN-Verbindung besteht)&lt;br /&gt;
* Aufteilung der Anzeige-Logik und des [[MCURSES]]-Monitors auf dsp.c und monitor.c&lt;br /&gt;
* Aufteilung der [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Routinen auf esp8266.c (low-level) und timeserver.c (high-level)&lt;br /&gt;
* Diverse Optimierungen - u.a. durch Einsatz von uint_fast8_t&lt;br /&gt;
* Diverse Bugfixes&lt;br /&gt;
&lt;br /&gt;
===== Version 0.7.1 =====&lt;br /&gt;
&lt;br /&gt;
* Portierung der Software auf STM32F411RE [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]&lt;br /&gt;
&lt;br /&gt;
===== Version 0.7 =====&lt;br /&gt;
&lt;br /&gt;
* Portierung der Software auf STM32F401RE [[WordClock_mit_WS2812#STM32F401RE_Nucleo_und_STM32F411RE_Nucleo|Nucleo-Board]]&lt;br /&gt;
* uart2.c generalisiert auf uart.c (verschiedene UARTs möglich)&lt;br /&gt;
* Bugfix im UART-Ringbuffer-Code (Interrupt-Sperre)&lt;br /&gt;
* Anzeige der Online-Devices ([[WordClock_mit_WS2812#ESP8266|ESP8266]], DCF77, EEPROM, [[WordClock_mit_WS2812#RTC_und_EEPROM|RTC]]) im Terminal&lt;br /&gt;
* Verschiedene Optimierungen&lt;br /&gt;
&lt;br /&gt;
===== Version 0.6 =====&lt;br /&gt;
&lt;br /&gt;
* Konfiguration des WLAN-Moduls (SSID &amp;amp; Key) nun über Terminal statt fest im Code verdrahtet.&lt;br /&gt;
* Einstellung der Zeitzone möglich. Standard ist GMT+1, also mitteleuropäische Zeit.&lt;br /&gt;
* DCF77- und [[WordClock_mit_WS2812#ESP8266|ESP8266]]-Modul-Aktivierung automatisch - keine Einstellung mehr im Code notwendig.&lt;br /&gt;
* I2C-Lib hinzugefügt (noch ungetestet und daher noch nicht verwendet).&lt;br /&gt;
* I2C-[[WordClock_mit_WS2812#RTC_und_EEPROM|EEPROM]]-Modul hinzugefügt (noch ungetestet und daher noch nicht verwendet).&lt;br /&gt;
* I2C-[[WordClock_mit_WS2812#RTC_und_EEPROM|RTC]]-Modul (DS3231) hinzugefügt (noch ungetestet und daher noch nicht verwendet).&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Hilfe:Bearbeitungshilfe&amp;diff=93660</id>
		<title>Hilfe:Bearbeitungshilfe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Hilfe:Bearbeitungshilfe&amp;diff=93660"/>
		<updated>2016-08-19T19:40:44Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Änderung 93659 von 201.219.210.26 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Umfangreiche Hilfe ==&lt;br /&gt;
Umfangreiche Hilfe befindet sich auch hier: &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[http://de.wikipedia.org/wiki/Hilfe:Bearbeiten de.Wikipedia.org/wiki/Hilfe:Bearbeiten]&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
== Überschriften ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== Überschrift ==&lt;br /&gt;
=== Unter-Überschrift ===&lt;br /&gt;
==== Unter-Unter-Überschrift ====&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formatierung ==&lt;br /&gt;
Eine ausführlichere Beschreibung der Gliederungs- und Formatierungsmöglichkeiten findet sich im Wikipedia Online-Lexikon: http://de.wikipedia.org/wiki/Hilfe:Bearbeitungshilfe&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;kursiv&#039;&#039;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&#039;&#039;kursiv&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;fett&#039;&#039;&#039;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&#039;&#039;&#039;fett&#039;&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;durchgestrichen&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;lt;s&amp;gt;durchgestrichen&amp;lt;/s&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;sup&amp;gt;hoch&amp;lt;/sup&amp;gt;gestellt&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;lt;sup&amp;gt;hoch&amp;lt;/sup&amp;gt;gestellt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;sub&amp;gt;tief&amp;lt;/sub&amp;gt;gestellt&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;lt;sub&amp;gt;tief&amp;lt;/sub&amp;gt;gestellt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 Festbreitenschrift&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;lt;Leerzeichen&amp;gt;Festbreitenschrift&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
:Eingerückt&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;:Eingerückt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mathematische Formeln mit LaTex ==&lt;br /&gt;
&lt;br /&gt;
[https://de.wikipedia.org/wiki/Hilfe:TeX LaTex auf Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Listen ==&lt;br /&gt;
Es ist zu beachten, dass Leerzeilen zwischen den Aufzählungen auch zu einem semantischen Bruch führen.&lt;br /&gt;
{| border=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;* eins&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* zwei&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;** zwei-eins&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;** zwei-zwei&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* drei&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* eins&lt;br /&gt;
* zwei&lt;br /&gt;
** zwei-eins&lt;br /&gt;
** zwei-zwei&lt;br /&gt;
* drei&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# eins&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# zwei&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
## zwei-eins&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
## zwei-zwei&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# drei&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
# eins&lt;br /&gt;
# zwei&lt;br /&gt;
## zwei-eins&lt;br /&gt;
## zwei-zwei&lt;br /&gt;
# drei&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Einbinden von Sourcecode ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;c&amp;gt;C-Code&amp;lt;/c&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(void) {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;avrasm&amp;gt;AVR Assembler-Code&amp;lt;/avrasm&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
; Mach fast nix!&lt;br /&gt;
.org 0x0000&lt;br /&gt;
Start:&lt;br /&gt;
  LDI r16, 42&lt;br /&gt;
  RJMP Start&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;vhdl&amp;gt;VHDL-Code&amp;lt;/vhdl&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
-- Kommentar in VHDL&lt;br /&gt;
process(clk)&lt;br /&gt;
begin&lt;br /&gt;
  if rising_dedge(clk) then&lt;br /&gt;
    data &amp;lt;= data_in;&lt;br /&gt;
  end if; &lt;br /&gt;
end process;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;Sonstige Texte mmit fester Formatierung&amp;lt;/pre&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hallo Welt!&lt;br /&gt;
    Leerzeichen bleiben, feste Zeichenbreite.&lt;br /&gt;
    Geht auch für ASCII-Art&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfügen von Bildern oder Dateien ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hierfür ist [[Spezial:Anmelden|Anmeldung]] erforderlich!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Bild erstellen ===&lt;br /&gt;
* Fotos müssen nicht von Hand verkleinert werden, sondern können bis 2 MB groß hochgeladen werden.&lt;br /&gt;
* Falls mit einem Vektorzeichenprogramm (z.B. [http://www.inkscape.org/ Inkscape]) gearbeitet wird, bitte das SVG-Format verwenden (erlaubt nachträgliche Bearbeitung durch andere!)&lt;br /&gt;
* Für Zeichnungen/Schaltpläne ist ansonsten das PNG-Format am besten geeignet, JPEG nur für Fotos/Scans verwenden, siehe [[Bildformate]].&lt;br /&gt;
&lt;br /&gt;
=== Datei/Bild hochladen und einfügen ===&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Bebilderung]]&lt;br /&gt;
&lt;br /&gt;
# Dort, wo das Bild erscheinen (oder die Datei verlinkt werden) soll, den Code &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Bild:AVR-Programmer.png]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in den Text einfügen (beliebiger Dateiname, aber mit richtiger Endung!).&lt;br /&gt;
# In der Vorschau oder der gespeicherten Seite auf den Platzhalter-Link &amp;quot;Bild:AVR-Programmer.png&amp;quot; klicken. Vorsicht, nicht gespeicherte Änderungen gehen verloren!&lt;br /&gt;
# Datei auswählen, ggf. Beschreibung eingeben und hochladen (wird automatisch umbenannt).&lt;br /&gt;
&lt;br /&gt;
=== Größe festlegen ===&lt;br /&gt;
&lt;br /&gt;
Folgender Code skaliert das Bild automatisch auf 200 Pixel Breite: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Bild:AVR-Programmer.png|&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;200px&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Für eine ausführlichere Liste und Beschreibung möglicher Features sei auf [http://de.wikipedia.org/wiki/Hilfe:Tabellen Wikipedia Hilfe:Tabellen] und [http://de.wikipedia.org/wiki/Hilfe:Tabellen-Referenz Wikipedia Hilfe:Tabellen-Referenz] verwiesen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Tabellen-Überschrift&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Überschrift links || Überschrift rechts&lt;br /&gt;
|-&lt;br /&gt;
| links oben  || rechts oben&lt;br /&gt;
|-&lt;br /&gt;
| links mitte || rechts mitte&lt;br /&gt;
|-&lt;br /&gt;
| links unten || rechts unten&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Tabellen-Überschrift&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Überschrift links || Überschrift rechts&lt;br /&gt;
|-&lt;br /&gt;
| links oben  || rechts oben&lt;br /&gt;
|-&lt;br /&gt;
| links mitte || rechts mitte&lt;br /&gt;
|-&lt;br /&gt;
| links unten || rechts unten&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um sortierbare Tabellen zu erhalten fügt man statt &amp;lt;tt&amp;gt; class=&amp;quot;wikitable&amp;quot; &amp;lt;/tt&amp;gt; folgendes ein: &amp;lt;tt&amp;gt; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;tabellexyz&amp;quot; &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Richtlinien ==&lt;br /&gt;
&lt;br /&gt;
=== Links zu verwandten Artikeln und externen Seiten ===&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;interne&#039;&#039;&#039; Links zu verwandten Artikeln legt man einen Bereich nach dem folgenden Muster an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Test]]&lt;br /&gt;
* [[Foobar]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ähnlich bei &#039;&#039;&#039;externen&#039;&#039;&#039; Links:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* http://url1/&lt;br /&gt;
* http://url2/&lt;br /&gt;
* [http://url3/ Seite 3 hat einen Linktext]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link für Nachricht an eine Person/Autor ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[http://www.mikrocontroller.net/user/show/Username_aus_Forum Alternativer Text]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/andreas Alternativer Text]&lt;br /&gt;
&lt;br /&gt;
== Artikel löschen ==&lt;br /&gt;
Um eine Seite zur Löschung vorzuschlagen, auf der Seite diesen Baustein hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{{Vorlage:Löschen|Deine Begründung...}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Näheres [http://www.mikrocontroller.net/articles/Kategorie:L%C3%B6schkandidaten hier] oder [http://www.mikrocontroller.net/topic/319411 hier]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tipps für Autoren]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=93650</id>
		<title>Cortex-A</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Cortex-A&amp;diff=93650"/>
		<updated>2016-08-17T22:01:51Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Unterschiede zum Cortex-M erläutert und Tabelle aller Cortex-A&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ARM Cortex-A sind von [[ARM]] konstruierte Prozessorkerne, 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;
ARM bezeichnet die Prozessorlinien folgendermaßen&amp;lt;ref&amp;gt;http://arm.com/products/processors/index.php&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
;ARM Cortex Embedded Processors: Cortex-M Series – Cost-sensitive solutions for deterministic microcontroller applications&lt;br /&gt;
;ARM Cortex Real-time Embedded Processors: Cortex-R Series – Exceptional performance for real-time applications&lt;br /&gt;
;ARM Cortex Application Processors: Cortex™-A and Cortex-A50 Series – High performance processors for open Operating Systems&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 Betriebssystemen Linux (z.B. Debian, Arch Linux ARM, Android), Windows Mobile etc. eingesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ Offizielle Beschreibungen aller Cortex-A Prozessoren von ARM&lt;br /&gt;
|-&lt;br /&gt;
! ARM Core   || Key Benefits&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A5  || &lt;br /&gt;
* ARM’s smallest application processor with Uniprocessor (UP) and Multiprocessor (MP) licensing options &lt;br /&gt;
* Extremely configurable processor with optional NEON, optional FPU and L1 caches configurable from 4K-64KB&lt;br /&gt;
* Full feature set of Cortex-A9 processor at one third the area and power&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A7  || &lt;br /&gt;
* ARMv7-A architectural extensions (40-bit physical addressing, hardware virtualization support)&lt;br /&gt;
* More than 20% improvement in single thread integer performance compared to Cortex-A5&lt;br /&gt;
* Integrated L2 cache subsystem provides improved area efficiency and up to 43% improvements in memory streaming performance&lt;br /&gt;
* Proven successful design, now well matched to the needs of wearable mobile devices and other UI-based consumer products&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A8  || &lt;br /&gt;
* Large increase in single thread performance over it’s predecessor, the ARM11&lt;br /&gt;
* ARMv7-A support including NEON and TrustZone&lt;br /&gt;
* Widely deployed in mobile and embedded, with numerous low-cost 3rd party development platforms. A great processor on which to learn the ARM architecture.&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A9  || &lt;br /&gt;
* Scalable performance and power efficiency for a broad range of 32-bit consumer, networking, enterprise and mobile applications&lt;br /&gt;
* Support the wide ARMv7-A 32-bit software eco-system&lt;br /&gt;
* Mature and silicon proven in multiple process technologies&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A15 || &lt;br /&gt;
* Established ARMv7-A processor with NEON-VFP configurability&lt;br /&gt;
* Reliable 32-bit infrastructure computing with 1TB addressing&lt;br /&gt;
* Support for multi-tenant software virtualization&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A17 || &lt;br /&gt;
* Highest performance for ARMv7-A software ecosystem&lt;br /&gt;
* Cost efficiency with premium 32-bit performance for mass-market devices&lt;br /&gt;
* Mature and shipped in a wide range of consumer and embedded markets&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A32 || &lt;br /&gt;
* ARMv8-A architectural enhancements, full backwards compatibility with ARMv7-A software&lt;br /&gt;
* Higher efficiency and performance compared to Cortex-A7 processor&lt;br /&gt;
* New idle power management features&lt;br /&gt;
* Highly scalable 32-bit processor with new configuration options&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A35 || &lt;br /&gt;
* Most efficient 64-bit ARMv8-A processor with full ARMv7-A compatibility&lt;br /&gt;
* Efficiency improvements compared to the Cortex-A7: Less active power, improved performance&lt;br /&gt;
* Highly scalable ARMv8-A processor with new configuration options&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A53 || &lt;br /&gt;
* High efficiency CPU for wide range of applications in mobile, DTV, automotive, networking, and more&lt;br /&gt;
* ARMv8-A architecture at low cost for standalone entry level designs&lt;br /&gt;
* Versatile enough to pair with any ARMv8 core in a big.LITTLE pairing, including Cortex-A57, Cortex-A72, or even other Cortex-A53 or Cortex-A35 CPU clusters&lt;br /&gt;
* Mature product with high volume shipment&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A57 || &lt;br /&gt;
* Established ARMv8-A 64-bit processor&lt;br /&gt;
* Reliable 64-bit infrastructure computing with 16TB addressing&lt;br /&gt;
* Proven functional safety documentation package&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A72 || &lt;br /&gt;
* ARM’s state-of-the-art high-performance processor for infrastructure, mobile, and automotive&lt;br /&gt;
* Market-leading compute density across all application form factors&lt;br /&gt;
* Improved performance and efficiency, with full ARMv8-A 64b support.&lt;br /&gt;
|-&lt;br /&gt;
| Cortex-A73 || &lt;br /&gt;
* Highest performance in mobile power envelope. Up to 30% higher performance than previous generation.&lt;br /&gt;
* Up to 2.8GHz frequency for highest peak performance&lt;br /&gt;
* New levels of sustained usage for the best user experience. Up to 30% increased power efficiency&lt;br /&gt;
* Smallest premium ARMv8-A processor ever. Premium CPU under 0.65mm2 per core.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zum Cortex-M ==&lt;br /&gt;
&lt;br /&gt;
Die Unterschiede zu den Cortex-M Mikrocontrollern sind unter anderem folgende:&lt;br /&gt;
* Teilweise 64 bit Prozessoren, mit vergrößertem Adressraum (44 bit oder mehr statt 32 bit)&lt;br /&gt;
* Kein On-Chip Speicher (meist ein geringes RAM vorhanden, aber ein externes ist so gut wie immer trotzdem nötig) macht externes Speicherinterface nötig, was viele Pins nutzt. Auch braucht man natürlich extra Speicher- und (DDR)-SDRAM-ICs.&lt;br /&gt;
* Mehrere Levels von Data und Instruction Caches&lt;br /&gt;
* Gehäuse mit wesentlich mehr Pins, meist im BGA&lt;br /&gt;
* Höhere Taktfrequenz (mehr als 500 MHz sind keine Seltenheit, aktuell maximal 2.8 GHz)&lt;br /&gt;
* ARM big.LITTLE Konzept: mehrere &amp;quot;kleine&amp;quot; Cortex-A-Cores werden zusammen mit mehreren &amp;quot;großen&amp;quot; Cores verschalten, um Enegie zu sparen: wenn wenig Leistung nötig ist werden die energieeffizierteren Cores benutzt, bei hohen Leistungsanforderungen übernehmen die anderne Cores&lt;br /&gt;
* ARM Jazelle für die beschleunigte Ausführung von Java-Code&lt;br /&gt;
* Sicherheitsmechanismen, wie eine [[MMU]] oder die ARM TrustZone Technologie&lt;br /&gt;
* Optional eine NEON™ Media Processing Engine&lt;br /&gt;
* Schnellere und präzisere [[FPU]]&lt;br /&gt;
* Kryptographie, wie AES- und SHA-Algorithmen, True-Random-Generators&lt;br /&gt;
* Digitale Interfaces, die man eher aus dem PC-Bereich kennt, wie HS-USB-Hosts, schnelles Ethernet, SD/MMC Interface, Kamera- oder Video-Dekoder, I²S, ...&lt;br /&gt;
* Dazu kommen aber auch klassische Mikrocontroller-Interfaces, wie UART, I²C, SPIs, interne ADCs und DACs, sowie Timer&lt;br /&gt;
&#039;&#039;(für alle oben genannten Fälle gibt es natürlich auch Ausnahmen)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einige der oben genannten Punkte finden sich neuerdings auch in Cortex-M7-Controllern, die damit die Brücke zwischen Mikrocontrollern und Anwendungsprozessoren schlagen.&lt;br /&gt;
&lt;br /&gt;
Größter Nachteil für diese Leistungsfähigen Controller wird das fehlen von On-Chip Flash und RAM sein, weil man so extra ICs braucht, was wiederum das layouten erschwert, da ein DDR3-RAM-Design nicht mehr sonderlich einfach ist.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-a/index.php?tab=Multicore Offizielle ARM Seite zu der Cortex-A Serie]&lt;br /&gt;
* [[Linux Boards]]&lt;br /&gt;
* [[Raspberry Pi Einführung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MPU&amp;diff=93648</id>
		<title>MPU</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MPU&amp;diff=93648"/>
		<updated>2016-08-17T20:46:30Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Ergänzung zum Stack&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit dieser Abkürzung ist nicht der &amp;quot;Idiotentest&amp;quot;, die sogenannte Medizinisch-Psychologische Untersuchung gemeint, sondern ein Hardwareteil in einem Prozessor: die &#039;&#039;&#039;Memory Protection Unit&#039;&#039;&#039;. Diese dient dazu, wie der Name schon sagt, den Hauptspeicher vor unerlaubten Zugriffen zu schützen.&lt;br /&gt;
&lt;br /&gt;
Um ihren Zweck zu erfüllen teilt die MPU den Speicher in mehrere Regionen, die alle definierte Eigenschaften haben:&lt;br /&gt;
* einen festen Ort und feste Größe&lt;br /&gt;
* Speicher Attribute (Read, Write, Execute)&lt;br /&gt;
* Zugriffsrechte &lt;br /&gt;
&lt;br /&gt;
Die MPU löst beim Verletzen der Zugriffsrechte einen sogenannten Fault aus, ähnlich einem Interrupt: ein Handler wird angesprungen und man kann auf den Fehler reagieren, zum Beispiel eine Fehlermeldung, Eintrag in ein Log, Memory-Dump, Breakpoint beim Debuggen, etc.&lt;br /&gt;
&lt;br /&gt;
Gerade beim Stack kann es helfen, diesen zu schützen. Damit bei einer Kollision mit dem Heap oder Gobalen Variablen (bzw. beim Verlassen seiner Memory Region) einen Kontrollierten Absturz gibt, der dann auch abgefangen und geloggt werden kann.&lt;br /&gt;
&lt;br /&gt;
Eine MPU kann dazu genutzt werden, um &lt;br /&gt;
* eine erhöhte Sicherheit bei der Code-Ausführung zu erreichen&lt;br /&gt;
* verschiedene Privilegien-Level in einer Anwendung&lt;br /&gt;
* Strikte Trennung von Code, Daten und Stack (auch zwischen verschiedenen Tasks)&lt;br /&gt;
&lt;br /&gt;
= Implementierungen =&lt;br /&gt;
Kleine 8bit-Controller, wie z.B. die AVRs haben meist keine MPU, da Anwendungen auf diesen Controllern meist ohne Betriebssystem oder mehrere Tasks ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Auf größeren Controllern macht eine MPU mehr Sinn, weswegen die Hersteller den zusätzlichen Aufwand in Kauf nehmen und diese implementieren.&lt;br /&gt;
ARM Cortex-M außer dem Cortex-M0 und dem Coretx-M1 haben eine optionale MPU. Der Hersteller kann auswählen, ob eine MPU mitintegriert werden soll.&lt;br /&gt;
Auch einige MSP430 Controller haben eine Memory Protection Unit.&lt;br /&gt;
&lt;br /&gt;
Größere Mikrocontroller, wie die Cortex-A, haben meist keine MPU, sondern eine komplette [[MMU]] (Memory Management Unit), mit dem &amp;quot;richtige&amp;quot; Betriebssysteme möglich sind.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MPU&amp;diff=93647</id>
		<title>MPU</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MPU&amp;diff=93647"/>
		<updated>2016-08-17T15:43:45Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Erstellung des Artikels&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit dieser Abkürzung ist nicht der &amp;quot;Idiotentest&amp;quot;, die sogenannte Medizinisch-Psychologische Untersuchung gemeint, sondern ein Hardwareteil in einem Prozessor: die &#039;&#039;&#039;Memory Protection Unit&#039;&#039;&#039;. Diese dient dazu, wie der Name schon sagt, den Hauptspeicher vor unerlaubten Zugriffen zu schützen.&lt;br /&gt;
&lt;br /&gt;
Um ihren Zweck zu erfüllen teilt die MPU den Speicher in mehrere Regionen, die alle definierte Eigenschaften haben:&lt;br /&gt;
* einen festen Ort und feste Größe&lt;br /&gt;
* Speicher Attribute (Read, Write, Execute)&lt;br /&gt;
* Zugriffsrechte &lt;br /&gt;
&lt;br /&gt;
Die MPU löst beim Verletzen der Zugriffsrechte einen sogenannten Fault aus, ähnlich einem Interrupt: ein Handler wird angesprungen und man kann auf den Fehler reagieren, zum Beispiel eine Fehlermeldung, Eintrag in ein Log, Memory-Dump, Breakpoint beim Debuggen, etc.&lt;br /&gt;
&lt;br /&gt;
Eine MPU kann dazu genutzt werden, um &lt;br /&gt;
* eine erhöhte Sicherheit bei der Codeausführung zu erreichen&lt;br /&gt;
* verschiedene Privilegien-Level in einer Anwendung&lt;br /&gt;
* Strikte Trennung von Code, Daten und Stack (auch zwischen verschiedenen Tasks)&lt;br /&gt;
&lt;br /&gt;
= Implementationen =&lt;br /&gt;
Kleine 8bitter, wie z.B. die AVRs haben meist keine MPU, da Anwendungen auf diesen Controllern meist ohne Betriebssystem oder mehrere Tasks ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Auf größeren Controllern macht eine MPU mehr Sinn, weswegen die Hersteller den zusätzlichen Aufwand in Kauf nehmen und diese implementieren.&lt;br /&gt;
ARM Cortex-M außer dem Cortex-M0 und dem Coretx-M1 haben eine optionale MPU. Der Hersteller kann auswählen, ob eine MPU mitintegriert werden soll.&lt;br /&gt;
Auch einige MSP430 Controller haben eine Memory Protection Unit.&lt;br /&gt;
&lt;br /&gt;
Größere Mikrocontroller, wie die Cortex-A, haben meist keine MPU, sondern eine komplette [[MMU]] (Memory Management Unit), mit dem &amp;quot;richtige&amp;quot; Betriebssysteme möglich sind.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;br /&gt;
[[Kategorie:ARM]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_Cortex_Mikrocontroller&amp;diff=93579</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=93579"/>
		<updated>2016-08-02T13:10:52Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Aktualisierung der ARM-Controller aus den Portfolios der Hersteller Atmel und NXP&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, ST, 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;
Allen ARM-Cores gemeinsam ist die 32 Bit RISC-Architektur. Für diese gibt es den klassischen 32bit ARM Befehlssatz und den zusätzlichen, kleineren 16/32 Bit &#039;&#039;&#039;Thumb&#039;&#039;&#039;-Befehlssatz. Die verschiedenen Prozessoren/Controller unterstützen einen oder beide davon. Thumb-fähige Controller sind 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. Thumb kodiert die meisten Instruktionen in 16bit, den Rest in 32bit, was in einem kleineren Prozessor und geringenem Platzbedarf des Codes resultiert [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf]; der Nachteil ist die etwas niedrigere Geschwindigkeit. Die Cortex-M Kerne unterstützen ausschließlich den Thumb2-Befehlssatz.&lt;br /&gt;
&lt;br /&gt;
Seit einigen Jahren sind ARM-basierte Mikrocontroller erhältlich, die aufgrund der vergleichbar einfachen Beschaltung und niedrigem Stromverbrauch eine echte Alternative zu 8-Bit-Controllern wie dem [[AVR]] darstellen. Die ersten Controller mit diesen Eigenschaften verwendeten den ARM7TDMI-Kern (zB. LPC2000) (ARMv4T-Architektur). Mittlerweile wurden diese vom Cortex M-Kern abgelöst (ARMv6M, ARMv7M-Architektur), welcher in verschiedenen Varianten für verschiedene Einsatzzwecke verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In diesem Artikel geht es primär um die ARM Cortex-M Mikrocontroller, weniger um ARM [[Cortex-A]] Prozessoren, welche in Smartphones, [[Raspberry Pi]] u.ä. eingesetzt werden.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es gibt folgende Varianten des Cortex-M Mikrocontroller-Kerns, aufgeführt vom energieeffizientesten zum leistungsfähigsten (Liste nicht unbedingt aktuell! Am besten immer die Herstellerseiten bemühen).&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M0/M0+ ==&lt;br /&gt;
=== ARM Cortex M0 ===&lt;br /&gt;
Als günstigste und energieeffizienteste Variante gibt es die Cortex-M0 Cores mit deutlich kleinerem Befehlssatz als z.B. Cortex-M3. 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], siehe &#039;&#039;&#039;[[STM32|STM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://ics.nxp.com/products/lpc1000/lpc11xx/ LPC11xx] von [http://www.nxp.com NXP], siehe &#039;&#039;&#039;[[LPC1xxx|LPC1xxx hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.infineon.com/XMC1000 XMC1000] von [http://www.infineon.com Infineon], siehe &#039;&#039;&#039;[[XMCxxxx|XMCxxxx hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.nuvoton.com/NuvotonMOSS/Community/ProductInfo.aspx?tp_GUID=5dbf7d7a-b6df-4fe1-91c9-063449500ce7 NuMicro-Controller] von Nuvoton (ex Winbond), laut Datenblatt mit 2.5-5.5V Betriebsspannung!&lt;br /&gt;
* [http://www.cypress.com/PSOC4  PSOC4 Familie] von [http://www.cypress.com  Cypress]&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 Entwicklungskit]&#039;&#039;&#039; vorhanden.&lt;br /&gt;
&lt;br /&gt;
=== ARM Cortex M0+ ===&lt;br /&gt;
&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 beinhalten, wie z.B eine MPU:&lt;br /&gt;
&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-zero-gecko/pages/efm32-zero-gecko.aspx EFM32 Zero Gecko] und [http://www.silabs.com/products/mcu/32-bit/efm32-happy-gecko/pages/efm32-happy-gecko.aspx EFM32 Happy Gecko] von [http://www.silabs.com Silicon Labs], siehe &#039;&#039;&#039;[[EFM32|EFM32 hier im Wiki]]&#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;
* [http://www.fujitsu-fm-family.com/products/fm0.html angekündigte FM0+ Familie] von [http://www.fujitsu.com/emea/services/microelectronics Fujitsu]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1817?icmp=ss1817_pron_pr_feb2014 angekündigte M0+ Familie] von [http://st.com  STMicroelectronics]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-C.aspx  SAM C Familie] von [http://www.atmel.com/default.aspx  Atmel] (5V Versorgungsspannung, nicht nur 5V-tolerant)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-D.aspx  SAM D Familie] von [http://www.atmel.com/default.aspx  Atmel]&lt;br /&gt;
* [http://www.cypress.com/PSOC4  PSOC4 Familie] von [http://www.cypress.com  Cypress]&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M3 ==&lt;br /&gt;
Der erste Kern der Cortex M-Reihe war der Cortex-M3. Dieser ist vom Leistungsniveau her am ehesten mit seinem Vorgänger, dem ARM7TDMI vergleichbar.&lt;br /&gt;
&lt;br /&gt;
Controllerfamilien dieser Klasse sind:&lt;br /&gt;
&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-tiny-gecko/pages/efm32-tiny-gecko.aspx EFM32 Tiny Gecko], [http://www.silabs.com/products/mcu/32-bit/efm32-gecko/pages/efm32-gecko.aspx EFM32 Gecko], [http://www.silabs.com/products/mcu/32-bit/efm32-leopard-gecko/pages/efm32-leopard-gecko.aspx EFM32 Leopard Gecko] sowie [http://www.silabs.com/products/mcu/32-bit/efm32-giant-gecko/pages/efm32-giant-gecko.aspx EFM32 Giant Gecko] von [http://www.silabs.com Silicon Labs] , siehe &#039;&#039;&#039;[[EFM32|EFM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.nxp.com LPC13xx/LPC17xx/LPC18xx] von NXP oder die inzwischen schon sehr ausführliche, siehe &#039;&#039;&#039;[[LPC1xxx|LPC1xxx hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/tm4c_arm_cortex-m4/overview.page TIVA] von [http://www.ti.com Texas Instruments] (vormals Stellaris, vormals Luminary Micro)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/default.aspx SAM3N, SAM3S,SAM3U, SAM3A und SAM3X Serien] von [http://www.atmel.com/default.aspx 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 , siehe &#039;&#039;&#039;[[STM32|STM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.toshiba-components.com/microcontroller/TMPM330.html TMPM330] von Toshiba&lt;br /&gt;
* [http://www.spansion.com/Products/microcontrollers/32-bit-ARM-Core/fm3/Pages/FM3-family.aspx FM3] von [http://www.spansion.com Spansion] (vormals Fujitsu)&lt;br /&gt;
* [http://www.holtek.com.tw/english/products/32bit_flashmcu.htm HT32] von Holtek Semiconductor&lt;br /&gt;
* [http://www.cypress.com/PSOC5 PSOC5] von Cypress&lt;br /&gt;
&lt;br /&gt;
Für den LPC1xxx ist 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;[[LPC1xxx_Entwicklungskit_LPCXpresso]]&#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 im Kern aus einem Cortex-M3 mit zusätzlichen [[DSP]]-Funktionen und teilweise einer (single precision) FPU bestehen. &lt;br /&gt;
&lt;br /&gt;
Diese werden beispielsweise in folgenden Controllern eingesetzt:&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus:KINETIS Kinetis Series] von Freescale (jetzt NXP)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc4300-cortex-m4-m0:MC_1403790133078 LPC43xx] von [http://www.nxp.com/ NXP] (Dual Core: M4F + bis zu 2 Cortex-M0)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc54000-low-power-cortex-m4:MC_1414576688124 LPC54xxx] von [http://www.nxp.com/ NXP] (Dual Core: M4F + bis zu einem Cortex-M0+)&lt;br /&gt;
* [http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/lpc-cortex-m4/lpc4000-cortex-m4:MC_1403790399405 LPC4xxx] von [http://www.nxp.com/ NXP]&lt;br /&gt;
* [http://www.silabs.com/products/mcu/32-bit/efm32-wonder-gecko/pages/efm32-wonder-gecko.aspx EFM32-Wonder Gecko] von [http://www.silabs.com Silicon Labs], siehe &#039;&#039;&#039;[[EFM32|EFM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.st.com/internet/mcu/subclass/1605.jsp STM32F3] von [http://www.st.com STMicro], siehe &#039;&#039;&#039;[[STM32|STM32 hier im Wiki]]&#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], siehe &#039;&#039;&#039;[[STM32|STM32 hier im Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/tm4c_arm_cortex-m4/overview.page Tiva C Series, TM4C] von [http://www.ti.com Texas Instruments]. Früher nannte Texas Instruments diese Controller &#039;&#039;Stellaris LM4F Series&#039;&#039;. 2013 begann TI mit einer große Umbenennung, bei der sogar neue Typenbezeichnung vergeben wurden. So wurde zum Beispiel aus dem LM4F230H5QR der TM4C123GH6PM. Gleichzeitig begann TI die Bezeichnung &#039;&#039;Stellaris&#039;&#039; aus Datenblättern, Software-Bibliotheken und Ähnlichem zu entfernen und durch &#039;&#039;Tiva&#039;&#039; zu ersetzen. Siehe auch [http://www.ti.com/lit/an/spma050a/spma050a.pdf].&lt;br /&gt;
* [http://www.infineon.com/XMC4000 XMC4000] von [http://www.infineon.com Infineon],  siehe &#039;&#039;&#039;[[XMCxxxx|XMCxxxx hier im Wiki]]&#039;&#039;&#039;, [[XMC4500|Artikel zum XMC4500]]&lt;br /&gt;
* [http://www.spansion.com/Products/microcontrollers/32-bit-ARM-Core/fm4/Pages/default.aspx FM4] von [http://www.spansion.com Spansion] (vormals Fujitsu)&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/sam4l.aspx SAML] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/sam4e.aspx SAME] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/sam4n.aspx SAMN] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/arm/sam4s.aspx SAMS] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
&lt;br /&gt;
== ARM Cortex M7 ==&lt;br /&gt;
&lt;br /&gt;
Die neueste Variante der Cortex M-Reihe ist der M7, bei dem gegenüber dem M4 zahlreiche Features hinzukommen die die Brücke zu Anwendungsprozessoren schlagen: eine double precision-FPU, Code- und Daten-Cache, eine 6-stufige Pipeline mit Sprungvorhersage, und unterm Strich eine deutlich höhere Rechenleistung. Controller basierend auf dem Cortex M7 sind u.a. von Atmel und ST erhältlich. &lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-E.aspx SAME] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-S.aspx SAMS] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/SAM-V.aspx SAMV] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/sam7s_se.aspx SAM7S/SE] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.atmel.com/products/microcontrollers/ARM/sam7x_xc.aspx SAM7X/XC] von [http://www.atmel.com/default.aspx Atmel]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/SC1169/SS1858 Produktseite der STM32F7-Serie von ST]&lt;br /&gt;
&lt;br /&gt;
== ARM7TDMI ==&lt;br /&gt;
Der Vorgänger der Cortex-M-Cores ist der &#039;&#039;&#039;ARM7&#039;&#039;&#039;TDMI. Controllerfamilien dieser Klasse sind immer noch weit verbreitet:&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 &amp;amp; Software ==&lt;br /&gt;
&lt;br /&gt;
=== [[ARM_GCC|GCC]] ===&lt;br /&gt;
Einer der beliebtesten Compiler für ARM-Prozessoren ist der GCC. Er kann sowohl ARM- als auch Thumb-Code erzeugen. Mehr dazu unter [[ARM GCC]].&lt;br /&gt;
&lt;br /&gt;
=== C/C++ IDEs ===&lt;br /&gt;
Kostenlose Entwicklungsumgebungen (überwiegend GCC-basiert):&lt;br /&gt;
* [http://www.coocox.org/CooCox_CoIDE.htm CooCox IDE] (Eclipse basierend)&lt;br /&gt;
* [http://www.emblocks.org/web/ EmBlocks IDE] (Basiert auf Code::Blocks)&lt;br /&gt;
** Compiler: GNU ARM-GCC (in der Installation enthalten), RealView und IAR &lt;br /&gt;
** Hardware: STlink (mit &amp;quot;Live data&amp;quot;), openOCD, Jlink. &lt;br /&gt;
** Project Import: CoIDE, uVision, Atmel studio, MplabX, Mplab 8&lt;br /&gt;
** OS aware debugging &lt;br /&gt;
***FreeRTOS&lt;br /&gt;
***ChibiOS/RT  &lt;br /&gt;
** Unterstützt sehr viele Controller(-Hersteller):&lt;br /&gt;
***Atmel-ARM&lt;br /&gt;
***NXP-ARM&lt;br /&gt;
***STMicro-ARM&lt;br /&gt;
***EnergyMicro-ARM&lt;br /&gt;
**Keine Beschränkungen&lt;br /&gt;
**Hier gehts zum &#039;&#039;[http://www.emblocks.org/web/downloads-main Download]&#039;&#039;&#039;&lt;br /&gt;
* [http://www.emide.org/ emIDE] Windows, komplette Visual Studio artige Entwicklungsumgebung (basierend auf Code::Blocks) mit GCC und Debugger (Unterstützung für Adapter von Segger) &amp;lt;!-- Projekt eines Segger Mitarbeiters --&amp;gt;&lt;br /&gt;
* [https://mbed.org mbed]: eine kostenlose Online-Entwicklungsumgebung basierend auf dem ARM Realview-Compiler, mit einer umfangreichen C++-Bibliothek für die Controllerfunktionen, integrierter Versionsverwaltung, und vielen Beispielprogrammen. Projekte lassen sich für Keil/IAR/GCC exportieren und offline weiterbearbeiten; die Bibliotheksfunktionen sind Open Source und auch kommerziell einsetzbar.&lt;br /&gt;
* [http://www.isystem.com/products/software/winidea-open winIDEAOpen]Die Fa. iSystem stellt mit der winIDEAOpen nun eine kostenlose Entwicklungsumgebung für alle Cortex-M Bauteile zur Verfügung. Als Compiler wird der GNU GCC verwendet und auch gleich mitinstalliert. Die IDE ist recht intuitiv und mit einer umfangreichen Hilfe ausgestattet. Das Ganze funktioniert mit dem &amp;lt;u&amp;gt;GCC ohne Codesize Limit&amp;lt;/u&amp;gt; und auch ein Testwerkzeug (testIDEA) ist mit integriert. Hardwareseitig werden neben dem iSystem iTag50 [http://www.isystem.com/products/hardware/cortex-debugger/itag] auch die Segger J-Link Debug Probes sowie der ST-Link von ST unterstützt. Auf der Webseite von iSystem sind auch einige schöne Beispielprojekte für diverse Boards zu finden [http://www.isystem.com/download/winideaopen]. Demnächst soll noch die Unterstützung für die ARM und IAR Compiler hinzuzkommen. Hier gehts zum &#039;&#039;[http://www.isystem.com/download/winideaopen Download]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Infineon&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;XMC&#039;&#039;&#039; Prozessorfamilien auch eine kostenlose, professionell gepflegte C/C++ Entwicklungsumgebung an, ohne Einschränkungen auf bestimmte Typen oder Speichergrößen - &amp;lt;u&amp;gt;alle erhältlichen XMC 1000er und 4000er Prozessoren werden unterstützt&amp;lt;/u&amp;gt;. Wenn man sich dazu noch eines der günstigen XMC Evaluierungsboards besorgt (XMC 1100 Bootkit, XMC 4500 Relax (lite) Kit o.ä.), hat man ein erstes Entwicklungssystem inklusive wiederverwendbaren HW-Debugger zur Verfügung. Die Entwicklungsumgebung basiert auf Eclipse, besitzt aber zahlreiche Erweiterungen samt Codegenerierung (sogenannte Apps), die gerade am Anfang viele Dinge abnehmen kann, da man die Peripherals damit einfach grafisch konfigurieren kann. Das ist bei Prozessoren, dessen User Manual einige hundert Seiten ausmacht (oder auch für Umsteiger von 8bitter oder anderen 32bittern), nicht unwichtig. Der generierte Code ist template-basiert, gut lesbar und kann später - wenn man mehr Erfahrung hat, für eigene Entwicklungen weiter nutzen und optimieren. Damit verliert man dann allerdings die Möglichkeit, Updates der generierten Codes aus den Apps zu bekommen, die Infineon ebenfalls kostenfrei zur Verfügung stellt. Die Software nennt sich &#039;&#039;Digital Application Virtual Engineer&#039;&#039; ([http://www.infineon.com/dave DAVE]) und kann nach Registrierung kostenlos für Windows heruntergeladen werden. Innerhalb von Dave kann man dann Apps und viele Beispiele (ohne weitere Anmeldung und Kosten) komplett oder selektiv (für bestimmte Prozessoren) herunterladen. Die aktuell stabile Version ist v3. Es ist eine neue DAVE Umgebung v4 in Arbeit, eine Betaversion kann heruntergeladen werden. Diese neue v4 Variante wird auch ein separates SDK besitzen, um Apps für Dave selbst schreiben zu können (z.B. Bauteilhersteller, die die Anbindung an den XMC für Kunden vereinfachen wollen). Einsteiger sollten aber mit v3 beginnen, um nicht über Bugs der Beta v4 zu stolpern (siehe auch im [http://www.infineonforums.com/forums/8-XMC-Forum XMC-Forum]).&lt;br /&gt;
* &#039;&#039;&#039;NXP&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;LPC&#039;&#039;&#039; Prozessorfamilien eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; C/C++ Entwicklungsumgebung an. Die auf Eclipse basierende Entwicklungsumgebung ([http://www.lpcware.com/lpcxpresso LPCXpresso]) ist nach der Installation bis 8kB freigeschaltet und nach einer einfachen und kostenlosen Registrierung für 256kB. [http://www.lpcware.com/lpcxpresso LPCXpresso] steht für Windows, Linux und Mac zur Verfügung.&lt;br /&gt;
* &#039;&#039;&#039;ST&#039;&#039;&#039; bietet für seine &#039;&#039;&#039;STM32&#039;&#039;&#039; Prozessorfamilie eine &amp;lt;u&amp;gt;kostenlose&amp;lt;/u&amp;gt; C/C++ Entwicklungsumgebung an. Die auf Eclipse basierende Entwicklungsumgebung kann nach Registrierung auf der Homepage heruntergeladen werden. [http://www.openstm32.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://timor.atollic.com/truestudio/ Atollic TrueStudio] (Windows), Eclipse-basierend inkl. Compiler und Linker für fast alle ARMs, jetzt auch kostenlos mit vielen Beispielen und ohne Codesize-Limitierung, dafür mit anderen Einschränkungen&lt;br /&gt;
* [http://www.cosmicsoftware.com/download_cortex_64k.php Cosmic Software] (Windows), bis 64kB kostenlos&lt;br /&gt;
* [http://rowley.co.uk/arm/ Crossworks ARM] (inkl. Toolchains basierend auf GCC und Clang, für Windows, Mac OS und Linux)&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), Lite-Version bis 32kB kostenlos,&lt;br /&gt;
* [http://www2.keil.com/stmicroelectronics-stm32/mdk MDK-STM32 von KEIL] Speziell für STM32x0 kostenlos ohne Beschränkung &lt;br /&gt;
* [http://www.sisy.de/ SiSy MC++] (Windows), Demo-Version, keine Code-Begrenzung&lt;br /&gt;
&lt;br /&gt;
=== Compiler für sonstige Programmiersprachen ===&lt;br /&gt;
* Basic: http://www.mikroe.com/mikrobasic/arm/&lt;br /&gt;
* Pascal: http://www.mikroe.com/mikropascal/arm/&lt;br /&gt;
&lt;br /&gt;
=== Interpreter ===&lt;br /&gt;
* Forth: https://github.com/ekoeppen/CoreForth&lt;br /&gt;
* JavaScript: http://www.espruino.com/&lt;br /&gt;
* Lua: http://www.eluaproject.net/&lt;br /&gt;
&lt;br /&gt;
=== ARM/XSCALE/CORTEX Instruction Set Simulator ===&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 ladenden 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. Zum Simulator gibt es entsprechende zugehörige Debugtools, die allerdings käuflich zu erwerben sind.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lauterbach.com/frames.html?dwnload.html Download ARM/XSCALE/CORTEX Simulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Programmierschnittstellen (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;
SWD (Serial Wire Debug) ist eine neue mit den Cortex-Mikrocontrollern eingeführte Debug- und Programmierschnittstelle, die weniger Pins benötigt als JTAG. Hier wird Debug-Bandbreite bzw. Speed gegen mehr verfügbare Pins für in-circuit Debugging &amp;quot;getauscht&amp;quot;. Die meisten Controller der Cortex-M0 &amp;amp; M3 Serie können sowohl mittels JTAG als auch mittels SWD programmiert werden, es gibt allerdings auch Exemplare (z.B. [[EFM32]] von [https://www.silabs.com Silicon Labs], XMC1100 von [http://www.infineon.com/xmc Infineon]) welche nur SWD unterstützen.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die empfohlenen Steckerbelegungen für JTAG und SWD gibt ein [http://infocenter.arm.com/help/topic/com.arm.doc.faqs/attached/13634/cortex_debug_connectors.pdf Dokument von ARM].&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus gibt es noch herstellerspezifische Schnittstellen wie SPD (Single Pin Debug) von Infineon, oder vorinstallierte serielle Bootloader, z.B. beim [[STM32]] oder auch bei den [[Infineon XMC]], die dann z.B. über ein eigenes [http://www.infineon.com/cms/de/product/microcontroller/development-tools-software-and-kits/c166/xc166-development-tools-software-and-kits/software-downloads/channel.html?channel=ff80808112ab681d0112ab6b50fe07c9 Tool] ohne weitere Hardware - abgesehen von einem handelsüblichen seriellen Schnittstellenadapter - programmiert werden können. &lt;br /&gt;
&lt;br /&gt;
Viele Entwicklungsboards enthalten auch einen On-Board-Debugadapter zum direkten Anschluss an USB, so dass kein externer SWD- oder JTAG-Adapter notwendig ist. Manche erlauben auch, diesen Adapter abzubrechen und für eigene Entwicklungen weiterzuverwenden, somit ist nach dem Kauf eines Eval-Kits nicht nötig, einen weiteren Adapter später nachzukaufen.&lt;br /&gt;
&lt;br /&gt;
=== Günstige Beispiele zum Einstieg ===&lt;br /&gt;
Ein einfacher JTAG-Adapter für den Parallelport ist der &amp;quot;Wiggler&amp;quot;-kompatible, den man auch einfach selbst bauen 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.  Für USB gibt es ebenfalls OpenOCD-kompatible JTAG-Adapter.&lt;br /&gt;
&lt;br /&gt;
Von NXP sind preiswerte Entwicklungskits (ca. 25€ für Evaluation-Board incl. USB-JTAG-/-SWD-Programer 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 MBED/Arduino kompatible Nucleo Entwicklungskits (ca. 12€) z.B. &#039;&#039;&#039;[http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF260320?s_searchtype=partnumber]&#039;&#039;&#039;. Der integrierte ST-Link Debugger kann mittels SWD und OpenOCD als Software auch andere Chip programmieren. Die etwas teuereren Discoveryboards, z.B. &#039;&#039;&#039;[http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF260946?s_searchtype=partnumber]&#039;&#039;&#039;, haben mehr externe Bauteile on-board, während die Nucleo Board über Shields erweiterbar sind. Nur bei Nucleo Boards ist eine UART Schnittstelle als Standard über USB zu erreichen, bei Discovery Boards mit ST-Link V2-1 müssen Lötbrücken gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Auch Infineon bietet Arduino-kompatible Boards+Shields mit dem XMC1100 Prozessor und angeflanschtem Debugger an (ab ca. 16€). Weiters gibt es günstige XMC4500 Kits, die auch Ethernet, SPI-Flash und SDCard-Slot Optionen bieten. Am unteren Ende gibt es ein XMC1100 Kit samt Debugger ab ca. 5€, dieses Board für den Schlüsselbund sozusagen nennt sich treffend &amp;quot;XMC 2 Go&amp;quot;. Die Preise können je nach Distributor stark variieren.&lt;br /&gt;
Siehe auch hier &#039;&#039;&#039;[http://www.infineon.com/cms/de/product/microcontroller/32-bit-industrial-microcontroller-based-on-arm-registered-cortex-registered-m/xmc-development-tools-kits-and-boards/channel.html?channel=db3a30433580b3710135a07902883872 XMC-Starter-Kits]&#039;&#039;&#039;.&lt;br /&gt;
Des weiteren werden auch schon Kits in Verbindung mit Sensoren zum Evaluieren angeboten, wie das &amp;quot;3D 2 Go&amp;quot; Board mit einem XMC1100 Prozessor und dem neuen 3D-Magnetfeldsensor von Infineon, um ein Beispiel zu nennen: &#039;&#039;&#039;[http://www.infineon.com/cms/en/product/sensor-ics/magnetic-sensors/3d-magnetic-sensor/channel.html?channel=5546d4624c9e0f0e014c9e105a8a001c 3D-Sensorkit]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von Silicon Labs gibt es [https://www.silabs.com/products/mcu/Pages/32-bit-microcontroller-tools.aspx Starter Kits] mit integriertem J-Link (Debugger) ab ca. 25 € z.B. das [https://www.silabs.com/products/mcu/lowpower/Pages/efm32tg-stk3300.aspx EFM32 Tiny Gecko Starter Kit] bei [http://www.mouser.de/ProductDetail/Silicon-Laboratories/EFM32TG-STK3300/?qs=%2fha2pyFadujBGJvO8YBq9JikBLXQGi%2fjwmF17imXuts5383tWpQKFA%3d%3d 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 &amp;quot;nicht-kommerziellen&amp;quot; Einsatz von Studenten, Funkamateuren und Hobby-Bastler für ca. €50.- erhältlich (J-Link-Edu). Sein Umfang ist dabei auf das Flashen des Speichers und das Debuggen beschränkt. Die Trace-Option wie sie bei der PRO-Variante zur Verfügung steht, ist nicht vorhanden. Für den Preis (05/2013) bekommt man jedoch ein ausgewachsenes Werkzeug mit breiter Unterstützung und der Möglichkeit sowohl SWD als auch JTAG in einem Gerät vereint zu haben. Wenn man aber plant, ein oben genanntes Kit von ST, NXP, Infineon oder ähnlich zu kaufen kann man für ähnliche Kosten auch gleich ein CPU-Board dazubekommen - daher ist es sinnvoll, sich die Dokumentationen der Evalkits voher genau durchzusehen.&lt;br /&gt;
&lt;br /&gt;
Der ULINK2 von Keil/ARM ist ebenfalls ein wirklich gutes Gerät. Leider ist er nicht ganz so günstig und seine Zusammenarbeit beschränkt sich auf die Arm/Keil IDE µVision. Er benötigt jedoch keine speziellen USB-Treiber sondern nutzt geschickt die Funktionalität der HID-Treiber des Betriebssystems. Das macht ihn sofort auf jedem Windows-Betriebssystem einsatzbereit.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Beschreiben des Flash über JTAG ist oft ein serieller [[Bootloader]] im Controller enthalten. Bei ST werden sie über einen speziellen Pin der MPU aktiviert und sind dank Kompression und das intelligente entfernen redundanter Information, bei der Übertragung genauso schnell wie JTAG/SWD Adapter.&lt;br /&gt;
&lt;br /&gt;
== CMSIS - ARM Cortex Software Libraries  ==&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. Dieser 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;
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-Prozessorkern und Peripherie-Registern.&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. Implementierungen gibt es z.B. von Keil ([http://www.keil.com/pack/doc/cmsis_rtx/index.html RTX])&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. Die &amp;quot;Core Peripheral Funktionen&amp;quot; benötigt beispielsweise weniger als 1 KB-Code und weniger als 10 Bytes RAM.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&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 auf der [http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php ARM CMSIS Webseite].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Linksammlung#ARM|Linksammlung (Abschnitt ARM)]]&lt;br /&gt;
* [[LPC1xxx]]&lt;br /&gt;
* [[LPC1xxx_Entwicklungskit_LPCXpresso]]&lt;br /&gt;
* [[Installationsanleitung_C-Entwicklungsumgebung_f%C3%BCr_LPC1xxx_von_Code_Red]]&lt;br /&gt;
* [[Codebase_f%C3%BCr_LPC1xxx]]&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;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.mySTM32.de Online Tutorial für den STM32]&lt;br /&gt;
* [http://www.myXMC.de Online Tutorial für den XMC von Infineon]&lt;br /&gt;
* [http://www.myUGL.de Online Tutorial für freie Grafikbibliothek, STM32, STM32F429, TFT, Touch]&lt;br /&gt;
* [http://embdev.net/forum/arm-gcc ARM-GCC Forum] im englischsprachigen &amp;quot;Ableger&amp;quot; von mikrocontroller.net embdev.net u.a. für WinARM, Yagarto, CS Codebench&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-m/index.php Cortex-M Produktseite von ARM]&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://booksite.elsevier.com/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;
&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/XMCxxxx &#039;&#039;&#039;Infineon XMCxxxx&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/articles/Cortex-A ARM Cortex A]&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Roboter2016.png&amp;diff=93375</id>
		<title>Datei:Roboter2016.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Roboter2016.png&amp;diff=93375"/>
		<updated>2016-07-07T11:01:56Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Newgeneration lud eine neue Version von Datei:Roboter2016.png hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rendering erstellt mit Keyshot&lt;br /&gt;
CAD: Solid Edge ST8&lt;br /&gt;
&lt;br /&gt;
Julian Frimmel&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Newgeneration&amp;diff=93374</id>
		<title>Benutzer:Newgeneration</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Newgeneration&amp;diff=93374"/>
		<updated>2016-07-07T11:00:14Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo,&lt;br /&gt;
&lt;br /&gt;
Für die paar unter euch die wissen wollen was ich so mache:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Roboter2016.png|mini|Unser Roboter aus dem Jahr 2016]]&lt;br /&gt;
&lt;br /&gt;
ich war an einem bayrischen Gymnasiums und habe dort am Wahlfach Robotik teilgenommen.&lt;br /&gt;
Dort kam ich dann auch mit µCs in Verbindung.&lt;br /&gt;
Robotik? Was macht man das so?&lt;br /&gt;
* Roboter bauen, um am [https://www.robocupgermanopen.de/de/junior Robocup Junior] teilzunehmen&lt;br /&gt;
* Auf Wettbewerbe fahren und gegen andere Teams antreten&lt;br /&gt;
* anderen, vor allem jüngeren helfen&lt;br /&gt;
Obwohl ich nicht mehr an der Schule bin, holt mich die Robotik-AG regelmäßig wieder zurück und ich hoffe, dass ich durch Fähigkeiten, die ich im Studium lerne, den anderen Teilnehmern der AG weiter helfen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mein Team konnte auch schon einige Erfolge in der Disziplin Soccer verbuchen, darunter zwei mal die Teilnahme an der WM; dort spielen jeweils 2 gegen 2 Roboter, nach ähnlichen Regeln wie im echten Fußball.&lt;br /&gt;
&lt;br /&gt;
Damit ihr euch mehr darunter vorstellen könnt gibt es hier einen Zusammenschnitt der deutschen Meisterschaft 2016:&lt;br /&gt;
https://www.youtube.com/watch?v=TYeKAMcxOPs&lt;br /&gt;
&lt;br /&gt;
Dieses Hobby überträgt sich natürlich auch in den Privatbereich, deswegen steht mein Schreibtisch voll mit Basteleien, vor allem AVRs, STM32 und neuerdings auch ARMs von NXP.&lt;br /&gt;
&lt;br /&gt;
== NEWS ==&lt;br /&gt;
* Auf der diesjährigen Deutschen Meisterschaft (Robocup Junior German Open 2016) haben mein Team und ich den 2. Platz erreicht und sind somit für die Weltmeisterschaft in Leipzig qualifiziert!&lt;br /&gt;
&lt;br /&gt;
* Bei der vor kurzem stattfindenden Robocup Junior Weltmeisterschaft in Leipzig ([http://robocup2016.org/ offizielle Seite]) gab nicht nur einen, sondern sogar 2 Erfolge zu vermelden:&lt;br /&gt;
# Unser Team wurde 8. aus 22 Weltklasse Teams&lt;br /&gt;
# Das jüngere Team unserer Schule mit dem zurückhaltenden Namen &amp;quot;Ultimate Team&amp;quot; wurde &#039;&#039;&#039;Weltmeister&#039;&#039;&#039; in ihrer Liga! Ihre [http://ultimateteam.bplaced.net/news.html Website]&lt;br /&gt;
&#039;&#039;Bilder und Videos folgen&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Damit war die WM ein riesen Erfolg für unsere AG und wir sind motiviert uns noch mehr zu steigern!&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Roboter2016.png&amp;diff=93062</id>
		<title>Datei:Roboter2016.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Roboter2016.png&amp;diff=93062"/>
		<updated>2016-05-26T15:14:56Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Rendering erstellt mit Keyshot
CAD: Solid Edge ST8

Julian Frimmel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rendering erstellt mit Keyshot&lt;br /&gt;
CAD: Solid Edge ST8&lt;br /&gt;
&lt;br /&gt;
Julian Frimmel&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Newgeneration&amp;diff=93061</id>
		<title>Benutzer:Newgeneration</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Newgeneration&amp;diff=93061"/>
		<updated>2016-05-26T15:13:58Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: auf aktuelle Saison angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo,&lt;br /&gt;
&lt;br /&gt;
Für die paar unter euch die wissen wollen was ich so mache:&lt;br /&gt;
ich bin derzeit noch Schüler eines bayrischen Gymnasiums und habe dort am Wahlfach Robotik teilgenommen.&lt;br /&gt;
Dort kam ich dann auch mit µCs in Verbindung.&lt;br /&gt;
Robotik? Was macht man das so?&lt;br /&gt;
* Roboter bauen, um am [https://www.robocupgermanopen.de/de/junior Robocup Junior] teilzunehmen&lt;br /&gt;
* Auf Wettbewerbe fahren und gegen andere Teams antreten&lt;br /&gt;
* anderen, vor allem jüngeren helfen&lt;br /&gt;
&lt;br /&gt;
[[Datei:Roboter2016.png|mini|Unser Roboter aus dem Jahr 2016]]&lt;br /&gt;
&lt;br /&gt;
Mein Team konnte auch schon einige Erfolge in der Disziplin Soccer verbuchen; dort spielen jeweils 2 gegen 2 Roboter, nach ähnlichen Regeln wie im echten Fußball.&lt;br /&gt;
Auf der diesjährigen Deutschen Meisterschaft (Robocup Junior German Open 2016) haben mein Team und ich den 2. Platz erreicht und sind somit für die Weltmeisterschaft in Leipzig qualifiziert!&lt;br /&gt;
Damit ihr euch mehr darunter vorstellen könnt gibt es hier einen Zusammenschnitt der DM:&lt;br /&gt;
https://www.youtube.com/watch?v=TYeKAMcxOPs&lt;br /&gt;
&lt;br /&gt;
Dieses Hobby überträgt sich natürlich auch in den Privatbereich, deswegen steht mein Schreibtisch voll mit Basteleien, vor allem AVRs und STM32.&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=92364</id>
		<title>AVR-GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=92364"/>
		<updated>2016-03-14T21:15:57Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: /* Vorbereitungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;avr-gcc ist ein freier [[C]]-Cross-[[Compiler]] für [[AVR]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
avr-gcc kann von der Leistungsfähigkeit kommerzieller [[Compiler]] gut mithalten. Sogar C++-Programme sind möglich; in der aktuellen Fassung wird C++ jedoch nur eingeschränkt unterstützt (Stand 3/2012).&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
Die Toolchain (Werkzeugsammlung) besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung, siehe [[AVR-GCC-Tutorial/Exkurs Makefiles|AVR-GCC-Tutorial: Exkurs Makefiles]]. &lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* AVR-Libc: Die C-Standardbibliothek mit AVR-spezifischen Headerdateien und Funktionen.&lt;br /&gt;
* [[AVRDUDE]]: universelle AVR-Programmiersoftware, kein eigentlicher Teil der Toolchain, aber oft verwendet&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Linux/Unix ===&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Wenn keine aktuelle avr-gcc-Version als Paket (Paketname ist, zumindest bei Debian, gcc-avr) für die verwendete Distribution zur Verfügung steht, dann können sich [[Unix]]/[[Linux]]-Nutzer den Sourcecode herunterladen und selbst kompilieren, dazu gibt es Schritt-für-Schritt-Anleitungen&amp;lt;ref&amp;gt;[http://www.nongnu.org/avr-libc/user-manual/install_tools.html AVR-Libc: Building and Installing under Linux, FreeBSD, and Others]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.roboternetz.de/wissen/index.php/Avr-gcc_und_avrdude_installieren www.roboternetz.de: avr-gcc und avrdude installieren]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das [http://www.femtoos.org FemtoOS]-Paket beinhaltet Scripte zum automatischen Herunterladen und Bauen einer avr-gcc Version 4.3.3.&lt;br /&gt;
&lt;br /&gt;
Empfehlenswert ist auch [http://cdk4avr.sf.net CDK4AVR], das die entsprechenden Tools als einfach installierbare Linux-Pakete bereitstellt. Leider ist das Projekt schon etwas älter, im Forum findet sich ein [http://www.mikrocontroller.net/topic/130972 Beitrag], aktuellere Sourcen mit den entsprechenden Patches zu versehen und zu kompilieren. Patches zu den Binutils und GCC-Sourcen sind unumgänglich, da die offiziellen Sourcen aufgrund des Umfangs an Prozessortargets den aktuellsten Entwicklungen hinterherhinken und damit bereits bekannte Fehler eventuell noch nicht behoben sind. Weitere Tipps zur AVR-Programmierung unter Linux stehen im Artikel [[AVR und Linux]].&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Die beste fertige Toolchain ist das [http://www.obdev.at/crosspack/ Crosspack]. Dieses enthält auch die AVR-Libc, avrdude und avarice. Leider gab es bei Mac OS 10.5.6 eine tiefgreifende Änderung beim fork()-Systemcall, der bewirkt, dass avarice mit JTAGICE mkII und Dragon nicht funktioniert. Geräte mit Serial-USB-Konvertern (AVRISP clones etc) funktionieren dagegen problemlos. &lt;br /&gt;
&lt;br /&gt;
Wer die Toolchain von Hand bauen möchte kann das natürlich auch tun, dazu einfach den unter &amp;quot;Linux/Unix&amp;quot; verlinkten Anleitungen folgen. Unter [[Mac OS X]] muss man dazu zuerst die [http://developer.apple.com/Tools/ Apple Developer Tools] installieren.&lt;br /&gt;
&lt;br /&gt;
Teile der Toolchain (AVR-Libc und avrdude) kann folgendermaßen installieren:&lt;br /&gt;
&lt;br /&gt;
==== Mit MacPorts ====&lt;br /&gt;
Wenn man [http://www.macports.org/ MacPorts] benutzt kann man folgendes in das Terminal eingeben, um den Toolchain zu installieren:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avr-libc&lt;br /&gt;
&lt;br /&gt;
Das Programmiertool avrdude bekommt man genauso:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avrdude&lt;br /&gt;
&lt;br /&gt;
==== Mit Hombrew ====&lt;br /&gt;
Mit dem neueren Tool [http://brew.sh Homebrew] funktioniert das folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
avrdude kann sofort installiert werden:&lt;br /&gt;
&lt;br /&gt;
 brew install avrdude&lt;br /&gt;
&lt;br /&gt;
Für den restlichen Toolchain muss man erst ein &#039;Tap&#039; hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 brew tap larsimmisch/homebrew-avr&lt;br /&gt;
&lt;br /&gt;
und kann dann den eigentlichen Toolchain installieren:&lt;br /&gt;
&lt;br /&gt;
 brew install avr-libc&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
&lt;br /&gt;
* [http://tinkerlog.com/2007/09/29/programming-avr-with-a-macbook/ Programming AVR with a MacBook] (engl.)&lt;br /&gt;
* [http://www.ladyada.net/library/avrdevtut/setup-mac.html AVR Tutorial from Lady Ada] (engl.)&lt;br /&gt;
* [http://www.obdev.at/crosspack/ Crosspack]&lt;br /&gt;
* [http://www.digithink.com/OSX-AVR OSX-AVR (nicht mehr aktuell)]&lt;br /&gt;
* [http://www.definefalsetrue.com/index.php/Mac-OS-X/bootfeedx.html BootFeedX Bootloaderfrontend]&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Man kann sich auch für Windows den GCC selbst bauen oder man sucht von anderen erstellte Binaries.&lt;br /&gt;
&lt;br /&gt;
Atmel bietet die [http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx Atmel AVR Toolchain] in verschiedenen Versionen zum Herunterladen an.&lt;br /&gt;
&lt;br /&gt;
Für MS-Windows gibt es das fertig kompilierte Softwarepaket [[WinAVR]], welches allerdings seit 2010 nicht mehr gepflegt wird.&lt;br /&gt;
&lt;br /&gt;
==== Selbst bauen ====&lt;br /&gt;
&lt;br /&gt;
Zuerst sei einmal die offizielle (englische) Anleitung genannt: [http://www.nongnu.org/avr-libc/user-manual/install_tools.html Building and Installing avr-gcc]&lt;br /&gt;
&lt;br /&gt;
Das hier ist die etwas ausführlichere Beschreibung, die mir Johann L. gegeben hat, damit ich meinen Compiler erstellen konnte. Der Post dazu findet sich [https://www.mikrocontroller.net/topic/384825?goto=4394391#4394606 hier]. &lt;br /&gt;
&lt;br /&gt;
Zuerst einmal braucht man am besten ein Linux, zum Beispiel ein aktuelles Ubuntu. dort müssen diverse Programme wie gcc, autoconf, subversion usw. installiert sein. Wenn etwas fehlt meckert configure, das einfach aufmerksam lesen und dann die Programme nachistallieren. Danach erneut configure aufrufen.&lt;br /&gt;
Um die Toolchain für Windows zu bauen brauchen wir noch mingw32. Eventuell findet sich das in den Paketquellen eurer Distribution, sonst kann ich auf [http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/ diese Seite] verweisen.&lt;br /&gt;
&lt;br /&gt;
===== Vorbereitungen =====&lt;br /&gt;
Wie schon gesagt brauchen wir ein Linux, zum Beispiel in einer VM. Ein paar Linux-Hintergrundinfos wären auch gut, kann man aber auch ergooglen.&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Auf diesem Linux darf kein avr-gcc und keine avr-libc vorhanden sein!&lt;br /&gt;
Dazu brauchen wir die folgende Software:&lt;br /&gt;
* GNU Binutils: [https://www.sourceware.org/binutils/ Download], am besten die neueste Version (runter scrollen, aktuell ist 2.26)&lt;br /&gt;
* GCC Sourcen: [https://gcc.gnu.org/ Download], diese sollten, wenn mans ganz aktuell will aus dem svn kommen (svn co svn://gcc.gnu.org/svn/gcc/branches/&#039;&#039;branchname&#039;&#039; gcc ,mit &#039;&#039;branchname&#039;&#039; gcc-&#039;&#039;version&#039;&#039;-branch, aktuell ist gcc-5-branch)&lt;br /&gt;
* Die AVR-libc: &#039;&#039;&#039;Achtung&#039;&#039;&#039;: nicht normal downloaden, immer aus dem SVN nehmen, da die neuren GCCs eine andere Struktur der Libc erfordern. Die ist in den Releases noch nicht eingearbeitet. [http://savannah.nongnu.org/svn/?group=avr-libc Download via svn]: svn co svn://svn.savannah.nongnu.org/avr-libc/&#039;&#039;modulename&#039;&#039; , wobei &#039;&#039;modulname&#039;&#039; meistens trunk ist. (Kann mit dem 2.0.0er Release der avr-libc anders sein, mit dem trunk sollte es aber immer gehen)&lt;br /&gt;
&lt;br /&gt;
Alles herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
Zu den Downloads kommen dann noch 2 Umgebungsvariablen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ PREFIX=$HOME/local/avr&lt;br /&gt;
$ export PREFIX&lt;br /&gt;
$ PATH=$PATH:$PREFIX/bin&lt;br /&gt;
$ export PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit legt ihr das Installationsverzeichnis fest und fügt auch gleich das Verzeichnis für die ausführbaren Dateien zum Pfad hinzu.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden gehe ich von diesem Ordner-Layout aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$HOME&lt;br /&gt;
|&lt;br /&gt;
+ BuildToolchain&lt;br /&gt;
	|&lt;br /&gt;
	+ Downloads&lt;br /&gt;
	|	|&lt;br /&gt;
	|	+ binutils&lt;br /&gt;
	|	+ gcc&lt;br /&gt;
	|	+ avr-libc&lt;br /&gt;
	|&lt;br /&gt;
	+ buildLinux&lt;br /&gt;
	|	|&lt;br /&gt;
	|	+ binutils&lt;br /&gt;
	|	+ gcc&lt;br /&gt;
	|	+ avr-libc&lt;br /&gt;
	|&lt;br /&gt;
	+ buildWindows&lt;br /&gt;
		|&lt;br /&gt;
		+ binutils&lt;br /&gt;
		+ gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Erstellen der Binutils =====&lt;br /&gt;
Wechselt in das Verzeichnis BuildToolchain/buildLinux/binutils.&lt;br /&gt;
Von dort aus werden wir die binutils konfigurieren und erstellen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; man darf weder GCC noch die Binutils in einem Verzeichnis innerhalb des Quellordners der Downloads konfigurieren, sonst kommen wirre Fehler.&lt;br /&gt;
&lt;br /&gt;
Also, wir sind soweit. Jetzt geht es ans Konfigurieren und erstellen, aber das ist ganz leicht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../binutils/configure --prefix=$PREFIX --target=avr --disable-nls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn configure fehlende Programme meldet: nachistallieren und erneut versuchen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sind die Binutils fertig. Ich könnt nachkontrollieren, ob die binutils da sind: Im Ordner $PREFIX/bin sollten sich die Dateien befinden, darunter avr-objcopy, avr-as, avr-size, etc.&lt;br /&gt;
&lt;br /&gt;
===== Erstellen vom GCC =====&lt;br /&gt;
Als erstes muss sich der GCC noch ein paar zusätzliche Dateien herunterladen, das geschiet automatisch mit dem Befehl (ausgeführt in BuildToolchain/Downloads/gcc):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./contrib/download_prerequisites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildLinux/gcc&lt;br /&gt;
Dort führt ihr das Folgende aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../gcc/configure --prefix=$PREFIX --target=avr --enable-languages=c,c++,lto --disable-nls --disable-libssp --with-dwarf2&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Erstellen der avr-libc =====&lt;br /&gt;
Als erstes muss die avr-libs zum konfigurieren bereit gemacht werden:&lt;br /&gt;
Im Verzeichnis BuildToolchain/Downloads/avr-libc die Datei bootstrap ausführen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./bootstrap&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Danach wechselt ihr ins Verzeichnis BuildToolchain/buildLinux/avr-libc&lt;br /&gt;
Dort führt ihr das Folgende aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../avr-libc/configure --prefix=$PREFIX --build=`./config.guess` --host=avr&lt;br /&gt;
$make&lt;br /&gt;
$make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Testen unter Linux =====&lt;br /&gt;
So, jetzt seit ihr schon bei der Hälfte: Der Compiler läuft schon unter Linux! &lt;br /&gt;
Das testet ihr am besten schon mit ein paar einfachen LED-blink-Programmen, damit auch sichergestellt ist, dass bis hierhin alles geklappt hat.&lt;br /&gt;
Das einfachste und wichtigste Kommando dürfte sein&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
avr-gcc --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dort sollte die Versionsnummer der GCC stehen. Wenn eine ältere Nummer dasteht, hab ihr entweder einen alten Download bemüht, oder eine andere version vom avr-gcc war noch installiert.&lt;br /&gt;
Wenn der fehler kommt, dass das Programm nicht gefunden werden kann, dann befindet sich avr-gcc nicht im PATH, das bedeutet ihr habt die Umgebungsvariablen nicht richtig gesetzt (siehe oben).&lt;br /&gt;
&lt;br /&gt;
===== Bau für Windows =====&lt;br /&gt;
Ihr müsst keine neuen Dateien runter laden, lediglich die Programme nochmal etwas anders konfigurieren.&lt;br /&gt;
Die Schritte davor &#039;&#039;&#039;müssen&#039;&#039;&#039; jedoch ausgeführt werden!&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildWindows/binutils und führt das Folgende aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../binutils/configure --prefix=$HOME/local/avr4win --target=avr --disable-nls --host=plattform-mingw32 --build=i686-linux-gnu&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wobei &#039;&#039;plattform&#039;&#039; euer Ziel-system ist, also entweder i686 oder x86_64, je nach dem, was ihr für ein mingw32 installiert habt.&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildWindows/gcc und führt das Folgende aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ../../gcc/configure --prefix=$HOME/local/avr4win --target=avr --disable-nls --host=plattform-mingw32 --build=i686-linux-gnu --enable-languages=c,c++,lto --with-gnu-as --with-gnu-ld --disable-shared --with-dwarf2&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wechselt ins Verzeichnis BuildToolchain/buildLinux/avr-libc und führt den folgenden Befehl aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make install prefix=$HOME/local/avr4win&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit sollten ihr im Ordner $HOME/local/avr4win die gesamte Toolchain haben. Diesen Ordner müsst ihr nur noch auf euren Windows-PC kopieren.&lt;br /&gt;
Für das klassische WinAVR fehlt noch Programmers Notepad, sowie die Utility-Programme, vor allem avrdude und make. Diese kann man entweder seperat downloaden oder aus einer WinAVR-Installation kopieren. Die Versionen davon spielen keine Rolle.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
&lt;br /&gt;
Win32:&lt;br /&gt;
* [[AVR-Studio]]: ab Version 4.12 mit WinAVR-Unterstützung, integrierter Simulator, Debugger, rudimentäre Projektverwaltung&lt;br /&gt;
* Programmers-Notepad: wird bei [[WinAVR]] mitgeliefert, ein guter Editor mit einer rudimentären Projektverwaltung&lt;br /&gt;
* [http://www.myavr.info/download/benutzerhandbuch_sisy_avr.pdf SiSy-AVR]: ein CASE-Tool mit WinAVR-Unterstützung, das eine Entwicklungsumgebung bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Plattformunabhängig:&lt;br /&gt;
* [http://www.eclipse.org/ Eclipse] mit CDT und dem [http://avr-eclipse.sourceforge.net/index.html AVR Eclipse Plugin]&lt;br /&gt;
* [[Code::Blocks]]: vielseitige, freie Entwicklungsumgebung für Windows und Linux&lt;br /&gt;
* [http://www.netbeans.org/ Netbeans] in der C++ - Version mit [[WinAVR]] oder [[avr-gcc]] als Toolchain&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
*[http://sourceforge.net/projects/kontrollerlab/?_test=b KontrollerLab] ist eine freie Entwicklungsumgebung für AVR momentan aber noch im Beta-stadium.&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken / Libraries ==&lt;br /&gt;
&lt;br /&gt;
Die [http://www.nongnu.org/avr-libc/ AVR-Libc] ist die gebräuchliche &amp;quot;Laufzeitbibliothek&amp;quot; zum avr-gcc C-Compiler, welche den Zugriff auf die AVR-Hardware erheblich erleichtert. Die offizielle Dokumentation zur avr-libc mit vielen Hinweisen auch zum Compiler avr-gcc und verschiedener Tools (z.&amp;amp;nbsp;B. [[AVRDUDE]]) findet man [http://www.nongnu.org/avr-libc/user-manual/index.html hier].&lt;br /&gt;
&lt;br /&gt;
Auch die [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] enthält nützlichen Code z.&amp;amp;nbsp;B. für UART, LCD,.... Bei der Procyon AVRlib ist die Lizenz zu beachten (in Kurzform: man muss dritten auf Verlangen den gesamten Quellcode der Firmware zur Verfügung stellen, falls Teile der Procyon Bibliothek genutzt werden).&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf interne Funktionen oder externe Peripherie existieren einige fertige Komponenten. Z.B. &amp;quot;Projects&amp;quot;-Bereich von [http://www.avrfreaks.net/ avrfreaks.net] (Anmeldung erforderlich (kostenlos)). &lt;br /&gt;
&lt;br /&gt;
Die Erstellung eigener Bibliotheken ist im Artikel  [[Libraries]] erklärt.&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
Eine Liste mit einigen Hinweisen:&lt;br /&gt;
&lt;br /&gt;
* 07.10.11 → es kann Probleme mit der aktuellen Eclipse-Version (Indigo) und WinAVR geben. Falls ihr Indigo installiert habt und Eclipse die Definitionen wie z.B. DDRA nicht kennt, jedoch kompillieren kann, dann müsst ihr auf die Version Helios SR2 wechseln. Danach läuft alles wie gehabt!&lt;br /&gt;
&lt;br /&gt;
* Keine &amp;quot;antiken&amp;quot; Versionen verwenden. Für MS-Windows-Nutzer: aktuelles WinAVR installieren. Für Linux/Unix-Nutzer: letzte stabile Version selbst kompilieren oder aus &amp;quot;Distribution-Packages&amp;quot; installieren (z.&amp;amp;nbsp;B. [http://cdk4avr.sourceforge.net/ cdk4avr]).&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen zuerst in die [http://www.nongnu.org/avr-libc/user-manual/index.html Anleitung] der avr-libc schauen. Insbesondere die FAQ lesen.&lt;br /&gt;
&lt;br /&gt;
* Sicherstellen, dass der MCU-Parameter (zum Compiler/Linker, meist im Makefile defniert) mit dem Zielprozessor übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-GCC-Tutorial]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Im Zweifel nicht INTERRUPT(...) sondern SIGNAL(...) nutzen. In neueren Versionen der avr-libc wurde &amp;quot;ISR&amp;quot; als Ersatz für SIGNAL eingeführt und sollte genutzt werden (SIGNAL und INTERRUPT werden langfristig entfallen). Darauf achten, dass die Vektor- bzw. Signal-Namen (&amp;quot;Parameter&amp;quot;) zu ISR bzw. SIGNAL (und INTERRUPT wenn denn unbedingt erforderlich) richtig geschrieben sind. Die Namen sind in der in der entsprechenden Header-Datei (ioxxx.h) für den Controller und der avr-libc-Dokumenation aufgelistet. Im Zweifel den erzeugten Interrupt-Vektor im Assembler-Listing prüfen, es darf &#039;&#039;&#039;kein&#039;&#039;&#039; SIG_&#039;&#039;xxx&#039;&#039; oder xxx_vect mehr zu sehen sein, sondern _vector_&#039;&#039;N&#039;&#039; (wobei &#039;&#039;N&#039;&#039; eine Zahl ist). Neuere Versionen der avr-gcc zeigen eine Warnung, falls etwas falsch geschrieben wurde, ältere Versionen nicht.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf Daten(-Tabellen) im Programmspeicher (Flash) erfolgt über Program-Space-Funktionen (pgm_read*). Lediglich die Definition einer Variablen/eines Feldes mit dem PROGMEM Attribut zu versehen, reicht (im Gegensatz zu Codevision, IAR, Imagecraft) nicht aus.&lt;br /&gt;
&lt;br /&gt;
* Nicht alle AVRs werden vollständig von der avr-libc bzw. dem Compiler unterstützt. Bei Problemen hilft oft ein Blick in den erzeugten Assembler-Code. Die Anzahl der unterstützen Controller steigt jedoch mit Version zu Version von binutils, avr-libc und avrdude. Evtl. reicht einfach ein Update auf neuere Software-Versionen (z.&amp;amp;nbsp;B. im jeweils aktuellen WinAVR-Packet).&lt;br /&gt;
&lt;br /&gt;
* inp(), outp(), sbi() und cbi() werden in der aktuellen Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle Header-Datei einbinden(deprecated.h). Es wird schon seit längerem empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen kann einfach z.&amp;amp;nbsp;B. DDRB=0xfe bzw. foo=PINB geschrieben werden.  Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &amp;amp;= ~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei (1&amp;lt;&amp;lt;x)). Die ersten beiden Varianten erzeugen bei eingeschalteter Optimierung und passenden Parametern (wie hier im Beispiel Register im &amp;quot;unteren&amp;quot; Speicherbereich) die SBI bzw. CBI Prozessorbefehle.&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-nm erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit &lt;br /&gt;
::&amp;lt;pre&amp;gt;avr-nm --size-sort --print-size -r -td &amp;lt;your_ELF_file&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aufgerufen und gibt eine vierspaltige Liste aus: Die erste Spalte ist die Adresse, die zweite die benötigte Größe, die dritte der Typ und die vierte der Name des Symbols. Alle Symbole vom Typ &amp;quot;T&amp;quot; (globale Funktionen), &amp;quot;t&amp;quot; (lokale Funktionen) und letztlich auch die mit einem &amp;quot;D&amp;quot; oder &amp;quot;d&amp;quot; (globale bzw. lokale Daten mit Initialisierungswerten im ROM) betreffen das FLASH-ROM. Typen &amp;quot;B&amp;quot; und &amp;quot;b&amp;quot; brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). (vgl. [http://www.mikrocontroller.net/topic/59960#467920 Forenbeitrag] von Jörg Wunsch)&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool avr-size erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]]&lt;br /&gt;
* [[GCC: unbenutzte Funktionen entfernen]]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Avr-gcc/Interna AVR-GCC Interna]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://winavr.sourceforge.net/install_config_WinAVR.pdf Tutorial von C. O&#039;Flynn und E. Weddington] Einstieg in die Nutzung des avr-gcc unter MS-Windows mit WinAVR (englisch)&lt;br /&gt;
* [http://www.linuxfocus.org/Deutsch/November2004/article352.shtml AVR-GCC und Linux]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum auf mikrocontroller.net]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Compiler]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=FPGA&amp;diff=91412</id>
		<title>FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=FPGA&amp;diff=91412"/>
		<updated>2016-01-22T10:39:59Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: Änderung 91410 von 193.158.249.10 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FPGA ist die Abkürzung für &amp;quot;&#039;&#039;&#039;F&#039;&#039;&#039;ield &#039;&#039;&#039;P&#039;&#039;&#039;rogrammable &#039;&#039;&#039;G&#039;&#039;&#039;ate &#039;&#039;&#039;A&#039;&#039;&#039;rray&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
=== Grundelemente  ===&lt;br /&gt;
&lt;br /&gt;
Ein FPGA besteht, ähnlich wie ein [[CPLD]], aus vielen Logikelementen, hauptsächlich [[FlipFlop]]s (FF) und davor gelagerten kombinatorischen Logikschaltungen. Diese sind entweder Verknüpfungen verschiedener Logikgatter (FPGAs der Firma Actel), die über elektronische &amp;quot;Schalter&amp;quot; entsprechend der vom Entwickler gewünschten Funktion miteinander verknüpft werden können oder es handelt sich um sogenannte LUTs (Look-Up-Table), mit denen die Logikfunktion explizit realisiert wird.&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;&#039;LUT&#039;&#039;&#039; kann eine beliebige kombinatorische Funktion (NAND, XOR, AND, Multiplexer etc.) aus den Eingangssignalen realisieren. Die Anzahl der Eingangssignale pro LUT ist vom FPGA abhängig und liegt meist zwischen 4 und 6. Für Funktionen die mehr Eingänge erfordern als eine einzige LUT besitzt (hohes Fan-In), werden mehrere LUTs direkt miteinander verschaltet. Die [[FlipFlop]]s dienen dazu, Signalwerte zwischenzuspeichern, um sie im nächsten Takt weiterverarbeiten zu können. Das Verhältnis zwischen der Anzahl der LUTs und der Anzahl der Flip-Flops ist meist 1:1. Aktuelle FPGAs bestehen aus bis zu einigen zehntausend Logikelementen.&lt;br /&gt;
&lt;br /&gt;
Die logischen Schalter und Speicher sind in den meisten FPGAs durch [[Speicher#SRAM | SRAM]]-Speicherzellen realisiert, welche beim Bootprozess passend geladen werden. Das Laden dieser Konfigurationsdaten bzw. Verknüpfungsregeln geschieht dabei in der Regel aus einem speziellen [[Speicher#Flash | Flash-ROM]]-Baustein heraus. Es kann aber auch ein Mikrocontroller benutzt werden. Die meisten FPGAs bieten daher für diesen Konfigurationsvorgang mehrere Modi an (seriell, parallel, Master/Slave). Da die SRAM-Zellen ihren Inhalt beim Abschalten der Versorgungsspannung verlieren, muss ein SRAM-basierter FPGA bei jedem Einschalten neu konfiguriert werden. Daher benötigt ein solcher FPGA einige Millisekunden bis zu einigen Sekunden, bevor er voll betriebsbereit ist.&lt;br /&gt;
&lt;br /&gt;
Eine FPGA-Familie beinhaltet Typen mit unterschiedlicher Anzahl und Komplexität von Logikzellen. So enthält ein Spartan3-1000 ca. 2,5 mal so viel Logik (FF, LUTs) wie ein Spartan3-400.  &lt;br /&gt;
&lt;br /&gt;
FPGAs mit nichtflüchtigem Speicher basieren auf [[Speicher#EEPROM | EEPROM]]-, [[Speicher#Flash | Flash]]-Speicher (einige Familien von Lattice und Actel) oder AntiFuse- Technologie (Actel). Die sogenannten AntiFuse FPGAs sind nur einmalig programmierbar.&lt;br /&gt;
&lt;br /&gt;
=== I/O Anschlüsse ===&lt;br /&gt;
&lt;br /&gt;
FPGAs unterstützen als universal einsetzbare Digital-ICs eine Vielzahl von Signalstandards, um mit den unterschiedlichen Digitalbausteinen im Markt kommunizieren zu können.&lt;br /&gt;
&lt;br /&gt;
==== Pegelstandards ====&lt;br /&gt;
Es existieren je nach FPGA-Familie verschiedene TTL-Pegel (5V, 3,3V, 2,5V), differentielle Signalstandards (LVDS, GTL, GTP) und im Hochpreisbereich serielle Hochgeschwindigkeitsstandards mit bis zu 28 Gbit/s. Oftmals sind weitere Eigenschaften wie Treiberstärke und Flankensteilheit für jeden benutzerdefinierbaren Anschluss (User-IO) einstellbar. Meist sind die Pins zu Bänken mit gleichem I/O Standard zusammengefasst. Innerhalb einer solchen Bank arbeiten alle Pins im gleichen I/O Standard und mit der selben I/O Spannung. Für hohe Taktraten wird sowohl für Daten als auch die Takte der LVDS IO-Standard verwendet. Hier sind zwei komplementäre Buffer in unmittelbarer Nachbarschaft angeordnet.&lt;br /&gt;
&lt;br /&gt;
==== Signalrichtung ====&lt;br /&gt;
Innerhalb eines FPGAs gibt es nur eine Datenrichtung, d.h. der Ausgang eines Elementes kann nur mit Eingängen verbunden werden, da die FPGA-typischen Optimierungen nur so sinnvoll anwendbar sind. Rückwärtspfade zwischen internen Modulen müssen daher parallel und ausdrücklich aufgebaut werden. Bei den Ports hingegen kann zwischen den Optionen Eingang, Ausgang und Hochohmig gewählt werden. Die dazu benötigten &lt;br /&gt;
[[Ausgangsstufen Logik-ICs | Tristatebuffer]] werden implizit über VHDL definiert, indem einem Ausgang zeitabhängig der Zustand &amp;quot;Z&amp;quot; zugewiesen wird. Alternativ kann er explizit als Element eingefügt werden. Bei komplexeren FPGAs sind die Ein- und Ausgänge mit Verzögerungsgliedern versehen, die ein Anpassen des Timings bei Bussen wie z.B. schnellen Speichern ermöglichen.&lt;br /&gt;
&lt;br /&gt;
==== Terminierung ====&lt;br /&gt;
Ebenso können je nach Hersteller und Typ interne Pull-Up und Pull-Down-Widerstände sowie Terminationswiderstände zugeschaltet werden, [[Wellenwiderstand | Terminierung]] wird ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
==== Test und Inbetriebnahme ====&lt;br /&gt;
Einige Pins übernehmen besondere Funktionen und sind somit vom Anwender nicht uneingeschränkt oder z.T. auch gar nicht nutzbar. Dazu zählen neben der [[JTAG]]-Schnittstelle z.&amp;amp;nbsp;B. die Pins zum Einlesen der Konfigurationsdaten. Zudem befinden sich hinter vielen IO-Pads sog. [[Boundary_scan| Boundary Scan]] Zellen.&lt;br /&gt;
&lt;br /&gt;
==== Takteingänge ====&lt;br /&gt;
Einige wenige Pins (2 - 8) zum Einspeisen des Taktes für das Design vorgesehen. Für schnelle Schaltungen sollten diese reservierten Pins benutzt werden. Sie enthalten kein Eingangs-FF und wirken über instanziierbare Buffer direkt auf Taktnetze / PLLs. Bei leistungsfähigen grossen Applikationen mit mehreren Takten müssen diese genutzt werden, da nur eine begrenzte Zahl von DCMs (Digital Clock Manager) zur Verfügung steht und benachbarte IO-Pins genutzt werden müssen. Für hohe Taktraten werden LVDS-Eingänge verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Verwendung ====&lt;br /&gt;
Das I/O Verhalten wird zusammen mit vielen anderen Parametern in einer Datei festgelegt (Xilinx *.ucf, Altera *.acf, Lattice *.lpf). Alternativ können diese auch als Syntheseoption im Kommentarfeld des [[Verilog]]/[[VHDL]] Codes mit angegeben werden. Die Hersteller bieten FPGAs mit gleicher Anzahl von Logikelementen in unterschiedlichen Gehäusen an. So kann der FPGA mit der passenden Anzahl von Pins eingesetzt werden. Das obere Ende markieren Chips mit über 1500 I/Os, die kleinsten bieten ca. 50 User-I/O. Oft werden nur [[IC-Geh%C3%A4useformen#BGA|BGA]] und [[IC-Geh%C3%A4useformen#QFP|QFP]] Gehäuse (bis ca. 240 Pins) angeboten. Umgekehrt kann innerhalb einer Gehäusefamilie hochmigriert werden, d.h. bei gleichbleibendem Pinout, kann ein komplexerer FPGA eingesetzt werden. Das Layout muss dann nicht verändert werden, um eine Schaltung mit mehr Funktionen auszustatten.&lt;br /&gt;
&lt;br /&gt;
=== Besondere Funktionsblöcke ===&lt;br /&gt;
Neben den LUTs und den FlipFlops beinhalten FPGAs komplexe Routing- und Speicherkonfigurationsoptionen innerhalb und außerhalb der logischen Elemente, die es überhaupt erst gestatten, komplexe Schalt- und Rechenstrukturen aufzubauen. Aufgrund der gestiegenen Anforderungen geht man immer mehr dazu über, häufig benötigte Schaltungsteile fast in Hardware zu integrieren.&lt;br /&gt;
&lt;br /&gt;
==== DSP-Elemente ====&lt;br /&gt;
Für rechenintensive Designs, z.&amp;amp;nbsp;B. in der Signalverarbeitung, enthalten viele FPGAs &#039;&#039;&#039;Multiplizierer&#039;&#039;&#039; direkt auf dem Chip, die in sehr kurzer Zeit, z.B. auch einem einzigen Taktzyklus, breite Multiplikationen durchführen können. Bei modernen FPGAs treten hier noch Carry-Chains, Akkumulatoren und Speicher-FFs hinzu, um direkt lokal schnelle Summierer und Zähler realisieren zu können.&lt;br /&gt;
==== Block-RAMs ====&lt;br /&gt;
Ferner haben FPGAs oft einen von den LEs getrennt verfügbaren &#039;&#039;&#039;RAM&#039;&#039;&#039;-Bereich integriert, der sich in vielfältiger Weise ansprechen lässt. So können damit Single- oder Dualport-RAMs mit variabler Bitbreite erzeugt werden. Üblich sind mehrere (4 - 30) kleinere Dualport [[Speicher#BRAM | RAM-Blöcke]] von 4 - 16 kbit. Einige Familien besitzen einen größeren internen RAM, andere spezielle FIFO-Blöcke.&lt;br /&gt;
==== Taktgeneratoren ====&lt;br /&gt;
Zur Erzeugung der internen Takte sind &#039;&#039;&#039;PLL&#039;&#039;&#039;s (Phase Locked Loop) auf dem FPGA integriert. Einige Hersteller setzen eine Kombination aus statischen Taktmultiplizierer &#039;&#039;&#039;DLL&#039;&#039;&#039;s (Delay Locked Loop) ein. Mittels dieser Blöcke können aus einem Taktsignal weitere Takte abgeleitet werden. Typisch sind Taktverdopplung oder -vervielfachung. Ebenso kann der Takt bei gleicher Frequenz um eine einstellbare Phase verschoben erzeugt werden. Typische Anwendungen sind die Kompensation von Eingangsbufferverzögerungen, die Ansteuerung von [[Speicher#DDR-RAM | DDR-RAMs]] oder die Kompensation von Laufzeitunterschieden zwischen Takt und mit diesem getakteten Steuersignalen. Meist sind 2 - 8 Taktnetzwerke und PLL/DLLs gleicher Anzahl integriert. Siehe auch [[Taktung FPGA/CPLD]].&lt;br /&gt;
&lt;br /&gt;
=== CPU im FPGA ===&lt;br /&gt;
&lt;br /&gt;
Programmierbare Prozessoren sind auch in FPGA-Designs immer häufiger anzutreffen. CPUs sind zwar im Allgemeinen langsamer und weniger effizient, als eine vollständige Implementation aus Logik-Primitiven - aber bei komplexen Abläufen auch deutlich einfacher und zielführender zu programmieren, da die Strukturen festgelegt und damit bekannt sind. Insbesondere bei sequentiellen Aufgaben (Benutzerinterface, komplexe Steueraufgaben etc.) wird man gerne auf eine klassische CPU zurückgreifen. Die CPUs sind teilweise kompatibel zu etablierten Prozessorarchitekturen (MIPS, SPARC, AVR), zum Teil aber auch auf die FPGAs einzelner Hersteller hin optimiert.&lt;br /&gt;
&lt;br /&gt;
Als Programmspeicher werden die FPGA-internen [[Speicher#BRAM | RAM-Blöcke]] oder externe [[Speicher]] (SDRAM, SRAM) genutzt. Für einige Prozessorkerne stehen Hochsprachen wie C, C++ etc. zur Verfügung, andere werden in Assembler programmiert.&lt;br /&gt;
&lt;br /&gt;
==== Hardcores ====&lt;br /&gt;
Manche FPGAs haben dazu einen oder mehrere Prozessorkerne (z. B. [[AVR]] bei Atmels FPSLIC, PowerPC bei Xilinx&#039; Virtex bzw Dual ARM A9 bei Xilinx&#039; Zynq oder ARM Cortex-M3 bei Actel (Microsemi) SmartFusion ) als &#039;&#039;HardCores&#039;&#039; physikalisch auf dem Chip integriert, entweder als Chipstruktur auf dem FPGA-kern selbst oder als gebondeter Chip im selben Gehäuse.&lt;br /&gt;
&lt;br /&gt;
==== Softcores ====&lt;br /&gt;
Auf der anderen Seite gibt es auch [[FPGA Soft Core | SoftCores]] (z. B. ARM-Cortex-M1 bei IGLOO-FPGA von [http://www.actel.com ACTEL]), Prozessorkerne die als Quelltext oder als vorsynthetisierte Netzliste vorliegen. In Abhängigkeit von den zur Verfügung stehenden Ressourcen können diese &#039;&#039;SoftCores&#039;&#039; beliebig instanziiert werden. Es gibt eine Vielzahl verschiedener &#039;&#039;SoftCores&#039;&#039;. Einige sind sehr klein und platzsparend realisiert, damit kann man auch auf vergleichsweise kleinen aktuellen FPGAs problemlos eine 32bit-RISC-CPU integrieren.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
=== Chipausnutzung ===&lt;br /&gt;
Aufgrund des Umstandes, dass FPGAs eine Reihe von allgemeinen Funktionsblöcken, wie BRAM, Multipliers, Transceivern beinhalten, die naturgemäß nie voll ausgenutzt werden können und zudem viele Routing-Resourcen benötigen, um die gewünschten Verschaltungen zu ermöglichen, nutzen FPGAs die Chipfläche relativ schlecht aus, was zu entsprechende geringer finanzieller Effizienz führt.&lt;br /&gt;
&lt;br /&gt;
=== Taktgeschwindigkeit ===&lt;br /&gt;
Die maximale „Geschwindigkeit“ eines FPGAs ist von der verwendeten Halbleitertechnologie (Prozess, Strukturgrößen), der internen Schaltungstopologie (Komplexität der LEs), Vorhandensein von harten Strukturen und vor allem vom Design abhängig. Dabei sind der sogenannte Datendurchsatz und die rein maximale Systemtaktfrequenz zu unterscheiden. Die erreichbare Taktfrequenz lässt sich ohne detaillierte Kenntnis des Designs nicht abschätzen, möglich sind je nach »Speed Grade« des ICs typischerweise Taktfrequenzen von 300-600 MHz für die Schaltgeschwindigkeit der reinen Logikelemente. Je nach der Anzahl und Komplexität der pro Takt durchzuführenden Operationen ergeben sich dann reale Systemtaktfrequenzen von meist 10-100 MHz für global operierende Einheiten und bis zu 300 MHz für schnelle lokale Module. Maßgeblich ist in wieweit das Design auf Fläche bzw. Geschwindigkeit hin optimiert und vom Tool synthetisiert wurde: Durch das Einbringen von zusätzlichen Registerstufen lassen sich z.&amp;amp;nbsp;B. zeitkritische Pfade entschärfen (Pipelining), sodass die Frequenz des Chips angehoben werden kann und somit der effektive Datendurchsatz erhöht wird, mit dem Nachteil der gesteigerten Latenz durch das Mehr an Takten. Der Datendurchsatz lässt sich darüber hinaus durch die Nutzung paralleler Architekturen verbessern.&lt;br /&gt;
&lt;br /&gt;
Die Systemfrequenz kann-, muss aber nicht der Frequenz entsprechen, mit der Daten zyklisch eingetaktet und verarbeitet werden; zudem sind Schaltungsteile mit unterschiedlichen Taktfrequenzen zu unterscheiden: Mit einem Systemtakt von 20 MHz lassen sich z.&amp;amp;nbsp;B. 18-Bit AD-Wandler auslesen, die so z.&amp;amp;nbsp;B. alle 1 µs neue Daten liefern, die verarbeitet werden müssen. Bei der Nutzung von 5 solchen Wandlern, die sequentiell verarbeitet werden, lägen 5 MHz Datenfrequenz vor. Für andere Schaltungsteile, die z.&amp;amp;nbsp;B. asynchron an die Peripherie andocken, sowie reine »state machines« können Schaltungsteile auf der 2-4 fachen Frequenz betrieben werden.&lt;br /&gt;
&lt;br /&gt;
Generell sind Fläche und Geschwindigkeit konkurrierende Größen, zwischen denen ein Optimum gefunden werden muss. Für die preiswerten FPGA-Serien wie Spartan (Xilinx) und Cyclone (Altera) sind aufgrund technologischer Randbedingungen etwa 10-30% weniger Taktgeschwindigkeit bei gleichem Design zu erwarten als bei den großen Brüdern der Virtex- (Xilinx) bzw. Stratix-Familie (Altera). Es muss mit mehr Verbrauch an Logikelementen und Taktzyklen gerechnet werden (weniger Routingreserven, geringere Zahl von LUT-Eingängen, langsamere Logikelemente). Dafür sind sie sehr preiswert.&lt;br /&gt;
&lt;br /&gt;
Funktionstechnisch identische Chips werden oft in zwei oder mehr Geschwindigkeitsklassen (speed grades) angeboten, die sich meist durch Bauteilselektion bei der Produktion ergeben. Grob kann man ca. 5%-10% höhere Taktung zwischen zwei speed grades erwarten.&lt;br /&gt;
&lt;br /&gt;
== Herstellung ==&lt;br /&gt;
&lt;br /&gt;
FPGAs heutiger Bauart sind hochkomplexe Strukturen, da sie einerseits sehr hochgetaktet werden müssen, umfangreiche Funktionen bewerkstelligen sollen und damit genügend Resourcen haben müssen, andererseits aber preisgünstig und flexibel sein sollen, was umfangreiche Umschaltmöglichkeiten erfordert. Damit sind FPGAs als universelles Bauteil vergleichsweise teuer. Umso problematischer ist deren Fertigung:&lt;br /&gt;
&lt;br /&gt;
=== Herstellungsprozess ===&lt;br /&gt;
FPGAs werden als Analogschaltkreis unter Verwendung von Standardbibliotheken entwickelt, indem fertige, mehrfach simulierte und getestete Blöcke zusammengeschaltet werden. Dabei haben IO-Zellen, Schaltmatritzen und vor allem Controller, RAM-Blöcke und hardcores ihre Funktion mehrfach auf Silizium bewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Hersteller ===&lt;br /&gt;
&lt;br /&gt;
Die größten Hersteller von FPGAs sind [http://www.altera.com Altera] und [http://www.xilinx.com Xilinx]. Weitere Hersteller sind [http://www.latticesemi.com/ Lattice], [http://www.actel.com Actel] und [http://www.atmel.com Atmel].&lt;br /&gt;
&lt;br /&gt;
Einige  Hersteller wie Altera verfügen über keine eigene Fabrik (-&amp;gt; &amp;quot;fabless&amp;quot;), sondern lassen ihre entwickelten FPGAs und ASICs bei wechselnden Halbleiterherstellern fertigen. Dies führt zu jeweils günstigen Produktionskosten, allerdings auch zu Qualitätsschwankungen. Auch Liefergarantien sind schwerer zu erhalten, besonders, wenn man darauf angewiesen ist, dass ein Chip auch in 25 Jahren noch zu bekommen ist.&lt;br /&gt;
&lt;br /&gt;
== Anwendung und Programmierung ==&lt;br /&gt;
=== Erstellung der FPGA firmware===&lt;br /&gt;
&lt;br /&gt;
==== Design Flow ====&lt;br /&gt;
Der Aufbau komplizierter, applikationsnaher Strukturen wird meist durch automatische Routing- und Synthesewerkzeuge erledigt, welche mit einer logischen, funktionellen Beschreibung der Architektur in einer Hardwarebeschreibungssprache wie z.B. [[VHDL]] oder [[Verilog]] &amp;quot;gefüttert&amp;quot; werden. Die Hardwarebeschreibung gelingt ihrerseits z.B. mit Code-generierenden Werkzeugen, mittels derer zuvor Logikstrukturen, hardwarenahe Strukturen, Ablaufdiagramme und Zustandsautomaten formuliert wurden.&lt;br /&gt;
&lt;br /&gt;
Die Korrektheit der Funktion einzelner Blöcke wie der gesamten Schaltung wird mit Simulationswerkzeugen geprüft und im Sinne der Validierung formell nachgewiesen und dokumentiert.&lt;br /&gt;
&lt;br /&gt;
==== Wiederverwendbarkeit ====&lt;br /&gt;
Durch die Standardisierung der Architektur einerseits und die Entkopplung von applikationsorientierter Beschreibung sowie Chip- und Hersteller-spezifischer Synthese andererseits, wird die Hardware quasi als Software gebaut. Dies wiederum schafft alle Optionen der Wiederverwendung und Austausch von &amp;quot;Hardwareteilen&amp;quot;. So stehen inzwischen komplett nutzbare Schaltungen wie serielle Bausteine, RAM-Controller und vieles mehr zur Verfügung - teilweise sogar in Form von Open Source Projekten.&lt;br /&gt;
&lt;br /&gt;
Andererseits ist eine Tendenz erkennbar, dass Hersteller ihre Software und die damit erstellbare VHDL, speziell bei IP-Cores, immer stärker schützen und abkapseln. Diese produzieren kaum noch allgemeine VHDL, sondern nur noch herstellerspezifische Scripte. Zudem führen immer grösser werdende Unterschiede in den Chipstrukturen und Resourcen in modernen FPGAs dazu, dass die Portierbarkeit weiter eingeschränkt wird. Dies ist besonders bezüglich der Integration von Peripherie-Controllern oder ganzer Mikrocontroller der Fall. Bei SOPC-Systemen sind die generierten Strukturen praktisch überhaupt nicht mehr von einem FPGA-Hersteller zum anderen zu portieren und oftmals nicht einmal mehr zwischen FPGA-Familien desselben Herstellers kompatibel.&lt;br /&gt;
&lt;br /&gt;
=== Anbindung an Mikrocontroller ===&lt;br /&gt;
Es gibt unterschiedliche Arten, wie ein FPGA mit einem Controller verbunden sein kann. In der Regel ist der Controller der Master und arbeitet auf den FPGA. Dabei ist zwischen direkten impulsiven Zugriffen auf den FPGA nach Massgabe des internen Ablaufs im Prozessor, die jederzeit und wortweise an irgendeine Adresse erfolgen können und blockweisem Schreiben, also permanentem Datenfluss ohne Adressierung zu unterscheiden.&lt;br /&gt;
&lt;br /&gt;
Das wortweise Schreiben und Lesen erfolgt in Form eines klassischen Speicherinterfaces durch aktiven Zugriff auf den FPGA oder den FPGA hindurch auf einen RAM-Bereich, in den der FPGA seinen Speicher einblendet.&lt;br /&gt;
&lt;br /&gt;
==== Memory Mapped ====&lt;br /&gt;
Hierunter versteht man den Zugriff des Mikrocontrollers auf das FPGA in Form eines Speichers. Dabei muss der FPGA ein klassisches Speicherinterface zur Verfügung stellen. In einzelnen Fällen reicht es auch, wenn dieser ein internes Blockram im dual ported Modus an die Ports des Mikrocontrollers heranführt.&lt;br /&gt;
&lt;br /&gt;
==== Streaming IO ====&lt;br /&gt;
Liefert ein Mikrocontroller häufig grosse Datenmengen an einen FPGA, ist es mitunter sinnvoll auf einen aktiven Zugriff mit Wortadressierung zu verzichten und einen pipeline-Zugriff zu implementieren. Der FPGA &amp;quot;hört&amp;quot; dazu den Datenbus des FPGA ab und erkennt anhand z.B. der Aktivierung nur einer Schreibleitung den Beginn des Sendens und empfängt dann mit jedem Takt ein Wort. Was die Daten zu bedeuten haben und wohin sie zu schreiben sind, muss dann in den Daten codiert werden. Auch ist es denkbar den FPGA so zu konfigurieren, dass beim Schreiben auf eine ganz bestimmte Adresse ein grösserer Datenblock übergeben wird. &lt;br /&gt;
&lt;br /&gt;
In beiden Fällen wird im FPGA ein FiFo eingesetzt, der synchron mit dem Mikroprozessortakt beschrieben wird. Auf der Seite des FPGAs muss eine FSM überwachen, ob Daten ankommen und diese geeignet verarbeiten.&lt;br /&gt;
&lt;br /&gt;
==== Indirekte Busverbindung ====&lt;br /&gt;
Oftmals sind FPGAs und MCUs in grösseren Systemen über Busse verschaltet. So kann der FPGA an einem klassischen Daten-Adress-Bus parallel zu einem RAM und anderen Bausteinen über Adressdekodierung und Chip-Select betrieben werden, oder er wird über ein logisches Interface wie SPI angebunden.&lt;br /&gt;
&lt;br /&gt;
=== Anbindung an RAMs und ROMs ===&lt;br /&gt;
&lt;br /&gt;
==== DDR2 / DDR3 - RAM ====&lt;br /&gt;
Während die Ansteuerung eines normalen SRAMS mittels eines klassischen memory mapped interface recht einfach ist, bedürfen DRAMS- speziell mit DDR-Funktion einer aufwändigeren Schaltung, welche die komplizierte Kommoandostruktur der DDR-Ansteuerung versteht, pipelining und gfs cashing praktiziert und das RAM entsprechend bedient. Dabei sind RAM-spezifische Randbedingungen (refresh / self refresh) zu beachten. Für FPGAs existieren hier eine Reihe von konfigurierbaren IP-Cores&lt;br /&gt;
&lt;br /&gt;
==== SPI-Flash ====&lt;br /&gt;
Die Anbindung über SPI erfolgt meist über serielle Verbindungen wie I2C, da nur wenig Bandbreite benötigt wird. In selteneren Fällen werden FPGAs parallel mit einem Flash verbunden, z.B. bei grossen FPGAs mit umfangreichem image, welches aus einem Flash schnell geladen werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Anbindung an Peripherie ===&lt;br /&gt;
Typische Anwendungen für FPGAs sind die breitbandige (grosse Busbreite und/oder hohe Taktfrequenz) Gewinnung- und Verarbeitung von Daten, bei denen DSPs oder MCUs nicht mehr (effektiv) eingesetzt werden können. Typische Beispiele dafür sind:&lt;br /&gt;
&lt;br /&gt;
==== Videotechnik ====&lt;br /&gt;
[[Bildsensor]]en produzieren traditionell die grössten Datenmengen je Zeiteinheit und sind ohne FPGAs praktisch nicht mit der Aussenwelt in Kontakt zu bringen. FPGAs arbeiten hier entweder auf der Kunden- oder auch der Herstellerseite, um die komplexen Datenströme anzunehmen, vorzuverarbeiten und in eine reduziertes, praktikableres Datenformat umzusetzen. Auch die Annahme eines Videoformates ist praktisch nur mit FPGAs möglich.&lt;br /&gt;
&lt;br /&gt;
Die benötigten Datenschnittstellen können mit Hilfe von Transceiver-Ports / LVDS manuell realisiert werden, oder es werden Umsetzer-Chips verwendet. Beispiele:&lt;br /&gt;
&lt;br /&gt;
* HDMI-Transceiver für FPGAs ohne Gigabit-Transceiver&lt;br /&gt;
* SERDES-Transceiver für mittelpreise FPGAs ohne SERDES / sehr hohe Frequenzen&lt;br /&gt;
* Camera-Link-Deserializer (für langsame FPGAs)&lt;br /&gt;
* LVDS-Buffer-Deserializer (für langsame FPGAs ohne LVDS buffer)&lt;br /&gt;
* DVI-Buffer&lt;br /&gt;
&lt;br /&gt;
Für Analoge Daten benötigt man selbstredend noch Video-ADCs / Video-DACs, die überhaupt erst ein digitales Signal erzeugen.&lt;br /&gt;
&lt;br /&gt;
==== Gigabit-Ethernet ====&lt;br /&gt;
Für die Umsetzung auf den (praktisch analogen) [[Ethernet]]-Standard braucht es immer einen sogenannten [[Glossar#p|PHY]], also einen physikalischen Zusatzchip. Dieser vollzieht die [[Glossar#p|5PAM]]-Modulation und die Codierung im 10/8-Format. Die Ankopplung an den FPGA erfolgt direkt.&lt;br /&gt;
&lt;br /&gt;
Während althergebrachte 100MBit-Verbindungen dabei oft noch mit UCs und softcores zu bedienen waren, können 1GBit-Netzwerke nur noch mit FPGAs sinnvoll angesteuert werden. Umgekehrt ist das Gigabit-Netzwerk eine gute Lösung, um Daten effektiv und billig in einen PC zu transportieren, da moderne PCs alle eine GBit-Karte besitzen und die Datenrate bei schnellen CPUs auch weitgehend ausgenutzt werden kann. Typische Bandbreiten bewegen sich für Linux mit unmodifizierten Treibern bei 700MBit-800MBit.&lt;br /&gt;
&lt;br /&gt;
Der [[Glossar#m|MAC]], bzw MAC-ähnliche Funktionen, sind im FPGA direkt implementierbar (z.B. mit IP-Cores) und können mit einfachen [[Glossar#f|FSM]]s angesteuert werden. Für die Verwendung von C-Software ist es notwendig, einen hardcore zu verwenden, da mit softcores die Bandbreite kaum erreicht werden kann. Besonders das Verpacken der Daten, die Abarbeitung des Protokolls sowie die Bildung der Ethernet-header mit Checksummen, CRC und zusätzlichen Prüf- und Steuerinformationen sind in VHDL sehr einfach und entspannt zu erzeugen, weil parallel gearbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
Die Bandbreite einer typischen [[Glossar#g|GMII]]-Verbindung mit [[Glossar#d|DDR]] beträgt 2x150MHz x 8 Bit, was mit mittleren FPGAs gut zu machen ist. Die interne Bandbreite ohne header beträgt dann typisch etwa 800MBit, z.B. 50MHz x 16 Bit für die Daten. Ab diesem Punkt ist dann wieder ein schneller softcore einsetzbar.&lt;br /&gt;
&lt;br /&gt;
==== High-Speed-USB ====&lt;br /&gt;
Für die Übersetzung auf den immer schnelleren USB-Bus (inzwischen bis 5Gb Bandbreite!) stehen Chips zur Verfügung, die sich in vergleichsweise einfacher Weise ansteuern lassen. Eine passende Sende- und Empfangsarchtiktur ist in FPGAs relativ rasch zu implementieren.&lt;br /&gt;
&lt;br /&gt;
=== Implementierung von Steuerfunktionen ===&lt;br /&gt;
In den meisten FPGA-Applikationen sind mehr oder weniger komplizierte Abläufe zu integrieren, die den Datenfluss steuern und die einzelnen Komponenten so mit einenander verschalten, dass sie wunschgemäss aufeinander reagieren.&lt;br /&gt;
&lt;br /&gt;
Mit nativem VHDL sind einfache sequenzielle Abläufe mit überschaubaren Verschlachtelungstiefen und Schleifen direkt in Form von Zählersteuerungen oder abstrakten State Machines realisierbar. Dazu kann auf die automatische Codegeneration aus state machine designern heraus oder die halbautomatische Erzeugung von Code mit z.B. Excel zurückgreifen, die die Enumeration von states, die Abfragen und die Sprünge zu den nächsten states automatisch vollzieht. Dies hat aber seine Grenzen, weil dies früher oder später unübersichtlich wird und nicht mehr so gut pflegbar ist. Zudem kann sich der Code stark aufblähen und die Zusammenfassung etwaiger Redundanz durch die Synthese zu hohen Synthesezeiten führen.&lt;br /&gt;
&lt;br /&gt;
Applikationen, die nicht ganz so zeitkritisch sind, sollten lieber mit einer flexiblen, verschachtelten Struktur von 2 state machines abgearbeitet werden, bei denen der Ablauf von der Generation des Timings für die Hardware getrennt ist. In reinen Ablaufsteuerung stehen dann wie in einem Befehlsspeicher abstrakte Codes hintereinander und werden mittels einer intelligenten Struktur sequenziell abgearbeitet werden. Diese agiert wie ein Befehlsinterpreter und  stösst eine untergeordnete state machine an. Damit wird zwar mehr Zeit für die Verwaltung benötigt, es führt aber letztlich zu quantitav weniger Steuer-Code. Die Befehlsfolgen lassen sich z.B. günstig in einem ROM realisieren. Die gesamte Steuerung wird intelligenter und insgesamt kleiner.&lt;br /&gt;
&lt;br /&gt;
Eine deartige Steuerlogik lässt sich soweit ausbauen, dass untergeordnete state machines wie Unterprogramme ablaufen und durch ein flexibles Hauptprogramm gesteuert werden, womit sie sich immer mehr einer Prozessorarchitektur annähert.&lt;br /&gt;
&lt;br /&gt;
Wenn die Komplexität viele &amp;quot;Befehle&amp;quot; erfordert, gfs noch gerechnet und viel entschieden werden muss, lohnt der Rückgriff auf einen vorgefertigen Softcore. Dies hat den Vorteil, dass eine Standardstruktur verwendet wird, für die es erweiterte Entwicklungs- und Debugging-Software gibt. Spätestens, wenn man mit virtuellen Datenstrukturen und rekursiven Funktionen arbeitet, oder z.B. Zeichenkettenverarbeitung braucht, ist ein Softcore unerlässlich, &lt;br /&gt;
weil dann alle Methoden-, Variablen und sonstige Aspekte der jeweiligen Hochsprache verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele von VHDL Code ===&lt;br /&gt;
Siehe [[VHDL_Softwarepool]]&lt;br /&gt;
&lt;br /&gt;
== Einsatz in elektronischen Schaltungen ==&lt;br /&gt;
Der Einsatz von modernen FPGAs erfordert neben dem grundsätzlichen Wissen im Bezug auf den design flow und den für FPGAs optimierten Schaltungs- und Rechenstrukturen auch grosses Knowhow im Bereich der analogen Schaltungstechnik sowie auch der effektiven Vorgehensweise beim Design. &lt;br /&gt;
&lt;br /&gt;
=== FPGA aus analoger Sicht ===&lt;br /&gt;
FPGAs bedürfen heute eines perfekten Layouts, um mit RAMs und externen Chips zusammenarbeiten zu können, da sowohl die internen, als auch externen Taktfrequenzen rapide angestiegen sind. Ferner ist grosses Augenmerk auf die Spannungsversorgungen zu legen.&lt;br /&gt;
&lt;br /&gt;
=== Integration ins PCB ===&lt;br /&gt;
Weiter ist es heute kaum noch möglich, FPGA-Design vom board-Design funktionell zu trennen, wie man es mit Blick auf den scheinbar rein logischen Schaltungsentwurf glauben könnte und früher auch der Fall war. Da FPGAs heute stark dedizierte Funktionen enthalten, die nicht in jeder IO-Zelle zur Verfügung stehen oder spezielle Bank-Konfigurationen erforden, muss der Schaltungsentwurf und das Layouten des FPGAs und des Boards einhergehen.&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsboards und Starter-Kits ===&lt;br /&gt;
Von mehreren Seiten gibt es im Markt eine ganze Palette von sogenannten Entwicklungs- und Evaluierungsboards. Diese eignen sich nicht nur zum Kennenlernen des Chips, bez. zur Validierung der Lösung (ob die Schaltung wie gebaut auch im konkreten Ziel-FPGAs arbeitet) sondern werden immer öfter auch in bestehenden Systemen verbaut, weil aufgrund einer geringen Stückzahl die Selbstentwicklung nicht lohnt.&lt;br /&gt;
&lt;br /&gt;
Siehe [[Liste von FPGA Eval boards]]&lt;br /&gt;
&lt;br /&gt;
=== FPGA als Ersatz von alten digitalen ICs und Prozessoren ===&lt;br /&gt;
Es gibt vielfach den Wunsch, ICs, die nicht mehr direkt zu beschaffen sind, durch FPGAs (oder wenn möglich CPLDs) zu ersetzen. Gerade ältere Schaltungen&lt;br /&gt;
basieren aber durchaus noch auf 5V TTL und CMOS Logik. Oft sind die Systeme nicht ohne sehr hohen Aufwand und Verlust der Wirtschaftlichkeit zu ersetzen (wie ältere, produktive Industrieanalagen oder komplexe Rechensysteme - aber auch wenn es um die Erhaltung alter Hardware bei &amp;quot;retro-computing&amp;quot; geht).&lt;br /&gt;
&lt;br /&gt;
Nun bieten heute erhältliche (und günstige) FPGAs - aufgrund ihrer verwendeten Technologie - keine direkte 5V Kompatibilität mehr. FPGAs wie die Spartan II (nicht IIe), erlauben zumindest noch &amp;quot;5V Toleranz&amp;quot; auf den I/O-Pins. Das heißt: das FPGA wird zwar mit 3.3V versorgt und kann daher nur 3.3V am Ausgang treiben, erlaubt aber 5V von externen Bausteinen am Pin - dies ist nach wie vor TTL kompatibel, aber auch viele CMOS-Schaltungen können so durchaus noch betrieben werden.&lt;br /&gt;
&lt;br /&gt;
Für neueste 3.3V (oder weniger) FPGAs kann man Levelshifter-Schaltungen verwenden, die entweder bidirektional ausgeführt sind und ein &amp;quot;open-drain-artiges&amp;quot; Verhalten zeigen (also beide Seiten können die Leitung nur auf Lowpegel treiben, der Highpegel wird durch pull-up Widerstände erreicht) oder die unidirektional (mit optionaler Richtungsumkehr und/oder Treiberdeaktivierung über Kontrolleingänge) gebaut sind. Verwendung von Spannungsteilern, Zenerdioden-Schaltungen oder Ausnutzung von Diodenlimitierungen der I/O Treiber des FPGAs (und Verwendung eines Serienwiderstands zur Stromlimitierung) sind zumeist nur für niedrige Schaltfrequenzen gut geeignet und sorgen für eine erhöhte Stromaufnahme.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Pegelwandler]]&lt;br /&gt;
&lt;br /&gt;
== Debugging-Hilfen ==&lt;br /&gt;
=== Soft-Debugging ===&lt;br /&gt;
&lt;br /&gt;
=== Logikanalysatoren ===&lt;br /&gt;
Gerade beim [[Debugging]] größerer FPGA-Designs ist es oft notwendig, auf interne Signale und Busse zuzugreifen, die aus routing- oder Platzgründen nicht an Pins des FPGAs gelegt - und mit konventionellen Analysatoren beobachtet werden können. Nebst den einschlägigen Tools der Hersteller, welche Signal probing über JTAG gestatten (z.&amp;amp;nbsp;B. ChipsScope und SignalTap), werden in FPGAs oft mehr oder weniger komplexe [[Logic Analyzer]] integriert, welche die internen Signale in vielfältiger Weise aufzeichnen. Diese werden in Block-RAMs oder FIFOs gespeichert und durch externe Master ausgelesen. Hier kommen auf der Platine befindliche MCUs oder fremd zugreifende FPGAs / CPUs in Betracht, welche über unterschiedliche Kommunikationsverbindungen (seriell, parallel, LVDS) angeschlossen sind. Dazu werden in die FPGAs entsprechende Cores und state machines instanziiert und mit Software auf PC-Seite ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend einige Beispiele:&lt;br /&gt;
&lt;br /&gt;
==== Automatisch instanziierte Logic Analyzer ====&lt;br /&gt;
Praktisch alle FPGA-Hersteller bieten die Möglichkeit, mit einem internen Tool ein script zu erzeugen, welches der Synthese übergeben wird, welche dann anhand von Signallisten und diversen Randbedingungen einen LA automatisiert aufbaut und verdrahtet. SampleZeit und -Takt sind dabei genauso einstellbar, wie RAM-Tiefe und -Breite. Die so generierten Datenpakete können dann mittels JTAG ausgelesen werden. Im Continous-Betrieb können so sogar permanente Datenausgaben wie bei einem Oszilloskop vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Proprietärer serieller Logic Analyzer ====&lt;br /&gt;
&lt;br /&gt;
Die einfachste Möglichkeit ist die direkte Instanziierung eines Blockrams als FIFO mit &amp;quot;breitem&amp;quot; Busanschluss: Linksseitig besitzt das FIFO eine Breite von z.&amp;amp;nbsp;B. 256 Bit (Xilinx-Rams lassen sich ohne weitere Umbeschaltung über den Wizzard mit bis zu 1024 Bits deklarieren und nutzen). Rechtsseitig einen 16- oder 32 Bit breiten Busanschluss für einen Prozessor bzw Parallelinterface oder einen 1 Bit breiten Anschluss für ein serielles streaming interface. Mit einem FiFo-enable können die zu sampelnden Zeiten (Busphasen) festgelegt werden, z.&amp;amp;nbsp;B. anhand eines Kriteriums wie die Erfüllung einer bestimmten mathematischen Bedingung, die man in VHDL formuliert, oder es wird einfach ein Trigger gesetzt. Solange das FiFo nicht voll ist, kann geschrieben werden, was durch die interne FiFo-Verwaltung selbst bereits komplett geregelt wird.&lt;br /&gt;
&lt;br /&gt;
Beim einfachen seriellen Logic Analyzer benötigt man nur noch einen kleinen Core, der permanent das FiFo liest, und den seriellen Overhead (Startbit, Stoppbit, Parity und gfs CRC) hinzufügt. Mit einem einfach Pegelwandler kann so ein PC direkt angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Auch denkbar ist die Anbindung an ein fremdes FPGA-board mit viel Speicher über (LV-)DS-Kommunikation. In komplexeren Systemen wird ein CAN- oder USB-Core eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Wenn mittels des Kriteriums nur ganz bestimmte kritische Phasen herausgesampelt werden (z.&amp;amp;nbsp;B. das Auftauchen eines bestimmten Rechenfehlers im FPGA) und so das Datenaufkommen je Zeiteinheit über längere Zeit betrachtet eher gering ist, kann bei geeignetem Datendurchsatz in Echtzeit dauerhaft mitprotokolliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BusProbe ====&lt;br /&gt;
Mit der BusProbe, dem Debugging Core von abaxor engineering, kann der Entwickler den Signalfluss im FPGA-Design auch über einen längeren Zeitraum überwachen und am PC aufzeichnen. Der Core verarbeitet an jedem Eingang einen kompletten Bus. &lt;br /&gt;
&lt;br /&gt;
Die Daten werden gemultiplext zum PC geschickt und dort per Software demultiplext. Im PC erfolgt auch die Auswertung mit beliebigen Analyse-Tools.&lt;br /&gt;
&lt;br /&gt;
Gegenüber dem Betriebssystem verhält sich die BusProbe wie eine Festplatte, von der die Daten mit gewöhnlichen Zugriffen gelesen werden können.&lt;br /&gt;
&lt;br /&gt;
* Streaming der Daten zum PC mit mehr als 20 MByte/s&lt;br /&gt;
* keine Treiber im PC da Nutzung von Standardschnittstellen (USB oder IDE)&lt;br /&gt;
* Hot-Plugging&lt;br /&gt;
* Visualisierung mit beliebigen Programmen&lt;br /&gt;
* geringer Logikaufwand&lt;br /&gt;
&lt;br /&gt;
[http://www.abaxor.de/produkte.html abaxor.de-Webseite]&lt;br /&gt;
&lt;br /&gt;
==== open source Logikanalysator ====&lt;br /&gt;
===== sump.org =====&lt;br /&gt;
Ein einfacher, übersichtlicher Logikanalysator findet sich auf sump.org. Er liegt im Quelltext vor wird mit ins Design einsynthetisiert. Als Speicher dient wahlweise SRAM oder internes RAM. Es können 32 Kanäle mit 100 MHz (oder weniger) gesampelt werden. Die Bediensoftware läuft platformunabhängig unter Java und benötigt eine serielle Schnittstelle (auch über USB-seriell Wandler) zum Core.&lt;br /&gt;
&lt;br /&gt;
[http://de.sump.org/projects/analyzer/ sump.org-Webseite]&lt;br /&gt;
&lt;br /&gt;
===== Weitere =====&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/articles/Logic_Analyzer&lt;br /&gt;
&lt;br /&gt;
== FPGA-Design aus Projektsicht ==&lt;br /&gt;
Vielfach wird die Auffassung vertreten, die FPGA-Entwicklung gehöre zur Hardwareentwicklung, da es sich um ein elektronisches Bauteil handle, welches lediglich konfiguriert werde. Man spricht bei der FPGA-Entwicklung oft auch ausdrücklich nicht vom &amp;quot;Programmieren&amp;quot; sondern &amp;quot;Beschreiben&amp;quot; der Hardware. Beides ist aus folgenden Gründen unrichtig:&lt;br /&gt;
&lt;br /&gt;
* Die Vorgehensweise, die Struktur einer Schaltung durch virtuelle Konstrukte wie Logikgatter, Multiplexer und Schalter zu definieren, die in der Praxis so gar nicht exisiteren, sondern später in Form von LUTs realisiert wird, ist zwar formell eine Beschreibung einer Struktur, jedoch ist es eine sehr abstrahierte Form, da equivalente Funktionen definiert werden. Die Sollhardware wird demnach in weicher Form beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Der output des Designers besteht aus Grafiken, Skripten, Anweisungen, Einstellungen der Synthesesoftware und Strukturvorgaben, die nicht selbst Hardware sind, sondern Anweisungen an eine Erzeugersoftware und stellen damit ein Programm (lat. &amp;quot;Vorschrift&amp;quot;) dar.&lt;br /&gt;
&lt;br /&gt;
* Neben den allein schon durch die Nutzung bestimmter Funktionen wie RAMs, MCBs und Soft-Cores implizit vorgegebenen Abläufen im FPGA, werden fast immer auch noch weitere, explizite Handlungsabläufe mit Reaktionen auf äussere Einflüsse implementiert, die als klassische Software aufzufassen sind.&lt;br /&gt;
&lt;br /&gt;
* Der erzeugte Code der Erzeugersoftware wiederum ist selbst ein Programm und wird zusammen wie die Quellinformation des Designers archiviert, versioniert und wie übliche Software gehandhabt.&lt;br /&gt;
&lt;br /&gt;
Damit erfüllt die FPGA-Entwicklung formell mehrere Bedingungen, die als Softwareentwicklung aufgefasst und eingruppiert zu werden. Andererseits ergeben sich durch die weiter oben erwähnten, sehr ausgeprägten Themen im Bereich der Elektronik (z.B. der Nachrichten- und HF-Technik) sowie der Physik eine Vielzahl von harten Anforderungen, der klassischen Hardwareentwicklung.&lt;br /&gt;
&lt;br /&gt;
Zusammengefasst kann man daher 2 grundlegende Aspekte des FPGA-Designs konstatieren, die je nach Anwendungsfall als mehr oder weniger unabhängig von einander gesehen werden können.&lt;br /&gt;
&lt;br /&gt;
=== Logikdesign ===&lt;br /&gt;
Das funktionslogische Design besteht aus dem Entwurf des Systems, der benötigten Abläufe und der zu realisierenden Protokolle und Berechnungsverfahren. Hierbei sind Kenntnisse im Systementwurf, gfs. von SOPC-Systemen, der üblichen Bussysteme und der Software generell nötig. Hinzu treten Kenntnisse in der elementaren und/oder der komplexen abstrakten Mathematik und der Signalverarbeitung sowie der theoretischen Nachrichtentechnik. Ferner sind Methoden des Script- und Softwareentwurfes, sowie Handhabung von Software nötig.&lt;br /&gt;
&lt;br /&gt;
Dies alles stellt den Anteil dar, der klassischerweise als Softwareentwicklung aufgefasst wird. Es ist die Schnittstelle zur Funktionsschicht, also der grundsätzlichen Funktion eines Gerätes.&lt;br /&gt;
&lt;br /&gt;
=== Schaltungsdesign ===&lt;br /&gt;
Das praktische, hardwaretechnische Anteil des Designens erstreckt sich zudem über die physikalischen Themen der Temperatur- und Betriebsstabilität, der Strahlungs- und Störsicherheit, der Produzier- und Herstellbarkeit, des Wirkens und der Fehleranfälligkeit interner Schaltungsstrukturen, der Art und Weise der Ressourcennutzung bei unterschiedlichen Realisationsformen - besonders, wenn es auch Kostenoptimierung ankommt, des Analogverhalten der IOs und internen Strukturen im Bezug auf Frequenz und Pegel, der Signalintegrität der FPGAs und der Leiterbahnen sowie alle Anfordernisse im Umfeld der anzubindenen Chips.&lt;br /&gt;
&lt;br /&gt;
Dies ist der Anteil der gerne als Hardwareentwicklung eingestuft wird. Er stellt die Schnittstelle zur Physik und der Fertigung dar.&lt;br /&gt;
&lt;br /&gt;
=== Fazit ===&lt;br /&gt;
Die Verwendung von FPGAs ist heute komplexer denn je und erfordert in aller Regel starke Kenntnisse in beiden Feldern. FPGA-Entwicklung kann praktisch wie die Einbindung eines komplexen Evaluierungsboards oder einer programierbaren Steuerplatine mit festgelegten Funktionen aufgefasst werden.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Hardwarebeschreibungssprachen]]&lt;br /&gt;
* [[Reset für FPGA/CPLD]]&lt;br /&gt;
* [[Taktung FPGA/CPLD]]&lt;br /&gt;
* Projekt [[Audio-DSP mit Spartan 3-FPGA]]&lt;br /&gt;
* Projekt [[FPGA Lab]]&lt;br /&gt;
&lt;br /&gt;
== Forumlinks ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/274159 Tonleiter im PLD] - Beispiel einer einfachen Musikapplikation&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/326462?goto=3564346#3564346 Kopierschutz] für FPGAs und programmierbare ICs&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.fpga4fun.com/index.html FPGA4Fun] - FPGA-Projekte, größtenteils mit Altera und Verilog&lt;br /&gt;
* [http://marcowuen.wordpress.com/2014/09/08/overview-cheap-fpga-development-boards/ Übersicht Development Boards] - Zusammenstellung günstiger FPGA Boards unter 100$&lt;br /&gt;
* [http://video.google.com/videoplay?docid=-4969729965240981475 Ein Vortrag, auf Englisch: General Purpose, Low Power Supercomputing Using Reconfiguration Logic]&lt;br /&gt;
* http://www.opencores.org - FPGA-Projekte, Opensource, jeder kann seine Eigenen einstellen und an anderen mitarbeiten. U.a. gibt es verschiedene CPUs für FPGAs.&lt;br /&gt;
* [http://pin4.at/pro_misc.php#fdil Projekt &amp;quot;FDIL v2&amp;quot;]: 5V DIL-Ersatz mit 100kGates Spartan II FPGA (Englisch)&lt;br /&gt;
* [http://members.optushome.com.au/jekent/FPGA.htm John&#039;s FPGA Page]&lt;br /&gt;
* [http://www.embedded.com/columns/whatsnew/197003073 More about designing with embedded FPGAs] by Bernard Cole, Embedded.com&lt;br /&gt;
* [http://chaosradio.ccc.de/cre117.html Chaosradio Express - FPGA]&lt;br /&gt;
* [http://www.pin4.at/pro_custom.php Custom IC replacements] - DIL / TTL-Replacements mit FPGA (Englisch)&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co|Grundlagen|Bauteile]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=91411</id>
		<title>Prozessorarchitekturen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Prozessorarchitekturen&amp;diff=91411"/>
		<updated>2016-01-22T10:39:33Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: &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 der echte 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>Newgeneration</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Vektor-Font_in_C&amp;diff=90845</id>
		<title>Vektor-Font in C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Vektor-Font_in_C&amp;diff=90845"/>
		<updated>2016-01-01T22:04:46Z</updated>

		<summary type="html">&lt;p&gt;Newgeneration: /* Interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:Vekfont_1-5.png|thumb|right|Eine PNG-Grafik für &amp;quot;Hallo Welt!&amp;quot; in den Zoom-Stufen 1-5, erstellt aus einer mit VEKFONT erzeugten [http://de.wikipedia.org/wiki/Portable_Bitmap PBM-Grafik].]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[benutzer:gjlayde|gjlayde]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VEKFONT ist ein C-Modul zur Erzeugung von Vektor-Schriften. Ursprünglich wurde die Software für einen [[Mikrocontroller]] der [[AVR]]-Familie geschrieben, um in einer Scope-Uhr Zeichen und Texte auf die Röhre auszugeben. Die Software ist aber so allgemein gehalten, dass sie ebenso auf einem PC einsetzbar ist. &lt;br /&gt;
So wurden die Beispiel-Grafiken, die in diesem Artikel zu sehen sind, nicht auf einem AVR erzeugt (was problemlos möglich wäre), sondern direkt auf einem PC.&lt;br /&gt;
&lt;br /&gt;
Die Software ist in einem weiten Bereich via Defines konfigurierbar, so dass sie an die eigenen Bedürfnisse angepasst werden kann, ohne die Quelle ändern zu müssen.&lt;br /&gt;
&lt;br /&gt;
== Einsatzgebiet ==&lt;br /&gt;
[[Bild:Vekfont_1-3.svg|thumb|right|Eine SVG-Grafik für &amp;quot;Hallo Welt!&amp;quot; in den Zoom-Stufen 1-3 und unterschiedlicher Stiftdicke gezeichnet]]&lt;br /&gt;
&lt;br /&gt;
VEKFONT eignet sich zur Erzeugung von Zeichen und Texten auf flüchtigen Anzeigen wie Elektronenröhren und x/y-Medien wie einem Plotter. Pro Aufruf der Hauptroutine wird über einen Callback-Mechanismus immer genau ein Pixel ausgegeben, so dass die Routine auch in einer [[Interrupt]]-Service-Routine (ISR) verwendet werden kann. Über einen zweiten Callback wird über einen Sprung der Ausgabeposition informiert, was zur Strahlaustastung bei einer Röhre oder zum Anheben des Stiftes bei einem Plotter genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
Die Software ist auf Performance ausgelegt. Auf einem µC sollen möglichst wenig der kostbaren Ressourcen &amp;quot;Laufzeit&amp;quot; und &amp;quot;Programmspeicher&amp;quot; verbraucht werden. Gleichwohl ist VEKFONT parametrierbar und kann angepasst werden, indem z.&amp;amp;nbsp;B. nur Teile des Zeichensatzes wie Großbuchstaben verwendet werden, was zur Platzersparnis führt.&lt;br /&gt;
&lt;br /&gt;
== Interface ==&lt;br /&gt;
&lt;br /&gt;
Um einen Text zu erzeugen, müssen zunächst einige Einstellungen vorgenommen und die Callbacks implementiert werden, dazu gehört z.&amp;amp;nbsp;B. das Initialisieren der verwendeten vecfont_t-Struktur&lt;br /&gt;
&lt;br /&gt;
;vecfont_t: Die Struktur, die für die Ausgabe genutzt wird. Nur einige der wichtigsten Felder werden im folgenden erläutert.&lt;br /&gt;
&lt;br /&gt;
;char* .text: Der auszugebende Text als Null-terminierter String.&lt;br /&gt;
&lt;br /&gt;
;uint8_t .zoom: Die Vergrößerungsstufe. Nur ganzzahlige Zoom-Stufen sind realisiert.&lt;br /&gt;
&lt;br /&gt;
;void .beam_xy (vf_uint_t x, vf_uint_t y): Die Callback-Funktion wird aufgerufen, wenn ein Pixel an die Position (x,y) auszugeben ist.&lt;br /&gt;
&lt;br /&gt;
;void .beam_skip (void): Die Callback-Funktion wird aufgerufen, wenn die Ausgabe-Position einen Sprung macht.&lt;br /&gt;
&lt;br /&gt;
;vf_uint_t .start.x:&lt;br /&gt;
;vf_uint_t .start.y: Die Start-Koordinaten legen die untere, linke Ecke des ersten Zeichens fest. Hier beginnt die Text-Ausgabe.&lt;br /&gt;
&lt;br /&gt;
Nach der Initialisierung wird die Funktion vecfont_draw_letters so lange aufgerufen, bis sie einen Wert ungleich Null liefert.&lt;br /&gt;
&lt;br /&gt;
;uint8_t vecfont_draw_letters (vecfont_t *vf): Bei jedem Aufruf wird genau ein Pixel ausgegeben, d.h. der Callback vf-&amp;gt;beam_xy wird genau einmal aufgerufen. Zusätzlich kann ein Aufruf von vf-&amp;gt;beam_skip stattfinden, der über einen Sprung der Ausgabeposition informiert. &lt;br /&gt;
:return-Wert ist&lt;br /&gt;
:;== 0: Falls die Ausgabe noch nicht fertig ist und noch weitere Pixel auszugeben sind.&lt;br /&gt;
:;!= 0: Falls die Ausgebe fertig ist und alle Pixel des Textes ausgegeben wurden.&lt;br /&gt;
&lt;br /&gt;
Ein simples Beispielprogramm für den PC, das einfach nur Punkte in einem zweidimensionalen Array setzt, könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;vektor-zeichen.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Unser Vektorfont-Objekt&lt;br /&gt;
static vecfont_t font;&lt;br /&gt;
&lt;br /&gt;
// Ein Array von 256 x 256 Pixeln&lt;br /&gt;
static char pixel[256][256];&lt;br /&gt;
&lt;br /&gt;
static void beam_skip (void)&lt;br /&gt;
{&lt;br /&gt;
    // Der Strahl macht jetzt einen Sprung&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void beam_xy (vf_uint_t x, vf_uint_t y)&lt;br /&gt;
{&lt;br /&gt;
    // Es wird ein neuer Pixel gezeichnet&lt;br /&gt;
    pixel[x][y] = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main ()&lt;br /&gt;
{&lt;br /&gt;
    // Größe, Position und Text angeben&lt;br /&gt;
    font.zoom    = 2;&lt;br /&gt;
    font.start.x = 10;&lt;br /&gt;
    font.start.y = 100;&lt;br /&gt;
    font.text = &amp;quot;Hallo Welt!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Callbacks festlegen&lt;br /&gt;
    font.beam_skip = beam_skip;&lt;br /&gt;
    font.beam_xy   = beam_xy;&lt;br /&gt;
&lt;br /&gt;
    // Text rauspixeln&lt;br /&gt;
    while (!vecfont_draw_letters (&amp;amp;font));&lt;br /&gt;
&lt;br /&gt;
    // Ausgabe von pixel[][], z.B. als Grafik&lt;br /&gt;
    // ...&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übersetzt werden kann das ganze mit&lt;br /&gt;
 gcc -std=gnu99 main.c vektor-zeichen.c vektor-zeichen-data.c -DVEKFONT=&#039;(-1)&#039; -O2 -o main.exe&lt;br /&gt;
&lt;br /&gt;
== Konfigurierung ==&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration der Software geschieht i.W. beim Übersetzen über das Define VEKFONT. Die meisten Features können darüber aktiviert bzw. deaktiviert werden, so dass deaktivierte und unbenutzte Features nicht unnötig Programmspeicher und/oder Laufzeit auffressen. &lt;br /&gt;
&lt;br /&gt;
Standardmäßig sind alle Features deaktiviert, was dem gcc-Kommandozeilenargument -DVEKFONT=&#039;0&#039; entspricht. Alle Features werden aktiviert durch -DVEKFONT=&#039;(-1)&#039;, was alle Bits in der Bitmaske VEKFONT setzt.&lt;br /&gt;
&lt;br /&gt;
Um einen Zeichensatz zu erhalten, der Kleinbuchstaben und Umlaute unterstützt, kann man also beim Compilieren angeben&lt;br /&gt;
 -DVEKFONT=&#039;(VF_LOWERCASE | VF_UMLAUTS)&#039;.&lt;br /&gt;
Im einzelnen besteht &amp;lt;code&amp;gt;VEKFONT&amp;lt;/code&amp;gt; aus den folgenden Schaltern:&lt;br /&gt;
&lt;br /&gt;
;VF_UMLAUTS: Der Zeichensatz enthält Umlaute und Ligaturen (ß)&lt;br /&gt;
;VF_LOWERCASE: Der Zeichensatz enthält Kleinbuchstaben &lt;br /&gt;
;VF_ARROWS: Der Zeichensatz enthält Pfeil-Symbole, ansprechbar via &amp;lt;, &amp;gt;, \, ^&lt;br /&gt;
;VF_PUNKT: Der Zeichensatz kennt Punktuation wie +, -, *, ?, ...&lt;br /&gt;
;VF_MAP_UMLAUTS: Falls der Zeichensatz keine Umlaute enthält wird Ä als AE dargestellt, etc.&lt;br /&gt;
;VF_MAP_LOWERCASE: Falls der Zeichensatz keine Kleinbuchstaben enthält werden Kleinbuchstaben als Großbuchstaben dargestellt.&lt;br /&gt;
;VF_SHRINKY: Kleinbuchstaben &#039;e&#039; und &#039;s&#039; ragen 1 Pixel über die Mittellinie und werden daher zu groß. Wird dieses Flag gesetzt, dann werden diese Buchstaben etwas geschrumpft, damit sie die Höhe der anderen Kleinbuchstaben erhalten.&lt;br /&gt;
;VF_PROPORTIONAL: Zur Laufzeit kann via &amp;lt;code&amp;gt;.proportional&amp;lt;/code&amp;gt; zwischen Fixed-Font und Proportionalschrift umgestellt werden. Auf den Platzbedarf des Zeichensatzes hat das keinen Einfluss, das Programm wird aber etwas langsamer und größer.&lt;br /&gt;
;VF_ALWAYS_PROPORTIONAL: Die Schrift wird immer als Proportionalschrift angezeigt. Das Bit ist stärker als VF_PROPORTIONAL&lt;br /&gt;
&lt;br /&gt;
Eine eingehende Dokumentation findet sich im Header vektor-zeichen.h.&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
&lt;br /&gt;
Der Resourcen-Verbrauch von VEKFONT kann in recht weiten Grenzen angepasst werden. An Speicherverbrauch auf einem AVR muß man rechnen&lt;br /&gt;
* Flash: 1/2&amp;amp;ndash;1 kByte für den Zeichensatz, abhängig von Konfiguration&lt;br /&gt;
* Flash: 1/2&amp;amp;ndash;1 kByte für den Programmcode, abhängig von Konfiguration&lt;br /&gt;
* RAM: einige Bytes + Größe der Lookup-Tabelle. Hinzu kommt die Große der Vecfont_t-Struktur, die man selbst anlegen muß.&lt;br /&gt;
&lt;br /&gt;
=== Lookup-Tabelle ===&lt;br /&gt;
Die Lookup-Tabelle dient zum schnellen Auffinden der Zeicheninformation zu einem auszugebenden Zeichen. Standardmässig ist die Lookup-Tabelle deaktiviert, was zu einer längeren Ausführungszeit bei RAM-Ersparnis führt. Aktiviert wird die Lookup-Tabelle, indem man ihren Start und ihr Ende &amp;amp;ndash; jeweils in Form von ASCII-Codes &amp;amp;ndash; festlegt, was über die folgenden Makros geschieht:&lt;br /&gt;
&lt;br /&gt;
;VF_LOOKUP_START:&lt;br /&gt;
;VF_LOOKUP_END: Definiert ersten und letzten ASCII-Code der Zeichen, die in die Lookup-Tabelle aufgenommen werden. Die Tabelle wird dynamisch aufgebaut, so daß die allererste Ausgabe eines Zeichens länger dauert als die Nachfolgenden Ausgaben, weil bei der Erstausgabe nach der Zeicheninformation gesucht werden muss. &lt;br /&gt;
Beispiel:&lt;br /&gt;
 -DVF_LOOKUP_START=0x20 -DVF_LOOKUP_END=127&lt;br /&gt;
&lt;br /&gt;
=== Verwendete Arithmetik ===&lt;br /&gt;
&lt;br /&gt;
Standardmässig wird mit einer 8-Bit Arithmetik hantiert. Falls dies für die anzusteuernde Anzeige nicht ausreicht, kann per&lt;br /&gt;
 -DVF_INT_BITS=16&lt;br /&gt;
zu einer 16-Bit Arithmetik umgestellt werden. Dies hat Einfluß auf die verwendeten Typen wie vf_uint_t.&lt;br /&gt;
&lt;br /&gt;
=== Feste Zoom-Stufe ===&lt;br /&gt;
&lt;br /&gt;
Falls nur Texte in einer einzigen Zoom-Stufe ausgegeben werden und daher keine Notwendigkeit besteht, den Zoom zur Laufzeit zu ändern, so kann er über das Makro VF_ZOOM angegeben werden. Das spart Code und Laufzeit. Beispiel:&lt;br /&gt;
 -DVF_ZOOM=2 &lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
* [[Datei:Vektor-Font_in_C.zip|Vektor-Font_in_C.zip]]&lt;br /&gt;
&lt;br /&gt;
Dieses Archiv enthält alle Quellen, ein Makefile sowie die Beispielprogramme pc-vecfont.c (PC), pc-vecfont-svg.c (PC), avr-vecfont.c (AVR). &lt;br /&gt;
&lt;br /&gt;
Als Software wird benötigt:&lt;br /&gt;
* GNU make&lt;br /&gt;
* Eine gcc-Host-Toolchain&lt;br /&gt;
* Eine [[avr-gcc]]-Toolchain&lt;br /&gt;
* convert aus dem [http://www.imagemagick.org ImageMagick]-Paket zum Umwandeln von PBM nach PNG.&lt;br /&gt;
* Optional ein SVG-Betrachter wie [http://www.inkscape.org Inkview] oder [http://www.firefox.com FireFox].&lt;br /&gt;
&lt;br /&gt;
;pc-vecfont.c: Erstellt aus dem per Kommandozeile angegebenen Text eine [http://de.wikipedia.org/wiki/Portable_Bitmap PBM-Grafik] mit dem Text in 5 Zoom-Stufen. Eine einfache Beispiel-Implementierung.&lt;br /&gt;
&lt;br /&gt;
;pc-vecfont-svg.c: Erstellt aus dem per Kommandozeile angegebenen Text eine [http://de.wikipedia.org/wiki/Scalable_Vector_Graphics SVG-Grafik] mit dem Text in 3 Zoom-Stufen. Eine wegen des SVG-Formats etwas kompliziertere Implementierung.&lt;br /&gt;
&lt;br /&gt;
;avr-vecfont.c:&lt;br /&gt;
;avr-vecfont-callbacks.h: Implementiert den Vektor-Font für AVR, indem die Callbacks über Hook-Makros auf Inline-Funktionen abgebildet werden. Diese Implementierung zielt auf minimalen Flash-Verbrauch und kurze Laufzeit und verwendet daher eine Lookup-Tabelle von &#039;A&#039;-&#039;Z&#039; zum schnellen Auffinden der Zeichen-Information. Die Zoom-Stufe ist im Makefile hartcodiert auf 2 eingestellt, um Rechnungen zur Laufzeit zu vermeiden. Software inklusive Zeichensatzinformation belegen weniger als 1kByte Speicher. &lt;br /&gt;
&lt;br /&gt;
:Für eingehende Dokumentation und Verständnis ist ein Blick in die Quellen angesagt.&lt;br /&gt;
&lt;br /&gt;
== Forum ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/108649 Vektor-Font in C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:PC-Programmierung]]&lt;br /&gt;
[[Kategorie:Displays und Anzeigen]]&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Newgeneration</name></author>
	</entry>
</feed>