<?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=172.26.27.242</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=172.26.27.242"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/172.26.27.242"/>
	<updated>2026-04-11T03:16:20Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Strukturierte_Programmierung_auf_Mikrocontrollern&amp;diff=105471</id>
		<title>Strukturierte Programmierung auf Mikrocontrollern</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Strukturierte_Programmierung_auf_Mikrocontrollern&amp;diff=105471"/>
		<updated>2022-10-06T09:29:46Z</updated>

		<summary type="html">&lt;p&gt;172.26.27.242: /* Grundlegendes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundlegendes ==&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel sollen die Grundlagen der sauberen Aufteilung eines Programms in Module, Schichten und Strukturen erklärt werden, besonders bezogen auf Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
Leider fällt im Forum oft auf, dass sehr gerne einfach alles in eine C-Datei &amp;quot;geklatscht&amp;quot; wird, was für kleinere Programme halbwegs funktionieren mag, bei größeren Projekten jedoch versagt, da man schnell die Übersicht verliert und sich auch die Wartbarkeit des Codes sehr verschlechtert.&lt;br /&gt;
&lt;br /&gt;
Für die stukturierte (professionelle) Programmierung sind 3 Faktoren von Bedeutung:&lt;br /&gt;
&lt;br /&gt;
== Planung ==&lt;br /&gt;
Zahllose Softwareentwickler starten ihre Programmierkarriere out of the box, d.h. sie haben keine Ausbildung und bringen sich das Programmieren selber bei. Sie starten daher oft direkt mit der Entwicklungsplattform und Beispiel-Codes, die sie modifizieren. Damit wird sozusagen auf der Ebene der Umsetzung gestartet und die Funktion des Programmes quasi nebenbei mit geplant. Dieses für kleine Projekte funktionable Vorgehen, bringt dann bei wachsenden Programmen Probleme, weil der Entwickler niemals ein strukturiertes Entwickeln gelernt hat. Diese Personen haben dann in der Praxis das Problem, dass sie gesteigerten Anforderungen in Sachen Planung und Dokumentation gegenüberstehen und die althergebrachte bottom up Methode nicht mehr gefragt ist. Unglücklicherweise wird selbst an Hochschulen nur sehr selten auf praktische Belange diesbezüglich Rücksicht genommen.&lt;br /&gt;
&lt;br /&gt;
Am Anfang eines Projektes steht daher sinnvollerweise ein Konzept, in dem wichtige Dinge vorab erfasst sind, damit man sich während des Entwickelns nicht &amp;quot;verläuft&amp;quot;. As nützlich haben sich erweisen:&lt;br /&gt;
&lt;br /&gt;
- Beschreibung der Funktionen eines Programmes mit Benutzereingriffsmöglichkeiten (use cases), jeweilige Reaktion des Programms (responses, event handling), autonome Aktionen im Hintergrund (interrupts, polling), erlaubte Funktionen, verbotene Zustände&lt;br /&gt;
&lt;br /&gt;
- Erstellung eines Blockdiagramms zur Aufteilung der funktionellen Module und Beschreibung der Untermodule und ihrer Funktion&lt;br /&gt;
&lt;br /&gt;
- Hinweise zur Umsetzung unter Rücksichtnahme auf Randbedingungen der speziellen Hardware (z.B. Timing, Tempo des Controllers, Loop-Anzahl, Verzögerungen infolge polling, maximale Interrupttiefe, und -dichte.&lt;br /&gt;
&lt;br /&gt;
- Beschreibung der mathematischen Funktionen, Niederlegung der Formeln, Beispielrechnungen in Excel mit Test der Auflösungen und Rundungsuntersuchung samt Bereichsgrenzenprüfung etc.&lt;br /&gt;
&lt;br /&gt;
Diese Vordokumentation ergibt einen Leitfaden für die Entwicklung = Umsetzung und hilft, dass mehrere Personen an einem Projekt arbeiten können. Zudem ist es leichter erweiterbar, da sofort ersichtlich ist, was die Software können sollte und was sie nicht kann und worauf Rücksicht genommen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumentation wird um die finale Doku erweitert und bildet wiederum die Basis für Änderung, die Erzeugung von Abkömmlingen und die Planung neuer Projekte. Hat man einen Stamm an Doku beisammen, ist die Planung und Definition nur noch ein Copy&amp;amp;Paste und man hat direkt einen Leitfaden der Todos im neuen Projekt. Die Chance, etwas zu vergessen oder zu übersehen, wird drastisch verringert.&lt;br /&gt;
&lt;br /&gt;
== Versionsverwaltung ==&lt;br /&gt;
&lt;br /&gt;
Oft kommt es vor, dass man an einem Programm arbeitet und irgendwann nach einer Änderung gar nichts mehr funktioniert und man es, warum auch immer, nicht schafft, den alten Zustand wiederherzustellen. Labile Naturen werfen dann meist das Projekt einfach hin, echte Männer fangen von vorn an ;-). Beides ist keine Lösung. Besonders interessant wird es, wenn man mit mehreren Personen an einer Datei arbeiten möchte und mehrere zur gleichen Zeit auf der selben Datei arbeiten. Wenn jeder einfach speichert, bleiben nur die letzten Änderungen erhalten.&lt;br /&gt;
&lt;br /&gt;
Dies löst ein Versionsverwaltungssystem, auch Source Code Management (SCM) oder Version Control System (VCS) genannt. Bekannte Versionsverwaltungen sind RCS, CVS, SVN, GIT. Ich möchte mich hier auf SVN beschränken. Eine gute Grundlagenerklärung zur Funktion von SVN bietet der Wikipedia-Artikel [http://de.wikipedia.org/wiki/Subversion_(Software) Subversion]. Ich bitte den Leser, sich diesen Artikel gründlich zu Gemüte zu führen. Dort sind vor allem wichtige Grundbegriffe erklärt, die den Rahmen dieses Artikels sprengen würden.&lt;br /&gt;
&lt;br /&gt;
Wer unter Linux, Unix oder BSD-Varianten arbeitet, der hat unter allen bekannten Versionsverwaltungen die größte Auswahl. Selbst ein frühes Festlegen auf ein SCM ist nicht unumkehrbar, denn es gibt sogar Konverter, die später den ganzen Code-Baum samt Geschichte umwandeln in ein anderes SCM.&lt;br /&gt;
&lt;br /&gt;
=== Installation von SVN ===&lt;br /&gt;
&lt;br /&gt;
Unter Windows empfehle ich den Server [http://www.visualsvn.com/ VisualSVN] und den in die Windows-Oberfläche integrierten Client [http://tortoisesvn.net/ TortoiseSVN]. Unter einem Debian-Derivat (z.&amp;amp;nbsp;B. Kubuntu) installiert man einfach das Paket &#039;&#039;&#039;subversion&#039;&#039;&#039;. Es existieren auch für Linux graphische Clients, auf die ich hier nicht weiter eingehen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Verwendung von SVN ===&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung von SVN gibt es eine sehr gute Anleitung unter: [https://www.bsdwiki.de/Subversion BSDwiki].  Ein Versionsverwaltungssystem mag zunächst lästig erscheinen. Spätestens, nachdem man das erste Mal seine Software zerschossen hat, mag man es nicht mehr missen.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Wichtig ist eine gute Dokumentation des Codes. Eine Möglichkeit dabei sind aussagekräftige Kommentare im Programmtext, die es gestatten, einen Zusammenhang zwischen der Implementierung und der Funktion herzustellen. &amp;quot;Aussagekräftig&amp;quot; bedeutet damit, dass man nicht schreibt, &#039;was&#039; die Codezeile macht, sondern &#039;warum&#039; und was sie funktionell bedeutet:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;schlecht&#039;&#039;&#039;:&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
maxTests = 5;       # Setze maxTests auf 5         &amp;lt;--- redundant und daher nutzlos&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gut&#039;&#039;&#039;:&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
maxTests = 5;       # Maximal 5 Abfragedurchläufe  &amp;lt;--- Bindung zur gewünschten Funktion. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin wird vor allem für größere Sachen empfohlen, ein integriertes Dokumentationssystems zu verwenden. Hier wurden gute Erfahrungen mit [http://de.wikipedia.org/wiki/Doxygen Doxygen] gemacht. Dieses Programm wurde unter der GPL veröffentlicht und erzeugt u.A. auch sogannte Callgraphs&lt;br /&gt;
&lt;br /&gt;
Doch nicht nur das Vorhandensein inhaltlicher Erläuterungen ist wichtig - auch die Art der Codegestaltung spielt in der Praxis eine wesentliche Rolle:&lt;br /&gt;
&lt;br /&gt;
== Formatierung des Quelltextes ==&lt;br /&gt;
&lt;br /&gt;
Um ein Programm gut und schnell verstehen zu können, muss auch der Quelltext sauber formatiert sein. Denn ein Programm schreibt man einmal, liest es aber viele Male. Dazu müssen ein paar grundlegende Formatierungsregeln beachtet und einheitlich umgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
* Syntax highlighting: Die meisten Editoren und Entwicklungsumgebungen unterstützen das farbige Hervorheben von Schlüsselwörtern. Das erleichtert die Lesbarkeit deutlich. Vor allem Kommentare sind somit leichter lokalisierbar.&lt;br /&gt;
* Einrückung: Bei While oder For -Schleife, If-Abfragen oder switch-Anweisungen sollen die Blöcke stets eingerückt werden, um die logische Struktur darzustellen. Dadurch sieht man auch leichter vergessene Klammern oder falsche logische Zuordung in verketteten if-Anweisungen.&lt;br /&gt;
* Begrenzung der Zeilenlänge auf 80-100 Zeichen&lt;br /&gt;
* Tabulatoren als Leerzeichen einfügen lassen: Das können die Editoren heute allein. Der Vorteil ist, dass der Quelltext danach immer gleich aussieht, und nicht auf einem anderen Editor mit anderer Tabulatoreinstellung verschoben aussieht.&lt;br /&gt;
&lt;br /&gt;
=== Benennung von Variablen, Makros, Nutzung von Anweisungen ===&lt;br /&gt;
&lt;br /&gt;
* selbsterklärende Funktions- und Variablennamen ersparen einem 100000 Kommentare&lt;br /&gt;
* Variablennamen sollen in erster Linie den Inhalt einer Variablen beschreiben, nicht ihren Datentyp.&lt;br /&gt;
* Defines komplett in GROSSBUCHSTABEN&lt;br /&gt;
* Namen von Variablen und Funktionen bzw. Methoden in Kleinbuchstaben; Worttrennung mit Unterstrich oder CamelCase (jede Wortsilbe beginnt mit einem Großbuchstaben, z.B GetInfo, MaxCount etc.)&lt;br /&gt;
* Namen wie i, j, k für Indizes für Zählschleifen&lt;br /&gt;
* Variablen wie x, y, z für Positionen&lt;br /&gt;
* bei Arrays z.B. einkaufsPreis[i] oder einkaufsPreis[index] verwenden. i bzw. index sind übliche Namen um aus einem Array ein einzelnes Element zu identifizieren.&lt;br /&gt;
* Variablen und Makros so lokal wie möglich halten&lt;br /&gt;
* mit globalen Variablen sparsam umgehen und diese auch im Namen kennzeichnen, z. B. den Modulnamen voranstellen &#039;i8_LOG_Position&#039;&lt;br /&gt;
* Vermeidung langer Funktionen / Aufspalten in kleinere Funktionen und Bibliotheken: Verwendest du den gleichen Code an verschiedenen Stellen lohnt es sich diesen in eine Funktion auszulagern.&lt;br /&gt;
* Eine Funktion löst genau eine Aufgabenstellung&lt;br /&gt;
* Funktionen sollen nur das machen, was der Funktionsname erwarten lässt.&lt;br /&gt;
* Wiederverwendbarkeit durch Funktionen, keine doppelten Codeteile, für Geschwindigkeit notfalls #inline verwenden&lt;br /&gt;
* kurze und knackige Berechnungen, keinen Spaghetticode; Werden in der Berechnung Konstanten verwendet, dann am besten einen Kommentar dazu (z. B. b = a*3.6e6 // 3.6e6 ist Millisekunden pro Stunde)&lt;br /&gt;
* statt ?: am besten Verzweigungen verwenden, da dieser oft nicht bekannt ist und auch nur noch selten verwendet wird.&lt;br /&gt;
* Leerzeichen und Leerzeilen kosten kein Geld! Aber bitte nicht tonnenweise!&lt;br /&gt;
* Kommentare schreibt man für sich selbst, für später&lt;br /&gt;
* Kommentare sofort schreiben, hinterher ist man zu faul und nicht mehr zu 100 % im Problem vertieft&lt;br /&gt;
* Je genialer die Idee, um so nötiger der Kommentar.&lt;br /&gt;
* Zusammenhänge dokumentieren. Die erschliessen sich nicht aus den paar Zeilen Code, auf die man gerade schaut!&lt;br /&gt;
* Kommentare sollen die &#039;Warum&#039;-Frage beantworten und nicht die &#039;Wie&#039;-Frage! Wie etwas gemacht wird, steht im Code. Aber dort steht nicht warum es gemacht wird.&lt;br /&gt;
* Kommentare nach dem Muster &amp;quot;Das ist eine for-Schleife&amp;quot; lösen maximal Schmunzeln aus, es sei denn es handelt sich um ein C-Lehrbuch. Solche Kommentare (&amp;quot;Hier beginnen die Variablen&amp;quot;, &amp;quot;Hier beginnen die Funktionen&amp;quot;, etc) lässt man besser. Jeder der mehr als 5 Stunden C programmiert erkennt eine for-Schleife auf Anhieb und wenn nicht soll er zuerst ein C-Buch studieren, ehe er sich an Code versucht.&lt;br /&gt;
* Die üblichen Regeln der Muttersprache sollten in den Stil einfließen&lt;br /&gt;
* einheitlicher Stil bei Formatierung und Namensgebung&lt;br /&gt;
* Vermeidung voreiliger Optimierungen&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Sicherung gegen doppeltes Einfuegen von Headerfiles */&lt;br /&gt;
#ifndef HEADER_FILE_NAME&lt;br /&gt;
#define HEADER_FILE_NAME&lt;br /&gt;
&lt;br /&gt;
// Das Headerfile&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define IN_GROSSBUCHSTABEN       // Caps mit underline&lt;br /&gt;
&lt;br /&gt;
int funktionsName(int param);    // CamelCase&lt;br /&gt;
&lt;br /&gt;
char varName;                    // CamelCase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modularisierung ==&lt;br /&gt;
&lt;br /&gt;
Nun zum wichtigsten Punkt: Ein Programm richtig in Module und Schichten zu unterteilen. Das ist aus verschiedenen Gründen notwendig.&lt;br /&gt;
&lt;br /&gt;
* Übersichtlichkeit: Vor allem bei größeren Sachen will und muss man den Überblick behalten. Dazu muss ein Programm sauber formatiert und strukturiert sein.&lt;br /&gt;
* Wartungsfreundlichkeit: Sowohl in der Entwicklungsphase als auch später bei der Erweiterung/Wartung ist ein gut modularisiertes Programm sehr wichtig&lt;br /&gt;
* Speicherverbrauch: Einen Ablauf, welcher mehrfach im Programm verwendet wird, packt man sinnvollerweise in eine Funktion. Dadurch wird nur einmal Speicherplatz benötigt, egal wie oft sie verwendet wird. &lt;br /&gt;
* Kapselung: Das Prinzip des Versteckens von Details steigert die Lesbarkeit deutlich, denn eine Funktion, die vielleicht drei Bildschirmseiten füllt, steht einfach als eine Anweisung in einer Zeile. Das ist vor allem deshalb von Vorteil, weil man sich nur einmal mit den Details einer Funktion beschäftigen muss, nämlich dann, wenn man sie erstellt. Für die Nutzung im Programm will man diese Information gar nicht haben, sie stören hier nur (Informationsüberfluß). &lt;br /&gt;
* Leistungsfähigkeit: Ein gut modularisiertes Programm erreicht ein bestimmte Funktionalität einfach und kompakt, weil die einzelnen Funktionen so angelegt sind, dass sie einfach und dennoch vielfältig verwendet werden können. Wichtig ist dabei die richtige Portionierung.&lt;br /&gt;
**Welche Funktion sollen immer zusammen sein, welche sollten getrennt werden?&lt;br /&gt;
**Wie gestaltet man die Parameter für eine Funktion sinnvoll?&lt;br /&gt;
* Testbarkeit: Das leidige Thema der Softwareentwicklung ist der Test. Dieser sollte theoretisch alle Fehler finden, praktisch wird das aber oft nicht erreicht. Da Software meist eine recht komplexe Sache ist, kann man sie nur sehr schwer als Gesamtwerk vollständig prüfen. Darum müssen zuerst die Teile einzeln getestet werden. Ein gut modularisiertes Programm kann man leichter testen.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
*[[Erweiterte LCD-Ansteuerung]]: Artikel mit einem einfachen Beispiel für strukturierte Programmierung&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/26550#new Forumsbeitrag]: C++ CodeChecking (Style,...)&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/132304#new Forumsbeitrag]: Tutorial für _sauberen_ C-Code&lt;br /&gt;
*[https://www.mikrocontroller.net/topic/392060?goto=new#new Forumsbeitrag]: goto verpönnt - was dann nehmen?&lt;br /&gt;
*[https://www.mikrocontroller.net/topic/438529#new Forumsbeitrag]: Doku zu AVR Assembler für komplexe Projekte&lt;br /&gt;
*[https://www.mikrocontroller.net/topic/1675?goto=new#10504 Forumsbeitrag]: Klingonische Softwareentwickler (Achtung Humor!)&lt;br /&gt;
*[https://www.mikrocontroller.net/topic/533978#7002671 Forumsbeitrag]: Suche Literatur für strukturierte Embedded Programmierung&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.gimpel.com/html/pcl.htm PC-lint, ein Analyseprogramm für C-Code]&lt;br /&gt;
* [http://www.chris-lott.org/resources/cstyle/indhill-cstyle.html Recommended C Style and Coding Standards, engl.]&lt;br /&gt;
* [http://www.jetcafe.org/jim/c-style.html Standards and Style for Coding in ANSI C, engl.]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Programmierstil Wikipediaartikel über Programmierstil]&lt;br /&gt;
* [http://www.campwoodsw.com/sourcemonitor.html Tool zur statischen Codeanalyse u.a. für C/C++]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Program_optimization Program optimization] auf Wikipedia, engl.&lt;br /&gt;
* [https://sites.google.com/site/artcfox/demystifying-the-tlc5940 demystifying-the-tlc5940] Umfassende Erklärung zur Ansteuerung eines TLC5940 sowie Hinweisen zum Vorgehen bei der Einarbeitung in neue Hard- und Software, engl.&lt;br /&gt;
* [http://kotaku.com/5975610/the-exceptional-beauty-of-doom-3s-source-code The Exceptional Beauty of Doom 3&#039;s Source Code] (engl.)&lt;br /&gt;
* [ftp://ftp.idsoftware.com/idstuff/doom3/source/CodeStyleConventions.doc CodeStyleConventions.doc] von iD Software für DOOM 3, (lokale [[:Datei:CodeStyleConventions_ID_Software.pdf | Kopie]]) &lt;br /&gt;
* [http://www.amazon.de/Weniger-schlecht-programmieren-Kathrin-Passig/dp/3897215675/ref=sr_1_1?ie=UTF8&amp;amp;qid=1444238128&amp;amp;sr=8-1&amp;amp;keywords=weniger+schlecht+programmieren Weniger schlecht programmieren], ISBN: 3897215675&lt;br /&gt;
* [http://c2.com/cgi/wiki?ThreeStarProgrammer ThreeStarProgrammer]: Warum man keinen hochkomplexen Code schreiben soll (engl.)&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Therac-25 Therac-25] Beschreibung eines Unfalls in der Medizintechnik, hervorgerufen durch Software- und Konzeptfehler&lt;br /&gt;
* [http://www.ccnr.org/fatal_dose.html FATAL DOSE] Radiation Deaths linked to AECL Computer Errors (engl.)&lt;br /&gt;
* [https://www.safetty.net/publications/pttes ‘Patterns for Time-Triggered Embedded Systems’]  by Michael J. Pont&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>172.26.27.242</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=%C3%84tzen_mit_luftregenerierten_Kupferchlorid&amp;diff=105469</id>
		<title>Ätzen mit luftregenerierten Kupferchlorid</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=%C3%84tzen_mit_luftregenerierten_Kupferchlorid&amp;diff=105469"/>
		<updated>2022-10-05T11:13:03Z</updated>

		<summary type="html">&lt;p&gt;172.26.27.242: /* Equipment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [https://www.mikrocontroller.net/user/show/coldtobi Coldtobi], Ergänzungen zu Kaliumchlorid von [https://www.mikrocontroller.net/usr/show/bastians BastianS]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
&lt;br /&gt;
Vor etwa zwei Jahren (2010?) bin ich auf das [http://home.exetel.com.au/adam.seychell/PCB/etching_CuCl/index.html hier] beschriebene Verfahren gestosssen und habe es zum ersten Mal 2012 ausprobiert.&lt;br /&gt;
&lt;br /&gt;
Das Charmante an dieser Lösung ist, das die Ätzbrühe nie verdirbt (nur mehr wird) und das nachdem man die Ätzbrühe zum ersten Mal angesetzt hat keine anderen Chemikalien als Salzsäure* benötigt werden. &lt;br /&gt;
&lt;br /&gt;
Im Prinzip ähnelt diese Methode der Methode [[Platinenherstellung_mit_der_Photo-Positiv-Methode#mit_Salzs.C3.A4ure_und_Wasserstoffperoxid|Salzsäure/Wasserstoffperoxid]], bei welcher vereinfacht gesagt das Wasserstoffperoxid verwendet wird um die Ätzbrühe zu regenerieren, was in der hier vorgestellten Methode durch den in der Luft enthaltenen Sauerstoff ersetzt wird.&lt;br /&gt;
Der Mehrwert ergibt sich dadurch, dass das Wasserstoffperoxid nicht mehr benötigt wird, denn dieses ist eine (auch politisch) heikle Chemikalie.&lt;br /&gt;
Außerdem entsteht kein giftiges Chlorgas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sub&amp;gt;(* naja, man braucht auch Wasser wenn die Suppe mal zu dick wird :))&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
* &#039;&#039;&#039;Einfache Verfügbarkeit der Chemikalien.&#039;&#039;&#039; (H2O2, NaPS und Fe(iii)Cl haben inzwischen Handelsbeschränkungen) &lt;br /&gt;
&lt;br /&gt;
* insbesondere: &#039;&#039;&#039;kein H2O2&#039;&#039;&#039; wird benötigt&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Entsorgung&#039;&#039;&#039;: Es entsteht kaum Abfall bzw. dauert es sehr lange bis man was zu entsorgen hat.&lt;br /&gt;
&lt;br /&gt;
* Sehr gute &#039;&#039;&#039;Ätzergebnisse&#039;&#039;&#039;, kaum Unterätzung (zuminderst meine subjektive Meinung im direkten Vergleich mit Fe(III)Cl)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prozessparameter&#039;&#039;&#039; sehr gut kontrollierbar -- für gute  Reproduzierbarkeit.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Haltbarkeit&#039;&#039;&#039; der Lösung praktisch unbegrenzt. Sehr Vorteilhaft für Gelegenheitsätzer. (Da es sich der Zeit selber zersetzt kann H2O2 nicht unbegrenzt aufbewahrt werden. Ausserdem sollte H2O2 kühl gelagert werden).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lagerbar im geschlossenen Gefäß&#039;&#039;&#039; -- Im Gegensatz zu H2O2 gast hier kein Sauerstoff aus, die Lösung kann also im gasdichten Behälter aufbewahrt werden, ohne dass man Angst haben muss das es diesen durch den steigenden Druck &amp;quot;zerreist&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
* &#039;&#039;&#039;Aufwändiger&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Erstellung der Ätzlösung braucht etwas Zeit und für schnelles Regenerieren muss man sich Equipment bauen/besorgen. Allerdings auch eine einmalige Sache...&lt;br /&gt;
Für den Gelegenheitsätzer, reicht normalerweise ein größeres Gefäß, in das zusätzlich zur Ätzlösung genug Luft passt zur Regeneration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Salzsäure ist korrosiv&#039;&#039;&#039; und dampft immer ein wenig aus. Dieser Nachteil entfällt jedoch, wenn man statt der freien Säure ein Alkalichlorid (z.B. Kaliumchlorid) als Komplexbildner verwendet.&lt;br /&gt;
&lt;br /&gt;
Dieser Punkt ist der am meisten diskutierte Punkt. Er lässt sich jedoch entweder durch die Verwendung von Kaliumchlorid oder Natriumchlorid völlig vermeiden. Außerdem ist er IMHO durch sauberes Arbeiten bzw. gutes Equipment im Griff zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Das Problem wird verstärkt durch das Einblasen von Luft, da hier immer etwas Aerosol entsteht. Das lässt sich verringern wenn das Regenerationsgefäß abgedeckt ist,&lt;br /&gt;
so dass sich die Spritzer am Deckel ablagern können und wieder zurücklaufen.&lt;br /&gt;
&lt;br /&gt;
Die durch Verdunstung entstehenden Dämpfe können z.B durch eine Plastikbox gekapselt werden, so dass sie zuverlässig &amp;quot;contained&amp;quot; werden.&lt;br /&gt;
&lt;br /&gt;
Ums deutlich zu machen: Wenn man nicht gewissenhaft arbeitet, wirds irgendwo in der Gegend zu rosten anfangen!&lt;br /&gt;
Wenn man gewissenhaft arbeitet, dann nicht. z.B habe ich als &amp;quot;Kontrolle&amp;quot; neben meinem Kontainment (die Plastikbox) ein paar Nägel liegen -- die rosten nicht.&lt;br /&gt;
Die Kontrollgruppe in der Plastikbox sofort.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sauberes &amp;amp; Gewissenhaftes Arbeiten notwendig!&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Eigentlich selbstverständlich, ich hab&#039;s hier nur als Nachteil rein damit es jedem klar ist das das hier kein Kinderspielzeug ist -- wie auch die anderen Ätzmethoden keines sind.&lt;br /&gt;
&lt;br /&gt;
=== Verwendung von Kaliumchlorid statt freier Salzsäure ===&lt;br /&gt;
&lt;br /&gt;
Das Patent DE2942504A1 (abgelaufen) schlägt vor die üblicherweise in der Ätzlösung vorhandene freie Salzsäure durch Kaliumchlorid (oder alternativ Natriumchlorid) zu ersetzen.&lt;br /&gt;
Durch den kleinen Mehraufwand für die Beschaffung von KCl ergeben sich einige Vorteile:&lt;br /&gt;
* &#039;&#039;&#039;höherere Ätzgeschwindigkeit&#039;&#039;&#039;: 5 Minuten für eine 35 µm Platine bei Raumtemperatur&lt;br /&gt;
* &#039;&#039;&#039;kein Ausgasen&#039;&#039;&#039;: die Lösung enthält keine freie Salzsäure mehr, die ausgast&lt;br /&gt;
* &#039;&#039;&#039;einfachere Prozessführung&#039;&#039;&#039;: die Titration zur Einstellung der freien Säurekonzentration entfällt, lediglich eine Waage ist nötig um das KCl korrekt nachzudosieren (siehe Methode 3 bei Badführung)&lt;br /&gt;
&lt;br /&gt;
Konkret erwähnt das Patent eine Ätzlösung mit 130 bis 320 g/l, insbesondere 210 g/l Kupfer(II)chlorid und 70 bis 250 g/l, insbesondere 160 g/l Kaliumchlorid.&lt;br /&gt;
&lt;br /&gt;
Details dazu gibt es [https://www.bastianschmidt.de/etching hier (auf englisch)].&lt;br /&gt;
&lt;br /&gt;
=== Disclaimer ===&lt;br /&gt;
&lt;br /&gt;
Die Informationen in diesem Artikel werden ohne Gewähr wiedergegeben -- Verwendung der Informationen ausschliesslich auf eigene Gefahr. Keine Haftung für Schäden, die durch die Informationen in diesen Artikel entstehen&lt;br /&gt;
Der Artikel setzt gewissen Menschenverstand / Sachkenntnis vorhanden. Im Zweifel ist der Artikel fehlerhaft. Wenn Sie sich unsicher sind, lassen sie die Sache lieber sein! &lt;br /&gt;
Gesetzliche Vorgaben -- zum Beispiel zur Entsorgung -- sind zu beachten. (die hier wiedergebenen Informationen sind sicherlich nicht vollständig.)&lt;br /&gt;
&lt;br /&gt;
= chemischer Ablauf der Kupferchloridätzung und Regeneration =&lt;br /&gt;
&lt;br /&gt;
Die eigentlich stattfinden Reaktion finden mit diversen Komplexen statt. Die hier wiedergegebenen vereinfachten Formeln reichen jedoch fürs Verständnis überwiegend aus.&lt;br /&gt;
&lt;br /&gt;
== Gleichungen ==&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich ist bei dieser Methode der ätzende Bestandteil NICHT die Salzsäure, sondern das Kupfer(II)chlorid. In Verbindung mit dem Kupfer der Leiterplatte entsteht dann eine [http://de.wikipedia.org/wiki/Komproportionierung Komproportionierung]: Das 0-wertige Kupfer und das 2-wertige Kupfer im CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; werden zu 1-wertigem Kupfer (CuCl) oxidziert bzw. reduziert: Es läuft diese Reaktion ab:&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;big&amp;gt;CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; + Cu  →  2 CuCl&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Das aktive Kupfer(II)chlorid wird also beim Ätzen &amp;quot;verbraucht&amp;quot;. Man kann allerdings das enstandende Kuper(I)chlorid wieder oxidieren. Dazu braucht man einen Oxidator, wie zum Beispiel H2O2, man kann aber auch Luftsauerstoff verwenden. Damit dieser wirken kann, muss er gelöst vorkommen. Somit lautet die Regenerationsformel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;2 HCl + 2 CuCl + O {aq} →  2 CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; + H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
bzw.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;6 CuCl + 3 O {aq} + 3 H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O → 2 Cu&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(OH)&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;Cl + 2 CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; (im alkalischen)&lt;br /&gt;
&lt;br /&gt;
Das Problem dabei ist, dass sich Sauerstoff nur sehr schlecht in Wasser löst und deshalb diese Reaktion nur sehr langsam abläuft. Man kann die Geschwidigkeit erhöhen, indem man die Oberfläche relativ zum Volumen erhöht. z.B. indem man zum Beispiel Luft, fein verteilt, durch die Brühe pustet.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun beide Gleichungen zusammenfasst erhält man folgende Bilanzgleichung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Cu + 2 HCl + O → CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  + H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Bilanz wird also Salzsäure, Sauerstoff und Kupfer verbraucht, es entsteht Kupfer(II)chlorid und Wasser, so dass das Spiel von vorne beginnen kann. Die Ätzbrühe nutzt sich sich also nicht ab, wird aber mit der Zeit immer mehr, da man die verbrauchte Salzsäure ersetzen muss.&lt;br /&gt;
&lt;br /&gt;
Falls während der Regeneration nicht genügend Salzsäure zur Verfügung steht, fällt Kupferoxychlorid Cu&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(OH)&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;Cl aus, welches dann mit Salzsäure gelöst werden kann, so dass in Summe das gleiche passiert.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften von CuCl / CuCl2 ==&lt;br /&gt;
&lt;br /&gt;
Um die beiden Kupfersalze zu unterscheiden (um z.B das Bad zu troubleshooten bzw. als Hintergrundinfo für die Badpflege) hier noch ein paar wichtige Eigenschaften:&lt;br /&gt;
* CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ist in Wasser gut löslich&lt;br /&gt;
* CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ist bei hoher Chloridionenkonzentration grün (sonst bläulich) und absorbiert bei hohen Konzentrationen Licht relativ stark&lt;br /&gt;
* CuCl&amp;lt;sub&amp;gt;&amp;lt;/sub&amp;gt; ist unlöslich in Wasser, jedoch wegen Komplexbildung löslich in Säuren, besonders Salzsäure, sowie Alkalichloridlösungen (z.B. KCl, NaCl)&lt;br /&gt;
* CuCl&amp;lt;sub&amp;gt;&amp;lt;/sub&amp;gt; ist dunkel, bräunlich, zusammen mit CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; absorbiert es bereits in kleinen Konzentrationen Licht sehr stark. (Durch 15 mm Ätzlösung mit 1 g/l CuCl kann man kaum mehr durchsehen.)&lt;br /&gt;
&lt;br /&gt;
Hier noch zwei Bilder. Im übrigen sind beide Bilder von hinten mit der selben Taschenlampe beleuchtet.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:CuCl.jpeg|Kupfer(I)chlorid &lt;br /&gt;
Datei:CuCl2.jpeg|Kupfer(II)chlorid&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter/Einflussfaktoren beim Ätzen ==&lt;br /&gt;
&lt;br /&gt;
Hier soll ein Überblick auf die Parameter gegeben werden, die die Ätzgeschwindigkeit beinflussen.&lt;br /&gt;
(Details findet sich auf [http://home.exetel.com.au/adam.seychell/PCB/etching_CuCl/index.html Adams Seychells] Seite, der hier umfangreiche Analysen gefahren hat. Und [https://www.bastianschmidt.de/etching hier] für die Verwendung von Kaliumchlorid.)&lt;br /&gt;
&lt;br /&gt;
=== Temperatur ===&lt;br /&gt;
&lt;br /&gt;
Wie bei jeder chemischen Reaktion ist die Temperatur ein großer Einflussfaktor: Je wärmer, desto schneller läuft eine Reaktion ab. &lt;br /&gt;
Laut Adam Seychell beschleunigen 10°C mehr die Reaktion um etwa 50%.&lt;br /&gt;
Allerdings geht es auch bei Raumtemperatur angenehm schnell :)&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite erhöht eine Erwärmung das Ausgasen der Salzsäure -- auch darum ist Raumtemperatur voll ok...&lt;br /&gt;
&lt;br /&gt;
=== Konzentation der Salzsäure / des Alkalimetallchlorids ===&lt;br /&gt;
&lt;br /&gt;
Die Kozentration der Salzsäure bzw. des Alkalimetallchlorids beinflusst die folgenden Parameter:&lt;br /&gt;
* Ätzgeschwindigkeit -- je mehr Säure desto schneller wird geätzt&lt;br /&gt;
* Das Unterätzen -- laut [4] wird das Unterätzen schneller beschleunigt als die Ätzgeschwindigkeit, so das ein höherer Säuregehalt mehr unterätzt.&lt;br /&gt;
* Das Ausgasen bei der Verwedung von Salzsäure -- je höher die Konzentration, desto mehr gast aus.&lt;br /&gt;
&lt;br /&gt;
Folglich muss jeder seinen eigenen Kompromiss finden. &lt;br /&gt;
ChemCut [4] z.B empfiehlt zwischen 2 und 3 Mol/l, während [3] zwischen 1.3 und 1.4 Mol empfiehlt und Seychell alles zwischen 1 und 3,5 Mol/l gut findet.&lt;br /&gt;
(Da ich besonders auf geringes Ausgasen  Wert lege ätze ich bei ca. 1,5 mol/l.)&lt;br /&gt;
Bei der Verwendung von Kaliumchlorid oder Natriumchlorid statt Salzsäure kann die von ChemCut [4] angegebene Konzentration ohne problematisches Ausgasen erreicht werden. [8] erwähnt eine Konzentration von 2,15 mol/l.&lt;br /&gt;
&lt;br /&gt;
=== Wahl des Komplexbildners ===&lt;br /&gt;
&lt;br /&gt;
Als Komplexbildner um das entstehende CuCl zu lösen, eignen sich Salzsäure oder auch verschiedene Alkalimetallchloridlösungen (KCl, NaCl).&lt;br /&gt;
Bei gleicher Konzentration ist die Ätzgeschwindigkeit mit Kaliumchlorid ungefähr doppelt so hoch, wie mit Salzsäure oder Natriumchlorid.&lt;br /&gt;
&lt;br /&gt;
=== Konzentration des Kuper(II)chlorids ===&lt;br /&gt;
&lt;br /&gt;
Sowohl zuwenig als auch zuviel Kupfer(II)chlorid wirkt sich negativ auf die Ätzgeschwindigkeit aus. &lt;br /&gt;
Da aber ein Zusammenhang zwischen der Konzentration und der Dichte der Ätzflüssigkeit besteht, kann der zu führende Prozessparameter auch die Dichte sein.&lt;br /&gt;
&lt;br /&gt;
Diese ist auch viel leichter zu ermitteln als die Konzentration des Kupfersalzes.&lt;br /&gt;
&lt;br /&gt;
Alle Quellen [2], [3] und [4] geben als ideale Dichte der Ätzlösung einen Wert von 1,2 - 1,38 g/ml an.&lt;br /&gt;
In diesem Bereich hat die Ätzrate ein Plateau, d.h dort sind die Ätzraten in etwa optimal und auch einigermaßen konstant. Kleinere und größere Dichten reduzieren die Ätzraten.&lt;br /&gt;
Der angegebene Dichtebereich deckt einen sehr großen größeren Konzentrationsbereich ab. Die Konzentration des Kupfer(II)chlorids spielt für die Ätzgeschwindigkeit eher eine untergeordnete Rolle.&lt;br /&gt;
&lt;br /&gt;
Da die Dichte hauptsächlich durch die Menge an gelösten Kupfer beeinflusst wird, muss  &lt;br /&gt;
erst mal einiges an Kupfer auflösen bevor man überhaupt diesen Bereich kommt. Wird die Suppe zu dick, kann man sie einfach mit Wasser verdünnen (siehe Badpflege).&lt;br /&gt;
&lt;br /&gt;
=== Konzentration des Kupfer(I)chlorids ===&lt;br /&gt;
&lt;br /&gt;
Während dem Ätzen entsteht Kupfer(I)chlorid, das von der Ätzlösung in Lösung gehalten werden muss.&lt;br /&gt;
Es ist praktisch unlöslich in Wasser und löst sich hier durch Komplexbildung mit Sälzsäure oder Alkalimetallchloridlösungen.&lt;br /&gt;
Eine Konzentration von 0,4 bis 0,5 mol/l reduziert die Ätzgeschwindigkeit bereits auf die Hälfte im Vergleich zu frischer Ätzlösung ohne Kupfer(I)chlorid.&lt;br /&gt;
Sie sollte daher so niedrig wie möglich sein. Dies erreicht man durch frühzeitige Regeneration und Verwendung von genug Ätzlösung für das geplante Vorhaben (siehe [[Ätzen mit luftregenerierten Kupferchlorid#Methoden|Ätzen]]).&lt;br /&gt;
&lt;br /&gt;
= Ätzbrühe erstmalig herstellen =&lt;br /&gt;
&lt;br /&gt;
Wie oben beschrieben braucht man CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; zum Ätzen. Wie kann man nun also dieses Henne-Ei Problem lösen?&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man sich einfach etwas Kupferchlorid kaufen, und das ganze einfach in verdünnter Salzsäure auflösen.&lt;br /&gt;
Mir ist allerdings keine Bezugsquelle bekannt die an privat liefern.&lt;br /&gt;
&lt;br /&gt;
Ansonsten kann man auch jemanden bitten, der die Methode bereits einsetzt ihm etwas Ätzbrühe abzugeben. &lt;br /&gt;
Immerhin -- wie oben erläutert -- hat ein Vielätzer irgendwann das Problem das er &amp;quot;zu viel&amp;quot; davon hat.&lt;br /&gt;
&lt;br /&gt;
Die dritte Möglichkeit ist selber herstellen. &lt;br /&gt;
&lt;br /&gt;
== Herstellung als &amp;quot;Abfallprodukt&amp;quot; der HCl/H2O2 Methode ==&lt;br /&gt;
&lt;br /&gt;
Wenn mann mit der HCl/H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;-Methode Platinen ätzt, entsteht dabei Kupferchlorid. Praktisch, denn man kann also sich&lt;br /&gt;
eine (kleine) Menge H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; besorgen und erstmal mit der herkömmlichen Methode ätzen. In einer [http://www.crcind.com/wwwcrc/tds/TKC3%20POSITIV20.PDF Applikationsschrift von Kontakt Chemie für deren Positiv 20 Lack] wird folgendes Rezept angegeben:&lt;br /&gt;
&lt;br /&gt;
* 770 ml Wasser&lt;br /&gt;
* 200 ml Salzsäure (33%)&lt;br /&gt;
* 30 ml  Wasserstoffperoxid (30%)&lt;br /&gt;
&lt;br /&gt;
Statt der 30% Wasserstoffperoxislösung kann man auch eine geringer dosierte nehmen und dementsprechend weniger Wasser. Zu wenig konzentriert sollte es allerdings auch nicht sein, da man ansonsten zu viel Wasser in die Lösung bekommt, wenn man später H2O2 nachdosiert. Das kann dann Probleme bereiten die optimale Kuferchloridkonzentration zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Allerdings sollte man darauf achten das die Zutaten möglichst rein sind, insbesondere organische Verunreinigungnen können problematisch sein. &amp;quot;Technische Reinheit&amp;quot; sollte aber ausreichend sein.&lt;br /&gt;
&lt;br /&gt;
Damit kann man dann erstmal loslegen und nach dem Ätzen die nun grünliche Flüssigkeit in einem geeigneten Behältnis aufbewahren. Da das H2O2 instabil ist und Sauerstoff abspaltet, darf dieses Behältnis nicht komplett gasdicht sein, also entweder nicht ganz zuschrauben oder ein kleines Loch in den Deckel machen.&lt;br /&gt;
Für das nächste Ätzen dosiert man entsprechend Salzsäure nach und gibt bei Bedarf etwas H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; zu, so dass die Flüssigkeit durchsichtig wird. (alles CuCl zu CuCl2 umgebaut wurde; &amp;quot;durchsichtig&amp;quot; ist hier als &amp;quot;klar&amp;quot; zu verstehen, als Gegenteil von &amp;quot;trüb&amp;quot;. Siehe auch oben bei den Eigenschaften von Kupferchlorid. Das Kupferchlorid schluckt so viel Licht das &amp;quot;durchsichtig&amp;quot; nicht heist das man durchsehen kann).&lt;br /&gt;
&lt;br /&gt;
Hierbei kann man sich schon durchaus am Kapitel &amp;quot;Badpflege&amp;quot; orientieren um herauszufinden wieviel HCl benötigt wird. &lt;br /&gt;
&lt;br /&gt;
Die ganze Prozedure macht man dann so lange bis man sein H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; aufgebraucht hat oder man denkt dass man jetzt genügend Kupferchlorid hat. Ich selber habe nur etwa 2-3 Platinen so hergestellt, meine Baddichte war noch kleiner als 1,05 kg/l. Das Ätzen dauert halt dann noch länger.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; &amp;quot;Gib nie Wasser in die Säure, sonst geschieht das Ungeheure&amp;quot;! Also immer die Säure in das Wasser kippen, nie umgekehrt!&lt;br /&gt;
&lt;br /&gt;
== Kupferchlorid gezielt herstellen ==&lt;br /&gt;
&lt;br /&gt;
Adam Seychell beschreibt auf seiner Seite [2] wie man sich ganz ohne Wasserstoffperoxid selber genügend Kuperchlorid erzeugen kann:&lt;br /&gt;
&lt;br /&gt;
Um 1l Ätzflüssigkeit anzusetzen gibt man&lt;br /&gt;
* 120g Kupfer &lt;br /&gt;
* 100ml Salzsäure (25%)&lt;br /&gt;
in ein Gefäß, so das das Kupfer größtenteils aus der Säure heraussragt, also Kontakt mit der Säure hat aber nicht komplett bedeckt ist. &lt;br /&gt;
Das Metal sollte eine möglichst große Oberfläche haben, also am besten Litzen oder Draht. Das Gefäß muss resistent gegen die Säure sein, insbesondere Metailgefäße sind ungeeignet.&lt;br /&gt;
Am besten verwendet man gleich seine angedachte Ätzküvette.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG: Bei diesem Ansatz ist sehr viel Säure drin, d.h die Lösung gast viel aus. Salzsäuredämpfe sind sehr korrosiv -- am besten also das Gefäß draussen aufstellen. Aber bitte (haus)tier- und kindersicher!) Bitte beachten dass z.B in einer Garage Sachen in der Nachbargarage korrodieren könnten... Notfalls das Gefäß abdecken und 1-2x am Tag neue Luft reinlassen.&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Nach ein paar Tagen sollte die Säuredämpfe gemeinsam mit dem Luftsauerstoff das Kupfer angegriffen haben und die Lösung eine braune Farbe haben, ein Zeichen das Kupfer(I)chlorid entstanden ist.&lt;br /&gt;
&lt;br /&gt;
Wenn die Farbe passt mischt man &#039;&#039;(Reihenfolge beachten -- nur Säure ins Wasser, nie umgekehrt!)&#039;&#039;&lt;br /&gt;
* 300ml Wasser&lt;br /&gt;
* 600ml Salzsäure (25%)&lt;br /&gt;
und gibt die Mischung vorsichtig zu der braunen Brühe.&lt;br /&gt;
&lt;br /&gt;
Nun muss man anfangen der Brühe Luft zuzuführen, also das ganze mit dem Sprudler zu durchlüften bis das ganze klar und grün wird, &lt;br /&gt;
also das und das restliche Kupfer &amp;quot;aufgefressen&amp;quot; wurde und das Kupfer(I)chlorid zu Kupfer(II)chlorid umgesetzt wurde. Da darduch die Säure verbraucht wird, kann es notwendig sein dass noch welche nachdosiert werden muss (wenn die Lösung braun bleibt und/oder noch Kupfer da ist. Auch hier kann man den Säuregehalt messen und dementsprechend Säure nachgeben.&lt;br /&gt;
(Man sollte eh nachdem alles Kupfer weg ist und die Farbe schön grün geworden ist den Säuregehalt messen und eventuell nachdosieren.)&lt;br /&gt;
&lt;br /&gt;
Hier noch als Bildergeschichte... (Zur Dokumentation hab ich nur 100ml angesetzt; Die Zeiten sind nur ungefähr anzusehen)&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:CuCl_Herst_1.JPG|12g Kupferlitzen mit 10ml HCl in einem Erlenmeyerkolben&lt;br /&gt;
Datei:CuCl_Herst_2.JPG|nach ca. 1 Tagen an der Luft&lt;br /&gt;
Datei:CuCl_Herst_3.JPG|wurde die braune Lösung mit ca. 30ml Wasser und ca. 60ml HCl aufgefüllt &lt;br /&gt;
Datei:CuCl_Herst_4.JPG|und mit dem Sprudler versehen.&lt;br /&gt;
Datei:CuCl_Herst_5.JPG|nach einem weiteren Tag blubbern ist das Kupfer aufgelöst und das CuCl zu CuCl2 umgebaut &lt;br /&gt;
Datei:CuCl_Herst_6.JPG|und auch klar geworden (Erlenmeyerkolben von unten beleuchtet)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adam Seychell empfiehlt hier am Schluss noch auf einen Liter (oder die gewünschte Menge) mit Wasser aufzufüllen. Ich würde dies allerdings nur tun falls die Dichte zu hoch ist, was sicherlich noch nicht der Fall ist.&lt;br /&gt;
&lt;br /&gt;
= Regeneration durch Luftsauerstoff =&lt;br /&gt;
&lt;br /&gt;
== Equipment ==&lt;br /&gt;
&lt;br /&gt;
Wie oben erläutert, benötigt die Regenerationsreaktion Sauerstoff, der aber in Lösung sein muss. &lt;br /&gt;
Leider löst sich Sauerstoff nur sehr schlecht in Wasser, so dass man kontinuierlich Sauerstoff dazugeben muss, damit die Reaktion nicht wegen Sauerstoffmangels sehr langsam wird.&lt;br /&gt;
&lt;br /&gt;
Da wir den in der Luft enthaltenen Sauerstoff verwenden wollen, heißt das, dass wir Ätzlösung mit Luft &amp;quot;durchblubbern&amp;quot; müssen, wobei die Luftblasen möglichst klein sein sollten.&lt;br /&gt;
Durch die große Oberfläche vieler kleiner Bläschen bekommt der Sauerstoff mehr Gelegenheit, in Lösung zu gehen und sofort mit dem CuCl zu reagieren.&lt;br /&gt;
&lt;br /&gt;
Geeignet hat sich für das Durchlüften ein Keramiksprudelstein erwiesen, wie man sie zum Beispiel auch in der Aquaristik verwendet. Allerdings muss man darauf achten, dass man wirklich einen Ausströmerstein aus Keramik erwischt.&lt;br /&gt;
Es gibt auch Sprudelsteine, die aus &amp;quot;verpapptem&amp;quot; Quarzsand hergestellt werden: Diese sind nicht geeignet. Mein Testexemplar hat sich innerhalb von ein paar Tagen &amp;quot;aufgelöst&amp;quot;, sodass die kleinste mechanische Belastung zu einem Sandhaufen geführt hat. Man kann es bedingt auch am Preis erkennen: Die keramischen sind etwas teurer -- vielleicht 5€ statt 3€.&lt;br /&gt;
Ich habe mir 2 Typen gekauft: Einen [http://www.zoo-kellner.de/ hier ] -- (einem Aquaristikgeschäft bei mir um die Ecke), der sehr feinperlige Blasen erzeugt -- Allerdings wird er dort als aus einem &amp;quot;Sortimentskasten&amp;quot; lose verkauft, ich kann also weder Hersteller noch Produktname nennen. Ein 10cm-Stein kostet dort ca. 4€.&lt;br /&gt;
Den Anderen habe ich im Netz gekauft: &amp;quot;Hobby Keramik Ausströmer&amp;quot;. Den gibt es in maximal 15cm Länge, weshalb ich ihn gekauft habe. Das Ergebnis is OK, jedoch nicht ganz so &amp;quot;feinperlig&amp;quot; wie der andere. Außerdem musste ich die Enden erst einmal mit Heißkleber abdichten, da dort Luft austrat. Ob dies an mangelhafter Verarbeitung oder am Einfluss der Säure lag, kann ich nicht sagen.&lt;br /&gt;
&lt;br /&gt;
Achja, die Dinger sind empfindlich: Aus Unachtsamkeit sind sie mir in Stücke gebrochen &amp;lt;small&amp;gt;(leasson learned: beim Schlauchanstecken möglichst nahe am Ende -- wo der Schlauch ran soll -- anfassen)&amp;lt;/small&amp;gt;, jedoch kann man die nach dem Trocknen sehr gut wieder mit Heißkleber zusammenkleben...&lt;br /&gt;
 &lt;br /&gt;
Antreiben kann man das Ganze mit einer Aquariumluftpumpe, ich verwende eine Luftpumpe vom Pollin (Best. Nr: [http://www.pollin.de/shop/dt/MzY5OTY2OTk-/Bauelemente_Bauteile/Pumpen/Luftpumpe_CONJOIN_CJP37_C12A2.html 330036]), bei der man dann über die Spannung (Labornetzteil) die Blubberstärke regulieren kann.&lt;br /&gt;
&lt;br /&gt;
Zum Verbinden eignet sich ganz normaler Aquarium-Luftschlauch (ich denke die sind aus weich-PVC).&lt;br /&gt;
&lt;br /&gt;
Da Salzsäure einen geringen Dampfdruck aufweist (also immer etwas ausgast) und diese Dämpfe korrosiv sind, empfehle ich, das gesamte Equipment nochmal in eine extra Plastikbox (mit Deckel und möglichst dicht) zu stellen bzw. dort aufzubewahren. Damit nichts in der Umgebung zu Rosten beginnt.... Ich verwende da eine Box von Ikea (Serie Samla). Die Küvette kann während des Ätzens/Regenerierens auch in der Box verbleiben, so hat man auch gleichzeitig einen Basisschutz gegen Verschütten.&lt;br /&gt;
&lt;br /&gt;
Wenn man etwas geduldig ist, und sowieso nur ab und zu zum Ätzen kommt, kann man problemlos auch einfach ein großes Gefäß (z.B. 5 l Kanister für 1 l Ätzlösung) nehmen, das man ab und zu aufmacht. Nach 1 bis 2 Wochen ist auch so die Ätzlösung regeneriert.&lt;br /&gt;
&lt;br /&gt;
== Regeneration ==&lt;br /&gt;
&lt;br /&gt;
Nun, das ganze Zusammenstecken, am besten im Ätzgefäß fest befestigen und durch die Lösung pusten...&lt;br /&gt;
Allerdings empfehle ich das Gefäß irgendwie abzudecken, da durch die Belüftung feine Tröpfchen in die Luft mitgeriessen werden -- ähnlich wie bei einem Glas Sprudel.&lt;br /&gt;
&lt;br /&gt;
= Ätzen = &lt;br /&gt;
&lt;br /&gt;
== Methoden ==&lt;br /&gt;
&lt;br /&gt;
Meiner Meinung ist am besten eine Ätzküvette geeignet: Dort bringt man am besten die Belüftungseinrichtung unter und das Bad wird durch die Belüftung auch gleichzeitig bewegt, was sich positiv auf die Ätzgeschwindigkeit auswirkt:&lt;br /&gt;
Das inaktive CuCl wird so möglichst bald wieder aktiviert bzw. durch die Badbewegeung von der Kupferoberfläche weggeführt.&lt;br /&gt;
&lt;br /&gt;
Nicht getestet habe ich das Ätzen in einer Schale. Aber auch dies sollte möglich sein, wenn man das CuCl von der Platine z.B durch Bewegen der Schale immer wieder entfernt -- die Fe(III)Cl-Verwender wissen was ich meine.&lt;br /&gt;
&lt;br /&gt;
Hier kann man das benötigte Volumen wie folgt abschätzen: Angenommen man möchte beim Ätzen nicht mehr als 5 g/l (~ 51 mmol/l)CuCl zulassen -- um eine gute Ätzgeschwindigkeit zu erhalten -- so muss man dafür sorgen dass durch das geätze Kupfer weniger CuCl entsteht: Eine doppelseitige Europakarte mit hat etwa 10g Cu -- entspricht 77 mmol Kupfer bzw. CuCl. Also brauchen wir mindestens 1,5l Volumen damit beim Ätzen diese Konzentration nicht überschritten wird.&lt;br /&gt;
Umgerechnet brauchen wir pro cm² zu ätzende Platinefläche minimal 10 ml Ätzflüssigkeit -- in der Praxis aber weniger, da wir nicht alles Kupfer wegätzen.&lt;br /&gt;
&lt;br /&gt;
Diese Mengenabschätzung gilt prinzipiell auch für die Ätzküvette -- allerdings regeneriert man hier gleichzeitig durch die Luftbeweggung, so dass hier auch mit weniger auskommt -- aber in der Regel definiert das Gefäß das Volumen was man braucht.&lt;br /&gt;
&lt;br /&gt;
Prinzipiell sollte diese Methode auch mit Sprühätzern gut funktionieren, man kann sogar erwarten dass durch das Sprühen besonders gut regeneriert wird.&lt;br /&gt;
&lt;br /&gt;
== Materialien ==&lt;br /&gt;
&lt;br /&gt;
Allerding sollte man darauf achten das die verwendeten Materialen den Chemikalien standhält. Hier meine Erfahrungen:&lt;br /&gt;
&lt;br /&gt;
* Expoxidharz: Wurde bei mir spröde, kann aber an damals vorhandenen Restmengen von H2O2 liegen &lt;br /&gt;
* Heißkleber: Keine Probleme...&lt;br /&gt;
* Bausilikon/Bauacryl: (Als Kleber verwendet; aus der Kartusche) Hält nicht, das Acryl hat sich mehr oder weniger aufgelöst.&lt;br /&gt;
* PL (3D-Drucker): Keine Probleme ...&lt;br /&gt;
* PP (meine Küvette ist daraus): Keine Probleme ...&lt;br /&gt;
&lt;br /&gt;
[http://www.buerkert.de/media/DE_Bestaendigkeit.pdf Kunststoffbeständigkeit]&lt;br /&gt;
&lt;br /&gt;
= Badpflege / Prozessführung =&lt;br /&gt;
&lt;br /&gt;
Damit das Ätzsystem sauber funktioniert müssen ab und zu ein paar Parameter der Ätze kontrolliert werden und korrigiert werden:&lt;br /&gt;
&lt;br /&gt;
* Zum einen der Säuregehalt (die Säure wird ja beim Regenerieren verbraucht) und &lt;br /&gt;
* zum Anderen die Dichte &lt;br /&gt;
&lt;br /&gt;
damit der optimale Bereich nicht überschritten wird. &lt;br /&gt;
&lt;br /&gt;
Vor der Badpflege sollte das CuCl zu CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; umgesetzt worden sein, die Lösung darf also nicht mehr bräunlich sein. Sollte die Lösung während der Regeneration trüb werden (blaugrüner Niederschlag) dann entsteht Kupferoxychlorid und es ist keine freie Salzsäure mehr vorhanden.&lt;br /&gt;
Die Regenerationsreaktion läuft trotzdem (etwas verlangsamt) weiter. Man kann sich hier die Titration sparen und so viel Salzsäure zugeben, dass die Lösung klar wird. &lt;br /&gt;
&lt;br /&gt;
== Kontrolle des Salzsäuregehaltes ==&lt;br /&gt;
&lt;br /&gt;
Wie oben erwähnt hat der Säuregehalt Auswirkungen auf die Ätzgeschwindigkeit und auch auf das Ätzergebnis. Schon aus dem Grund der [http://de.wikipedia.org/wiki/Reproduzierbarkeit Reproduzierbarkeit] &lt;br /&gt;
sollte man versuchen diesen Parameter konstant zu halten. Allzu genau braucht man hier allerdings nicht sein, das Prozessfenster ist riesig.&lt;br /&gt;
&lt;br /&gt;
Falls man zu hohe Säurekonzentrationen hat, wird man dies in der Regel ignorieren, das sich dieses Problem von selber lösen wird. Man wird nur dann mit Wasser verdünnen, wenn man die Dichte korrigieren muss. &lt;br /&gt;
&lt;br /&gt;
Unten stelle ich zwei Methoden vor: [http://de.wikipedia.org/wiki/Steuerungstechnik#Abgrenzung_zwischen_Steuerung_und_Regelung Regeln bzw. steuern] der Säurekonzentration. &lt;br /&gt;
&lt;br /&gt;
Ich verwende beide Methoden kombiniert um die Säure (einigermaßen) konstant zu halten.&lt;br /&gt;
&lt;br /&gt;
=== Methode 1: Regeln -- Messen des Säuregehaltes durch Titration und Nachdosierung ===&lt;br /&gt;
&lt;br /&gt;
Um herauszufinden wie viel freie Säure noch in der Ätze ist, kann man den pH-Wert zu Rate ziehen. Allerdings wäre es ziemlich kompliziert den pH-Wert direkt zu messen, so dass wir hier einen Trick verwenden:&lt;br /&gt;
&lt;br /&gt;
Wir [http://de.wikipedia.org/wiki/S%C3%A4ure-Base-Titration tritieren] die Ätze  so lange mit einer Base bis die Lösung neutral ist und merken uns die Menge an Base die hierzu benötigt wird.&lt;br /&gt;
Ein Indikator zeigt uns dann diesen Punkt an. Als Indikator können wir praktischerweise gleich unsere Ätzflüssigkeit verwenden, denn CuCl2 ist nur im Sauren gut löslich...&lt;br /&gt;
&lt;br /&gt;
Als Base bietet sich Natronlauge an, &amp;quot;Belichter&amp;quot; haben die eh zu Hause, &amp;quot;Tonertransferrer&amp;quot; müssen sich halt aus der Apotheke ein paar Gramm besorgen...&lt;br /&gt;
Wir verwenden hierbei eine Konzentration von 1mol/l, was später die Konzentrationsermitlung der Säure trivial macht: Man braucht einfach die gleiche Stoffmenge, was sofort klar ist, wenn man auf die Neutralisationsgleichung schaut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;NaOH + HCL -&amp;gt; NaCl + H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Benötigtes Equipment ====&lt;br /&gt;
&lt;br /&gt;
Wir brauchen für die Säurekontrolle an Hardware:&lt;br /&gt;
&lt;br /&gt;
[[Datei:CuCl Equipment.jpg|miniatur|Equipment]]&lt;br /&gt;
&lt;br /&gt;
* eine kleine (gasdicht verschliessbare, Natronlauge-taugliche) Flasche* -- Apotheken haben die recht günstig. Die Flasche sollte nicht zu groß sein, so 100ml ist meiner Meinung nach ideal.&lt;br /&gt;
* eine kleines Becherglas,&lt;br /&gt;
* ein paar 2ml Spritzen oder Pipetten mit Skalierung (um Volumen abzumessen),&lt;br /&gt;
* ein paar Gramm NaOH. (wie schon oben erwähnt) oder gleich bei der Apotheke anmischen lassen, vor allem wenn keine &lt;br /&gt;
* Fein-Waage (optional) vorhanden ist, um das NaOH abzuwiegen.&lt;br /&gt;
* destilliertes Wasser  (Tipp: Kondenswassertrockner-Wasser ist perfekt!)&lt;br /&gt;
&lt;br /&gt;
Die Flasche sollte eine Dichtung haben, denn CO2 aus der Luft würde die Natronlauge kaputt machen. Deswegen sollte diese Flasche auch nicht zu groß sein.&lt;br /&gt;
&lt;br /&gt;
(* lt. Wikipedia sind Glasflaschen nicht geeignet, sie würden angegriffen.. Ich hatte aber noch nie Probleme damit.)&lt;br /&gt;
&lt;br /&gt;
==== Herstellung der Natronlauge ====&lt;br /&gt;
&lt;br /&gt;
Die Herstellung ist einfach: Mann löst einfach NaOH in (destillierten*) Wasser. &lt;br /&gt;
&lt;br /&gt;
Und zwar nimmt man ca. 4g/100ml**, so dass wir eine &#039;&#039;&#039;1,0 molarige Natronlauge&#039;&#039;&#039;  bekommt. &lt;br /&gt;
Das Ganze gibt man in seine Flasche und &#039;&#039;&#039;[http://www.seilnacht.com/Chemie/ch_naohl.htm beschriftet]&#039;&#039;&#039; diese anständig.&lt;br /&gt;
&lt;br /&gt;
(* Wenn man es in normales Wasser gibt, insbesondere in Gegenden mit harten Wasser, wird die Lauge trüb -- ich nehm mal an das das nicht so vorteilhaft ist...)&lt;br /&gt;
&lt;br /&gt;
(** also 4g abwiegen und mit Wasser auf 100ml auffüllen. Die 4g müssen auch nicht absolut genau sein, die Methodik hier ist eh nicht sooo genau)&lt;br /&gt;
&lt;br /&gt;
==== Durchführung der Titration ====&lt;br /&gt;
&lt;br /&gt;
# Fülle das Becherglas mit 20-30ml Wasser auf. &lt;br /&gt;
# Messe mit der Spritze 1ml Ätzflüssigkeit ab und gebe sie in das Becherglas&lt;br /&gt;
# Ziehe in einer anderen Spritze* eine definierte Menge Deiner 1,0 molaren NaOH-Lauge auf &lt;br /&gt;
# Gib das NaOH tropfenweise in das Becherglas und schwenke es nach jedem Tropen (so dass sich die Schlieren wieder auflösen und die Lösung wieder klar wird)&lt;br /&gt;
# Sobald die Lösung NICHT mehr klar werden will ist die Lösung neutralisiert und die Titration fertig. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:CuCl AR Titrat.jpeg|Nach Schritt 2: 1ml Ätzflüssigkeit aufgefüllt mit Wasser&lt;br /&gt;
Datei:Titrat NAOH Beleuchtet.jpeg|Schritt 3: Flüssigkeit und aufgezogene Spritze mit NaOH&lt;br /&gt;
Datei:Titrat_Tropfen.jpeg|Schritt 4: Dieser Tropfen NaOH hat sich noch nicht aufgelöst&lt;br /&gt;
Datei:Titrat_Ende.jpeg|Schritt 5: Die Lösung bleibt trüb -- nichts löst sich mehr. Titration ist zuende.&lt;br /&gt;
Datei:Titrat Menge NaOH.jpeg|Dafür haben wir 1.5 ml NaOH benötigt.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da wir die gleichen Stoffmengen zur Neutralisation brauchen, und die Konzentration der Natronlauge 1molar war, kann man kann man aus dem Volumen der zugegebenen Natronlauge direkt die Konzentration ablesen: &lt;br /&gt;
Im Bilderbeispiel wurde 1.5ml Lauge gebraucht um die 1ml der Ätze zu neutralisieren. Die Säurekonzentration ist somit 1,5 molar. Hätten wir 2ml NaOH gebraucht, wäre die Säurekonzentration 2mol/l.&lt;br /&gt;
&lt;br /&gt;
(* Anmerkung: Es ist anzuraten die Spritzen immer nur für die selbe Flüssigkeit zu verwenden, um Kontaminationen insbesondere der NaOH-Lösung zu vermeiden...)&lt;br /&gt;
&lt;br /&gt;
Bilder die das ganze Veranschaulichen findet sich auf Adam Seychell&#039;s Seite: http://home.exetel.com.au/adam.seychell/PCB/etching_CuCl/titraion_images.html&lt;br /&gt;
&lt;br /&gt;
==== Berechnung der benötigten Säuremenge ====&lt;br /&gt;
&lt;br /&gt;
Nachdem man ermittelt hat wie groß die Säurekonzentration ist, rechnet man aus, wieviel Säure man hinzugeben muss:&lt;br /&gt;
&lt;br /&gt;
V_Säure = V_Ätze * ( c_soll - c_ist ) / ( c_säure - c_soll)&lt;br /&gt;
&lt;br /&gt;
wobei:&lt;br /&gt;
* V_Säure das Volumen der hinzuzufügenfen Salzsäure&lt;br /&gt;
* V_Ätze das augenblickliche Volumen der Ätze (wieviel Ätzmittel habe ich schon?)&lt;br /&gt;
* c_soll die gewünschte Soll-Säurekonzentration in Mol/l&lt;br /&gt;
* c_ist die augenblickliche Säurekonzentration in der Ätze in Mol/l&lt;br /&gt;
* c_säure die Säurekonzentration in Mol/l (die dazugegeben werden soll) -- siehe [http://de.wikipedia.org/wiki/Salzs%C3%A4ure Wikipedia-Artikel] für eine Umrechnung %-Mol&lt;br /&gt;
&lt;br /&gt;
Das Libreoffice-Dokument https://www.mikrocontroller.net/wikifiles/6/6e/Hcl-rechner-cucl.ods hat diese Formel als &amp;quot;Konzentrationsrechner Säure&amp;quot; implementiert. &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
* V_Ätze: 1 l&lt;br /&gt;
* C_ist: 1 Mol/l&lt;br /&gt;
* C_soll: 1,5 Mol/l&lt;br /&gt;
* C_säure: 7,5 Mol/l&lt;br /&gt;
* &#039;&#039;&#039;Ergebnis:&#039;&#039;&#039; V_Säure: 83 ml&lt;br /&gt;
&lt;br /&gt;
=== Methode 2: Steuern -- Berechnung des Säureverbrauches beim Ätzen ===&lt;br /&gt;
&lt;br /&gt;
Aus der Gleichung oben&lt;br /&gt;
:&amp;lt;big&amp;gt;Cu + 2 HCl + O -&amp;gt; CuCl&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; + H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;lt;/big&amp;gt;&lt;br /&gt;
erkennt man, dass man für das Ätzen von 1 Mol Kupfer 2 Mol Salzsäure benötigt. &lt;br /&gt;
&lt;br /&gt;
Man kann sich also auch die Menge an Salzsäure berechnen, die man für eine Platine benötigt.&lt;br /&gt;
Dazu muss man die Stoffmengen ausrechnen, was hier an dem Beispiel einer Europakarte geschehen soll:&lt;br /&gt;
&lt;br /&gt;
* 1 Mol Kupfer sind etwas 65g Metall,&lt;br /&gt;
* Eine einseitige Europakarte (mit 35µ Kupferauflage) hat etwa 5g Kupfer. &amp;lt;small&amp;gt;(Gewicht= Volumen*Dichte)&amp;lt;/small&amp;gt;&lt;br /&gt;
* Da wir aber nicht alles Kupfer wegätzen, z.B also nur 50%, ätzen wir also (5g*50%)/(65g/Mol) = 0,038 Mol Kupfer.&lt;br /&gt;
* Da wir 2 mal soviel Stoffmenge an Salzsäure brauchen wie an Kupfer, benötigen wir 0,077 Mol Salzsäure.&lt;br /&gt;
* &amp;quot;Übliche&amp;quot; Baumarkt-Salzsäure hat etwa 25%, das entspricht in etwa 7,5 Mol/l.&lt;br /&gt;
* Umgerechnet mit unserer Konzentration ist das dann 0,077 Mol/(7,5 Mol/l) ~ 10ml von unserer Salzsäure. &lt;br /&gt;
&lt;br /&gt;
Als Hilfe habe ich dieses Libreoffice-Spreadsheet gemacht:&lt;br /&gt;
https://www.mikrocontroller.net/wikifiles/6/6e/Hcl-rechner-cucl.ods&lt;br /&gt;
(Dabei einfach die gelben Felder ausfüllen und von den grauen Ablesen.)&lt;br /&gt;
&lt;br /&gt;
=== Methode 3: Verwenden eines Alkalimetallchlorids als Komplexbildner statt freier Salzsäure ===&lt;br /&gt;
&lt;br /&gt;
Ersetzt man die üblicherweise verwendete Salzsäure durch Kaliumchlorid (oder Natriumchlorid), benötigt man keine freie Salzsäure mehr in der Lösung.&lt;br /&gt;
Dadurch fällt bei der Regeneration Kupferoxychlorid Cu&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(OH)&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;Cl aus.&lt;br /&gt;
Jetzt kann man einfach langsam so viel Salzsäure hinzufügen, dass das Kupferoxychlorid sich gerade auflöst.&lt;br /&gt;
Misst man die Menge der dafür nötigen Salzsäure (und kennt deren Konzentration) kann man dadurch auch bestimmen, wie viel Kupfer man geätzt hat (siehe Methode 2) und damit auch, wie viel Kupfer(II)chlorid neu entstanden ist.&lt;br /&gt;
&lt;br /&gt;
Das kann man dann dafür verwenden, um die Konzentration des Alkalimetallchlorids anzupassen.&lt;br /&gt;
Bei der in [8] vorgeschlagenen Konzentration ergibt sich die Masse an zuzugebendem Kaliumchlorid als 1,4 mal der Masse der Salzsäure mal deren Konzentration.&lt;br /&gt;
&lt;br /&gt;
== Kontrolle der Dichte ==&lt;br /&gt;
&lt;br /&gt;
Für die Dichte schlägt Adam Seychell ein [http://de.wikipedia.org/wiki/Ar%C3%A4ometer Hydrometer] vor. Nachdem die interessanten Dichtebereiche von vielen Batteriesäuetestern (für Blei Batterien in Autos) abgedeckt werden, kann man die auch normalerweise für wenig Geld kaufen.&lt;br /&gt;
&lt;br /&gt;
Die Dichte braucht man nur ab und zu überprüfen. Denn eine zu hohe Dichte ist gar nicht so einfach zu erreichen. (siehe &amp;quot;Prozessparameter&amp;quot; unten)&lt;br /&gt;
&lt;br /&gt;
=== Berechnung der Dichte aus Volumen und Masse ===&lt;br /&gt;
&lt;br /&gt;
Da bekanntlich Dichte = Masse / Volumen ist, kann man mit einer Feinwaage die Masse eines bestimmten Volumen ermitteln und sich daraus die Dichte errechnen.&lt;br /&gt;
&lt;br /&gt;
Also mit der Spritze z.B. 100 ml abmessen und mit der Waage abwiegen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:cucl_ar_dichte1.jpg|5x 10ml abgewogen&lt;br /&gt;
Datei:cucl_ar_dichte2.jpg|ergeben 59.93g -&amp;gt; Dichte ist 1,20 kg/l&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prozessparameter ===&lt;br /&gt;
&lt;br /&gt;
Die optimale Dichte liegt im Bereich von 1,20 kg/l bis 1,38 kg/l. &lt;br /&gt;
&lt;br /&gt;
Wenn die Dichte zu &#039;&#039;&#039;klein&#039;&#039;&#039; ist, hat man diese beiden Optionen:&lt;br /&gt;
* &#039;&#039;&#039; ignorieren&#039;&#039;&#039; und Weiterätzen bis die richtige Dichte erreicht wird,&lt;br /&gt;
* eindampfen / verdunsten lassen -- was aber wegen der entstehenden Säuredämpfe kein Spass ist, also nicht empfohlen. Alternative kann man auch die Säure verbrauchen (z.B Kupferabfälle reinwerfen). &lt;br /&gt;
&lt;br /&gt;
Wenn man diesen Wert überschreitet, verdünnt man seine Ätze entsprechend mit Wasser. (Berechnungstool im [http://www.mikrocontroller.net/wikifiles/6/6e/Hcl-rechner-cucl.ods Libreoffice-Dokument]) &lt;br /&gt;
&lt;br /&gt;
Allerdings wird es schon eine Zeit brauchen bis man die obere Grenze erreicht: Hierzu eine &lt;br /&gt;
&#039;&#039;&#039;Überschlagsrechnung&#039;&#039;&#039; für 1 Liter Ätzflüssigkeit: &lt;br /&gt;
* Um die maximale Dichte zu erreichen muss man 380g CuCl2 in Lösung bekommen.&lt;br /&gt;
* Dies entspricht ca. 2,8 Mol CuCl2 &amp;lt;small&amp;gt;(CuCl2 hat eine molare Masse von 134 g/Mol)&amp;lt;/small&amp;gt;&lt;br /&gt;
* Diese CuCl2 ist beim Ätzen von 2,8 * 65 g = ~180 g Kupfer entstanden.&lt;br /&gt;
* Um 180g Kuper zu Ätzen wurden 5,6 Mol Salzsäure verbraucht. &lt;br /&gt;
* Dies sind bei einer 25%-igen Salzsäure ca. 750ml Volumen,&lt;br /&gt;
* wobei dieses 625g Wasser enthält.&lt;br /&gt;
* Also haben wir allein durch das Verdünnen des enthaltenen Wassers schon das Volumen auf ca. 1,6l erhöht, was &lt;br /&gt;
* wiederum ca. 110g Kupfer (230g CuCl2) aufnehmen kann bis die Dichte wieder kritisch wird.&lt;br /&gt;
&lt;br /&gt;
Diese Überschlagsrechnung macht natürlich ein paar Vernachlässigungen / Fehler, zeigt aber deutlich man sich über Dichte kaum Sorgen machen braucht. &lt;br /&gt;
&lt;br /&gt;
Die Vereinfachungen: &lt;br /&gt;
* Die Regenerierung erzeugt auch H20, d.h. aus 1 Mol Hcl werden 0,5 Mol H2O (ca. 9g)&lt;br /&gt;
* Das CuCl2 wird nicht im Wasser gelöst und HCl hat eine Dichte &amp;gt;1. &lt;br /&gt;
* Es wird angenommen das das Volumen der Lösung nicht ändert, wenn man CuCl2 darin auflöst.&lt;br /&gt;
&lt;br /&gt;
(Der Dichterechner im [http://www.mikrocontroller.net/wikifiles/6/6e/Hcl-rechner-cucl.ods Libreoffice-Dokument] berücksichtigt zuminderst die Dichte der Salzsäure)&lt;br /&gt;
&lt;br /&gt;
= Chemikaliensicherheit &amp;amp; Entsorgung =&lt;br /&gt;
&lt;br /&gt;
Beim Umgang mit Chemikalien sollte die Hinweise im Sicherheitsdatenblatt (MSDS) durchgelesen werden. Die Sicherheitsdatenblätter bekommt man in der Regel vom Hersteller der Chemikalie (Privatanwender haben keinen Anspruch drauf, aber in der Regel gibt es sie im Netz).&lt;br /&gt;
&lt;br /&gt;
Es sollten immer geeignete Persönliche Schutzausrüstungen (PSA) getragen werden. Also immer nur &amp;quot;mit&amp;quot; arbeiten: geeignete Handschuhe, geeignete Schutzbrille und geeignete Kleidung (z.B Kittel) etc...&lt;br /&gt;
&lt;br /&gt;
Beim Arbeiten mit Chemikalien nie essen, trinken oder rauchen. Danach Hände waschen.&lt;br /&gt;
&lt;br /&gt;
Nie Behältnisse die für Lebensmittel gedacht sind für die Aufbewahrung von Chemikalien verwenden. &lt;br /&gt;
&lt;br /&gt;
Alle Chemikalien beschriften&lt;br /&gt;
&lt;br /&gt;
== MSDS (Material Saftey Datasheets)==&lt;br /&gt;
&lt;br /&gt;
Die MSDS sollte also bei seinem Hersteller/Lieferanten bekommen.&lt;br /&gt;
&lt;br /&gt;
Hier noch ein paar Links zur [http://de.wikipedia.org/wiki/GESTIS-Stoffdatenbank GESTIS] für die Stoffe:&lt;br /&gt;
&lt;br /&gt;
* Salzsäure [http://gestis.itrust.de/nxt/gateway.dll/gestis_de/520030.xml?f=templates&amp;amp;fn=default.htm HCl]&lt;br /&gt;
* Wasserstoffperoxid [http://gestis.itrust.de/nxt/gateway.dll?f=id$t=default.htm$vid=gestisdeu:sdbdeu$id=002430 H2O2]&lt;br /&gt;
* Natriumhydroxid [http://gestis.itrust.de/nxt/gateway.dll/gestis_de/001270.xml?f=templates&amp;amp;fn=default.htm NaOH]&lt;br /&gt;
* Kupfer(I)chlorid [http://gestis.itrust.de/nxt/gateway.dll/gestis_de/003280.xml?f=templates&amp;amp;fn=default.htm CuCl]&lt;br /&gt;
* Kupfer(II)chlorid [http://gestis.itrust.de/nxt/gateway.dll/gestis_de/002470.xml?f=templates&amp;amp;fn=default.htm CuCl2]&lt;br /&gt;
&lt;br /&gt;
== Entsorgung ==&lt;br /&gt;
&lt;br /&gt;
Chemikalien müssen immer fachgerecht entsorgt werden. Für Privatleute und begrenzten Mengen nimmt in der Regel der Wertstoffhof bzw. das Schadstoffmobil entgegen. Einfach mal bei der Gemeinde nachfragen.&lt;br /&gt;
Die Gefäße sollten entsprechend beschriftet werden. Siehe auch hier: http://www.tuf-ev.de/workshop/aetzen/EntsorgungAetzen.htm &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AUF GAR KEINEN FALL&#039;&#039;&#039; darf die Ätzlösung über die Kanalisation entsorgt werden.&lt;br /&gt;
&lt;br /&gt;
= Threads =&lt;br /&gt;
&lt;br /&gt;
Diskussionthread: https://www.mikrocontroller.net/topic/306447&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Links wo das Thema schon mal disktutiert wurde, off topic.. )&lt;br /&gt;
https://www.mikrocontroller.net/topic/306023&lt;br /&gt;
&lt;br /&gt;
https://www.mikrocontroller.net/topic/304366&lt;br /&gt;
&lt;br /&gt;
= Externe Links = &lt;br /&gt;
&lt;br /&gt;
[1] Patent RP0178347B1 (abgelaufen) http://www.google.com/patents/EP0178347B1&lt;br /&gt;
&lt;br /&gt;
[2] [http://home.exetel.com.au/adam.seychell/PCB/etching_CuCl/index.html Seite von Adam Seychell]&lt;br /&gt;
&lt;br /&gt;
[3] http://www.iasj.net/iasj?func=fulltext&amp;amp;aId=24599&lt;br /&gt;
&lt;br /&gt;
[4] www.chemcut.net/pdf/Cupric-Chloride.pdf‎&lt;br /&gt;
&lt;br /&gt;
[5] Patent http://www.google.com/patents/EP0048381B1&lt;br /&gt;
&lt;br /&gt;
[6] Technisches Datenblatt HCl von Bayer Science [https://tecci.bayer.de/io-tra-pro/emea/de/docId-2857593/Salzs%C3%A4ure.pdf]&lt;br /&gt;
&lt;br /&gt;
[7] Firmenwerbung? mit Bildern:&lt;br /&gt;
http://www.prowet.co.kr/download/board06/120177308463302.pdf&lt;br /&gt;
&lt;br /&gt;
[8] Patent DE2942504A1 https://patents.google.com/patent/DE2942504A1&lt;br /&gt;
&lt;br /&gt;
[9] [https://www.bastianschmidt.de/etching Seite von BastianS] zur Verwendung von Kaliumchlorid statt freier Salzsäure&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Platinen]]&lt;/div&gt;</summary>
		<author><name>172.26.27.242</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Umstieg_von_Arduino_auf_AVR&amp;diff=105466</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=105466"/>
		<updated>2022-09-27T09:50:33Z</updated>

		<summary type="html">&lt;p&gt;172.26.27.242: /* Entfernen der delay()-Aufrufen */&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 annehmen. 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 Implementierung, 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 weitere 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 geschaltet, 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 langem 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 kompiliert 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;
Die meisten Arduinos kommen mit einem vorinstalliertem Bootloader. Clones werden auch gerne mal ohne verkauft. Mit dem Bootloader 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-Version 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>172.26.27.242</name></author>
	</entry>
</feed>