<?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=194.94.93.93</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=194.94.93.93"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/194.94.93.93"/>
	<updated>2026-04-11T03:16:21Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Codeoptimierung&amp;diff=58265</id>
		<title>AVR-GCC-Codeoptimierung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC-Codeoptimierung&amp;diff=58265"/>
		<updated>2011-07-01T09:37:22Z</updated>

		<summary type="html">&lt;p&gt;194.94.93.93: /* Compileroption -mint8 für 8-Bit Arithmetik als Default */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entstanden aus diesem [http://www.mikrocontroller.net/topic/66690 Thread] sollen hier ein paar Hinweise/Erfahrungen gegeben werden, um den Quellcode in Punkto Größe und Geschwindigkeit zu optimieren. &#039;&#039;En detail&#039;&#039; ist das Thema komplex, da es stark von der Codeoptimierung des Compilers abhängt. Es ist im Einzelfall ratsam zu prüfen, ob die eigenen Maßnahmen auch erfolgreich waren. Die Diskussionen [http://www.mikrocontroller.net/topic/132624] bzw. [http://www.mikrocontroller.net/topic/180800#new] können als Anhaltspunkte dienen, wie eine solche Prüfung ablaufen kann.&lt;br /&gt;
&lt;br /&gt;
== Prinzipien der Optimierung ==&lt;br /&gt;
&lt;br /&gt;
Wie so oft sollte man nicht einfach wild drauf los optimieren und sich zunächst ein paar Dinge klar machen.&lt;br /&gt;
&lt;br /&gt;
* Warum will ich optimieren?&lt;br /&gt;
* Was kann man sinnvoll optimieren?&lt;br /&gt;
* Wieviel Rechenzeit oder Speicher soll dabei gespart werden?&lt;br /&gt;
* Wie kann optimiert werden?&lt;br /&gt;
* &amp;quot;Verfrühte Optimierung ist die Wurzel allen Übels&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Viele Optimierungen sind &amp;quot;Angst-Optimierungen&amp;quot;, die nicht wirklich nötig sind. Die Gefahr mit Optimierungen ist, den Code tot zu optimieren, sprich Lesbarkeit, Portierbarkeit und ggf. Fehlerfreiheit sinken massgeblich. Kurz und knapp in diesem [http://blogs.msdn.com/b/audiofool/archive/2007/06/14/the-rules-of-code-optimization.aspx BLOG] formuliert.&lt;br /&gt;
&lt;br /&gt;
=== Warum ===&lt;br /&gt;
&lt;br /&gt;
Optimieren sollte man nur, wenn&lt;br /&gt;
* der Speicher nicht mehr ausreicht (RAM, Flash)&lt;br /&gt;
* Die Laufzeit für bestimmte Programmteile zu groß wird und somit bestimmte (Echtzeit-)Ausgaben nicht im erforderlichen Zeitrahmen erledigt werden&lt;br /&gt;
&lt;br /&gt;
Weiter sollte man folgende Punkte gegeneinander abwägen:&lt;br /&gt;
&lt;br /&gt;
* Codeverbrauch&lt;br /&gt;
* Datenverbrauch. Statisch/Stack/Heap&lt;br /&gt;
* Mittlere Laufzeit/maximale Laufzeit&lt;br /&gt;
* Entwicklungszeit&lt;br /&gt;
* Portabilität (Compiler, Hardware, ...)&lt;br /&gt;
* Verständlichkeit der Quelle, siehe [[Strukturierte Programmierung auf Mikrocontrollern]] &lt;br /&gt;
* ABI-Konformität&lt;br /&gt;
&lt;br /&gt;
=== Was ===&lt;br /&gt;
&lt;br /&gt;
Die goldene Regle lautet: 90% der Rechenleistung werden in 10% des Codes verbraucht. Diese 10% muss man finden und zum richtigen Zeitpunkt optimieren. Der Rest muss nur sauber und lesbar geschrieben sein. Was jedoch nichts bringt, ist eine Funktion, die von 1 Minute Programmlaufzeit lediglich 1 Sekunde verbraucht, um den Faktor 10 schneller zu machen. Die Programmlaufzeit sinkt dann von 60 Sekunden auf 59.1 Sekunden. Der Aufwand, die Funktion um einen Faktor 10 schneller zu machen ist aber meistens beträchtlich!  Kann ich aber den Code, der für die 59 Sekunden verantwortlich ist um einen Faktor 10 schneller machen, dann sinkt die Gesamtlaufzeit von 60 Sekunden auf 6.9 Sekunden. Dort bringt Optimieren augenscheinlich viel mehr!&lt;br /&gt;
&lt;br /&gt;
Um die optimierungswürdigen Stellen zu finden, muss man sein Programm analysieren. Dazu gibt es verschiedene Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
====Speicherverbrauch nach Funktionen aufschlüsseln====&lt;br /&gt;
&lt;br /&gt;
;map-File:&lt;br /&gt;
:dort sind alle globalen und statischen Variablen enthalten. Eine Map-Datei kann mit den GNU-Tools während des Linkens angelegt werden:&lt;br /&gt;
::&amp;lt;pre&amp;gt;&amp;amp;gt; avr-gcc ... -Wl,-Map,foo.map&amp;lt;/pre&amp;gt;&lt;br /&gt;
: Die Option -Wl bewirkt, daß avr-gcc die angehängen Optionen unverändert an den Linker weiterreicht. Dieser erzeugt dann das Mapfile &amp;quot;foo.map&amp;quot;, eine Textdatei.&lt;br /&gt;
;avr-size: Mit Tools wie avr-size kann die Platzbelegung einzelner Module ermittelt werden:&lt;br /&gt;
::&amp;lt;pre&amp;gt;&amp;amp;gt; avr-size -x foo1.o foo2.o ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
:bzw. die Platzbelegung der elf-Datei:&lt;br /&gt;
::&amp;lt;pre&amp;gt;&amp;amp;gt; avr-size -C --mcu=atmega8 foo.elf&amp;lt;/pre&amp;gt;&lt;br /&gt;
;avr-nm:&lt;br /&gt;
::&amp;lt;pre&amp;gt;&amp;amp;gt; avr-nm --size-sort -S foo.elf&amp;lt;/pre&amp;gt;&lt;br /&gt;
:ergibt eine Liste mit der Größe aller Objekte: der erste Spalte enthälte die Adresse, die zweite Spalte die Größe, die dritte den Typ und die vierte Spalte den zugehörigen Symbolnamen. Der Typ ergibt sich aus der folgenden Zuordnung, wobei Großbuchstaben globale Symbole kennzeichnen und Kleinbuchstaben Symbole, die Modul-lokal sind:&lt;br /&gt;
:;T/t: Objekte in der text-Section: Funktionen, Daten im Flash&lt;br /&gt;
:;D/d: Objekte im data-Segment (initialisierte Daten)&lt;br /&gt;
:;B/b: Objekte im bss-Segment (Null-initialisierte Daten)&lt;br /&gt;
&lt;br /&gt;
;avr-gcc: Der Compiler hat bereits Informationen über die übersetzten Funktionen, die man direkt zur Analyse verwenden kann. Dazu lässt man avr-gcc die Assembler-Ausgabe, die ohne weiteres Zutun nur als temporäre Datei angelegt wird, abspeichern. Etwa für die Quelldatei foo.c:&lt;br /&gt;
::&amp;lt;pre&amp;gt;&amp;amp;gt; avr-gcc -save-temps foo.c -c ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Die Assembler-Datei wird damit als foo.s angelegt und nicht gelöscht. (Das ebenfalls angelegte Präcompilat foo.i wird nicht benötigt). Für jede Funktion gibt avr-gcc 3.4.x im Prolog einen Kommentar der Form&amp;lt;ref&amp;gt;Für avr-gcc 4.x sehen die Kommentare anders aus oder fehlen je nach Compilerversion ganz&amp;lt;/ref&amp;gt;&lt;br /&gt;
::&amp;lt;pre&amp;gt;/* prologue: frame size=0 */&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aus, was die Größe des aktuellen Frames angibt. Dies ist der Platz auf dem Stack, der für lokale Variablen benötigt wird. Am besten ist es, wenn die Frame-Size wie im Beispiel gleich 0 ist. Ansonsten sollte man versuchen, diese Größe auf Null zu bringen. Für Variablen, die nicht in Registern gehalten werden können, müssen Speicherzugriffe in den Stack erzeugt werden. Diese machen das Programm sowohl größer aus auch langsamer. Zudem reserviert avr-gcc bei solche Funktionen das Y-Register als Frame-Pointer; das Y-Register steht damit nicht mehr für lokale Variablen zur Verfügung was sich ebenfalls ungünstig auf die Codegüte auswirkt. Ein Grund für das Anlegen eines Frames können zu viele lokale Variablen sein (zB lokale Puffer/Arrays) oder lokale Variablen/Strukturen/Parameter mit ungünstigen Größen, etwa eine 3-Byte große Struktur. &lt;br /&gt;
&lt;br /&gt;
: Neben dieser Information gibt avr-gcc Kommentare der Gestalt&lt;br /&gt;
::&amp;lt;pre&amp;gt;/* prologue end (size=2) */&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aus die darüber informieren, wie viele Register auf dem Stack gesichert wurden.&lt;br /&gt;
&lt;br /&gt;
: Zusammen mit Werkzeugen wie grep, die in jedem Linux und jeder WinAVR-Distribution enthalten sind, findet man schnell Übeltäter wie Funktionen mit Frame.&lt;br /&gt;
&lt;br /&gt;
;Assembler-Code sichten: Ein kurzer Blick auf den erzeugten Assembler-Code zeigt oft, wie gut der Compiler den Code umgesetzt hat. Den erzeugten Assembler-Code zu überfliegen ist wesentlich zeitsparender als selbst in Assembler zu programmieren. Je nach Gusto verwendet man zur Einsicht den Assembler-Code, den avr-gcc ausgibt (s.o.), Assembler-Dumps des Assemblers, List-Files oder HEX-Dumps. Siehe auch&amp;lt;ref&amp;gt;[http://rn-wissen.de/index.php/Assembler-Dump_erstellen_mit_avr-gcc roboternetz.de: Assembler-Dump erstellen mit avr-gcc]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Hilfsmittel: einkaufen oder selber bauen. Es gilt herauszufinden, welche Funktion massig Stack durch lokale Variablen verbraucht. Stacktracer können das. Wenn man keinen hat, dann muss man sich eben selber einen bauen, indem man den Stackpointer mitloggt. Zur Not einen Code-Review machen: Alle Funktionen optisch durchgehen und die identifizieren, die viele Variablen anlegen. Dann die Aufrufhierarchie der Funktion feststellen: Wirken sich die vielen Variablen überhaupt aus oder entsteht mein Problem durch eine tiefe Funktionsaufrufhierarchie, bei der zwar wenige Variablen pro Funktion im Spiel sind, aber die Menge der ineinandergeschachtelten Aufrufe &#039;das Kraut fett macht&#039;&lt;br /&gt;
;Profitools: können das alles fast auf Knopfdruck, kosten aber viel Geld&lt;br /&gt;
&lt;br /&gt;
====Laufzeit messen====&lt;br /&gt;
&lt;br /&gt;
*Simulator&lt;br /&gt;
*In Echtzeit mittels Testpin, welche an Anfang einer Funktion/Blocks gesetzt wird und am Ende wieder gelöscht wird. Mit einem [[Oszilloskop]] kann man so sehr einfach die Laufzeit messen.&lt;br /&gt;
&lt;br /&gt;
; Anmerkung: Solche Messverfahren liefern immer nur eine &#039;&#039;untere&#039;&#039; Schranke für die Laufzeit, niemals eine obere Schranke. Eine obere Schranke, wie man sie etwa in sicherheitsktitischen Systemen benötigt, liefert eine statische Codeanalyse.&lt;br /&gt;
&lt;br /&gt;
=== Wieviel ===&lt;br /&gt;
&lt;br /&gt;
Der Aufwand von Optimierungen wächst exponentiell. Die letzten paar Prozent brauchen überproportional viel Aufwand.&lt;br /&gt;
&lt;br /&gt;
=== Wie ===&lt;br /&gt;
&lt;br /&gt;
Meist muss man die Wahl treffen ob man Speicher oder Rechenzeit sparen will, beides gleichzeitg geht meist nicht. Das Konzept heißt &#039;Space for Time&#039; und kann in beide Richtungen verwendet werden. Als Beispiel soll eine komplizierte Berechnung dienen. Diese kann man relativ kompakt in eine Funktion packen, welche dann aber eher langsam ist. Oder man benutzt eine sehr große Tabelle, in welcher die Ergebnisse schon für jeden Eingangswert vorausberechnet wurden. Diese Lösung ist sehr schnell, verbraucht aber sehr viel Speicher.&lt;br /&gt;
&lt;br /&gt;
* Inlining von Funktionen erhöht den Speicherverbrauch, senkt aber die Laufzeit. Beispiel: Funktion A ist 50 Byte groß und wird 10 mal im Programm aufgerufen. Ein Aufruf kostet 10 Byte:&lt;br /&gt;
** Ohne Inline: 10 * 10Byte + 50 Byte = 150 Byte Platzverbrauch&lt;br /&gt;
** Mit Inline: 10 * 50 Byte = 500 Byte&lt;br /&gt;
* Optimierer einschalten&lt;br /&gt;
* möglichst keine Floating Point Operationen, besser ist meist [[Festkommaarithmetik]]&lt;br /&gt;
* Formeln umstellen und zusammenfassen&lt;br /&gt;
* Variablen so klein wie möglich, uint8_t wo&#039;s nur geht.&lt;br /&gt;
* Wirklich zeitkritische Funktionen und Interrupts als Assemblercode in separater Datei&lt;br /&gt;
&lt;br /&gt;
==Optimierung der Größe==&lt;br /&gt;
&lt;br /&gt;
===GCC-interne Optimierung===&lt;br /&gt;
&lt;br /&gt;
avr-gcc kennt mehrere Optimierungsstufen:&lt;br /&gt;
;-O0: Keine Optimierung. Alle lokalen Variablen werden auf dem Stack angelegt und nicht in Registern gehalten. Es werden keine komplexen Optimierungsalgorithmen angewandt; lediglich Konstanten wie 1+2 werden zu 3 gefaltet. Diese Optimierungsstufe erzeugt zusammen mit Debug-Information Code, der sehr gut in einem Debugger nachvollzogen werden kann.&lt;br /&gt;
;-O1: Je höher die Optimierungsstufe, desto schwieriger ist der erzeugte Code nachvollziehbar &amp;amp;mdash; auch mit Debugger. Diese O-Stufe ist ein Kompromiss zwischen agressiver Optimierung und Nachvollziehbarkeit des erzeugten Codes. Ein ehernes Gesetz in GCC ist, dass er den gleichen Code erzeugen muss unabhängig davon, ob Debug-Information erzeugt wird oder nicht. Im Umkehrschluss erlaubt volle Debug-Unterstützung nicht alle Optimierungen, wozu diese Optimierungsstufe dient.&lt;br /&gt;
&lt;br /&gt;
;-O2: Optimierung auf Geschwindigkeit. Für AVR nur mässig sinnvoll, da sich der Codezuwachs nicht in einem entsprechenden Geschwindigkeitszuwachs transformiert. Dies liegt vor allem daran, daß Sprünge und Funktionsaufrufe auf AVR im Vergleich zu anderen Architekturen sehr billig sind. Es bringt also kaum einen Geschwindigkeitszuwachs, einen Block zu kopieren um einen Sprung zu sparen. Hingegen vergrößert dies den Code deutlich.&lt;br /&gt;
&lt;br /&gt;
;-O3: Ditto. Auf Teufel-komm-raus Funktionen zu inlinen, Schleifen aufzurollen oder gar Funktionen mehrfach für unterschiedliche Aufruf-Szenarien zu implementieren, ist auf einem kleinen µC wie AVR der Overkill.&lt;br /&gt;
&lt;br /&gt;
;-Os: Optimierung auf Codegröße. Die bevorzugte Optimierungsstufe für AVR und viele andere µC.&lt;br /&gt;
&lt;br /&gt;
Jede O-Option ist ein Sammlung von verschiedenen Schaltern, welche bestimmte Optimierungsstrategien aktivieren. Um zu sehen, welche Schalter dies genau sind, erzeugt man wie oben beschrieben mit den Schalten&lt;br /&gt;
   -fsave-temps -fverbose-asm&lt;br /&gt;
die Assembler-Ausgabe von gcc und schaut die Optionen im s-File nach. Einzelne Optionen lassen sich gezielt aktivieren bzw. deaktivieren und damit zum Beispiel zum -Os-Paket hinzufügen. &lt;br /&gt;
&lt;br /&gt;
Eine Ausnahme bildet -O0: Hier ist Code-Optimierung generell deaktiviert, und Optimierungsschalter bleiben ohne Wirkung. -O0 optimiert auf Resourcenverbrauch des /Compilers/ und auf Nachvollziehbarkeit per Debug-Info (so diese erzeugt wird).&lt;br /&gt;
&lt;br /&gt;
Kandidaten dafür für Optimierungsoptionen sind folgende Schalter. -m kennzeichnet maschinenspezifische Schalter, die nur für AVR gültig sind. -f bzw. -fno- sind maschinenunabhängige Schalter, die auch für andere Architekturen verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
;-fno-split-wide-types: Je nach Quelle kann die Deaktivierung von -fsplit-wide-types besseren Code ergeben.&lt;br /&gt;
&lt;br /&gt;
;-fno-inline-small-functions: Relativ kleine Funktionen /immer/ zu inlinen kann den Code unnötig vergrößern, dieser Schalter unterbindet das automatische Inlinen kleiner Funktionen.&lt;br /&gt;
&lt;br /&gt;
;-finline-limit=&amp;lt;n&amp;gt;: Maximale Wert für automatisch geinlinte Funktionen. In einschlägigen Foren werden kleine Werte für den Parameter vorgeschlagem, z.B. 1...3&lt;br /&gt;
&lt;br /&gt;
;-mcall-prologues: Die für aufwändige Funktionen mitunter recht langen push/pop-Sequenzen werden durch Hilfsfunktionen ersetzt. Das kann vor allem bei grossen Programmen Platz sparen. Die Ausführungszeit steigt an.&lt;br /&gt;
&lt;br /&gt;
;-fno-jump-tables: Switch-Statements werden hierdurch mitunter deutlich kürzer.&lt;br /&gt;
&lt;br /&gt;
;-fno-move-loop-invariants&amp;lt;br/&amp;gt;-fno-tree-loop-optimize: einige Schleifenoptimierungen, welche die Registerlast erhöhen und für AVR kaum zu einem Geschwindigkeitszuwachs führen, unterbleiben&lt;br /&gt;
&lt;br /&gt;
Generall gilt für all diese Optionen, daß sie abhängig vom Projekt zu einer Codeverbesserung oder -verschlechterung führen können &amp;amp;mdash; dies ist i.d.R. vom Projektcode abhängig.&lt;br /&gt;
&lt;br /&gt;
===Statische (globale) Variablen in einer Struktur sammeln===&lt;br /&gt;
&lt;br /&gt;
Das erleichtert dem Compiler die Adressierung, da er den Basiszeiger wiederverwenden kann. Die Codegröße kann dann noch von der Reihenfolge der struct-Member abhängen. Die häufigst benutzte Variable sollte am Anfang stehen, dann kann sie ohne Offset direkt mit dem Basiszeiger adressiert werden. Ansonsten in Gruppen, wie die Variablen auch gebraucht werden. Hier kann man viel rumprobieren.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
    uint16_t sec;            // Meistbenutze Variable an den Anfang&lt;br /&gt;
    uint16_t minute;&lt;br /&gt;
    uint16_t hour;&lt;br /&gt;
} time_t;&lt;br /&gt;
&lt;br /&gt;
time_t global;                    // Globale Struktur definieren&lt;br /&gt;
uint8_t min;                 // Als Vergleich: einzelne globale Variable&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    time_t *time = &amp;amp;global;       // Zeiger auf die globale Struktur&lt;br /&gt;
    // LDI R30,LOW(global)   ; Init Z pointer&lt;br /&gt;
    // LDI R31,(global &amp;gt;&amp;gt; 8) ; Init Z high byte&lt;br /&gt;
    if (++time-&amp;gt;sec == 60)&lt;br /&gt;
    {&lt;br /&gt;
    // LDD R16,Z+2           ; Load with displacement&lt;br /&gt;
    // INC R16               ; Increment&lt;br /&gt;
    // STD Z+2,R16           ; Store with displacement&lt;br /&gt;
    // CPI R16,LOW(60)       ; Compare&lt;br /&gt;
    // BRNE ?0005            ; Branch if not equal&lt;br /&gt;
    }&lt;br /&gt;
    if ( ++min == 60)&lt;br /&gt;
    {&lt;br /&gt;
    // LDS R16,LWRD(min)     ; Load direct from SRAM&lt;br /&gt;
    // INC R16               ; Increment&lt;br /&gt;
    // STS LWRD(min),R16     ; Store direct to SRAM&lt;br /&gt;
    // CPI R16,LOW(60)       ; Compare&lt;br /&gt;
    // BRNE ?0005            ; Branch if not equal&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch, dass die Strukturvariable über LDD/STD (LDD/STD 2 Bytes; LDS/STS 4 Bytes) angesprochen werden kann, werden an dieser Stelle 4 Bytes eingespart.&lt;br /&gt;
Hinzu kommen jedoch noch einmal die 4 Bytes für die Initialisierung des Z-pointers, sodass die Einsparung erst bei mehreren Globalvariablen zum Tragen kommt.&lt;br /&gt;
&lt;br /&gt;
; Anmerkung: Dieses Beispiel zeigt sehr schön, daß solcherlei &amp;quot;Optimierung&amp;quot; ohne Wissen um die Arbeitsweise des eingesetzten Compilers nach hinten losgehen können oder ins Leere laufen. Der erzeugte Code (avr-gcc 4.3.3 -Os) ist:&lt;br /&gt;
::{|&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
main:&lt;br /&gt;
/* prologue: function */&lt;br /&gt;
    lds r24,global&lt;br /&gt;
    lds r25,(global)+1&lt;br /&gt;
    adiw r24,1&lt;br /&gt;
    sts (global)+1,r25&lt;br /&gt;
    sts global,r24&lt;br /&gt;
    lds r24,min&lt;br /&gt;
    subi r24,lo8(-(1))&lt;br /&gt;
    sts min,r24&lt;br /&gt;
    ldi r24,lo8(0)&lt;br /&gt;
    ldi r25,hi8(0)&lt;br /&gt;
/* epilogue start */&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
: D.h. es wird &#039;&#039;nicht&#039;&#039; indirekt auf die Daten zugegriffen. Grund ist, daß gcc die Adresse zur Compilzeit ermitteln kann und dieses Wissen ausnutzt. Angemerkt sei noch, daß der Code im Beispiel von oben entweder gefaket ist und nicht von einem Compiler stammt (die wahrscheinlichere Variante), oder der Compiler inkorrekten Code erzeugte: Das INC erhöht nur die unteren 8 Bit der Komponenten, welche jedoch 16-Bit Werte sind.&lt;br /&gt;
&lt;br /&gt;
: Dennoch ist die angedeutete Zusammenfassung von &#039;&#039;inhaltlich zusammengehörenden&#039;&#039; Variablen sinnvoll und besser als ein Schwarm frei-flottierender int-Variablen.&lt;br /&gt;
&lt;br /&gt;
===Multiplikationen mit Konstanten===&lt;br /&gt;
&lt;br /&gt;
Der Compiler instanziiert sofort eine teure allgemeine Bibliotheksfunktion, auch wenn es anders ginge. Ich hatte eine einzige 32-bit Multiplikation mit 10 drin, die mir ein mulsi3 beschert hat. Mit a = (b&amp;lt;&amp;lt;3) + (b&amp;lt;&amp;lt;1) geht es in dem Fall kürzer. Wie gesagt, map-File beobachten. &lt;br /&gt;
Anmerkung: Variablen als unsigned definieren, dann sollte der Compiler das selbst machen.&lt;br /&gt;
&lt;br /&gt;
;Anmerkung: Auch Schieben ist teuer auf AVR. Schauen wir uns also mal an, was aus folgendem Code wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint32_t foo (uint32_t i)&lt;br /&gt;
{&lt;br /&gt;
    return i*10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t bar (uint32_t i)&lt;br /&gt;
{&lt;br /&gt;
    return (i &amp;lt;&amp;lt; 1) + (i &amp;lt;&amp;lt; 3);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Scrollbox|18ex;|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000032 &amp;lt;foo&amp;gt;:&lt;br /&gt;
  32:	2a e0       	ldi	r18, 0x0A	; 10&lt;br /&gt;
  34:	30 e0       	ldi	r19, 0x00	; 0&lt;br /&gt;
  36:	40 e0       	ldi	r20, 0x00	; 0&lt;br /&gt;
  38:	50 e0       	ldi	r21, 0x00	; 0&lt;br /&gt;
  3a:	19 d0       	rcall	.+50     	; 0x6e &amp;lt;__mulsi3&amp;gt;&lt;br /&gt;
  3c:	08 95       	ret&lt;br /&gt;
&lt;br /&gt;
0000003e &amp;lt;bar&amp;gt;:&lt;br /&gt;
  3e:	26 2f       	mov	r18, r22&lt;br /&gt;
  40:	37 2f       	mov	r19, r23&lt;br /&gt;
  42:	48 2f       	mov	r20, r24&lt;br /&gt;
  44:	59 2f       	mov	r21, r25&lt;br /&gt;
  46:	22 0f       	add	r18, r18&lt;br /&gt;
  48:	33 1f       	adc	r19, r19&lt;br /&gt;
  4a:	44 1f       	adc	r20, r20&lt;br /&gt;
  4c:	55 1f       	adc	r21, r21&lt;br /&gt;
  4e:	e3 e0       	ldi	r30, 0x03	; 3&lt;br /&gt;
  50:	66 0f       	add	r22, r22&lt;br /&gt;
  52:	77 1f       	adc	r23, r23&lt;br /&gt;
  54:	88 1f       	adc	r24, r24&lt;br /&gt;
  56:	99 1f       	adc	r25, r25&lt;br /&gt;
  58:	ea 95       	dec	r30&lt;br /&gt;
  5a:	d1 f7       	brne	.-12     	; 0x50 &amp;lt;__SREG__+0x11&amp;gt;&lt;br /&gt;
  5c:	26 0f       	add	r18, r22&lt;br /&gt;
  5e:	37 1f       	adc	r19, r23&lt;br /&gt;
  60:	48 1f       	adc	r20, r24&lt;br /&gt;
  62:	59 1f       	adc	r21, r25&lt;br /&gt;
  64:	95 2f       	mov	r25, r21&lt;br /&gt;
  66:	84 2f       	mov	r24, r20&lt;br /&gt;
  68:	73 2f       	mov	r23, r19&lt;br /&gt;
  6a:	62 2f       	mov	r22, r18&lt;br /&gt;
  6c:	08 95       	ret&lt;br /&gt;
&lt;br /&gt;
0000006e &amp;lt;__mulsi3&amp;gt;:&lt;br /&gt;
  6e:	ff 27       	eor	r31, r31&lt;br /&gt;
  70:	ee 27       	eor	r30, r30&lt;br /&gt;
  72:	bb 27       	eor	r27, r27&lt;br /&gt;
  74:	aa 27       	eor	r26, r26&lt;br /&gt;
&lt;br /&gt;
00000076 &amp;lt;__mulsi3_loop&amp;gt;:&lt;br /&gt;
  76:	60 ff       	sbrs	r22, 0&lt;br /&gt;
  78:	04 c0       	rjmp	.+8      	; 0x82 &amp;lt;__mulsi3_skip1&amp;gt;&lt;br /&gt;
  7a:	a2 0f       	add	r26, r18&lt;br /&gt;
  7c:	b3 1f       	adc	r27, r19&lt;br /&gt;
  7e:	e4 1f       	adc	r30, r20&lt;br /&gt;
  80:	f5 1f       	adc	r31, r21&lt;br /&gt;
&lt;br /&gt;
00000082 &amp;lt;__mulsi3_skip1&amp;gt;:&lt;br /&gt;
  82:	22 0f       	add	r18, r18&lt;br /&gt;
  84:	33 1f       	adc	r19, r19&lt;br /&gt;
  86:	44 1f       	adc	r20, r20&lt;br /&gt;
  88:	55 1f       	adc	r21, r21&lt;br /&gt;
  8a:	96 95       	lsr	r25&lt;br /&gt;
  8c:	87 95       	ror	r24&lt;br /&gt;
  8e:	77 95       	ror	r23&lt;br /&gt;
  90:	67 95       	ror	r22&lt;br /&gt;
  92:	89 f7       	brne	.-30     	; 0x76 &amp;lt;__mulsi3_loop&amp;gt;&lt;br /&gt;
  94:	00 97       	sbiw	r24, 0x00	; 0&lt;br /&gt;
  96:	76 07       	cpc	r23, r22&lt;br /&gt;
  98:	71 f7       	brne	.-36     	; 0x76 &amp;lt;__mulsi3_loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
0000009a &amp;lt;__mulsi3_exit&amp;gt;:&lt;br /&gt;
  9a:	9f 2f       	mov	r25, r31&lt;br /&gt;
  9c:	8e 2f       	mov	r24, r30&lt;br /&gt;
  9e:	7b 2f       	mov	r23, r27&lt;br /&gt;
  a0:	6a 2f       	mov	r22, r26&lt;br /&gt;
  a2:	08 95       	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
: Der Funktionsaufruf samt Lib-Funktion ist garnicht sooo teuer. Bereits mit zwei Multiplikationen im Programm &amp;amp;mdash; auch einer Multiplikation mit einer anderen Konstanten oder einer Variablen &amp;amp;mdash; gewinnt die lib-Version, da der Code wiederverwendet wird. Übrigens sind diese Multiplikationsroutinen und auch die in die libgcc enthaltenen Divisionen keine &amp;quot;normalen&amp;quot; Funktionen wie sie von C erzeugt werden. avr-gcc weiß genau, welche Register diese Routinen belegen und welche nicht. Damit ist der Aufruf einer solchen Funktion billiger als ein herkömmlicher Funktionsaufruf, bei dem die Funktion als Blackbox behandelt werden muss, die alle call-clobbered Register zerstört.&lt;br /&gt;
&lt;br /&gt;
===Alle Variablen nur so breit wie nötig===&lt;br /&gt;
&lt;br /&gt;
Hatte ich eigentlich schon, nur an einigen wenigen Stellen war ich da etwas nachlässig. Mitunter reicht ein kleinerer Typ doch, wenn man z.&amp;amp;nbsp;B. vorher geeignet skaliert. Am besten nur die skalaren Typen aus &amp;lt;stdint.h&amp;gt; verwenden, das erleichtert auch das Folgende. Bei RAM Knappheit: kann ich Strings sinnvollerweise aus dem RAM ins Flash verbannen? Kann ich es mir leisten mehrere Flag-Variablen in ein Byte zusammenzufassen, auch wenn dann die Zugriffe möglicherweise etwas langsamer werden.&lt;br /&gt;
&lt;br /&gt;
===Logische Operatoren werden auf int-Größe erweitert===&lt;br /&gt;
&lt;br /&gt;
Obwohl der AVR ein 8-Bit Controller ist, weitet der AVR-GCC an manchen Stellen  Vergleiche von zwei 8-Bit Variablen auf 16-Bit auf.&lt;br /&gt;
Als Beispiel sei dabei folgendes gezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void foo(uint8_t a, uint8_t b)&lt;br /&gt;
{&lt;br /&gt;
    if (a == b)&lt;br /&gt;
    {&lt;br /&gt;
        // tue dies&lt;br /&gt;
    }   &lt;br /&gt;
    if (a == ~b)&lt;br /&gt;
    {&lt;br /&gt;
        // tue das&lt;br /&gt;
    // clr r19           ; clear register&lt;br /&gt;
    // mov r24,r22       ; copy register&lt;br /&gt;
    // clr r25           ; clear register&lt;br /&gt;
    // com r24           ; one&#039;s complement&lt;br /&gt;
    // com r25           ; one&#039;s complement&lt;br /&gt;
    // cp r18,r24        ; compare registers&lt;br /&gt;
    // cpc r19,r25       ; compare registers with carry&lt;br /&gt;
    // brne .L1          ; branch if not equal&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Den zweiten Vergleich mit der Negation weitet der Compiler auf 16 Bit auf.&lt;br /&gt;
Ein Cast verhindert dieses:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void foo(uint8_t a, uint8_t b)&lt;br /&gt;
{&lt;br /&gt;
    if (a == b)&lt;br /&gt;
    {&lt;br /&gt;
        // tue dies&lt;br /&gt;
    }   &lt;br /&gt;
    if (a == (uint8_t) ~b)&lt;br /&gt;
    {&lt;br /&gt;
        // tue das&lt;br /&gt;
    // com r22           ; one&#039;s complement&lt;br /&gt;
    // cp r25,r22        ; compare registers&lt;br /&gt;
    // brne .L1          ; branch if not equal&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Einsparung an Speicher zwischen den beiden Versionen beträgt 12 Bytes. Außerdem ist die zweite Version um 6 Takte schneller.&lt;br /&gt;
&lt;br /&gt;
;Achtung: Tatsächlich handelt es sich dabei nicht um ein Optimierungsproblem, sondern einen typischen Programmierfehler. Die beiden Varianten sind keineswegs identisch. Bei Variablen vom Typ uint8_t wird der Ausdruck (a == ~b) immer falsch sein (a=0x0000:0x00FF, ~b=0xFF00:0xFFFF).&lt;br /&gt;
&lt;br /&gt;
===Compileroption -mint8 für 8-Bit Arithmetik als Default===&lt;br /&gt;
&lt;br /&gt;
Mit obigen casts überall sähe der Code ziemlich schlimm aus. Blöd auch, wenn man mal einen Type ändert, dann muß man sorgsam nach den zugehörigen casts&lt;br /&gt;
suchen. Mit dem Compilerschalter -mint8 wird das zum Standard. Bei mir&lt;br /&gt;
hat das etwa 200 Byte gespart! Man sollte dafür aber keine ints mehr im&lt;br /&gt;
Code haben, nur noch Typen definierter Größe aus &amp;lt;stdint.h&amp;gt;.&lt;br /&gt;
Literal-Werte muß man ggf. anpassen (z.&amp;amp;nbsp;B. mit postfix L long machen)&lt;br /&gt;
damit sie nicht überlaufen, Compiler-Warnings beachten.  Ist anscheinend&lt;br /&gt;
noch etwas experimentell(?), mit dem aktuellen gcc 4.1.1 gibt es eine&lt;br /&gt;
Unverträglichkeit in &amp;lt;stdint.h&amp;gt;, der kriegt ein Problem mit den 64-bit Typen. Ist aber wohl in Arbeit, ich habe einen Patch gesehen.&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Warnung:Diese Option verändert das Binärinterface! Funktionen, die nicht mit dieser Option übersetzt wurden, sind nicht unbedingt kompatiablen mit solchen, die mit dem Schalter erzeugt wurden. Da die Bibliotheken &amp;amp;mdash; auch die Compiler-interne libgcc &amp;amp;mdash; ohne diesen Schalter generiert werden, ist mit Problemen zu rechnen. Weiterhin sind bestimmte Typen nicht mehr verfügbar bzw. werden mit anderer Semantik belegt, etwa int und long. Für die Option gibt es in avr-gcc 4.x kein Support mehr.}}&lt;br /&gt;
&lt;br /&gt;
===Stack auf 256 Bytes begrenzen===&lt;br /&gt;
&lt;br /&gt;
Mit dem Compileflag -mtiny-stack wird für den Stack eine einfachere Adressierung möglich, die aber &amp;quot;nur&amp;quot; 256 Byte Stacktiefe erlaubt. Wenn man nicht exzessiv automatische Variablen benutzt (Arrays!) oder eine hohe&lt;br /&gt;
Verschachtelungstiefe hat, sollte das ausreichen. Hat mir nochmal knapp 100 Byte (!) kleineren Code erzeugt.&lt;br /&gt;
&lt;br /&gt;
===Speichern von globalen Flags===&lt;br /&gt;
&lt;br /&gt;
Oft werden in den Programmen Flags verwendet um beispielsweise eingetroffene Interrupts in der main-Routine auszuwerten. Hierzu wird üblicherweise eine globale Variable verwendet.&lt;br /&gt;
&lt;br /&gt;
Um den Wert dieser Variable abzufragen, muss sie jedoch erst aus dem SRAM in ein Register geladen werden, und kann dann erst auf ihren Status hin überprüft werden. Eine Möglichkeit ist, der globalen Variablen ein einziges Register fest zuzuordnen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
register uint8_t counter8_1 asm(&amp;quot;r2&amp;quot;);&lt;br /&gt;
register uint8_t counter8_2 asm(&amp;quot;r3&amp;quot;);&lt;br /&gt;
register uint16_t counter16_1 asm(&amp;quot;r4&amp;quot;); // r4:r5&lt;br /&gt;
register uint16_t counter16_2 asm(&amp;quot;r6&amp;quot;); // r6:r7&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
siehe auch: http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_regbind&lt;br /&gt;
&lt;br /&gt;
Als Alternative kann man ein nicht verwendetes Register des I/O-Bereichs verwenden. Dabei würde sich z.&amp;amp;nbsp;B. das Register eines zweiten UARTs, oder das  EEPROM-Register anbieten, falls diese nicht benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Neuere AVR-Modelle besitzen für diesen Zweck 3 frei verwendbare Bytes im bitadressierbaren I/O-Bereich: GPIOR0-2.&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Warnung: Dieses Vorgehen verändert das ABI! Um dieses Feature fehlerfrei anzuwenden, ist einiges an Wissen über die Interna von GCC notwendig. Auch ein korrekt funktionierendes Programm ist keine Garantie dafür, daß die globalen Register fehlerfrei implementiert wurden. Unter Umständen bringen erst spätere Codeänderungen/-erweiterung den Fehler zum Vorschein, und weil der Fehler vorher nicht akut war, sucht man sich den Wolf an der falschen Stelle im Code anstatt bei der globalen Registern. Siehe auch [[Globale Register]].}}&lt;br /&gt;
&lt;br /&gt;
===Puffern von volatile-Variablen===&lt;br /&gt;
&lt;br /&gt;
Der Compiler behandelt volatile-Variablen bei mehreren Manipulationen wie heiße Kartoffeln. Für jeden einzelnen Vorgang wiederholt sich das Spiel:&lt;br /&gt;
&lt;br /&gt;
* aus dem Speicher holen&lt;br /&gt;
* bearbeiten&lt;br /&gt;
* zurückspeichern&lt;br /&gt;
&lt;br /&gt;
Unter Umständen ist dieses Verhalten unsinnig. Ein Minimalbeispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
volatile char var;&lt;br /&gt;
&lt;br /&gt;
ISR()&lt;br /&gt;
{&lt;br /&gt;
    var++;&lt;br /&gt;
&lt;br /&gt;
    if (var &amp;gt; 100)&lt;br /&gt;
        var = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main (void)&lt;br /&gt;
{&lt;br /&gt;
    while (1)&lt;br /&gt;
        printf (var);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Hier wird &#039;&#039;&#039;var&#039;&#039;&#039; pro [[ISR]]-Ausführung zwei mal aus dem RAM geholt und zurückgeschrieben. Das ist überflüssig, weil die Interruptrountine nicht unterbrochen werden kann. Aus Sicht der ISR bräuchte man eigentlich kein volatile, kann es aber wegen dem Zugriff von main heraus nicht weglassen. Eine Lösung findet sich im folgenden Schnipsel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
volatile char var;&lt;br /&gt;
&lt;br /&gt;
ISR()&lt;br /&gt;
{&lt;br /&gt;
    char temp = var;&lt;br /&gt;
&lt;br /&gt;
    if (++temp &amp;gt; 100)&lt;br /&gt;
        temp=0;&lt;br /&gt;
&lt;br /&gt;
    var = temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main (void)&lt;br /&gt;
{&lt;br /&gt;
    while (1)&lt;br /&gt;
        printf (var);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Hier wird die globale Variable &#039;&#039;&#039;var&#039;&#039;&#039; in der lokalen Variable &#039;&#039;&#039;temp&#039;&#039;&#039; gepuffert. Ein Nachteil durch das Anlegen von &#039;&#039;&#039;temp&#039;&#039;&#039; ergibt sich nicht, da das dafür verwendete Register für die Manipulation sowieso benötigt wird. &lt;br /&gt;
&lt;br /&gt;
Wie alle Optimierungen kann dieses Vorgehen auch nach hinten losgehen: Wenn Laden und Zurückspeichern von &#039;&#039;&#039;var&#039;&#039;&#039; weit auseinanderliegen (extrem lange ISR), müllt man sich die Register zu. Im schlimmsten Fall wird &#039;&#039;&#039;temp&#039;&#039;&#039; sogar zwischenzeitlich auf dem Stack ausgelagert.&lt;br /&gt;
&lt;br /&gt;
===Schleifen===&lt;br /&gt;
&lt;br /&gt;
Bei Schleifen, die eine bestimmte Anzahl an Durchläufen ausgeführt werden sollen, ist es besser den Schleifenzähler vorher auf einen Wert zu setzen, und am Ende einer Do-While Schleife diesen zu dekrementieren.&lt;br /&gt;
So beschränkt sich die Sprungbedingung auf ein brne (branch if not equal).&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint8_t counter;	&lt;br /&gt;
counter = 100;&lt;br /&gt;
do&lt;br /&gt;
{&lt;br /&gt;
    // mach irgendetwas&lt;br /&gt;
} while (--counter);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Unbenutzte Funktionen und/oder Variablen entfernen===&lt;br /&gt;
&lt;br /&gt;
F: Mir ist aufgefallen, dass der Linker nicht benutzte Funktionen trotzdem mit linkt und Speicherplatz belegt. Gibt es eine Möglichkeit diese Funktionen automatisch weg zu lassen?&lt;br /&gt;
&lt;br /&gt;
A: Dem GNU Linker sagt man mit &#039;&#039;--gc-sections&#039;&#039;, dass er unbenutzte Sektionen rauswirft. Mit &#039;&#039;--print-gc-sections&#039;&#039; listet er die rausgeworfenen auch auf. Dem GCC kann man mit &#039;&#039;-ffunction-sections&#039;&#039; sagen, dass er jede Funktion in eine eigene Sektion legt, damit funktioniert das auch unterhalb der Ebene einer Quellcodedatei (also eine Funktion rausschmeissen obwohl fünf andere in derselben Datei gebraucht werden). Mit der Option &#039;&#039;-fdata-sections&#039;&#039; geht das auch für statische Variablen ([http://www.mikrocontroller.net/topic/210453#2084822 Forumsbeitrag von Andreas B.]).&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Je nach Implementierung der Interruptsprung- bzw. Vektorleiste kann es dazu führen, dass alle eigenen Interrupt-Handler ebenfalls wegoptimiert werden. Dies passiert dann, wenn es im Code keinen Verweis (typisch: Ermittlung der Adresse zum Eintrag in eine Interrupt-Vektortabelle oder in Hardwareregister eines Interrupt-Controllers) auf die Handler-Funktion gibt oder die Funktion, in der der Verweis auf eine ISR enthalten ist, nie aufgerufen wird. In solchen Fällen kann es notwendig sein, die Handler mit __attribute__((used)) zu versehen. Bei Verwendung der Makros aus der avr-libc (in WinAVR enthalten, z.B. ISR()) ist dies nicht erforderlich, da das Attribut bereits in den Makro-Definitionen enthalten ist (avr-libc/interrupt.h/ __INTR_ATTRS). In manch anderer Umgebung, wie bei einigen Quellcodes für ARM-basierte Controller, ist das Attribut jedoch zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
==Optimierung der Ausführungsgeschwindigkeit==&lt;br /&gt;
&lt;br /&gt;
Hierzu gibt es schon eine Application-Note von Atmel. Diese AppNote bezieht sich auf den IAR-Compiler. Die darin genannten &amp;quot;Optimierungen&amp;quot; sind für avr-gcc größtenteils obsolet oder bleiben bestenfalls ohne Effekt.&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1497.pdf AVR035]: Efficient C Coding for AVR&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Program_optimization Program optimization] auf Wikipedia, engl.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:avr-gcc]]&lt;/div&gt;</summary>
		<author><name>194.94.93.93</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Absolute_Beginner&amp;diff=51153</id>
		<title>Absolute Beginner</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Absolute_Beginner&amp;diff=51153"/>
		<updated>2010-10-06T12:48:43Z</updated>

		<summary type="html">&lt;p&gt;194.94.93.93: /* Probleme beim Mikrocontroller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Grundlagen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Gestern tat es einen Schlag,&amp;lt;br/&amp;gt;&lt;br /&gt;
wovon ich hier berichten mag.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drosselspulen, Widerstände,&amp;lt;br/&amp;gt;&lt;br /&gt;
alles fällt mir in die Hände.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da bau ich eine Schaltung auf.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ein Kühlblech kommt da auch noch drauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
An Einstellreglern rumgedreht,&amp;lt;br/&amp;gt;&lt;br /&gt;
bis dann plötzlich nichts mehr geht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Elkos hab ich nicht gebraucht,&amp;lt;br/&amp;gt;&lt;br /&gt;
Widerstände abgeraucht.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jetzt ist die Bude voller Qualm,&amp;lt;br/&amp;gt;&lt;br /&gt;
zum Himmel schick ich einen Psalm.&amp;lt;br/&amp;gt;&lt;br /&gt;
Transistoren an den Ohren.&amp;lt;br/&amp;gt;&lt;br /&gt;
Dioden an den Hoden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Kabel am Nabel.&amp;lt;br/&amp;gt;&lt;br /&gt;
Phase an der Nase!&amp;lt;br/&amp;gt;&lt;br /&gt;
Herzkammer flimmert; kann nur noch fluchen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Muß mir ein neues Hobby suchen!&amp;lt;br/&amp;gt;&lt;br /&gt;
MfG Paul&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dass dieses von Paul so plastisch dargestellte Anfängerszenario gar nicht erst eintritt, werden auf dieser Artikelseite von http://www.mikrocontroller.net einige Dinge aufgeführt, die unbedingt notwendig sind, wenn man sich mit Elektronikbasteleien auseinandersetzt. Die Seite richtet sich bewusst an den absoluten Anfänger um so interessierten Leuten den Einstieg in die Welt der Elektronik und damit auch zum Programmieren von Mikrocontrollern möglichst einfach zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Natürlich ist das Programmieren von Mikrocontrollern auch ohne Elektronikkenntnisse machbar, aber die Aussenanbindung eines Mikrocontrollers zu verstehen ist häufig sinnvoll, so z.&amp;amp;nbsp;B. wenn man ein Signal auswerten möchte.&lt;br /&gt;
&lt;br /&gt;
Die Grundlage für diesen Artikel bildet dieser [http://www.mikrocontroller.net/forum/read-1-344257.html#new Thread] aus dem Forum.&lt;br /&gt;
&lt;br /&gt;
==Sicherheit==&lt;br /&gt;
&lt;br /&gt;
Bleibt gesund! Denkt daran, dass nicht nur Strom und  Spannung bei dem neuen interessanten Hobby gefährlich sein können, sondern auch Hitze, Licht (Laser), Schall, Chemikalien (Entwickler, Ätzbäder, Lötrauch) usw. Lieber einmal mehr fragen, als einmal zu wenig. Und vielleicht bewahrt eure Frage euch und den Nächsten vor Schaden!&lt;br /&gt;
&lt;br /&gt;
===Versuchsaufbauten &amp;gt;60V (DC)===&lt;br /&gt;
Tipp aus dem Forum [http://www.mikrocontroller.net/topic/181266#1750311]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Diplomand schrieb:&lt;br /&gt;
&amp;gt; Oder wie geht es auf&#039;er Arbeit zu in Puncto &lt;br /&gt;
&amp;gt; Versuchsaufbauten?&lt;br /&gt;
&lt;br /&gt;
Alles was über 60V (DC) ist muß bei anliegender Spannung&lt;br /&gt;
mindestens unter 1 cm dickes Plexiglas.&lt;br /&gt;
&lt;br /&gt;
Gruß Anja&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
Ohne Lektüre (egal ob in Papierform oder im Internet) wird das mit der Elektronik in Eigenregie nix. &lt;br /&gt;
Möchte man sich ernsthaft mit der Materie beschäftigen, so kommt man nicht umhin, sich mit den Grundlagen der Elektronik zu beschäftigen. Während man im Internet viele Schaltungen findet, die einfach nachzubauen sind, bietet sich für das Grundlagenstudium eher ein Buch an. Da gute Elektronikbücher häufig teuer sind, will ich Dir folgenden Tipp geben: Schau einfach mal in die nächste größere Bibliothek. Wenn Dir ein Buch dort gefällt, kannst Du es jederzeit noch kaufen. Wer sich nicht irgendwann mit den Grundlagen beschäftigt, wird nie über das Stadium herauskommen, in dem er Schaltungen aus dem Internet kopiert. Aber unser aller Ziel ist es doch, auch zu verstehen, weshalb hier jetzt genau der rot-rot-schwarze Widerstand rein muss und was er tut...&lt;br /&gt;
*&#039;&#039;&#039;Fachzeitschriften&#039;&#039;&#039; am Kiosk&lt;br /&gt;
*&#039;&#039;&#039;Internet&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;[http://www.elektronik-kompendium.de/ Das Elektronik Kompendium]&#039;&#039;&#039; Ziel von das ELKO ist es die Themen Elektronik, Computertechnik, Kommunikationstechnik und Netzwerktechnik allgemeinverständlich zu erklären und der Allgemeinheit zu präsentieren. Die Zielgruppe sind vor allem Schüler und Auszubildende, die sich mit Elektronik näher beschäftigen müssen oder wollen. Weiterhin sollen alle privat und beruflich an Elektronik interessierte angesprochen werden.&lt;br /&gt;
**&#039;&#039;&#039;http://www.dse-faq.elektronik-kompendium.de/&#039;&#039;&#039; Es gibt zwar von der Startseite des ELKO einen Link zum FAQ, aber es schadet sicher nicht, es hier explizit aufzuführen.&lt;br /&gt;
**&#039;&#039;&#039;http://www.b-kainka.de/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;http://www.dieelektronikerseite.de/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;http://www.howstuffworks.com/&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;Datenblatt (Datasheet)&#039;&#039;&#039; zu den meisten Bauteilen, wird vom Hersteller ein Datasheet angeboten. Es ist sinnvoll, dies wenigstens einmal durchzulesen, auch wenn man am Anfang wenig mit den ganzen Fachbegriffen anfangen kann.  &lt;br /&gt;
**Diverse Application Notes der großen Halbleiterhersteller sind auch immer eine gute Informationsquelle und beschäftigen sich teilweise auch mit sehr grundlegenden Problemen&lt;br /&gt;
*&#039;&#039;&#039;Bücher&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;[http://www.amazon.com/gp/product/0521370957/103-9884703-3518215?v=glance&amp;amp;n=283155 Art Of Electronics]&#039;&#039;&#039; Bitte nur die englische Version nutzen, da die Übersetzung nicht gut gelungen ist.&lt;br /&gt;
** &#039;&#039;&#039;[http://www.amazon.de/exec/obidos/ASIN/3426037920/qid=1146692611/sr=8-1/ref=sr_8_xs_ap_i1_xgl/302-0461878-1759243 Elektronik ohne Geheimnisse]&#039;&#039;&#039; Von der Anfängerschaltung bis zum Radio Franzis-Verlag ISBN 3-426-03792-0&lt;br /&gt;
**&#039;&#039;&#039;Schaltkreisbastelbuch&#039;&#039;&#039; von H.Jakubaschk und das&lt;br /&gt;
**&#039;&#039;&#039;Radiobastelbuch&#039;&#039;&#039; von K.H. Schubert. Das sind sehr alte DDR-Bücher. Aber die sind für Einsteiger äußerst nahrhaft.&lt;br /&gt;
**&#039;&#039;&#039;Tabellenbuch&#039;&#039;&#039; ein beliebiges Elektronik Tabellenbuch, hier findest Du die  mathematischen Grundlagen als Formelsammlung. Es wird Dich als Nachschlagewerk bis zur Rente begleiten.&lt;br /&gt;
** [http://www.generalatomic.com/teil1/index.html Das Telekosmos-Praktikum (Teil 1)]&lt;br /&gt;
** &#039;&#039;&#039;[http://www.amazon.de/Elektronik-nicht-schwer-Experimente-Gleichstrom/dp/3921608325 Elektronik - gar nicht schwer]&#039;&#039;&#039; Es gibt davon verschiedene Bände. Band 1 ist für den absoluten Einstieg gut, allerdings sind die Schaltungen darin für etwas Fortgeschrittene nicht mehr besonders interesssant. Band 2 hingegen ist sowohl für Einsteiger als auch für Fortgeschrittene empfehlenswert!&lt;br /&gt;
&lt;br /&gt;
==Grundausstattung für das Elektroniklabor==&lt;br /&gt;
In der folgenden Liste werden die wichtigsten Bauteile aufgeführt, die in keinem Elektroniklabor fehlen dürfen. Da es eine Unmenge an Angeboten der einzelnen Bauteile gibt, wird auf der Seite [[Standardbauelemente]] darauf hingewiesen, welche Bauteile sich im Laufe der Zeit als sinnvoll dargestellt haben.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;[[Steckbrett]]&amp;lt;/b&amp;gt; Mit dem Steckbrett (Breadboard) kann man schnell und ohne Lötkolben eine Schaltung zum Testen aufbauen. Zur Auswahl des richtigen Drahts fürs Steckbrett sind in folgendem Thread nützliche Informationen zu finden: [http://www.mikrocontroller.net/forum/read-1-350462.html#new]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Widerstände:&#039;&#039;&#039; 330 Ω, 1 kΩ, 3.3 kΩ, 10 kΩ, 100 kΩ, 1 MΩ (lies: &amp;quot;Ohm&amp;quot;/&amp;quot;Kilo-Ohm&amp;quot;/&amp;quot;Mega-Ohm&amp;quot;)&lt;br /&gt;
*&#039;&#039;&#039;Potentiometer:&#039;&#039;&#039; 1 kΩ, 10 kΩ, 100 kΩ&lt;br /&gt;
*&#039;&#039;&#039;Elektrolytkondensatoren&#039;&#039;&#039; (&amp;quot;Elkos&amp;quot;): 1 µF, 10 µF, 470µF, 1000µF, 2200 µF (lies: &amp;quot;Mikro-Farad&amp;quot;). Eine Spannungsfestigkeit von 16 oder 64 Volt ist für den Anfang ausreichend.&lt;br /&gt;
*&#039;&#039;&#039;Keramikkondensatoren:&#039;&#039;&#039; 100 nF, 15pF (letztere für Quarze)&lt;br /&gt;
*&#039;&#039;&#039;Dioden:&#039;&#039;&#039; 1N4148, 1N400X, BAT43 (Schottky)&lt;br /&gt;
*&#039;&#039;&#039;[[LED]]s&#039;&#039;&#039; verschiedenfarbig, je nach Geschmack&lt;br /&gt;
*&#039;&#039;&#039;[[Transistor]]en:&#039;&#039;&#039; BC547, BC557. Dies sind die beiden Standard npn- bzw. pnp-Transistortypen. BC327, BC337 (höherer Kollektorstrom, trotzdem Standard)&lt;br /&gt;
*&#039;&#039;&#039;Operationsverstärker (&amp;quot;OpAmp&amp;quot;):&#039;&#039;&#039; LM324 (der LM741 ist weniger gut geeignet) &lt;br /&gt;
*&#039;&#039;&#039;Universal-Timer-IC:&#039;&#039;&#039; NE555. Wenn man mit 3,3V Mikrocontrollern arbeitet, dann eventuell die nur wenige Cent teureren CMOS-Version wie LM&#039;&#039;&#039;C&#039;&#039;&#039;555, I&#039;&#039;&#039;C&#039;&#039;&#039;M7555, TS555, TM&#039;&#039;&#039;C&#039;&#039;&#039;555, usw. Diese lassen sich mit niedrigeren Betriebsspannungen betreiben (Datenblatt checken!), während der bipolare NE555 etwa mindestens 4,5V benötigt.&lt;br /&gt;
*&#039;&#039;&#039;[[AVR-Tutorial:_Equipment#Stromversorgung|Spannungsregler]]:&#039;&#039;&#039; Ein  7805-Festspannungsregler für die Bereitstellung von 5 V ist sinnvoll, wenn man mal eine Schaltung autark betreiben will. Dann benötigt man in den meisten Fällen noch einen geeigneten Trafo mit einem Brückengleichrichter und einem Glättungskondensator oder ein kleines Steckernetzteil als Basisversorgung für den Spannungsregler. Ein regelbares Netzteil mit Anzeige ist ebenfalls einsetzbar, birgt aber eine Gefahr in sich. Einige ICs, darunter Mikrocontroller, haben enge Betriebsgrenzen, in denen sie funktionieren bzw. oberhalb denen sie sterben (siehe unter &#039;&#039;Absolute Maximum Ratings&#039;&#039; im Datenblatt). Irgendwann ist der Stellknopf am Labornetzteil dann doch höhergestellt, als es dem Chip gut tut...&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Schalter&#039;&#039;&#039; einfache Schiebeschalter (EIN/AUS)&lt;br /&gt;
*&#039;&#039;&#039;Taster: &#039;&#039;&#039; Prellfreier Digitaster&lt;br /&gt;
*&#039;&#039;&#039;Lötnägel&#039;&#039;&#039; Sind dazu gedacht, auf Platinen eingelötet zu werden.  Auf Breadboards haben sie nichts verloren, weil sie mit einem Durchmesser von 1 mm dafür zu dick sind.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ein Satz Schnellverbinder-Kabel&#039;&#039;&#039; mit Krokodilklemmen an beiden Enden&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Draht&#039;&#039;&#039;&lt;br /&gt;
** dünne Litze,&lt;br /&gt;
** dünner isolierter Draht (je dünner desto besser), ideal: Wrap-Draht ca. AWG30, leider etwas schwer erhältlich und teuer,&lt;br /&gt;
** dünner blanker verzinnter Draht (möglichst &amp;lt; 0,5mm, leider etwas schwer erhältlich), oder lötbarer Silberdraht.&lt;br /&gt;
&lt;br /&gt;
230V-Litze oder Klingeldraht sollte man zum Aufbau von Lochraster-Schaltungen nicht verwenden. Leitungen mit größerem Querschnitt kommen nur zum Einsatz, wenn ernsthaft Strom fließen soll.&lt;br /&gt;
&lt;br /&gt;
Zur Aufbewahrung der Kleinteile ist ein Sortimentkasten sehr zu empfehlen. Man muss sich nicht von vornherein auf spezielle Bauteile festlegen.&lt;br /&gt;
&lt;br /&gt;
Eine weiterreichende Liste von Standard-Bauelementen findet sich [[Standardbauelemente|hier]].&lt;br /&gt;
&lt;br /&gt;
==Werkzeug==&lt;br /&gt;
* Eine eigene &#039;&#039;&#039;Bastelecke&#039;&#039;&#039;, in der ein Aufbau auch mal ein, zwei Wochen [http://www.mikrocontroller.net/topic/15027#104245 liegenbleiben] kann, bis man wieder Lust oder Zeit hat, was daran zu machen. Bau Dir den Schreibtisch vorm PC nicht zu – Du brauchst den Zugang hierher ;-)&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;stabile Unterlage&#039;&#039;&#039;, z. B. eine Holzplatte. Die nimmt es im Gegensatz zum Wohnzimmertisch nicht übel, wenn der Lötkolben mal umfällt und einen Brandfleck hinterlässt, oder wenn abgeknipste, scharfe Drahtspitzen (Platinenunterseiten!) kratzen.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;kleiner Schraubendreher&#039;&#039;&#039; als Allzweckwerkzeug zum Drücken, Klopfen, Justieren, ICs-aus-dem-Sockel-hebeln, Kabel beim Löten Fixieren.  Ach ja, Schrauben drehen kann man damit auch.&lt;br /&gt;
&lt;br /&gt;
* Eine gute, spitze &#039;&#039;&#039;Pinzette&#039;&#039;&#039; zum Greifen und Richten kleiner Bauteile, Drähte einstecken usw. Außerdem eine Klemmpinzette mit flacher Spitze zum Fixieren von Bauteilen.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Seitenschneider&#039;&#039;&#039;, klein, zum Durchtrennen von Drähten. Opas Kneifzange ist ungeeignet, Omas Handarbeitsschere auch.&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Spitzzange&#039;&#039;&#039;, klein, für alles, wofür die Pinzette nicht kräftig genug ist. &lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Abisolierzange&#039;&#039;&#039;, Bauform vgl. Wasserrohrzange. Die symmetrischen mit dem Loch vorne sind eher für Starkstromleitungen gedacht.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Skalpell&#039;&#039;&#039; als Allzweckwaffe. Wenn man es einmal hat, will man es nicht mehr missen.&lt;br /&gt;
&lt;br /&gt;
* Eine Grundausrüstung zum Löten. Detaillierte Informationen zum Löten findest Du im Artikel [[Löten_(praktisch)]].&lt;br /&gt;
** &#039;&#039;&#039;Lötkolben&#039;&#039;&#039; mindestens 30 Watt&lt;br /&gt;
** &#039;&#039;&#039; Lötzinn&#039;&#039;&#039; 1 mm&lt;br /&gt;
** &#039;&#039;&#039;Lötschwamm &#039;&#039;&#039;. Ein gut mit Wasser angefeuchteter Baumwoll-Lumpen (gefaltete &amp;quot;Jute-Tasche&amp;quot;) tut es auch.&lt;br /&gt;
** &#039;&#039;&#039;Entlötlitze&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Netzteil mit Strombegrenzung&#039;&#039;&#039; hilft zu verhindern, dass Dir ständig die Bauteile flöten gehen. Oder Du nimmst deine Schaltungen zunächst mit Batterien oder Akkus in Betrieb, dann kostet es &amp;quot;nur&amp;quot; die Schaltung. Denn bei Batterien/Akkus ist auch darauf zu achten, dass bei einem Kurzschluss sehr hohe Ströme fließen können! Als Strombegrenzung für die Schaltung kann bei kleinen Aufbauten eine 6 V/100 mA Glühlampe in Serie benutzt werden ([http://www.mikrocontroller.net/topic/61119#480376 Forenbeitrag]). Bei einem Kurzschluss heizt sich durch den hohen Strom der Faden auf, die Lampe wird hell, der Widerstand des Fadens nimmt zu, und es können nur die 100 mA zur Schaltung kommen. &lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;[http://de.wikipedia.org/wiki/Multimeter Multimeter]&#039;&#039;&#039; zum Messen von Spannungen, Strömen und Widerständen. Eine Überlegung wert ist der Kauf zweier Multimeter, weil man dann z. B. gleichzeitig Strom und Spannung messen kann. Prüfspitzen in Klemmausführung haben den Vorteil, dass man die Hände frei hat für wichtigere Dinge. [http://de.wikipedia.org/wiki/Digitalmultimeter Digitale Multimeter] sind in der Regel günstiger als die analogen (Beispiel: 3,95 € bei [http://www.pollin.de pollin]).&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;[[Oszilloskop]]&#039;&#039;&#039; ist zu Beginn noch nicht unbedingt notwendig. Wenn man sich eine Weile mit der Materie beschäftigt, kommt der Wunsch danach von alleine. Ein kleiner Ratgeber zur Auswahl von Oszilloskopen findet man hier im Wiki. &#039;&#039;Tip:&#039;&#039;Für I2C und UART reicht bei niedrigen Raten (bis so 16kHz) oft ein PC-Oszilloskop mit einem etwas veränderten Mikrofonkabel.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Simulationstool&#039;&#039;&#039; ist nützlich. Mit Simulationsprogrammen kann man sich viel Zeit und Frust ersparen. Man weiß bereits vor dem Aufbau, ob eine Schaltung NICHT funktionieren wird. Der Umkehrschluss (&amp;quot;Das funktioniert dann auch in Echt&amp;quot;) ist leider nicht immer möglich.&lt;br /&gt;
:Viele kommerzielle, aber auch kostenlos erhältliche Simulationsprogramme sind Abkömmlinge eines Programms namens &#039;&#039;&#039;[[SPICE]]&#039;&#039;&#039;. Z.B. enthalten die folgenden Programme nicht ganz zufällig je einen SPICE-Kern für die eigentliche Berechnung. Im Gegensatz zum Original-SPICE bieten sie jedoch den Vorteil einer grafischen Benutzeroberfläche. &lt;br /&gt;
** Die &#039;&#039;&#039;[http://www.electronicsworkbench.com/ Electronic Workbench]&#039;&#039;&#039; (aktuelle Versionen heißen &#039;&#039;&#039;NI Multisim&#039;&#039;&#039;, nachdem der Hersteller von National Instruments übernommen wurde) ist in einigen Fachbüchern (s. Franzis Verlag) als abgespeckte Version mit einem geringeren Umfang an simulierbaren Bauteilen beigelegt und als [http://digital.ni.com/worldwide/germany.nsf/web/all/23834AA0D635C68586257124004EF1C9#3 Studentenversion günstiger erhältlich].&lt;br /&gt;
** &#039;&#039;&#039;[http://www.linear.com/designtools/software/#Spice SwitcherCAD III/LTspice]&#039;&#039;&#039; wird vom Hersteller Linear Technology kostenlos abgegeben. Eigentlich zur Unterstützung bei der Entwicklung von Anwendungen mit Linear Technology Produkten gedacht, enthält es doch einen kompletten SPICE-Kern.&lt;br /&gt;
** Das früher sehr populäre &#039;&#039;&#039;PSpice&#039;&#039;&#039; (erste PC SPICE Version, von der es eine kostenlose &#039;&#039;Student Edition&#039;&#039; gab) wurde mittlerweile von Cadence übernommen und in die OrCAD-Produktlinie integriert. Dabei ist die Student Edition weggefallen. Es gibt statt dessen eine &#039;&#039;&#039;[http://www.cadence.com/products/orcad/downloads/orcad_demo/index.aspx OrCAD PCB Demo-CD]&#039;&#039;&#039;, auf der auch eine eingeschränkte PSpice-Version enthalten ist.&lt;br /&gt;
** &#039;&#039;&#039;[http://ngspice.sourceforge.net/screens.html ngspice]&#039;&#039;&#039; ist eine mit diversen Erweiterungen versehene Freie-Software Version von SPICE für diverse Unix Systeme (Solaris, Linux, Mac OS X, etc.) und Windows XP. Es enthält eine graphische Ausgabe, jedoch selber keine graphische, sondern nur eine Texteingabe. Es ist Teil von &#039;&#039;&#039;[http://www.geda.seul.org/ gEDA]&#039;&#039;&#039;, einer Sammlung von freien &#039;&#039;Electronic Design Automation&#039;&#039;-Werkzeugen, zu denen auch &#039;&#039;&#039;gschem&#039;&#039;&#039; als Schaltplan-Editor gehört. Was zur nächsten Kategorie führt:  &lt;br /&gt;
** &#039;&#039;&#039;[http://qucs.sourceforge.net QUCS]&#039;&#039;&#039; ist ein gutes Simulationsprogramm, welches sich nicht nur zu Lernzwecken eignet, sondern auch zur Simulation von &amp;quot;echten&amp;quot; Schaltungen (Bauteilkatalog mit Strg-4 abrufen). Nützlich ist die Einbindung der Graphen direkt in den Schaltungseditor, da man so &amp;quot;alles auf einem Blick hat&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;[http://ktechlab.org/ KTechLab]&#039;&#039;&#039; ist eine Echtzeitsimulation von analogen und digitalen Bauelementen in Kombination mit PIC-Mikrocontrollern.&lt;br /&gt;
** &#039;&#039;&#039;[http://www.falstad.com/circuit/ P. Falstads Circuit Simulator]&#039;&#039;&#039; ist ein Java-Applet, das man direkt aus dem Browser heraus ausführen kann. Die Möglichkeiten sind zwar nicht ganz so umfangreich wie bei den anderen genannten Simulatoren, trotzdem lässt sich mit dem Applet schnell und einfach eine Schaltung simulieren (Vorteil: Programm muss nicht erst installiert werden)&lt;br /&gt;
So kann das gesamte Mikrocontrollerprojekt simuliert werden. Aber auch in die Transistor/Operationsverstärker/Logiktechnik kann man sich mit dem Programm gut&lt;br /&gt;
einarbeiten.&lt;br /&gt;
* Ein &#039;&#039;&#039;Schaltplaneditor&#039;&#039;&#039; (&#039;&#039;schematic capturer&#039;&#039;) ist nützlich z.&amp;amp;nbsp;B. &lt;br /&gt;
** &#039;&#039;&#039;[http://www.abacom-online.de/html/splan.html sEdit ]&#039;&#039;&#039; Software für Windows auch als Freewareversion geeignet.&lt;br /&gt;
**&#039;&#039;&#039;[http://www.cadsoft.de/ Eagle von Cadsoft]&#039;&#039;&#039; Der Quasi-Standard für Hobbyanwender. Es ist zwar etwas gewöhnungsbedürftig in der Bedienung, aber wenn  man erstmal dahintergekommen ist, was sich Cadsoft dabei gedacht hat, kann man damit leben. Und mit der Freeware-Version, Light- oder auch Non-Profit-Version kann man schon einiges machen. Früher oder später wirst eh nicht darum herumkommen, auch Platinen zu machen, und dann kannst Du schon auf eine Basis von Schaltplänen zurückgreifen, die Du vorher nur z.&amp;amp;nbsp;B. auf Lochraster aufgebaut hast und brav vorher wenigstens einen Schaltplan davon gezeichnet hast.&lt;br /&gt;
** Die bereits erwähnte &#039;&#039;&#039;[http://www.cadence.com/products/orcad/downloads/orcad_demo/index.aspx OrCAD PCB Demo-CD]&#039;&#039;&#039; enthält eine Demo-Version von &#039;&#039;&#039;OrCADE Capture&#039;&#039;&#039;.&lt;br /&gt;
** Das schon erwähnte &#039;&#039;&#039;[http://www.geda.seul.org/tools/gschem/index.html gschem]&#039;&#039;&#039; aus der gEDA-Sammlung.&lt;br /&gt;
** Die freie Software &#039;&#039;&#039;[http://www.lis.inpg.fr/realise_au_lis/kicad/ KiCad]&#039;&#039;&#039; für Linux und Windows (siehe auch den Artikel [[KiCAD]]).&lt;br /&gt;
:Siehe den Artikel [[Schaltplaneditoren]] für weitere Informationen zu Schaltplaneditoren.&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;Layout-Editor&#039;&#039;&#039; ist nützlich, um den Schaltplan dann in eine Vorlage zum Selbstätzen umzusetzen oder die Platine als Datei zum Leiterplattenhersteller zu senden.&lt;br /&gt;
** Das bereits erwähnte &#039;&#039;&#039;[http://www.cadsoft.de/ Eagle von Cadsoft]&#039;&#039;&#039; gilt auch hier als der Standard im Hobbybereich.&lt;br /&gt;
**&#039;&#039;&#039;[http://www.ibfriedrich.com TARGET 3001! ]&#039;&#039;&#039; vom Ing.-Büro Friedrich ist eine komplette Software vom Schaltplan bis zum Layout, inkl. Simulation oder Isolationsfräsen. Die kostenlose [http://www.ibfriedrich.com/download.htm Discover-Version] geht bis 250 Pins. Einen einfachen Einstieg findet man &#039;&#039;&#039;[http://ibfriedrich.dyndns.org/wiki/ibfwikide/index.php?title=Kurzeinführung2 hier]&#039;&#039;&#039;.&lt;br /&gt;
** In der gEDA-Sammlung für Linux findet man &#039;&#039;&#039;[http://www.geda.seul.org/tools/pcb/index.html PCB]&#039;&#039;&#039;, das allerdings noch Ecken und Kanten hat. &lt;br /&gt;
** Das bereits erwähnte &#039;&#039;&#039;[http://www.lis.inpg.fr/realise_au_lis/kicad/ KiCad]&#039;&#039;&#039; ermöglicht ebenfalls die Erstellung von Platinen-Layouts.&lt;br /&gt;
** Zum Aufbau auf Platinen mit &#039;&#039;&#039;Lochraster&#039;&#039;&#039; oder &#039;&#039;&#039;Lochstreifen&#039;&#039;&#039; gibt es die Tools [http://www.geocities.com/stripboarddesigner/ Stripboard Designer] (Shareware), [http://veecad.com/ VeeCAD] Stripboard Layout Editor und [http://www.abacom-online.de/html/lochmaster.html Lochmaster] (ca. 40€). Beide Tools laufen ab Windows 95. Alternativ kann man mit Papier und Stift entwerfen oder mit einem Zeichenprogramm ([http://www.mikrocontroller.net/topic/112889 Forenbeitrag]).&lt;br /&gt;
&lt;br /&gt;
* Eine kleine &#039;&#039;&#039;(LED-) Taschenlampe&#039;&#039;&#039;, um Bauteile wie Dioden oder schwach bedruckte IC&#039;s zu beleuchten, um deren Beschriftung erkennen zu können. Das  Tageslicht kann gelegentlich zu &amp;quot;dunkel&amp;quot; sein.&lt;br /&gt;
&lt;br /&gt;
==Baukästen== &lt;br /&gt;
Elektronikbaukästen bieten die Möglichkeit, das was man gelernt hat, gleich praktisch anzuwenden. Sie beinhalten die notwendigen Bauteile und sind oft didaktisch sinnvoll aufgebaut.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Kosmos XN&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;XN1000&#039;&#039;&#039; Bereits für Kinder geeignet. Prof. Armstrong und der kleine Roboter Robert führen spielend in die Welt der Elektronik ein.&lt;br /&gt;
** &#039;&#039;&#039;XN2000&#039;&#039;&#039; Die Erweiterung. &lt;br /&gt;
** &#039;&#039;&#039;XN3000&#039;&#039;&#039; Nicht mehr auf Kinder, sondern auf Jugendliche ausgerichtet. Relativ anspruchsvoll, aber verständlich.   &lt;br /&gt;
** &#039;&#039;Nachteil:&#039;&#039; relativ teuer&lt;br /&gt;
*&#039;&#039;&#039;Busch-Elektronik-Kästen (Conrad)&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Nachteil:&#039;&#039; Weil die Bauteile auf kleinen Platten befestigt sind, kann man mit ihnen keine eigenen Schaltungen aufbauen.&lt;br /&gt;
*&#039;&#039;&#039;Polytronic A B C ... (ex. DDR)&#039;&#039;&#039; aber nicht um jeden Preis im Kaufhaus kaufen - also Vorstufe zum Steckbrett&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Elektronik 2006 (amazon)&#039;&#039;&#039;  Sehr gut geeignet, da echte ungesockelte Bauelemente die überall nachgekauft werden können.&lt;br /&gt;
**&#039;&#039;Nachteil:&#039;&#039; Steckbrett wird schnell &amp;quot;zu klein&amp;quot;&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Elektronik mit ICs (Franzis)&#039;&#039;&#039;  Ausgezeichnetes Lernpaket für Theorie und Praxis: &#039;&#039;&#039;[http://www.franzis.de/elo-das-magazin/literatur-und-software/experimente/lernpaket-elektronik-mit-ics Lernpaket Elektronik mit ICs]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Besonders schön:&#039;&#039; Es liegt ein großes Breadboard bei&lt;br /&gt;
**&#039;&#039;Und dazu:&#039;&#039; Es werden nur kommerzielle Bauelemente eingesetzt, alles ist also nachbestellbar, Erweiterungen sind kein Problem.&lt;br /&gt;
*&#039;&#039;&#039;Lernpaket Sensortechnik (Franzis)&#039;&#039;&#039;  Hervorragendes Lernpaket für angewandte Sensorelektronik: &#039;&#039;&#039;[http://www.elo-web.de/elektronik-lernpakete/mechatronik/elektrotechnik-industrielle-elektronik/lernpaket-sensortechnik Lernpaket Sensortechnik]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;Inhalt:&#039;&#039; Alle gängigen Sensoren, Opto-, Thermo-, Hall-Sensor etc.&lt;br /&gt;
**&#039;&#039;Weiterhin:&#039;&#039; Interessante ICs: LM386, 555, Bargraph-Treiber, LEDs etc. etc.&lt;br /&gt;
*&#039;&#039;&#039;NerdKit&#039;&#039;&#039; Steckbrett, AVR Microcontroller, LCD Screen, Temperatursensor, Piezo-Summer und weitere Bauteile. Interessante Projekte finden sich auf der &#039;&#039;&#039;[http://www.nerdkits.com/ Nerdkits Webseite]&#039;&#039;&#039;. &#039;&#039;Die Dokumentation ist englischsprachig.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Sinnvolles Wissen ==&lt;br /&gt;
*Es schadet nichts, wenn man das [http://de.wikipedia.org/wiki/Ohmsches_Gesetz  ohmsche Gesetz] und die [http://de.wikipedia.org/wiki/Kirchhoffsche_Regeln kirchhoffschen Regeln] kennt.&lt;br /&gt;
*http://www.tldp.org/HOWTO/html_single/Coffee/ ;)&lt;br /&gt;
&lt;br /&gt;
== Was tun, wenn es brennt? ==&lt;br /&gt;
&lt;br /&gt;
Hier ist eine Liste der üblichen Anfängerfragen. Bitte überprüfe doch all diese Punkte. Falls Du zu einem der Punkte detaillierte Fragen hast, kannst Du Dich auch an die Experten im Forum wenden. Viel Glück bei der Suche!&lt;br /&gt;
*&#039;&#039;&#039;Anschlüsse vergessen&#039;&#039;&#039; Bevor Du die Schaltung das erste Mal an die Spannungsquelle hängst, überprüfe doch folgendes:&lt;br /&gt;
**&#039;&#039;&#039;VCC&#039;&#039;&#039; und &#039;&#039;&#039;GND&#039;&#039;&#039; Wurden die Bauteile mit der Versorgungsspannung verbunden? In aller Eile vergisst man dies leicht.&lt;br /&gt;
**&#039;&#039;&#039;Abblockkondensatoren&#039;&#039;&#039; Für sichere Funktion die Abblockkondensatoren (oft 100nF) nahe an den Pins anschließen. Sie sollen Störungen abfangen.&lt;br /&gt;
*&#039;&#039;&#039;Bauteile richtig herum eingesetzt?&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Wackelkontakt&#039;&#039;&#039; am Breadboard. Die Steckbretter haben leider häufig die Eigenschaft, dass die Kontakte nicht perfekt sind.&lt;br /&gt;
*&#039;&#039;&#039;korrekte Werte&#039;&#039;&#039; Gelegentlich liest man von Newbies, die etwas von 100µF am Quarz schreiben und sich ernsthaft wundern, weshalb nichts schwingt...&lt;br /&gt;
&lt;br /&gt;
===Probleme beim Mikrocontroller===&lt;br /&gt;
*&#039;&#039;&#039;Quarz schwingt nicht&#039;&#039;&#039;. Ein Anzeichen hierfür ist, wenn die Spannung zwischen XTAL1 und GND nicht ungefähr 1/2  VCC beträgt.&lt;br /&gt;
*&#039;&#039;&#039;Steckkontakte&#039;&#039;&#039; sind nicht ok -  Steckbretter haben manchmal schlechte Kontakte. Aus diesem Grund ist es sinnvoll, Mikrocontroller mit Sockel auf eine Platine zu löten.&lt;br /&gt;
*&#039;&#039;&#039;falsche Kondensatoren&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Bauteil beschädigt&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Weblinks ===&lt;br /&gt;
* [http://warmcat.com/milksop/prototypes.html Numbnut&#039;s guide to debugging prototypes] (engl.)&lt;br /&gt;
(Seite ist leider nicht mehr online und auch nicht in web.archive.org. Es gibt eine Kopie auf einer chinesischen Seite =&amp;gt; Selbersuchen)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
*&#039;&#039;&#039;http://www.csd-electronics.de&#039;&#039;&#039; Günstiger Anbieter, führt eigentlich alles was man als Einsteiger braucht, dazu sehr günstig und mit niedrigen Versandkosten. Eine Bestellung aber nur über den Shop zu empfehlen.&lt;br /&gt;
*&#039;&#039;&#039;http://www.reichelt.de&#039;&#039;&#039; Mittel-Günstiger Anbieter, führt leider nicht alles, was das Elektronikerherz begehrt. Der Grund hierfür ist, dass er sich hauptsächlich auf Mainstreamprodukte stützt, die einen großen Absatz finden. Nur so ist der günstige Preis möglich. Mindestbestellwert und Versandkosten nach Deutschland sind sehr günstig. Die Versandkosten ins Ausland sind relativ hoch, weil es für Nicht-Deutschland einen hohen Mindestbestellwert gibt.&lt;br /&gt;
* &#039;&#039;&#039;http://www.pollin.de&#039;&#039;&#039; Diverse Restposten, sehr günstige Preise aber keine große Auswahl an Standardbauteilen.&lt;br /&gt;
* &#039;&#039;&#039;http://www.conrad.de&#039;&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;http://www.ELV.de&#039;&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;http://www.segor.de&#039;&#039;&#039; Hat manchmal Teile, die man bei Reichelt, Conrad nicht bekommt. &lt;br /&gt;
&lt;br /&gt;
Der Artikel [[Elektronikversender]] zählt viele weitere Versender auf. Doch sollte man darauf achten, dass gerade sogenannte Distributoren in Deutschland normalerweise nicht an Privatleute verkaufen wollen (eine merkwürdige deutsche Spezialität) und mit Privatleuten auch mal sehr ruppig umgehen. Eine Ausnahme machen einige Distributoren für Studenten, da man sich so erhofft, frühzeitig Kontakt zu späteren gewerblichen Kunden zu bekommen. Eine andere Ausnahme sind normale Versender, die sich zusätzlich als Distributoren betätigen.&lt;/div&gt;</summary>
		<author><name>194.94.93.93</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Steckbrett&amp;diff=51152</id>
		<title>Steckbrett</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Steckbrett&amp;diff=51152"/>
		<updated>2010-10-06T12:12:28Z</updated>

		<summary type="html">&lt;p&gt;194.94.93.93: Tippfehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:steckbrett.jpg|miniatur|rechts|280px|zwei zusammengeclipste Steckbretter]]&lt;br /&gt;
[[Bild:steckbrett_verbindungen.jpg|miniatur|rechts|280px|interne Verbindungen des Steckbretts in orange]]&lt;br /&gt;
&lt;br /&gt;
Das Steckbrett auch Steckplatine genannt ist eine gute Möglichkeit um schnell einen Prototypen einer Schaltung aufzubauen und in einem iterativen Entwicklungsprozess zu verbessern.&lt;br /&gt;
Heutzutage wird auch oft der engl. Begriff [[Breadboard]] verwendet&lt;br /&gt;
&lt;br /&gt;
== Do&#039;s and Do Not&#039;s beim Arbeiten mit Steckbrettern ==&lt;br /&gt;
Nutzer von Steckbrettern bemängeln immer wieder die schlechte Qualität (ausgeleierte Kontakte, auffallend hohe Übergangswiderstände usw.). Viele dieser Probleme entstehen durch unsachgemäße Handhabung. Aus diesem Grund folgt hier eine Aufstellung der Do&#039;s and Do Not&#039;s:&lt;br /&gt;
&lt;br /&gt;
=== Do Not&#039;s ===&lt;br /&gt;
* Drahtenden sollten nicht allzu dick sein, da es ansonsten zum ausleiern der Kontakte kommen kann. Notfalls Drahtenden mit dünnerem Draht &#039;verlängern&#039;.&lt;br /&gt;
* Gegurtete Bauteile sollten nicht als Ganzes vom Gurt gelöst und in das Breadboard gesteckt werden, da sich Kleberreste, welche an den Drahtenden haften, sich auf den Kontaktzungen festsetzen und so den Übergangswiderstand dauerhaft erhöhen bzw. sogar gegen unendlich treiben. Diese Bauteile sollten also ausserhalb des gegurteten Bereiches abgezwickt werden.&lt;br /&gt;
&lt;br /&gt;
=== Do&#039;s ===&lt;br /&gt;
* SIL-Buchsen (Single-in-Line = &amp;quot;Halbe IC-Fassung&amp;quot;) für Bauelemente mit kurzen Anschlussdrähten verwenden&lt;br /&gt;
* An der Unterseite aufgeklebten Schaumstoff entfernen, dann lassen sich die Kontaktfedern zum reparieren und reinigen herausnehmen	&lt;br /&gt;
* Die oft verwendeten Metallträgerplatten sind ungünstig: zusätzliche Streukapazität - besser	Trägerplatten mit geringer Dielektrizitätskonstante verwenden&lt;br /&gt;
* Verschmutzung vermeiden: Kriechströme (Feuchtigkeit)	&lt;br /&gt;
* Litzen mit Drahtenden und Schrumpfschlauch versehen	&lt;br /&gt;
* Maximal empfohlene Spannung: 30 V	&lt;br /&gt;
* Maximal empfohlener Strom: 1 A&lt;br /&gt;
* Der Kontaktwiderstand zwischen Kontaktfeder und Anschlussdraht eines Bauelementes beträgt typischerweise 5 - 25 mOhm&lt;br /&gt;
* Die Kapazität zwischen Kontaktfedern beträgt ca. 1-2 pF &lt;br /&gt;
&lt;br /&gt;
Hier finden sich viele Beispiele für Breadboard-Schaltungen:&lt;br /&gt;
* [http://www.franzis.de/elo-das-magazin ELO-Online-Magazin]&lt;br /&gt;
* [http://www.dieelektronikerseite.de Die Elektronikerseite]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Eine Reihe sehr guter Tipps für die Arbeit mit Breadboards findet sich unter [http://www.elo-web.de/elo/aktuelles-und-uebersicht/tipps-und-tricks Breadboardtipps in ELO-web.de]&lt;br /&gt;
* [http://www.national.com/rap/Story/0,1562,8,00.html] Bob Pease zum Thema wann man &amp;quot;solderless breadboards&amp;quot; besser nicht benutzen sollte: &amp;quot;...solderless breadboards are unsuitable for any applications other than medium-speed, medium-impedance-level, and medium-precision circuits.&amp;quot;&lt;br /&gt;
* [http://tinkerlog.com/2009/01/18/attiny-breadboard-headers/ ATtiny breadboard headers] von Alex&lt;br /&gt;
* [http://www.instructables.com/id/My_Top_Ten_Most_Useful_Breadboard_Tips_and_Tricks/?ALLSTEPS My Top Ten Most Useful Breadboard Tips and Tricks] auf www.instructables.com&lt;br /&gt;
* [http://diy4fun.blogspot.com/2010/02/atmega-1632-pinout-sticker.html DIY Pinout Sticker] - Pfiffiges, selbstgemachtes Hilfsmittel&lt;br /&gt;
* [http://oomlout.co.uk/?p=189 How-to Breadboard Arduino Compatible] (ATmega168)&lt;br /&gt;
&lt;br /&gt;
* Online-Programme:&lt;br /&gt;
** [http://rev-ed.co.uk/picaxe/pebble/ Pebble] - Online Layoutprogramm für einfache, kleine Breadboard-Aufbauten&lt;br /&gt;
** [http://www.dieelektronikerseite.de/Tools/V-Breadboard/index.html DES-Steckboard]&lt;br /&gt;
** [http://www.musicfromouterspace.com/ElectronicTools/virtualbreadboard/index.html VirtualBreadboard]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Steckplatine de.wikipedia.org/wiki/Steckplatine]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/58204 Diskussion im Forum mit Bezugsquellen]&lt;br /&gt;
* [[Breadboard]] Übersicht über verschiedene Prototyp Methoden&lt;br /&gt;
* [[SMD 2 Steckbrett Adapter]]&lt;br /&gt;
* [[Schaltplaneditoren#Fritzing]]&lt;br /&gt;
* [[Lochrasterplatine]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Platinen]]&lt;br /&gt;
[[Kategorie:Boards]]&lt;/div&gt;</summary>
		<author><name>194.94.93.93</name></author>
	</entry>
</feed>