<?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=Mox-mox</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=Mox-mox"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Mox-mox"/>
	<updated>2026-04-10T13:36:42Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81806</id>
		<title>Platinensammler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81806"/>
		<updated>2014-02-25T21:35:12Z</updated>

		<summary type="html">&lt;p&gt;Mox-mox: Noch eine Rechtschreibkorrektur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung &amp;amp; Generelles ==&lt;br /&gt;
Der Traum eines jeden Elektrotechnik-Hobbyisten ist wohl ein selbst entworfenes PCB. &lt;br /&gt;
&lt;br /&gt;
Oft scheitert eine saubere Realisierung jedoch an der Fertigung der Leiterplatte. Hobbymittel wie die Direkttonermethode führen oft nur zu unzureichend sauberen Ergebnissen, Doppelseitige Platinen sind nur schwer sauber zu realisieren. &lt;br /&gt;
Eine vernünftige Ausrüstung zum Belichten ist teuer und so mancher Bastler hat auch schlicht und ergreifend nicht die Möglichkeit zum Umgang mit Entwicklern, Ätzmitteln, usw. &lt;br /&gt;
&lt;br /&gt;
Egal ob man nun die Platinen nicht fertigen kann oder möchte besteht immer die Möglichkeit diese bei den Platinenherstellern (professionell) produzieren zu lassen. Das ist allerdings oft mit nicht unerheblichen Kosten und einem Mindestnutzen verbunden, gerade wenn nur einzelne kleine Platinen benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grunde biete ich, alias &amp;quot;jakobk&amp;quot;, hier im Forum mit meinem Platinensammler die Möglichkeit an, Platinen als Teil einer großen Sammelbestellung (Nutzen) mit zu bestellen.&lt;br /&gt;
&lt;br /&gt;
Diese Bestellung geht immer an einen deutschen Hersteller. Dieser schickt mir auch gut getestete überproduzierte Platinen mit, die ich euch ebenfalls kostenlos &amp;quot;dazu lege&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mit Beginn 2014 gibt es alle zwei Wochen eine Bestellung. Die Abgabetermine für die Bestellungen der sowie Infos zu ihrem Fertigungsstand finden sich weiter [[Platinensammler#Bestellungen|unten ]] im Artikel. Zu jedem Termin nehme ich 2- und 4-lagige Layouts an und bestelle diese dann so, dass sie nach ca 15 Arbeitstagen bei euch sind.&lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts leichter zuordnen zu können füge ich an geeigneter Stelle eine kleine Kennziffer im Bestückungsdruck oder Stoplack ein. I.d.R. setze ich diese Markierung unter einen IC oder ein andere Bauteil das Sie dann nach dem Bestücken verdeckt.&lt;br /&gt;
&lt;br /&gt;
Der Preis wird abhängig von der im Nutzen benötigten Fläche, und der Lagenzahl berechnet. Denn um die einzelnen Layouts vereinzeln zu können muss ein umlaufender 3mm Fräsgraben zur eigentlichen Leiterkartenkontur zugerechnet werden.&lt;br /&gt;
&lt;br /&gt;
d.h. wenn eine Platine 3 x 2 cm groß ist, wird eine Fläche 3,6 cm x 2,6 cm also 9,36 cm² berechnet.&lt;br /&gt;
&lt;br /&gt;
Näheres zu den Kosten findet Ihr [[Platinensammler#Kosten|hier]]&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr noch Fragen oder Anmerkungen habt schreibt [http://www.mikrocontroller.net/user/show/JakobK mir]&lt;br /&gt;
&lt;br /&gt;
Viel Spass beim Layouten!&lt;br /&gt;
&lt;br /&gt;
Jakob&lt;br /&gt;
&lt;br /&gt;
== Designregeln ==&lt;br /&gt;
&lt;br /&gt;
===Kontur===&lt;br /&gt;
Die Platinenkontur kann beinahe beliebige Formen haben.&lt;br /&gt;
&lt;br /&gt;
Allerdings sollte sie so beschaffen sein, dass sie mit einem 2 mm Fräser herstellbar ist und sollte mit einer Strichstärke von 1 MIL oder 0,0254 mm gezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus muss eine Platine mindestens eine Seitenlänge mit 10 mm und darf keine Seitenlänge unter 5 mm haben. In der anderen Richtung sollte sie, aus versandtechnischen Gründen in ein A4-Blatt passen.&lt;br /&gt;
&lt;br /&gt;
===Bohrungen===&lt;br /&gt;
Der kleinste verfügbare Bohrdurchmesser beträgt 0,3 mm.&lt;br /&gt;
&lt;br /&gt;
===Fräsungen===&lt;br /&gt;
Innerhalb der Leiterplatten können Fräsungen beliebiger Form eingebracht werden. Auch diese müssen mit einem 2 mm-Fräser herstellbar sein. Daher sollte man diese in einer eigenen Lage mit einer Strichstärke von min. 2 mm Zeichnen.&lt;br /&gt;
&lt;br /&gt;
Wer z.B. für DC-Buchsen metallisierte Langlöcher haben möchte darf diese mit einem 1 mm-Fräser zeichnen. Um die Metallisierung zu erhalten, muss innerhalb dieser Fräsung zusätzlich eine durchkontaktierte Bohrung platziert werden.&lt;br /&gt;
&lt;br /&gt;
===Leiterbahnstärke===&lt;br /&gt;
Grundsätzlich sind Leiterbahnen ab 0,15 mm machbar. Die Mindestabstände im Kupfer liegen ebenfalls bei 0,15 mm.&lt;br /&gt;
&lt;br /&gt;
===Abstand zwischen Kontur und Kupfer===&lt;br /&gt;
Zwischen Kupfer und Fräsungen sollte (außer natürlich den Stellen wo Kupfer angefräst werden soll) 0,2 mm betragen und die Hersteller mögen Kupfer anfräsen wegen der höheren Belastung ihrer Fräser nicht so gerne.&lt;br /&gt;
&lt;br /&gt;
===Bestückungsdruck===&lt;br /&gt;
Die Leiterplatten werden immer mit beidseitigem Bestückungsdruck bestellt. &lt;br /&gt;
&lt;br /&gt;
Um hier ein möglichst gutes Ergebnis zu erhalten sollte man darauf achten, dass die minimale Strichstärke nicht unter 0,15mm geht und man sollte den Bestückungsdruck natürlich &amp;quot;aufräumen&amp;quot; ;-)&lt;br /&gt;
&lt;br /&gt;
Normalerweise gehören Bauteilkonturen und -Referenzen sowie Informationstexte wie z.B. Platinenbezeichnung, Pinbelegung usw. (letztere sind auch im Kupfer oder Stoplack nicht unüblich).&lt;br /&gt;
&lt;br /&gt;
Bei der Datenübername entferne ich sicherheitshalber den Bestückungsdruck von etwaigen Pads.&lt;br /&gt;
&lt;br /&gt;
Daher übernehme ich beim Datenexport aus Eagle z.B. nur die Layer tPlace und tNames sowie bPlace und bNames in den Bestückungsdruck. Also müßt ihr bitte darauf achten, dass in diesen Layern nichts ist, was ihr nicht auf der Platine haben wollt. Umgekehrt gilt natürlich, dass alles was ihr auf der Platine haben wollt auch in diesen Layern sein muss.&lt;br /&gt;
&lt;br /&gt;
Bitte denkt bei euren Layouts daran, denn auf Anmerkungen die eine andere Zusammensetzung des Bestückungsdrucks wünschen kann ich nicht eingehen.&lt;br /&gt;
&lt;br /&gt;
== Fertigungsparameter des Nutzen ==&lt;br /&gt;
&lt;br /&gt;
Die im Rahmen der Platinensammlung bestellten Nutzen werden mit 35µm/35µm (2-Lagig) bzw. 18µm/35µm/35µm/18µm Kupfer (4-Lagig), auf FR4, mit E-Test, HAL-Verzinnung (RoHS), Stoplack und Bestückungsdruck auf beiden Seiten bestellt. &lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts später leichter zuordnen zu können, bekommt Jedes an geeigneter Stelle eine kleine 4stellige Referenz. In der Regel so, dass sie nach dem Bestücken nicht mehr sichtbar oder möglichst unauffällig ist. &lt;br /&gt;
&lt;br /&gt;
Es ist nicht mehr nötig einen Platzhalter zu setzen, da die Suche hiernach oft länger dauert als eine geeignete Stelle zu finden.&lt;br /&gt;
&lt;br /&gt;
In den Bestückungsdruck werden Gehäusekonturen und Referenzen übernommen. Also muss alles was später im Bestückungsdruck landen soll in die entsprechenden Layer gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für den Bestückungsdruck sollten die gleichen Regeln bzgl. der Strichstärke und Abstände eingehalten werden, um ein sauberes Druckbild zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Wer keinen Bestückungsdruck haben möchte, löscht die entsprechenden Inhalte am besten aus dem abgegebenen Datensatz. Normaler Weise reicht auch der Hinweis im Bestellformular, aber was gar nicht erst abgegeben wird kann auch nicht versehentlich auf der Platine landen. &lt;br /&gt;
&lt;br /&gt;
Allerdings beeinflußt der Verzicht auf den Bestückungsdruck den Preis nicht.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Der Preis für Platinen im Sammelnutzen hängt natürlich von der im Nutzen verwendeten Fläche (also Platinengröße + Fräsrand) sowie der Lagenzahl ab.&lt;br /&gt;
&lt;br /&gt;
Ab 2014 kostet der cm² im 2-lagigen Nutzen 0,40€/cm² und im 4-lagigen Nutzen 0,70€/cm². Anders als bisher gibt es ab 2014 immer alle Überproduzierten ohne Mehrkosten dazu.&lt;br /&gt;
&lt;br /&gt;
Unabhängig von der Anzahl gleicher Platinen eines Layouts, wird für jedes Layout eine Bearbeitungsgebühr von 5,00€ berechnet. &lt;br /&gt;
&lt;br /&gt;
Für die gesamte Bestellung kommen dann noch Porto und Versandkosten von 2,50€/Sendung für Versand im Luftpolsterumschlag innerhalb Deutschlands bzw. 4,50€/Sendung für Versand in die EU und die Schweiz.&lt;br /&gt;
&lt;br /&gt;
Anmerkung:&lt;br /&gt;
Die genaue Kontur der Platine spielt für den Preis keine Rolle. Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&lt;br /&gt;
=== Beispielrechnung für ein 3 cm x 2 cm großes Layout ===&lt;br /&gt;
Benötigte Nutzenfläche pro Platine A = (3,0cm + 0,6cm) * (2,0cm + 0,6cm) = 9,36cm². Damit liegt der Preis pro Platine dieses Layouts bei &amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenzahl !! Preis  &lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3,74€/Stk&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 6,55€/Stk&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit den 5,00€ Bearbeitungsgebühr pro Layout ergeben sich die folgenden Gesamtkosten:&lt;br /&gt;
&lt;br /&gt;
2-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 3,74€ || 7,48€ || 11,22€ || 14,96€ || 18,70€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 8,74€  || 12,48€  || 16,22€  || 19,96€  || 23,70€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;8,74€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;6,24€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;5,41€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,99€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,74€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
4-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 6,55€ || 13,10€ || 19,65€ || 26,20€ || 32,75€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 11,55€  || 18,10€  || 24,65€  || 31,20€  || 37,75€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;11,55€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;9,05€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;8,22€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,80€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,55€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
== Zahlungsarten ==&lt;br /&gt;
Grundsätzlich lege ich den Platinen einfach eine Rechnung bei, die dann bitte zeitnah zu begleichen ist.&lt;br /&gt;
&lt;br /&gt;
Gerade für Bestellungen aus dem Ausland kann es auf Grund von hohen Überweisungskosten auch interessant sein per Paypal zu bezahlen. Das ist auch kein Problem, aber dann müßt ihr das bitte im Bestellformular unter Anmerkungen angeben und die zusätzlichen Gebühren (0,35€/Zahlung + 1,9% des ursprünglichen Rechnungswertes) kommen noch mit auf die Rechnung.&lt;br /&gt;
&lt;br /&gt;
== Bestellablauf ==&lt;br /&gt;
Die geprüften Layoutdaten (*.dru File siehe Designregeln oder hier http://www.mikrocontroller.net/attachment/132705/platinensammler_02.dru ) schickt ihr dann bitte zusammen mit dem ausgefüllten Bestellformular ( http://www.mikrocontroller.net/attachment/199133/Bestellformular_v4.txt ) an &#039;&#039;&#039; platinensammler(at)gmail.com &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Bitte beachtet, dass ich nur vollständige Bestellungspakete &lt;br /&gt;
berücksichten kann (auch die Wiederbesteller bitte). Außerdem solltet &lt;br /&gt;
ihr mir bitte keine &amp;quot;Schnellschüsse&amp;quot; mit &amp;quot;Schönheitsfehlern schicken, &lt;br /&gt;
die ihr dann noch drei mal bis zum Stichtag nachbessert.&lt;br /&gt;
&lt;br /&gt;
Wenn sich jemand nicht sicher ist, ob sein Layout produzierbar ist, &lt;br /&gt;
schaue ich gerne vorab unverbindlich drüber. Gerade bei Layoutneulingen kann das&lt;br /&gt;
schon mal ganz nützlich sein, um grobe Fehler zu vermeiden und um ggf.&lt;br /&gt;
Unsicherheit entgegen zu wirken.&lt;br /&gt;
&lt;br /&gt;
Sobald ich die Daten geprüft und in den Nutzen übernommen habe, &lt;br /&gt;
bestätige ich die Bestellung per Mail. In dieser Mail steht dann eure &lt;br /&gt;
Adresse sowie Anzahl, Größe und Kosten eurer Platinen. Wenn ich nichts &lt;br /&gt;
von euch höre gehe ich davon aus, dass ich eure Bestellung richtig &lt;br /&gt;
übernommen habe. (Auch wenn ich mich über eine kurze Bestätigung freue)&lt;br /&gt;
&lt;br /&gt;
Normaler Weise lege ich den Abgabetermin auf den letzten Werktag vor einem Wochenende. Wer bis zum Abgabetermin keine Auftragsbestätigung hat, sollte sich bei mir melden.&lt;br /&gt;
&lt;br /&gt;
Wenn ein produzierter Nutzen bei mir ist, drösel ich den auseinander und gebe die Teilbestellungen zusammen mit den Rechnungen in die Post.&lt;br /&gt;
&lt;br /&gt;
== Dateiformate ==&lt;br /&gt;
Ihr könnt mir eure Layoutdaten in den folgenden Formaten mailen.&lt;br /&gt;
* Eagle brd-file&lt;br /&gt;
* KiCad brd-file (alte .brd und neue .kicad_pcb)&lt;br /&gt;
* SPrint&lt;br /&gt;
* RS-274-X (Extended Gerber) / Excellon&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
Wer Eagle hat, kann mit gerne direkt das BRD-File seines Layouts schicken. Wer auch noch einen kurzen 4-Augencheck haben möchte, sollte bitte auch das SCH-File mit schicken.&lt;br /&gt;
&lt;br /&gt;
Allerdings habe ich zu Eagle noch einen besonderen Hinweis:&lt;br /&gt;
&lt;br /&gt;
Wenn man aus Eagle die Gerberdaten exportiert, wird der Schrifttyp IMMER &lt;br /&gt;
in Vector umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Leider verändert das nicht nur das &amp;quot;Aussehen&amp;quot; sondern auch die Größe.&lt;br /&gt;
&lt;br /&gt;
Für Schriften im Bestückungsdruck bedeutet dass, das ein ordentlich &lt;br /&gt;
aufgräumter Bestückungsdruck halt nicht mehr ganz so aufgeräumt ist.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun aber (wie ja nicht unüblich) Layoutname und Versionsstand &lt;br /&gt;
o.ä. im Kupfer hat und dicht an der Schrift mit Leiterbahnen vorbei &lt;br /&gt;
geht, kann diese Veränderung zu Kurzschlüssen führen die weder beim &lt;br /&gt;
Designcheck, noch beim E-Test auffallen.&lt;br /&gt;
&lt;br /&gt;
Am Besten gebt ihr in der Konsole (bzw. Befehlszeile) von Eagle &amp;quot;set &lt;br /&gt;
vector_font on&amp;quot; (ohne die &amp;quot;&amp;quot;) ein.&lt;br /&gt;
&lt;br /&gt;
Dann wandelt schon der Brd-Editor alle Texte in Vector um und ihr seht &lt;br /&gt;
auch wirklich das, was später hinten raus fällt.&lt;br /&gt;
&lt;br /&gt;
Da mir das schon ein ganzes Stück Arbeit erspart, währe ich euch dankbar &lt;br /&gt;
wenn ihr dies in Zukunft &amp;quot;unerinnert&amp;quot; berücksichten würdet.&lt;br /&gt;
&lt;br /&gt;
=== KiCad ===&lt;br /&gt;
Ich versuche immer auf dem aktuellsten Stand von KiCad zu sein und kann daher sowohl die alten (*.brd) , als auch die neunen *.kicad_pcb) KiCad-Layouts weiter verarbeiten. &lt;br /&gt;
&lt;br /&gt;
=== Sprint-Layout===&lt;br /&gt;
Es ist auch möglich Sprint-Layouts direkt zu bestellen.&lt;br /&gt;
&lt;br /&gt;
=== Gerberfiles===&lt;br /&gt;
Bei den Extended Gerber und Excellon Daten müssen eure Daten die folgenden Endungen für die Lagenzuordnung haben:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenbezeichnung !! Datentyp !! Datenformat !! Dateiendung &lt;br /&gt;
|-&lt;br /&gt;
| Kuntur / Fräsungen || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L00&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L01&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L02&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L03&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer untere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L04&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer obere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L05&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Oberseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L06&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L07&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L08&lt;br /&gt;
|-&lt;br /&gt;
| durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.DK&lt;br /&gt;
|-&lt;br /&gt;
| nicht durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.NDK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
* &#039;&#039;&#039;Was sind überproduzierte Platinen?&#039;&#039;&#039; - Bei der Leiterplattenherstellung werden in der Regel 2-3 mal so viele Platinen, wie eigentlich bestellt, in die Produktion gegeben. So muss der Hersteller den Herstellungsprozess nicht komplett neu beginnen, falls es zu fertigungsfehlern kommt. Treten diese Fehler nicht oder nicht im erwarteten Umfang auf, so werden mehr Platinen gefertigt als eigentlich bestellt. Diesen Überhang bezeichnet man als Überproduktion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Sind auch &amp;quot;buried vias&amp;quot;, &amp;quot;blind vias&amp;quot; möglich?&#039;&#039;&#039; - Es sind leider keine &#039;&#039;buried vias&#039;&#039; oder &#039;&#039;blind vias&#039;&#039; möglich&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Lieferung in die Schweiz möglich?&#039;&#039;&#039; - Kein Problem (Siehe Verpackung und Versand)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Mindestgröße für ein Layout?&#039;&#039;&#039; - Ja die gibt es. Die Mindestmaße für Platinen sind mindestens eine Seite 10 mm, keine Seite unter 5 mm und Mindestfläche 1 cm².&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Maximalgröße für ein Layout?&#039;&#039;&#039; - Die maximale Größe hänt natürlich in erster Linie von der Fertigungsnutzengröße des Herstellers ab. Diese variiert von Hersteller zu hersteller, ist aber wenigstens ca 300x400mm groß. Allerdings muss ich die Platinen ja anschließend noch verschicken können. Also sollten eure Layouts irgendwie in ein A4-Blatt passen. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Bekomme ich eine Rechnung?&#039;&#039;&#039; - Ja, zusammen mit den Platinen bekommt ihr eine Rechnung, die auch die MwSt. ausweist.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Verringert sich der gewählte Bohrdurchmesser bei metallisierten Löchern um die Beschichtungsdicke?&#039;&#039;&#039; - Nein, der Bohrdurchmesser wird vom Hersteller auf seinen Prozess hin korregiert, so dass die im Layout gewählten Bohrdurchmesser auch die Enddurchmesser sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;In welchen Schritten kann ich Bohrdurchmesser wählen?&#039;&#039;&#039; - Die Bohrer können in 0,1mm-Schritten gewählt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Auslandslieferung möglich?&#039;&#039;&#039; - Ich verschicke die Platinen auch ins Ausland. Da die Portokosten hierfür steigen, wird der Versand entsprechend teurer. Außerdem fällt für Sendungen in die Schweiz oder andere nicht EU Länder keine Mehrwertsteuer an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie klein darf/kann der Bestückungsdruck werden?&#039;&#039;&#039; - Ich habe mal eine Schablone mit vorstellbaren Kombinationen machen lassen, um diese Frage möglichst gut beantworten zu können. &lt;br /&gt;
[[Datei:SilkSchablone.png|rahmenlos|zentriert|Bild von Platine mit Bestückungsdruck mit verschiedenen Parametern]] Wie man sehen kann, kommt es darauf an, ob man nur eine einzelne Linie, komplexere Strukturen oder Texte gedruckt haben möchte. Bei einfachen Linien kann man bis 50µm Strichstärke runter. Aber der Abstand zwischen den Linien sollte wenigstens 100µm betragen. Was die Lesbarkeit kommt es da natürlich auch auf euer Sehvermögen an. Für mich wäre eine Schrifthöhe von 0,6mm mit einer Strichstärke von ca. 50µm (8% von 0,6mm sind ja 48µm) grade eben die Unterkannte.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es Einschränkungen bezüglich der Form einer Platine (rund, eckig, Auschnitte)?&#039;&#039;&#039; - Grundsätzlich gilt, dass die Konturen mit einem 2mm Fräser herstellbar sein müssen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie berechnet sich der Preis für nicht Rechteckige Platinen oder Platinen mit Ausfräsungen?&#039;&#039;&#039; - Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich &amp;quot;Löcher&amp;quot; in der berechneten Fläche mit passenden Layouts füllen?&#039;&#039;&#039; - Das ist kein Problem. Du mußt nur darauf achten, dass der &amp;quot;Lückenfüller&amp;quot; mit genügend 1mm Stegen mit der eigentlichen Platine verbunden ist und der Abstand zwischen den Platinen sonst wenigstens 2mm beträgt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Muss ich das verwendete DRC-File bei der Bestellung mit abgeben?&#039;&#039;&#039; - Nein, das ist nicht nötig da die zuletzt verwendeten Designregeln im BRD-File enthalten sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Welche mindestmaße gelten für den Lötstoplack?&#039;&#039;&#039; - Für den Lötstoplack gelten die gleichen Vorgaben wie für den Bestückungsdruck.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie viel Abstand sollte der Löststoplack von Pads haben?&#039;&#039;&#039; - Ich würde da zu ca 100µm raten, aber ich habe das nicht getestet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Möglichkeit sich die Exportierten Gerbedaten anzusehen?&#039;&#039;&#039; - In der Regel klappt das mit GerbV (das ja auch im KiCad-Paket enthalten ist). Wenn da mal was &amp;quot;merkwürdiges&amp;quot; zu sehen ist, solltet Ihr aber nicht zu viel Zeit ins &amp;quot;Debugging&amp;quot; schieben. Ich sehe mir eure Plots (genau wie Layouts allgemein) auch gerne im Vorfeld bzw. bei der Bestellung an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich auch abweichend formatierte Gerber/Excellon-Daten abgeben?&#039;&#039;&#039; - Inzwischen habe ich einigermaßen Übung im Dateninterpretieren. Daher könnt Ihr es gerne auf den Versuch ankommen lassen. Bisher hat es noch immer irgendwie geklappt. Die von mir angegebene Formatierung macht mir das Datenhandling nur einfacher ;-)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Noch eine neue Frage? Dann schickt sie [http://www.mikrocontroller.net/user/show/JakobK mir.]&lt;br /&gt;
&lt;br /&gt;
== Bestellungen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Nutzen !! Lagenzahl !! Status !! Liefertermin !! Update &lt;br /&gt;
|-&lt;br /&gt;
| 2014-0001|| 2/4 ||  versandt || 2014/02/03 || 2014/01/30&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0002|| 2/4 ||  versandt|| 2014/02/17 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0003|| 2/4 ||  in Produktion || 2014/03/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0004|| 2/4 ||  läuft bis 28.2. || 2014/24/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245590 (30ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/273018 (60ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245595 (Feedback)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594 (FAQ)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594#2696432 (FAQ: EAGLE Hohlsteckerbuchsen)&lt;br /&gt;
* http://www.mikrocontroller.net/articles/Platinenhersteller &lt;br /&gt;
* http://www.platinensammler.de/&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Platinen]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>Mox-mox</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81805</id>
		<title>Platinensammler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81805"/>
		<updated>2014-02-25T21:32:44Z</updated>

		<summary type="html">&lt;p&gt;Mox-mox: Rechtschreibfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung &amp;amp; Generelles ==&lt;br /&gt;
Der Traum eines jeden Elektrotechnik-Hobbyisten ist wohl ein selbst entworfenes PCB. &lt;br /&gt;
&lt;br /&gt;
Oft scheitert eine saubere Realisierung jedoch an der Fertigung der Leiterplatte. Hobbymittel wie die Direkttonermethode führen oft nur zu unzureichend sauberen Ergebnissen, Doppelseitige Platinen sind nur schwer sauber zu realisieren. &lt;br /&gt;
Eine vernünftige Ausrüstung zum Belichten ist teuer und so mancher Bastler hat auch schlicht und ergreifend nicht die Möglichkeit zum Umgang mit Entwicklern, Ätzmitteln, usw. &lt;br /&gt;
&lt;br /&gt;
Egal ob man nun die Platinen nicht fertigen kann oder möchte besteht immer die Möglichkeit diese bei den Platinenherstellern (professionell) produzieren zu lassen. Das ist allerdings oft mit nicht unerheblichen Kosten und einem Mindestnutzen verbunden, gerade wenn nur einzelne kleine Platinen benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grunde biete ich, alias &amp;quot;jakobk&amp;quot;, hier im Forum mit meinem Platinensammler die Möglichkeit an, Platinen als Teil einer großen Sammelbestellung (Nutzen) mit zu bestellen.&lt;br /&gt;
&lt;br /&gt;
Diese Bestellung geht immer an einen deutschen Hersteller. Dieser schickt mir auch gut getestete überproduzierte Platinen mit, die ich euch ebenfalls kostenlos &amp;quot;dazu lege&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mit Beginn 2014 gibt es alle zwei Wochen eine Bestellung. Die Abgabetermine für die Bestellungen der sowie Infos zu ihrem Fertigungsstand finden sich weiter [[Platinensammler#Bestellungen|unten ]] im Artikel. Zu jedem Termin nehme ich 2- und 4-lagige Layouts an und bestelle diese dann so, dass sie nach ca 15 Arbeitstagen bei euch sind.&lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts leichter zuordnen zu können füge ich an geeigneter Stelle eine kleine Kennziffer im Bestückungsdruck oder Stoplack ein. I.d.R. setze ich diese Markierung unter einen IC oder ein andere Bauteil das Sie dann nach dem Bestücken verdeckt.&lt;br /&gt;
&lt;br /&gt;
Der Preis wird abhängig von der im Nutzen benötigten Fläche, und der Lagenzahl berechnet. Denn um die einzelnen Layouts vereinzeln zu können muss ein umlaufender 3mm Fräsgraben zur eigentlichen Leiterkartenkontur zugerechnet werden.&lt;br /&gt;
&lt;br /&gt;
d.h. wenn eine Platine 3 x 2 cm groß ist, wird eine Fläche 3,6 cm x 2,6 cm also 9,36 cm² berechnet.&lt;br /&gt;
&lt;br /&gt;
Näheres zu den Kosten findet Ihr [[Platinensammler#Kosten|hier]]&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr noch Fragen oder Anmerkungen habt schreibt [http://www.mikrocontroller.net/user/show/JakobK mir]&lt;br /&gt;
&lt;br /&gt;
Viel Spass beim Layouten!&lt;br /&gt;
&lt;br /&gt;
Jakob&lt;br /&gt;
&lt;br /&gt;
== Designregeln ==&lt;br /&gt;
&lt;br /&gt;
===Kontur===&lt;br /&gt;
Die Platinenkontur kann beinahe beliebige Formen haben.&lt;br /&gt;
&lt;br /&gt;
Allerdings sollte sie so beschaffen sein, dass sie mit einem 2 mm Fräser herstellbar ist und sollte mit einer Strichstärke von 1 MIL oder 0,0254 mm gezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus muss eine Platine mindestens eine Seitenlänge mit 10 mm und darf keine Seitenlänge unter 5 mm haben. In der anderen Richtung sollte sie, aus versandtechnischen Gründen in ein A4-Blatt passen.&lt;br /&gt;
&lt;br /&gt;
===Bohrungen===&lt;br /&gt;
Der kleinste verfügbare Bohrdurchmesser beträgt 0,3 mm.&lt;br /&gt;
&lt;br /&gt;
===Fräsungen===&lt;br /&gt;
Innerhalb der Leiterplatten können Fräsungen beliebiger Form eingebracht werden. Auch diese müssen mit einem 2 mm-Fräser herstellbar sein. Daher sollte man diese in einer eigenen Lage mit einer Strichstärke von min. 2 mm Zeichnen.&lt;br /&gt;
&lt;br /&gt;
Wer z.B. für DC-Buchsen metallisierte Langlöcher haben möchte darf diese mit einem 1 mm-Fräser zeichnen. Um die Metallisierung zu erhalten, muss innerhalb dieser Fräsung zusätzlich eine durchkontaktierte Bohrung platziert werden.&lt;br /&gt;
&lt;br /&gt;
===Leiterbahnstärke===&lt;br /&gt;
Grundsätzlich sind Leiterbahnen ab 0,15 mm machbar. Die Mindestabstände im Kupfer liegen ebenfalls bei 0,15 mm.&lt;br /&gt;
&lt;br /&gt;
===Abstand zwischen Kontur und Kupfer===&lt;br /&gt;
Zwischen Kupfer und Fräsungen sollte (außer natürlich den Stellen wo Kupfer angefräst werden soll) 0,2 mm betragen und die Hersteller mögen Kupfer anfräsen wegen der höheren Belastung ihrer Fräser nicht so gerne.&lt;br /&gt;
&lt;br /&gt;
===Bestückungsdruck===&lt;br /&gt;
Die Leiterplatten werden immer mit beidseitigem Bestückungsdruck bestellt. &lt;br /&gt;
&lt;br /&gt;
Um hier ein möglichst gutes Ergebnis zu erhalten sollte man darauf achten, dass die minimale Strichstärke nicht unter 0,15mm geht und man sollte den Bestückungsdruck natürlich &amp;quot;aufräumen&amp;quot; ;-)&lt;br /&gt;
&lt;br /&gt;
Normalerweise gehören Bauteilkonturen und -Referenzen sowie Informationstexte wie z.B. Platinenbezeichnung, Pinbelegung usw. (letztere sind auch im Kupfer oder Stoplack nicht unüblich).&lt;br /&gt;
&lt;br /&gt;
Bei der Datenübername entferne ich sicherheitshalber den Bestückungsdruck von etwaigen Pads.&lt;br /&gt;
&lt;br /&gt;
Daher übernehme ich beim Datenexport aus Eagle z.B. nur die Layer tPlace und tNames sowie bPlace und bNames in den Bestückungsdruck. Also müßt ihr bitte darauf achten, dass in diesen Layern nichts ist, was ihr nicht auf der Platine haben wollt. Umgekehrt gilt natürlich, dass alles was ihr auf der Platine haben wollt auch in diesen Layern sein muss.&lt;br /&gt;
&lt;br /&gt;
Bitte denkt bei euren Layouts daran, denn auf Anmerkungen die eine andere Zusammensetzung des Bestückungsdrucks wünschen kann ich nicht eingehen.&lt;br /&gt;
&lt;br /&gt;
== Fertigungsparameter des Nutzen ==&lt;br /&gt;
&lt;br /&gt;
Die im Rahmen der Platinensammlung bestellten Nutzen werden mit 35µm/35µm (2-Lagig) bzw. 18µm/35µm/35µm/18µm Kupfer (4-Lagig), auf FR4, mit E-Test, HAL-Verzinnung (RoHS), Stoplack und Bestückungsdruck auf beiden Seiten bestellt. &lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts später leichter zuordnen zu können, bekommt Jedes an geeigneter Stelle eine kleine 4stellige Referenz. In der Regel so, dass sie nach dem Bestücken nicht mehr sichtbar oder möglichst unauffällig ist. &lt;br /&gt;
&lt;br /&gt;
Es ist nicht mehr nötig einen Platzhalter zu setzen, da die Suche hiernach oft länger dauert als eine geeignete Stelle zu finden.&lt;br /&gt;
&lt;br /&gt;
In den Bestückungsdruck werden Gehäusekonturen und Referenzen übernommen. Also muss alles was später im Bestückungsdruck landen soll in die entsprechenden Layer gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für den Bestückungsdruck sollten die gleichen Regeln bzgl. der Strichstärke und Abstände eingehalten werden, um ein sauberes Druckbild zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Wer keinen Bestückungsdruck haben möchte, löscht die entsprechenden Inhalte am besten aus dem abgegebenen Datensatz. Normaler Weise reicht auch der Hinweis im Bestellformular, aber was gar nicht erst abgegeben wird kann auch nicht versehentlich auf der Platine landen. &lt;br /&gt;
&lt;br /&gt;
Allerdings beeinflußt der Verzicht auf den Bestückungsdruck den Preis nicht.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Der Preis für Platinen im Sammelnutzen hängt natürlich von der im Nutzen verwendeten Fläche (also Platinengröße + Fräsrand) sowie der Lagenzahl ab.&lt;br /&gt;
&lt;br /&gt;
Ab 2014 kostet der cm² im 2-lagigen Nutzen 0,40€/cm² und im 4-lagigen Nutzen 0,70€/cm². Anders als bisher gibt es ab 2014 immer alle Überproduzierten ohne Mehrkosten dazu.&lt;br /&gt;
&lt;br /&gt;
Unabhängig von der Anzahl gleicher Platinen eines Layouts, wird für jedes Layout eine Bearbeitungsgebühr von 5,00€ berechnet. &lt;br /&gt;
&lt;br /&gt;
Für die gesamte Bestellung kommen dann noch Porto und Versandkosten von 2,50€/Sendung für Versand im Luftpolsterumschlag innerhalb Deutschlands bzw. 4,50€/Sendung für Versand in die EU und die Schweiz.&lt;br /&gt;
&lt;br /&gt;
Anmerkung:&lt;br /&gt;
Die genaue Kontur der Platine spielt für den Preis keine Rolle. Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&lt;br /&gt;
=== Beispielrechnung für ein 3 cm x 2 cm großes Layout ===&lt;br /&gt;
Benötigte Nutzenfläche pro Platine A = (3,0cm + 0,6cm) * (2,0cm + 0,6cm) = 9,36cm². Damit liegt der Preis pro Platine dieses Layouts bei &amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenzahl !! Preis  &lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3,74€/Stk&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 6,55€/Stk&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit den 5,00€ Bearbeitungsgebühr pro Layout ergeben sich die folgenden Gesamtkosten:&lt;br /&gt;
&lt;br /&gt;
2-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 3,74€ || 7,48€ || 11,22€ || 14,96€ || 18,70€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 8,74€  || 12,48€  || 16,22€  || 19,96€  || 23,70€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;8,74€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;6,24€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;5,41€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,99€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,74€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
4-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 6,55€ || 13,10€ || 19,65€ || 26,20€ || 32,75€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 11,55€  || 18,10€  || 24,65€  || 31,20€  || 37,75€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;11,55€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;9,05€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;8,22€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,80€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,55€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
== Zahlungsarten ==&lt;br /&gt;
Grundsätzlich lege ich den Platinen einfach eine Rechnung bei, die dann bitte zeitnah zu begleichen ist.&lt;br /&gt;
&lt;br /&gt;
Gerade für Bestellungen aus dem Ausland kann es auf Grund von hohen Überweisungskosten auch interessant sein per Paypal zu bezahlen. Das ist auch kein Problem, aber dann müßt ihr das bitte im Bestellformular unter Anmerkungen angeben und die zusätzlichen Gebühren (0,35€/Zahlung + 1,9% des ursprünglichen Rechnungswertes) kommen noch mit auf die Rechnung.&lt;br /&gt;
&lt;br /&gt;
== Bestellablauf ==&lt;br /&gt;
Die geprüften Layoutdaten (*.dru File siehe Designregeln oder hier http://www.mikrocontroller.net/attachment/132705/platinensammler_02.dru ) schickt ihr dann bitte zusammen mit dem ausgefüllten Bestellformular ( http://www.mikrocontroller.net/attachment/199133/Bestellformular_v4.txt ) an &#039;&#039;&#039; platinensammler(at)gmail.com &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Bitte beachtet, dass ich nur vollständige Bestellungspakete &lt;br /&gt;
berücksichten kann (auch die Wiederbesteller bitte). Außerdem solltet &lt;br /&gt;
ihr mir bitte keine &amp;quot;Schnellschüsse&amp;quot; mit &amp;quot;Schönheitsfehlern schicken, &lt;br /&gt;
die ihr dann noch drei mal bis zum Stichtag nachbessert.&lt;br /&gt;
&lt;br /&gt;
Wenn sich jemand nicht sicher ist, ob sein Layout produzierbar ist, &lt;br /&gt;
schaue ich gerne vorab unverbindlich drüber. Gerade bei Layoutneulingen kann das&lt;br /&gt;
schon mal ganz nützlich sein, um grobe Fehler zu vermeiden und um ggf.&lt;br /&gt;
Unsicherheit entgegen zu wirken.&lt;br /&gt;
&lt;br /&gt;
Sobald ich die Daten geprüft und in den Nutzen übernommen habe, &lt;br /&gt;
bestätige ich die Bestellung per Mail. In dieser Mail steht dann eure &lt;br /&gt;
Adresse sowie Anzahl, Größe und Kosten eurer Platinen. Wenn ich nichts &lt;br /&gt;
von euch höre gehe ich davon aus, dass ich eure Bestellung richtig &lt;br /&gt;
übernommen habe. (Auch wenn ich mich über eine kurze Bestätigung freue)&lt;br /&gt;
&lt;br /&gt;
Normaler Weise lege ich den Abgabetermin auf den letzten Werktag vor einem Wochenende. Wer bis zum Abgabetermin keine Auftragsbestätigung hat, sollte sich bei mir melden.&lt;br /&gt;
&lt;br /&gt;
Wenn ein produzierter Nutzen bei mir ist, drösel ich den auseinander und gebe die Teilbestellungen zusammen mit den Rechnungen in die Post.&lt;br /&gt;
&lt;br /&gt;
== Dateiformate ==&lt;br /&gt;
Ihr könnt mir eure Layoutdaten in den folgenden Formaten mailen.&lt;br /&gt;
* Eagle brd-file&lt;br /&gt;
* KiCad brd-file (alte .brd und neue .kicad_pcb)&lt;br /&gt;
* SPrint&lt;br /&gt;
* RS-274-X (Extended Gerber) / Excellon&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
Wer Eagle hat, kann mit gerne direkt das BRD-File seines Layouts schicken. Wer auch noch einen kurzen 4-Augencheck haben möchte, sollte bitte auch das SCH-File mit schicken.&lt;br /&gt;
&lt;br /&gt;
Allerdings habe ich zu Eagle noch einen besonderen Hinweis:&lt;br /&gt;
&lt;br /&gt;
Wenn man aus Eagle die Gerberdaten exportiert, wird der Schrifttyp IMMER &lt;br /&gt;
in Vector umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Leider verändert das nicht nur das &amp;quot;Aussehen&amp;quot; sondern auch die Größe.&lt;br /&gt;
&lt;br /&gt;
Für Schriften im Bestückungsdruck bedeutet dass, das ein ordentlich &lt;br /&gt;
aufgräumter Bestückungsdruck halt nicht mehr ganz so aufgeräumt ist.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun aber (wie ja nicht unüblich) Layoutname und Versionsstand &lt;br /&gt;
o.ä. im Kupfer hat und dicht an der Schrift mit Leiterbahnen vorbei &lt;br /&gt;
geht, kann diese Veränderung zu Kurzschlüssen führen die weder beim &lt;br /&gt;
Designcheck, noch beim E-Test auffallen.&lt;br /&gt;
&lt;br /&gt;
Am Besten gebt ihr in der Konsole (bzw. Befehlszeile) von Eagle &amp;quot;set &lt;br /&gt;
vector_font on&amp;quot; (ohne die &amp;quot;&amp;quot;) ein.&lt;br /&gt;
&lt;br /&gt;
Dann wandelt schon der Brd-Editor alle Texte in Vector um und ihr seht &lt;br /&gt;
auch wirklich das, was später hinten raus fällt.&lt;br /&gt;
&lt;br /&gt;
Da mir das schon ein ganzes Stück Arbeit erspart, währe ich euch Dankbar &lt;br /&gt;
wenn ihr dies in Zukunft &amp;quot;unerinnert&amp;quot; berücksichten würdet.&lt;br /&gt;
&lt;br /&gt;
=== KiCad ===&lt;br /&gt;
Ich versuche immer auf dem aktuellsten Stand von KiCad zu sein und kann daher sowohl die alten (*.brd) , als auch die neunen *.kicad_pcb) KiCad-Layouts weiter verarbeiten. &lt;br /&gt;
&lt;br /&gt;
=== Sprint-Layout===&lt;br /&gt;
Es ist auch möglich Sprint-Layouts direkt zu bestellen.&lt;br /&gt;
&lt;br /&gt;
=== Gerberfiles===&lt;br /&gt;
Bei den Extended Gerber und Excellon Daten müssen eure Daten die folgenden Endungen für die Lagenzuordnung haben:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenbezeichnung !! Datentyp !! Datenformat !! Dateiendung &lt;br /&gt;
|-&lt;br /&gt;
| Kuntur / Fräsungen || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L00&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L01&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L02&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L03&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer untere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L04&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer obere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L05&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Oberseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L06&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L07&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L08&lt;br /&gt;
|-&lt;br /&gt;
| durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.DK&lt;br /&gt;
|-&lt;br /&gt;
| nicht durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.NDK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
* &#039;&#039;&#039;Was sind überproduzierte Platinen?&#039;&#039;&#039; - Bei der Leiterplattenherstellung werden in der Regel 2-3 mal so viele Platinen, wie eigentlich bestellt, in die Produktion gegeben. So muss der Hersteller den Herstellungsprozess nicht komplett neu beginnen, falls es zu fertigungsfehlern kommt. Treten diese Fehler nicht oder nicht im erwarteten Umfang auf, so werden mehr Platinen gefertigt als eigentlich bestellt. Diesen Überhang bezeichnet man als Überproduktion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Sind auch &amp;quot;buried vias&amp;quot;, &amp;quot;blind vias&amp;quot; möglich?&#039;&#039;&#039; - Es sind leider keine &#039;&#039;buried vias&#039;&#039; oder &#039;&#039;blind vias&#039;&#039; möglich&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Lieferung in die Schweiz möglich?&#039;&#039;&#039; - Kein Problem (Siehe Verpackung und Versand)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Mindestgröße für ein Layout?&#039;&#039;&#039; - Ja die gibt es. Die Mindestmaße für Platinen sind mindestens eine Seite 10 mm, keine Seite unter 5 mm und Mindestfläche 1 cm².&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Maximalgröße für ein Layout?&#039;&#039;&#039; - Die maximale Größe hänt natürlich in erster Linie von der Fertigungsnutzengröße des Herstellers ab. Diese variiert von Hersteller zu hersteller, ist aber wenigstens ca 300x400mm groß. Allerdings muss ich die Platinen ja anschließend noch verschicken können. Also sollten eure Layouts irgendwie in ein A4-Blatt passen. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Bekomme ich eine Rechnung?&#039;&#039;&#039; - Ja, zusammen mit den Platinen bekommt ihr eine Rechnung, die auch die MwSt. ausweist.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Verringert sich der gewählte Bohrdurchmesser bei metallisierten Löchern um die Beschichtungsdicke?&#039;&#039;&#039; - Nein, der Bohrdurchmesser wird vom Hersteller auf seinen Prozess hin korregiert, so dass die im Layout gewählten Bohrdurchmesser auch die Enddurchmesser sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;In welchen Schritten kann ich Bohrdurchmesser wählen?&#039;&#039;&#039; - Die Bohrer können in 0,1mm-Schritten gewählt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Auslandslieferung möglich?&#039;&#039;&#039; - Ich verschicke die Platinen auch ins Ausland. Da die Portokosten hierfür steigen, wird der Versand entsprechend teurer. Außerdem fällt für Sendungen in die Schweiz oder andere nicht EU Länder keine Mehrwertsteuer an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie klein darf/kann der Bestückungsdruck werden?&#039;&#039;&#039; - Ich habe mal eine Schablone mit vorstellbaren Kombinationen machen lassen, um diese Frage möglichst gut beantworten zu können. &lt;br /&gt;
[[Datei:SilkSchablone.png|rahmenlos|zentriert|Bild von Platine mit Bestückungsdruck mit verschiedenen Parametern]] Wie man sehen kann, kommt es darauf an, ob man nur eine einzelne Linie, komplexere Strukturen oder Texte gedruckt haben möchte. Bei einfachen Linien kann man bis 50µm Strichstärke runter. Aber der Abstand zwischen den Linien sollte wenigstens 100µm betragen. Was die Lesbarkeit kommt es da natürlich auch auf euer Sehvermögen an. Für mich wäre eine Schrifthöhe von 0,6mm mit einer Strichstärke von ca. 50µm (8% von 0,6mm sind ja 48µm) grade eben die Unterkannte.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es Einschränkungen bezüglich der Form einer Platine (rund, eckig, Auschnitte)?&#039;&#039;&#039; - Grundsätzlich gilt, dass die Konturen mit einem 2mm Fräser herstellbar sein müssen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie berechnet sich der Preis für nicht Rechteckige Platinen oder Platinen mit Ausfräsungen?&#039;&#039;&#039; - Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich &amp;quot;Löcher&amp;quot; in der berechneten Fläche mit passenden Layouts füllen?&#039;&#039;&#039; - Das ist kein Problem. Du mußt nur darauf achten, dass der &amp;quot;Lückenfüller&amp;quot; mit genügend 1mm Stegen mit der eigentlichen Platine verbunden ist und der Abstand zwischen den Platinen sonst wenigstens 2mm beträgt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Muss ich das verwendete DRC-File bei der Bestellung mit abgeben?&#039;&#039;&#039; - Nein, das ist nicht nötig da die zuletzt verwendeten Designregeln im BRD-File enthalten sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Welche mindestmaße gelten für den Lötstoplack?&#039;&#039;&#039; - Für den Lötstoplack gelten die gleichen Vorgaben wie für den Bestückungsdruck.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie viel Abstand sollte der Löststoplack von Pads haben?&#039;&#039;&#039; - Ich würde da zu ca 100µm raten, aber ich habe das nicht getestet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Möglichkeit sich die Exportierten Gerbedaten anzusehen?&#039;&#039;&#039; - In der Regel klappt das mit GerbV (das ja auch im KiCad-Paket enthalten ist). Wenn da mal was &amp;quot;merkwürdiges&amp;quot; zu sehen ist, solltet Ihr aber nicht zu viel Zeit ins &amp;quot;Debugging&amp;quot; schieben. Ich sehe mir eure Plots (genau wie Layouts allgemein) auch gerne im Vorfeld bzw. bei der Bestellung an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich auch abweichend formatierte Gerber/Excellon-Daten abgeben?&#039;&#039;&#039; - Inzwischen habe ich einigermaßen Übung im Dateninterpretieren. Daher könnt Ihr es gerne auf den Versuch ankommen lassen. Bisher hat es noch immer irgendwie geklappt. Die von mir angegebene Formatierung macht mir das Datenhandling nur einfacher ;-)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Noch eine neue Frage? Dann schickt sie [http://www.mikrocontroller.net/user/show/JakobK mir.]&lt;br /&gt;
&lt;br /&gt;
== Bestellungen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Nutzen !! Lagenzahl !! Status !! Liefertermin !! Update &lt;br /&gt;
|-&lt;br /&gt;
| 2014-0001|| 2/4 ||  versandt || 2014/02/03 || 2014/01/30&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0002|| 2/4 ||  versandt|| 2014/02/17 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0003|| 2/4 ||  in Produktion || 2014/03/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0004|| 2/4 ||  läuft bis 28.2. || 2014/24/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245590 (30ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/273018 (60ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245595 (Feedback)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594 (FAQ)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594#2696432 (FAQ: EAGLE Hohlsteckerbuchsen)&lt;br /&gt;
* http://www.mikrocontroller.net/articles/Platinenhersteller &lt;br /&gt;
* http://www.platinensammler.de/&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Platinen]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>Mox-mox</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81804</id>
		<title>Platinensammler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81804"/>
		<updated>2014-02-25T21:07:31Z</updated>

		<summary type="html">&lt;p&gt;Mox-mox: Rechtschreibfehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung &amp;amp; Generelles ==&lt;br /&gt;
Der Traum eines jeden Elektrotechnik-Hobbyisten ist wohl ein selbst entworfenes PCB. &lt;br /&gt;
&lt;br /&gt;
Oft scheitert eine saubere Realisierung jedoch an der Fertigung der Leiterplatte. Hobbymittel wie die Direkttonermethode führen oft nur zu unzureichend sauberen Ergebnissen, Doppelseitige Platinen sind nur schwer sauber zu realisieren. &lt;br /&gt;
Eine vernünftige Ausrüstung zum Belichten ist teuer und so mancher Bastler hat auch schlicht und ergreifend nicht die Möglichkeit zum Umgang mit Entwicklern, Ätzmitteln, usw. &lt;br /&gt;
&lt;br /&gt;
Egal ob man nun die Platinen nicht fertigen kann oder möchte besteht immer die Möglichkeit diese bei den Platinenherstellern (professionell) produzieren zu lassen. Das ist allerdings oft mit nicht unerheblichen Kosten und einem Mindestnutzen verbunden, gerade wenn nur einzelne kleine Platinen benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grunde biete ich, alias &amp;quot;jakobk&amp;quot;, hier im Forum mit meinem Platinensammler die Möglichkeit an, Platinen als Teil einer großen Sammelbestellung (Nutzen) mit zu bestellen.&lt;br /&gt;
&lt;br /&gt;
Diese Bestellung geht immer an einen deutschen Hersteller. Dieser schickt mir auch gut getestete überproduzierte Platinen mit, die ich euch ebenfalls kostenlos &amp;quot;dazu lege&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mit Beginn 2014 gibt es alle zwei Wochen eine Bestellung. Die Abgabetermine für die Bestellungen der sowie Infos zu ihrem Fertigungsstand finden sich weiter [[Platinensammler#Bestellungen|unten ]] im Artikel. Zu jedem Termin nehme ich 2- und 4-lagige Layouts an und bestelle diese dann so, dass sie nach ca 15 Arbeitstagen bei euch sind.&lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts leichter zuordnen zu können füge ich an geeigneter Stelle eine kleine Kennziffer im Bestückungsdruck oder Stoplack ein. I.d.R. setze ich diese Markierung unter einen IC oder ein andere Bauteil das Sie dann nach dem Bestücken verdeckt.&lt;br /&gt;
&lt;br /&gt;
Der Preis wird abhängig von der im Nutzen benötigten Fläche, und der Lagenzahl berechnet. Denn um die einzelnen Layouts vereinzeln zu können muss ein umlaufender 3mm Fräsgraben zur eigentlichen Leiterkartenkontur zugerechnet werden.&lt;br /&gt;
&lt;br /&gt;
d.h. wenn eine Platine 3 x 2 cm groß ist, wird eine Fläche 3,6 cm x 2,6 cm also 9,36 cm² berechnet.&lt;br /&gt;
&lt;br /&gt;
Näheres zu den Kosten findet Ihr [[Platinensammler#Kosten|hier]]&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr noch Fragen oder Anmerkungen habt schreibt [http://www.mikrocontroller.net/user/show/JakobK mir]&lt;br /&gt;
&lt;br /&gt;
Viel Spass beim Layouten!&lt;br /&gt;
&lt;br /&gt;
Jakob&lt;br /&gt;
&lt;br /&gt;
== Designregeln ==&lt;br /&gt;
&lt;br /&gt;
===Kontur===&lt;br /&gt;
Die Platinenkontur kann beinahe beliebige Formen haben.&lt;br /&gt;
&lt;br /&gt;
Allerdings sollte sie so beschaffen sein, dass sie mit einem 2 mm Fräser herstellbar ist und sollte mit einer Strichstärke von 1 MIL oder 0,0254 mm gezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus muss eine Platine mindestens eine Seitenlänge mit 10 mm und darf keine Seitenlänge unter 5 mm haben. In der anderen Richtung sollte sie, aus versandtechnischen Gründen in ein A4-Blatt passen.&lt;br /&gt;
&lt;br /&gt;
===Bohrungen===&lt;br /&gt;
Der kleinste verfügbare Bohrdurchmesser beträgt 0,3 mm.&lt;br /&gt;
&lt;br /&gt;
===Fräsungen===&lt;br /&gt;
Innerhalb der Leiterplatten können Fräsungen beliebiger Form eingebracht werden. Auch diese müssen mit einem 2 mm-Fräser herstellbar sein. Daher sollte man diese in einer eigenen Lage mit einer Strichstärke von min. 2 mm Zeichnen.&lt;br /&gt;
&lt;br /&gt;
Wer z.B. für DC-Buchsen metallisierte Langlöcher haben möchte darf diese mit einem 1 mm-Fräser zeichnen. Um die Metallisierung zu erhalten, muss innerhalb dieser Fräsung zusätzlich eine durchkontaktierte Bohrung platziert werden.&lt;br /&gt;
&lt;br /&gt;
===Leiterbahnstärke===&lt;br /&gt;
Grundsätzlich sind Leiterbahnen ab 0,15 mm machbar. Die Mindestabstände im Kupfer liegen ebenfalls bei 0,15 mm.&lt;br /&gt;
&lt;br /&gt;
===Abstand zwischen Kontur und Kupfer===&lt;br /&gt;
Zwischen Kupfer und Fräsungen sollte (außer natürlich den Stellen wo Kupfer angefräst werden soll) 0,2 mm betragen und die Hersteller mögen Kupfer anfräsen wegen der höheren Belastung ihrer Fräser nicht so gerne.&lt;br /&gt;
&lt;br /&gt;
===Bestückungsdruck===&lt;br /&gt;
Die Leiterplatten werden immer mit beidseitigem Bestückungsdruck bestellt. &lt;br /&gt;
&lt;br /&gt;
Um hier ein möglichst gutes Ergebnis zu erhalten sollte man darauf achten, dass die minimale Strichstärke nicht unter 0,15mm geht und man sollte den Bestückungsdruck natürlich &amp;quot;aufräumen&amp;quot; ;-)&lt;br /&gt;
&lt;br /&gt;
Normalerweise gehören Bauteilkonturen und -Referenzen sowie Informationstexte wie z.B. Platinenbezeichnung, Pinbelegung usw. (letztere sind auch im Kupfer oder Stoplack nicht unüblich).&lt;br /&gt;
&lt;br /&gt;
Bei der Datenübername entferne ich sicherheitshalber den Bestückungsdruck von etwaigen Pads.&lt;br /&gt;
&lt;br /&gt;
Daher übernehme ich beim Datenexport aus Eagle z.B. nur die Layer tPlace und tNames sowie bPlace und bNames in den Bestückungsdruck. Also müßt ihr bitte darauf achten, dass in diesen Layern nichts ist, was ihr nicht auf der Platine haben wollt. Umgekehrt gilt natürlich, dass alles was ihr auf der Platine haben wollt auch in diesen Layern sein muss.&lt;br /&gt;
&lt;br /&gt;
Bitte denkt bei euren Layouts daran, denn auf Anmerkungen die eine andere Zusammensetzung des Bestückungsdrucks wünschen kann ich nicht eingehen.&lt;br /&gt;
&lt;br /&gt;
== Fertigungsparameter des Nutzen ==&lt;br /&gt;
&lt;br /&gt;
Die im Rahmen der Platinensammlung bestellten Nutzen werden mit 35µm/35µm (2-Lagig) bzw. 18µm/35µm/35µm/18µm Kupfer (4-Lagig), auf FR4, mit E-Test, HAL-Verzinnung (RoHS), Stoplack und Bestückungsdruck auf beiden Seiten bestellt. &lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts später leichter zuordnen zu können, bekommt Jedes an geeigneter Stelle eine kleine 4stellige Referenz. In der Regel so, dass sie nach dem Bestücken nicht mehr sichtbar oder möglichst unauffällig ist. &lt;br /&gt;
&lt;br /&gt;
Es ist nicht mehr nötig einen Platzhalter zu setzen, da die suche hiernach oft länger dauert als eine geeignete Stelle zu finden.&lt;br /&gt;
&lt;br /&gt;
In den Bestückungsdruck werden Gehäusekonturen und Referenzen übernommen. Also muss alles was später im Bestückungsdruck landen soll in die entsprechenden Layer gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für den Bestückungsdruck sollten die gleichen Regeln bzgl. der Strichstärke und Abstände eingehalten werden, um ein sauberes Druckbild zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Wer keinen Bestückungsdruck haben möchte, löscht die entsprechenden Inhalte am besten aus dem abgegebenen Datensatz. Normaler Weise reicht auch der Hinweis im Bestellformular, aber was gar nicht erst abgegeben wird kann auch nicht versehentlich auf der Platine landen. &lt;br /&gt;
&lt;br /&gt;
Allerdings beeinflußt der Verzicht auf den Bestückungsdruck den Preis nicht.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Der Preis für Platinen im Sammelnutzen hängt natürlich von der im Nutzen verwendeten Fläche (also Platinengröße + Fräsrand) sowie der Lagenzahl ab.&lt;br /&gt;
&lt;br /&gt;
Ab 2014 kostet der cm² im 2-lagigen Nutzen 0,40€/cm² und im 4-lagigen Nutzen 0,70€/cm². Anders als bisher gibt es ab 2014 immer alle Überproduzierten ohne Mehrkosten dazu.&lt;br /&gt;
&lt;br /&gt;
Unabhängig von der Anzahl gleicher Platinen eines Layouts, wird für jedes Layout eine Bearbeitungsgebühr von 5,00€ berechnet. &lt;br /&gt;
&lt;br /&gt;
Für die gesamte Bestellung kommen dann noch Porto und Versandkosten von 2,50€/Sendung für Versand im Luftpolsterumschlag innerhalb Deutschlands bzw. 4,50€/Sendung für Versand in die EU und die Schweiz.&lt;br /&gt;
&lt;br /&gt;
Anmerkung:&lt;br /&gt;
Die genaue Kontur der Platine spielt für den Preis keine Rolle. Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&lt;br /&gt;
=== Beispielrechnung für ein 3 cm x 2 cm großes Layout ===&lt;br /&gt;
Benötigte Nutzenfläche pro Platine A = (3,0cm + 0,6cm) * (2,0cm + 0,6cm) = 9,36cm². Damit liegt der Preis pro Platine dieses Layouts bei &amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenzahl !! Preis  &lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3,74€/Stk&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 6,55€/Stk&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit den 5,00€ Bearbeitungsgebühr pro Layout ergeben sich die folgenden Gesamtkosten:&lt;br /&gt;
&lt;br /&gt;
2-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 3,74€ || 7,48€ || 11,22€ || 14,96€ || 18,70€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 8,74€  || 12,48€  || 16,22€  || 19,96€  || 23,70€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;8,74€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;6,24€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;5,41€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,99€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,74€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
4-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 6,55€ || 13,10€ || 19,65€ || 26,20€ || 32,75€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 11,55€  || 18,10€  || 24,65€  || 31,20€  || 37,75€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;11,55€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;9,05€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;8,22€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,80€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,55€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
== Zahlungsarten ==&lt;br /&gt;
Grundsätzlich lege ich den Platinen einfach eine Rechnung bei, die dann bitte zeitnah zu begleichen ist.&lt;br /&gt;
&lt;br /&gt;
Gerade für Bestellungen aus dem Ausland kann es auf Grund von hohen Überweisungskosten auch interessant sein per Paypal zu bezahlen. Das ist auch kein Problem, aber dann müßt ihr das bitte im Bestellformular unter Anmerkungen angeben und die zusätzlichen Gebühren (0,35€/Zahlung + 1,9% des ursprünglichen Rechnungswertes) kommen noch mit auf die Rechnung.&lt;br /&gt;
&lt;br /&gt;
== Bestellablauf ==&lt;br /&gt;
Die geprüften Layoutdaten (*.dru File siehe Designregeln oder hier http://www.mikrocontroller.net/attachment/132705/platinensammler_02.dru ) schickt ihr dann bitte zusammen mit dem ausgefüllten Bestellformular ( http://www.mikrocontroller.net/attachment/199133/Bestellformular_v4.txt ) an &#039;&#039;&#039; platinensammler(at)gmail.com &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Bitte beachtet, dass ich nur vollständige Bestellungspakete &lt;br /&gt;
berücksichten kann (auch die Wiederbesteller bitte). Außerdem solltet &lt;br /&gt;
ihr mir bitte keine &amp;quot;Schnellschüsse&amp;quot; mit &amp;quot;Schönheitsfehlern schicken, &lt;br /&gt;
die ihr dann noch drei mal bis zum Stichtag nachbessert.&lt;br /&gt;
&lt;br /&gt;
Wenn sich jemand nicht sicher ist, ob sein Layout produzierbar ist, &lt;br /&gt;
schaue ich gerne vorab unverbindlich drüber. Gerade bei Layoutneulingen kann das&lt;br /&gt;
schon mal ganz nützlich sein, um grobe Fehler zu vermeiden und um ggf.&lt;br /&gt;
Unsicherheit entgegen zu wirken.&lt;br /&gt;
&lt;br /&gt;
Sobald ich die Daten geprüft und in den Nutzen übernommen habe, &lt;br /&gt;
bestätige ich die Bestellung per Mail. In dieser Mail steht dann eure &lt;br /&gt;
Adresse sowie Anzahl, Größe und Kosten eurer Platinen. Wenn ich nichts &lt;br /&gt;
von euch höre gehe ich davon aus, dass ich eure Bestellung richtig &lt;br /&gt;
übernommen habe. (Auch wenn ich mich über eine kurze Bestätigung freue)&lt;br /&gt;
&lt;br /&gt;
Normaler Weise lege ich den Abgabetermin auf den letzten Werktag vor einem Wochenende. Wer bis zum Abgabetermin keine Auftragsbestätigung hat, sollte sich bei mir melden.&lt;br /&gt;
&lt;br /&gt;
Wenn ein produzierter Nutzen bei mir ist, drösel ich den auseinander und gebe die Teilbestellungen zusammen mit den Rechnungen in die Post.&lt;br /&gt;
&lt;br /&gt;
== Dateiformate ==&lt;br /&gt;
Ihr könnt mir eure Layoutdaten in den folgenden Formaten mailen.&lt;br /&gt;
* Eagle brd-file&lt;br /&gt;
* KiCad brd-file (alte .brd und neue .kicad_pcb)&lt;br /&gt;
* SPrint&lt;br /&gt;
* RS-274-X (Extended Gerber) / Excellon&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
Wer Eagle hat, kann mit gerne direkt das BRD-File seines Layouts schicken. Wer auch noch einen kurzen 4-Augencheck haben möchte, sollte bitte auch das SCH-File mit schicken.&lt;br /&gt;
&lt;br /&gt;
Allerdings habe ich zu Eagle noch einen besonderen Hinweis:&lt;br /&gt;
&lt;br /&gt;
Wenn man aus Eagle die Gerberdaten exportiert, wird der Schrifttyp IMMER &lt;br /&gt;
in Vector umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Leider verändert das nicht nur das &amp;quot;Aussehen&amp;quot; sondern auch die Größe.&lt;br /&gt;
&lt;br /&gt;
Für Schriften im Bestückungsdruck bedeutet dass, das ein ordentlich &lt;br /&gt;
aufgräumter Bestückungsdruck halt nicht mehr ganz so aufgeräumt ist.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun aber (wie ja nicht unüblich) Layoutname und Versionsstand &lt;br /&gt;
o.ä. im Kupfer hat und dicht an der Schrift mit Leiterbahnen vorbei &lt;br /&gt;
geht, kann diese Veränderung zu Kurzschlüssen führen die weder beim &lt;br /&gt;
Designcheck, noch beim E-Test auffallen.&lt;br /&gt;
&lt;br /&gt;
Am Besten gebt ihr in der Konsole (bzw. Befehlszeile) von Eagle &amp;quot;set &lt;br /&gt;
vector_font on&amp;quot; (ohne die &amp;quot;&amp;quot;) ein.&lt;br /&gt;
&lt;br /&gt;
Dann wandelt schon der Brd-Editor alle Texte in Vector um und ihr seht &lt;br /&gt;
auch wirklich das, was später hinten raus fällt.&lt;br /&gt;
&lt;br /&gt;
Da mir das schon ein ganzes Stück Arbeit erspart, währe ich euch Dankbar &lt;br /&gt;
wenn ihr dies in Zukunft &amp;quot;unerinnert&amp;quot; berücksichten würdet.&lt;br /&gt;
&lt;br /&gt;
=== KiCad ===&lt;br /&gt;
Ich versuche immer auf dem aktuellsten Stand von KiCad zu sein und kann daher sowohl die alten (*.brd) , als auch die neunen *.kicad_pcb) KiCad-Layouts weiter verarbeiten. &lt;br /&gt;
&lt;br /&gt;
=== Sprint-Layout===&lt;br /&gt;
Es ist auch möglich Sprint-Layouts direkt zu bestellen.&lt;br /&gt;
&lt;br /&gt;
=== Gerberfiles===&lt;br /&gt;
Bei den Extended Gerber und Excellon Daten müssen eure Daten die folgenden Endungen für die Lagenzuordnung haben:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenbezeichnung !! Datentyp !! Datenformat !! Dateiendung &lt;br /&gt;
|-&lt;br /&gt;
| Kuntur / Fräsungen || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L00&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L01&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L02&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L03&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer untere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L04&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer obere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L05&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Oberseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L06&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L07&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L08&lt;br /&gt;
|-&lt;br /&gt;
| durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.DK&lt;br /&gt;
|-&lt;br /&gt;
| nicht durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.NDK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
* &#039;&#039;&#039;Was sind überproduzierte Platinen?&#039;&#039;&#039; - Bei der Leiterplattenherstellung werden in der Regel 2-3 mal so viele Platinen, wie eigentlich bestellt, in die Produktion gegeben. So muss der Hersteller den Herstellungsprozess nicht komplett neu beginnen, falls es zu fertigungsfehlern kommt. Treten diese Fehler nicht oder nicht im erwarteten Umfang auf, so werden mehr Platinen gefertigt als eigentlich bestellt. Diesen Überhang bezeichnet man als Überproduktion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Sind auch &amp;quot;buried vias&amp;quot;, &amp;quot;blind vias&amp;quot; möglich?&#039;&#039;&#039; - Es sind leider keine &#039;&#039;buried vias&#039;&#039; oder &#039;&#039;blind vias&#039;&#039; möglich&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Lieferung in die Schweiz möglich?&#039;&#039;&#039; - Kein Problem (Siehe Verpackung und Versand)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Mindestgröße für ein Layout?&#039;&#039;&#039; - Ja die gibt es. Die Mindestmaße für Platinen sind mindestens eine Seite 10 mm, keine Seite unter 5 mm und Mindestfläche 1 cm².&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Maximalgröße für ein Layout?&#039;&#039;&#039; - Die maximale Größe hänt natürlich in erster Linie von der Fertigungsnutzengröße des Herstellers ab. Diese variiert von Hersteller zu hersteller, ist aber wenigstens ca 300x400mm groß. Allerdings muss ich die Platinen ja anschließend noch verschicken können. Also sollten eure Layouts irgendwie in ein A4-Blatt passen. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Bekomme ich eine Rechnung?&#039;&#039;&#039; - Ja, zusammen mit den Platinen bekommt ihr eine Rechnung, die auch die MwSt. ausweist.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Verringert sich der gewählte Bohrdurchmesser bei metallisierten Löchern um die Beschichtungsdicke?&#039;&#039;&#039; - Nein, der Bohrdurchmesser wird vom Hersteller auf seinen Prozess hin korregiert, so dass die im Layout gewählten Bohrdurchmesser auch die Enddurchmesser sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;In welchen Schritten kann ich Bohrdurchmesser wählen?&#039;&#039;&#039; - Die Bohrer können in 0,1mm-Schritten gewählt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Auslandslieferung möglich?&#039;&#039;&#039; - Ich verschicke die Platinen auch ins Ausland. Da die Portokosten hierfür steigen, wird der Versand entsprechend teurer. Außerdem fällt für Sendungen in die Schweiz oder andere nicht EU Länder keine Mehrwertsteuer an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie klein darf/kann der Bestückungsdruck werden?&#039;&#039;&#039; - Ich habe mal eine Schablone mit vorstellbaren Kombinationen machen lassen, um diese Frage möglichst gut beantworten zu können. &lt;br /&gt;
[[Datei:SilkSchablone.png|rahmenlos|zentriert|Bild von Platine mit Bestückungsdruck mit verschiedenen Parametern]] Wie man sehen kann, kommt es darauf an, ob man nur eine einzelne Linie, komplexere Strukturen oder Texte gedruckt haben möchte. Bei einfachen Linien kann man bis 50µm Strichstärke runter. Aber der Abstand zwischen den Linien sollte wenigstens 100µm betragen. Was die Lesbarkeit kommt es da natürlich auch auf euer Sehvermögen an. Für mich wäre eine Schrifthöhe von 0,6mm mit einer Strichstärke von ca. 50µm (8% von 0,6mm sind ja 48µm) grade eben die Unterkannte.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es Einschränkungen bezüglich der Form einer Platine (rund, eckig, Auschnitte)?&#039;&#039;&#039; - Grundsätzlich gilt, dass die Konturen mit einem 2mm Fräser herstellbar sein müssen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie berechnet sich der Preis für nicht Rechteckige Platinen oder Platinen mit Ausfräsungen?&#039;&#039;&#039; - Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich &amp;quot;Löcher&amp;quot; in der berechneten Fläche mit passenden Layouts füllen?&#039;&#039;&#039; - Das ist kein Problem. Du mußt nur darauf achten, dass der &amp;quot;Lückenfüller&amp;quot; mit genügend 1mm Stegen mit der eigentlichen Platine verbunden ist und der Abstand zwischen den Platinen sonst wenigstens 2mm beträgt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Muss ich das verwendete DRC-File bei der Bestellung mit abgeben?&#039;&#039;&#039; - Nein, das ist nicht nötig da die zuletzt verwendeten Designregeln im BRD-File enthalten sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Welche mindestmaße gelten für den Lötstoplack?&#039;&#039;&#039; - Für den Lötstoplack gelten die gleichen Vorgaben wie für den Bestückungsdruck.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie viel Abstand sollte der Löststoplack von Pads haben?&#039;&#039;&#039; - Ich würde da zu ca 100µm raten, aber ich habe das nicht getestet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Möglichkeit sich die Exportierten Gerbedaten anzusehen?&#039;&#039;&#039; - In der Regel klappt das mit GerbV (das ja auch im KiCad-Paket enthalten ist). Wenn da mal was &amp;quot;merkwürdiges&amp;quot; zu sehen ist, solltet Ihr aber nicht zu viel Zeit ins &amp;quot;Debugging&amp;quot; schieben. Ich sehe mir eure Plots (genau wie Layouts allgemein) auch gerne im Vorfeld bzw. bei der Bestellung an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich auch abweichend formatierte Gerber/Excellon-Daten abgeben?&#039;&#039;&#039; - Inzwischen habe ich einigermaßen Übung im Dateninterpretieren. Daher könnt Ihr es gerne auf den Versuch ankommen lassen. Bisher hat es noch immer irgendwie geklappt. Die von mir angegebene Formatierung macht mir das Datenhandling nur einfacher ;-)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Noch eine neue Frage? Dann schickt sie [http://www.mikrocontroller.net/user/show/JakobK mir.]&lt;br /&gt;
&lt;br /&gt;
== Bestellungen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Nutzen !! Lagenzahl !! Status !! Liefertermin !! Update &lt;br /&gt;
|-&lt;br /&gt;
| 2014-0001|| 2/4 ||  versandt || 2014/02/03 || 2014/01/30&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0002|| 2/4 ||  versandt|| 2014/02/17 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0003|| 2/4 ||  in Produktion || 2014/03/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0004|| 2/4 ||  läuft bis 28.2. || 2014/24/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245590 (30ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/273018 (60ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245595 (Feedback)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594 (FAQ)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594#2696432 (FAQ: EAGLE Hohlsteckerbuchsen)&lt;br /&gt;
* http://www.mikrocontroller.net/articles/Platinenhersteller &lt;br /&gt;
* http://www.platinensammler.de/&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Platinen]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>Mox-mox</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81764</id>
		<title>Platinensammler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81764"/>
		<updated>2014-02-23T02:07:40Z</updated>

		<summary type="html">&lt;p&gt;Mox-mox: Leerzeile eingefügt um Formatierung einheitlich zu halten&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung &amp;amp; Generelles ==&lt;br /&gt;
Der Traum eines jeden Elektrotechnik-Hobbyisten ist wohl ein selbst entworfenes PCB. &lt;br /&gt;
&lt;br /&gt;
Oft scheitert eine saubere Realisierung jedoch an der Fertigung der Leiterplatte. Hobbymittel wie die Direkttonermethode führen oft nur zu unzureichend sauberen Ergebnissen, Doppelseitige Platinen sind nur schwer sauber zu realisieren. &lt;br /&gt;
Eine vernünftige Ausrüstung zum Belichten ist teuer und so mancher Bastler hat auch schlicht und ergreifend nicht die Möglichkeit zum Umgang mit Entwicklern, Ätzmitteln, usw. &lt;br /&gt;
&lt;br /&gt;
Egal ob man nun die Platinen nicht fertigen kann oder möchte besteht immer die Möglichkeit diese bei den Platinenherstellern (professionell) produzieren zu lassen. Das ist allerdings oft mit nicht unerheblichen Kosten und einem Mindestnutzen verbunden, gerade wenn nur einzelne kleine Platinen benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grunde biete ich, alias &amp;quot;jakobk&amp;quot;, hier im Forum mit meinem Platinensammler die Möglichkeit an, Platinen als Teil einer großen Sammelbestellung (Nutzen) mit zu bestellen.&lt;br /&gt;
&lt;br /&gt;
Diese Bestellung geht immer an einen deutschen Hersteller. Dieser schickt mir auch gut getestete überproduzierte Platinen mit, die ich euch ebenfalls kostenlos &amp;quot;dazu lege&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mit Beginn 2014 gibt es alle zwei Wochen eine Bestellung. Die Abgabetermine für die Bestellungen der sowie Infos zu ihrem Fertigungsstand finden sich weiter [[Platinensammler#Bestellungen|unten ]] im Artikel. Zu jedem Termin nehme ich 2- und 4-lagige Layouts an und bestelle diese dann so, dass sie nach ca 15 Arbeitstagen bei euch sind.&lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts leichter zuordnen zu können füge ich an geeigneter Stelle eine kleine Kennziffer im Bestückungsdruck oder Stoplack ein. I.d.R. setze ich diese Markierung unter einen IC oder ein andere Bauteil das Sie dann nach dem Bestücken verdeckt.&lt;br /&gt;
&lt;br /&gt;
Der Preis wird abhängig von der im Nutzen benötigten Fläche, und der Lagenzahl berechnet. Denn um die einzelnen Layouts vereinzeln zu können muss ein umlaufender 3mm Fräsgraben zur eigentlichen Leiterkartenkontur zugerechnet werden.&lt;br /&gt;
&lt;br /&gt;
d.h. wenn eine Platine 3 x 2 cm groß ist, wird eine Fläche 3,6 cm x 2,6 cm also 9,36 cm² berechnet.&lt;br /&gt;
&lt;br /&gt;
Näheres zu den Kosten findet Ihr [[Platinensammler#Kosten|hier]]&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr noch Fragen oder Anmerkungen habt schreibt [http://www.mikrocontroller.net/user/show/JakobK mir]&lt;br /&gt;
&lt;br /&gt;
Viel Spass beim Layouten!&lt;br /&gt;
&lt;br /&gt;
Jakob&lt;br /&gt;
&lt;br /&gt;
== Designregeln ==&lt;br /&gt;
&lt;br /&gt;
===Kontur===&lt;br /&gt;
Die Platinenkontur kann beinahe beliebige Formen haben.&lt;br /&gt;
&lt;br /&gt;
Allerdings sollte sie so beschaffen sein, dass sie mit einem 2 mm Fräser herstellbar ist und sollte mit einer Strichstärke von 1 MIL oder 0,0254 mm gezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus muss eine Platine mindestens eine Seitenlänge mit 10 mm und darf keine Seitenlänge unter 5 mm haben. In der anderen Richtung sollte sie, aus versandtechnischen Gründen in ein A4-Blatt passen.&lt;br /&gt;
&lt;br /&gt;
===Bohrungen===&lt;br /&gt;
Der kleinste verfügbare Bohrdurchmesser beträgt 0,3 mm.&lt;br /&gt;
&lt;br /&gt;
===Fräsungen===&lt;br /&gt;
Innerhalb der Leiterplatten können Fräsungen beliebiger Form eingebracht werden. Auch diese müssen mit einem 2 mm-Fräser herstellbar sein. Daher sollte man diese in einer eigenen Lage mit einer Strichstärke von min. 2 mm Zeichnen.&lt;br /&gt;
&lt;br /&gt;
Wer z.B. für DC-Buchsen metallisierte Langlöcher haben möchte darf diese mit einem 1 mm-Fräser zeichnen. Um die Metallisierung zu erhalten, muss innerhalb dieser Fräsung zusätzlich eine durchkontaktierte Bohrung platziert werden.&lt;br /&gt;
&lt;br /&gt;
===Leiterbahnstärke===&lt;br /&gt;
Grundsätzlich sind Leiterbahnen ab 0,15 mm machbar. Die Mindestabstände im Kupfer liegen ebenfalls bei 0,15 mm.&lt;br /&gt;
&lt;br /&gt;
===Abstand zwischen Kontur und Kupfer===&lt;br /&gt;
Zwischen Kupfer und Fräsungen sollte (außer natürlich den Stellen wo Kupfer angefräst werden soll) 0,2 mm betragen und die Hersteller mögen Kupfer anfräsen wegen der höheren Belastung ihrer Fräser nicht so gerne.&lt;br /&gt;
&lt;br /&gt;
===Bestückungsdruck===&lt;br /&gt;
Die Leiterplatten werden immer mit beidseitigem Bestückungsdruck bestellt. &lt;br /&gt;
&lt;br /&gt;
Um hier ein möglichst gutes Ergebnis zu erhalten sollte man darauf achten, dass die minimale Strichstärke nicht unter 0,15mm geht und man sollte den Bestückungsdruck natürlich &amp;quot;aufräumen&amp;quot; ;-)&lt;br /&gt;
&lt;br /&gt;
Normalerweise gehören Bauteilkonturen und -Referenzen sowie Informationstexte wie z.B. Platinenbezeichnung, Pinbelegung usw. (letztere sind auch im Kupfer oder Stoplack nicht unüblich).&lt;br /&gt;
&lt;br /&gt;
Bei der Datenübername entferne ich sicherheitshalber den Bestückungsdruck von etwaigen Pads.&lt;br /&gt;
&lt;br /&gt;
Daher übernehme ich beim Datenexport aus Eagle z.B. nur die Layer tPlace und tNames sowie bPlace und bNames in den Bestückungsdruck. Also müßt ihr bitte darauf achten, dass in diesen Layern nichts ist, was ihr nicht auf der Platine haben wollt. Umgekehrt gilt natürlich, dass alles was ihr auf der Platine haben wollt auch in diesen Layern sein muss.&lt;br /&gt;
&lt;br /&gt;
Bitte denkt bei euren Layouts daran, denn auf Anmerkungen die eine andere Zusammensetzung des Bestückungsdrucks wünschen kann ich nicht eingehen.&lt;br /&gt;
&lt;br /&gt;
== Fertigungsparameter des Nutzen ==&lt;br /&gt;
&lt;br /&gt;
Die im Rahmen der Platinensammlung bestellten Nutzen werden mit 35µm/35µm (2-Lagig) bzw. 18µm/35µm/35µm/18µm Kupfer (4-Lagig), auf FR4, mit E-Test, HAL-Verzinnung (RoHS), Stoplack und Bestückungsdruck auf beiden Seiten bestellt. &lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts später leichter zuordnen zu können, bekommt Jedes an geeigneter Stelle eine kleine 4stellige Referenz. In der Regel so, dass sie nach dem Bestücken nicht mehr sichtbar oder möglichst unauffällig ist. &lt;br /&gt;
&lt;br /&gt;
Es ist nicht mehr nötig einen Platzhalter zu setzen, da die suche hiernach oft länger dauert als eine geeignete Stelle zu finden.&lt;br /&gt;
&lt;br /&gt;
In den Bestückungsdruck werden Gehäusekonturen und Referenzen übernommen. Also muss alles was später im Bestückungsdruck landen soll in die entsprechenden Layer gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für den Bestückungsdruck sollten die gleichen Regeln bzgl. der Strichstärke und Abstände eingehalten werden, um ein sauberes Druckbild zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Wer keinen Bestückungsdruck haben möchte, löscht die entsprechenden Inhalte am besten aus dem abgegebenen Datensatz. Normaler Weise reicht auch der Hinweis im Bestellformular, aber was gar nicht erst abgegeben wird kann auch nicht versehentlich auf der Platine landen. &lt;br /&gt;
&lt;br /&gt;
Allerdings beeinflußt der Verzicht auf den Bestückungsdruck den Preis nicht.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Der Preis für Platinen im Sammelnutzen hängt natürlich von der im Nutzen verwendeten Fläche (also Platinengröße + Fräsrand) sowie der Lagenzahl ab.&lt;br /&gt;
&lt;br /&gt;
Ab 2014 kostet der cm² im 2-lagigen Nutzen 0,40€/cm² und im 4-lagigen Nutzen 0,70€/cm². Anders als bisher gibt es ab 2014 immer alle Überproduzierten ohne Mehrkosten dazu.&lt;br /&gt;
&lt;br /&gt;
Unabhängig von der Anzahl gleicher Platinen eines Layouts, wird für jedes Layout eine Bearbeitungsgebühr von 5,00€ berechnet. &lt;br /&gt;
&lt;br /&gt;
Für die gesamte Bestellung kommen dann noch Porto und Versandkosten von 2,50€/Sendung für Versand im Luftpolsterumschlag innerhalb Deutschlands bzw. 4,50€/Sendung für Versand in die EU und die Schweiz.&lt;br /&gt;
&lt;br /&gt;
Anmerkung:&lt;br /&gt;
Die genaue Kontur der Platine spielt für den Preis keine Rolle. Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&lt;br /&gt;
=== Beispielrechnung für ein 3 cm x 2 cm großes Layout ===&lt;br /&gt;
Benötigte Nutzenfläche pro Platine A = (3,0cm + 0,6cm) * (2,0cm + 0,6cm) = 9,36cm². Damit liegt der Preis pro Platine dieses Layouts bei &amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenzahl !! Preis  &lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3,74€/Stk&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 6,55€/Stk&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit den 5,00€ Bearbeitungsgebühr pro Layout ergeben sich die folgenden Gesamtkosten:&lt;br /&gt;
&lt;br /&gt;
2-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 3,74€ || 7,48€ || 11,22€ || 14,96€ || 18,70€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 8,74€  || 12,48€  || 16,22€  || 19,96€  || 23,70€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;8,74€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;6,24€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;5,41€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,99€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,74€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
4-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 6,55€ || 13,10€ || 19,65€ || 26,20€ || 32,75€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 11,55€  || 18,10€  || 24,65€  || 31,20€  || 37,75€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;11,55€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;9,05€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;8,22€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,80€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,55€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
== Zahlungsarten ==&lt;br /&gt;
Grundsätzlich lege ich den Platinen einfach eine Rechnung bei, die dann bitte zeitnah zu begleichen ist.&lt;br /&gt;
&lt;br /&gt;
Gerade für Bestellungen aus dem Ausland kann es auf Grund von hohen Überweisungskosten auch interessant sein per Paypal zu bezahlen. Das ist auch kein Problem, aber dann müßt ihr das bitte im Bestellformular unter Anmerkungen angeben und die zusätzlichen Gebühren (0,35€/Zahlung + 1,9% des ursprünglichen Rechnungswertes) kommen noch mit auf die Rechnung.&lt;br /&gt;
&lt;br /&gt;
== Bestellablauf ==&lt;br /&gt;
Die geprüften Layoutdaten (*.dru File siehe Designregeln oder hier http://www.mikrocontroller.net/attachment/132705/platinensammler_02.dru ) schickt ihr dann bitte zusammen mit dem ausgefüllten Bestellformular ( http://www.mikrocontroller.net/attachment/199133/Bestellformular_v4.txt ) an &#039;&#039;&#039; platinensammler(at)gmail.com &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Bitte beachtet, dass ich nur vollständige Bestellungspakete &lt;br /&gt;
berücksichten kann (auch die Wiederbesteller bitte). Außerdem solltet &lt;br /&gt;
ihr mir bitte keine &amp;quot;Schnellschüsse&amp;quot; mit &amp;quot;Schönheitsfehlern schicken, &lt;br /&gt;
die ihr dann noch drei mal bis zum Stichtag nachbessert.&lt;br /&gt;
&lt;br /&gt;
Wenn sich jemand nicht sicher ist, ob sein Layout produzierbar ist, &lt;br /&gt;
schaue ich gerne vorab unverbindlich drüber. Gerade bei Layoutneulingen kann das&lt;br /&gt;
schon mal ganz nützlich sein, um grobe Fehler zu vermeiden und um ggf.&lt;br /&gt;
Unsicherheit entgegen zu wirken.&lt;br /&gt;
&lt;br /&gt;
Sobald ich die Daten geprüft und in den Nutzen übernommen habe, &lt;br /&gt;
bestätige ich die Bestellung per Mail. In dieser Mail steht dann eure &lt;br /&gt;
Adresse sowie Anzahl, Größe und Kosten eurer Platinen. Wenn ich nichts &lt;br /&gt;
von euch höre gehe ich davon aus, dass ich eure Bestellung richtig &lt;br /&gt;
übernommen habe. (Auch wenn ich mich über eine kurze Bestätigung freue)&lt;br /&gt;
&lt;br /&gt;
Normaler Weise lege ich den Abgabetermin auf den letzten Werktag vor einem Wochenende. Wer bis zum Abgabetermin keine Auftragsbestätigung hat, sollte sich bei mir melden.&lt;br /&gt;
&lt;br /&gt;
Wenn ein produzierter Nutzen bei mir ist, drösel ich den auseinander und gebe die Teilbestellungen zusammen mit den Rechnungen in die Post.&lt;br /&gt;
&lt;br /&gt;
== Dateiformate ==&lt;br /&gt;
Ihr könnt mir eure Layoutdaten in den folgenden Formaten mailen.&lt;br /&gt;
* Eagle brd-file&lt;br /&gt;
* KiCad brd-file (alte .brd und neue .kicad_pcb)&lt;br /&gt;
* SPrint&lt;br /&gt;
* RS-274-X (Extended Gerber) / Excellon&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
Wer Eagle hat, kann mit gerne direkt das BRD-File seines Layouts schicken. Wer auch noch einen kurzen 4-Augencheck haben möchte, sollte bitte auch das SCH-File mit schicken.&lt;br /&gt;
&lt;br /&gt;
Allerdings habe ich zu Eagle noch einen besonderen Hinweis:&lt;br /&gt;
&lt;br /&gt;
Wenn man aus Eagle die Gerberdaten exportiert, wird der Schrifttyp IMMER &lt;br /&gt;
in Vector umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Leider verändert das nicht nur das &amp;quot;Aussehen&amp;quot; sondern auch die Größe.&lt;br /&gt;
&lt;br /&gt;
Für Schriften im Bestückungsdruck bedeutet dass, das ein ordentlich &lt;br /&gt;
aufgräumter Bestückungsdruck halt nicht mehr ganz so aufgeräumt ist.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun aber (wie ja nicht unüblich) Layoutname und Versionsstand &lt;br /&gt;
o.ä. im Kupfer hat und dicht an der Schrift mit Leiterbahnen vorbei &lt;br /&gt;
geht, kann diese Veränderung zu Kurzschlüssen führen die weder beim &lt;br /&gt;
Designcheck, noch beim E-Test auffallen.&lt;br /&gt;
&lt;br /&gt;
Am Besten gebt ihr in der Konsole (bzw. Befehlszeile) von Eagle &amp;quot;set &lt;br /&gt;
vector_font on&amp;quot; (ohne die &amp;quot;&amp;quot;) ein.&lt;br /&gt;
&lt;br /&gt;
Dann wandelt schon der Brd-Editor alle Texte in Vector um und ihr seht &lt;br /&gt;
auch wirklich das, was später hinten raus fällt.&lt;br /&gt;
&lt;br /&gt;
Da mir das schon ein ganzes Stück Arbeit erspart, währe ich euch Dankbar &lt;br /&gt;
wenn ihr dies in Zukunft &amp;quot;unerinnert&amp;quot; berücksichten würdet.&lt;br /&gt;
&lt;br /&gt;
=== KiCad ===&lt;br /&gt;
Ich versuche immer auf dem aktuellsten Stand von KiCad zu sein und kann daher sowohl die alten (*.brd) , als auch die neunen *.kicad_pcb) KiCad-Layouts weiter verarbeiten. &lt;br /&gt;
&lt;br /&gt;
=== Sprint-Layout===&lt;br /&gt;
Es ist auch möglich Sprint-Layouts direkt zu bestellen.&lt;br /&gt;
&lt;br /&gt;
=== Gerberfiles===&lt;br /&gt;
Bei den Extended Gerber und Excellon Daten müssen eure Daten die folgenden Endungen für die Lagenzuordnung haben:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenbezeichnung !! Datentyp !! Datenformat !! Dateiendung &lt;br /&gt;
|-&lt;br /&gt;
| Kuntur / Fräsungen || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L00&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L01&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L02&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L03&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer untere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L04&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer obere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L05&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Oberseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L06&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L07&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L08&lt;br /&gt;
|-&lt;br /&gt;
| durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.DK&lt;br /&gt;
|-&lt;br /&gt;
| nicht durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.NDK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
* &#039;&#039;&#039;Was sind überproduzierte Platinen?&#039;&#039;&#039; - Bei der Leiterplattenherstellung werden in der Regel 2-3 mal so viele Platinen, wie eigentlich bestellt, in die Produktion gegeben. So muss der Hersteller den Herstellungsprozess nicht komplett neu beginnen, falls es zu fertigungsfehlern kommt. Treten diese Fehler nicht oder nicht im erwarteten Umfang auf, so werden mehr Platinen gefertigt als eigentlich bestellt. Diesen Überhang bezeichnet man als Überproduktion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Sind auch &amp;quot;buried vias&amp;quot;, &amp;quot;blind vias&amp;quot; möglich?&#039;&#039;&#039; - Es sind leider keine &#039;&#039;buried vias&#039;&#039; oder &#039;&#039;blind vias&#039;&#039; möglich&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Lieferung in die Schweiz möglich?&#039;&#039;&#039; - Kein Problem (Siehe Verpackung und Versand)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Mindestgröße für ein Layout?&#039;&#039;&#039; - Ja die gibt es. Die Mindestmaße für Platinen sind mindestens eine Seite 10 mm, keine Seite unter 5 mm und Mindestfläche 1 cm².&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Maximalgröße für ein Layout?&#039;&#039;&#039; - Die maximale Größe hänt natürlich in erster Linie von der Fertigungsnutzengröße des Herstellers ab. Diese variiert von Hersteller zu hersteller, ist aber wenigstens ca 300x400mm groß. Allerdings muss ich die Platinen ja anschließend noch verschicken können. Also sollten eure Layouts irgendwie in ein A4-Blatt passen. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Bekomme ich eine Rechnung?&#039;&#039;&#039; - Ja, zusammen mit den Platinen bekommt ihr eine Rechnung, die auch die MwSt. ausweist.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Verringert sich der gewählte Bohrdurchmesser bei metallisierten Löchern um die Beschichtungsdicke?&#039;&#039;&#039; - Nein, der Bohrdurchmesser wird vom Hersteller auf seinen Prozess hin korregiert, so dass die im Layout gewählten Bohrdurchmesser auch die Enddurchmesser sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;In welchen Schritten kann ich Bohrdurchmesser wählen?&#039;&#039;&#039; - Die Bohrer können in 0,1mm-Schritten gewählt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Auslandslieferung möglich?&#039;&#039;&#039; - Ich verschicke die Platinen auch ins Ausland. Da die Portokosten hierfür steigen, wird der Versand entsprechend teurer. Außerdem fällt für Sendungen in die Schweiz oder andere nicht EU Länder keine Mehrwertsteuer an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie klein darf/kann der Bestückungsdruck werden?&#039;&#039;&#039; - Ich habe mal eine Schablone mit vorstellbaren Kombinationen machen lassen, um diese Frage möglichst gut beantworten zu können. &lt;br /&gt;
[[Datei:SilkSchablone.png|rahmenlos|zentriert|Bild von Platine mit Bestückungsdruck mit verschiedenen Parametern]] Wie man sehen kann, kommt es darauf an, ob man nur eine einzelne Linie, komplexere Strukturen oder Texte gedruckt haben möchte. Bei einfachen Linien kann man bis 50µm Strichstärke runter. Aber der Abstand zwischen den Linien sollte wenigstens 100µm betragen. Was die Lesbarkeit kommt es da natürlich auch auf euer Sehvermögen an. Für mich wäre eine Schrifthöhe von 0,6mm mit einer Strichstärke von ca. 50µm (8% von 0,6mm sind ja 48µm) grade eben die Unterkannte.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es Einschränkungen bezüglich der Form einer Platine (rund, eckig, Auschnitte)?&#039;&#039;&#039; - Grundsätzlich gilt, dass die Konturen mit einem 2mm Fräser herstellbar sein müssen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie berechnet sich der Preis für nicht Rechteckige Platinen oder Platinen mit Ausfräsungen?&#039;&#039;&#039; - Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich &amp;quot;Löcher&amp;quot; in der berechneten Fläche mit passenden Layouts füllen?&#039;&#039;&#039; - Das ist kein Problem. Du mußt nur darauf achten, dass der &amp;quot;Lückenfüller&amp;quot; mit genügend 1mm Stegen mit der eigentlichen Platine verbunden ist und der Abstand zwischen den Platinen sonst wenigstens 2mm beträgt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Muss ich das verwendete DRC-File bei der Bestellung mit abgeben?&#039;&#039;&#039; - Nein, das ist nicht nötig da die zuletzt verwendeten Designregeln im BRD-File enthalten sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Welche mindestmaße gelten für den Lötstoplack?&#039;&#039;&#039; - Für den Lötstoplack gelten die gleichen Vorgaben wie für den Bestükungsdruck.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie viel Abstand sollte der Löststoplack von Pads haben?&#039;&#039;&#039; - Ich würde da zu ca 100µm raten, aber ich habe das nicht getestet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Möglichkeit sich die Exportierten Gerbedaten anzusehen?&#039;&#039;&#039; - In der Regel klappt das mit GerbV (das ja auch im KiCad-Paket enthalten ist). Wenn da mal was &amp;quot;merkwürdiges&amp;quot; zu sehen ist, solltet Ihr aber nicht zu viel Zeit ins &amp;quot;Debugging&amp;quot; schieben. Ich sehe mir eure Plots (genau wie Layouts allgemein) auch gerne im Vorfeld bzw. bei der Bestellung an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich auch abweichend formatierte Gerber/Excellon-Daten abgeben?&#039;&#039;&#039; - Inzwischen habe ich einigermaßen Übung im Dateninterpretieren. Daher könnt Ihr es gerne auf den Versuch ankommen lassen. Bisher hat es noch immer irgendwie geklappt. Die von mir angegebene Formatierung macht mir das Datenhandling nur einfacher ;-)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Noch eine neue Frage? Dann schickt sie [http://www.mikrocontroller.net/user/show/JakobK mir.]&lt;br /&gt;
&lt;br /&gt;
== Bestellungen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Nutzen !! Lagenzahl !! Status !! Liefertermin !! Update &lt;br /&gt;
|-&lt;br /&gt;
| 2014-0001|| 2/4 ||  versandt || 2014/02/03 || 2014/01/30&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0002|| 2/4 ||  versandt|| 2014/02/17 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0003|| 2/4 ||  in Produktion || 2014/03/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0004|| 2/4 ||  läuft bis 28.2. || 2014/24/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245590 (30ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/273018 (60ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245595 (Feedback)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594 (FAQ)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594#2696432 (FAQ: EAGLE Hohlsteckerbuchsen)&lt;br /&gt;
* http://www.mikrocontroller.net/articles/Platinenhersteller &lt;br /&gt;
* http://www.platinensammler.de/&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Platinen]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>Mox-mox</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81763</id>
		<title>Platinensammler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Platinensammler&amp;diff=81763"/>
		<updated>2014-02-23T02:06:42Z</updated>

		<summary type="html">&lt;p&gt;Mox-mox: Rechtschreibfehlerkorrektur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung &amp;amp; Generelles ==&lt;br /&gt;
Der Traum eines jeden Elektrotechnik-Hobbyisten ist wohl ein selbst entworfenes PCB. &lt;br /&gt;
&lt;br /&gt;
Oft scheitert eine saubere Realisierung jedoch an der Fertigung der Leiterplatte. Hobbymittel wie die Direkttonermethode führen oft nur zu unzureichend sauberen Ergebnissen, Doppelseitige Platinen sind nur schwer sauber zu realisieren. &lt;br /&gt;
Eine vernünftige Ausrüstung zum Belichten ist teuer und so mancher Bastler hat auch schlicht und ergreifend nicht die Möglichkeit zum Umgang mit Entwicklern, Ätzmitteln, usw. &lt;br /&gt;
&lt;br /&gt;
Egal ob man nun die Platinen nicht fertigen kann oder möchte besteht immer die Möglichkeit diese bei den Platinenherstellern (professionell) produzieren zu lassen. Das ist allerdings oft mit nicht unerheblichen Kosten und einem Mindestnutzen verbunden, gerade wenn nur einzelne kleine Platinen benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grunde biete ich, alias &amp;quot;jakobk&amp;quot;, hier im Forum mit meinem Platinensammler die Möglichkeit an, Platinen als Teil einer großen Sammelbestellung (Nutzen) mit zu bestellen.&lt;br /&gt;
&lt;br /&gt;
Diese Bestellung geht immer an einen deutschen Hersteller. Dieser schickt mir auch gut getestete überproduzierte Platinen mit, die ich euch ebenfalls kostenlos &amp;quot;dazu lege&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mit Beginn 2014 gibt es alle zwei Wochen eine Bestellung. Die Abgabetermine für die Bestellungen der sowie Infos zu ihrem Fertigungsstand finden sich weiter [[Platinensammler#Bestellungen|unten ]] im Artikel. Zu jedem Termin nehme ich 2- und 4-lagige Layouts an und bestelle diese dann so, dass sie nach ca 15 Arbeitstagen bei euch sind.&lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts leichter zuordnen zu können füge ich an geeigneter Stelle eine kleine Kennziffer im Bestückungsdruck oder Stoplack ein. I.d.R. setze ich diese Markierung unter einen IC oder ein andere Bauteil das Sie dann nach dem Bestücken verdeckt.&lt;br /&gt;
&lt;br /&gt;
Der Preis wird abhängig von der im Nutzen benötigten Fläche, und der Lagenzahl berechnet. Denn um die einzelnen Layouts vereinzeln zu können muss ein umlaufender 3mm Fräsgraben zur eigentlichen Leiterkartenkontur zugerechnet werden.&lt;br /&gt;
&lt;br /&gt;
d.h. wenn eine Platine 3 x 2 cm groß ist, wird eine Fläche 3,6 cm x 2,6 cm also 9,36 cm² berechnet.&lt;br /&gt;
&lt;br /&gt;
Näheres zu den Kosten findet Ihr [[Platinensammler#Kosten|hier]]&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr noch Fragen oder Anmerkungen habt schreibt [http://www.mikrocontroller.net/user/show/JakobK mir]&lt;br /&gt;
&lt;br /&gt;
Viel Spass beim Layouten!&lt;br /&gt;
&lt;br /&gt;
Jakob&lt;br /&gt;
&lt;br /&gt;
== Designregeln ==&lt;br /&gt;
&lt;br /&gt;
===Kontur===&lt;br /&gt;
Die Platinenkontur kann beinahe beliebige Formen haben.&lt;br /&gt;
&lt;br /&gt;
Allerdings sollte sie so beschaffen sein, dass sie mit einem 2 mm Fräser herstellbar ist und sollte mit einer Strichstärke von 1 MIL oder 0,0254 mm gezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus muss eine Platine mindestens eine Seitenlänge mit 10 mm und darf keine Seitenlänge unter 5 mm haben. In der anderen Richtung sollte sie, aus versandtechnischen Gründen in ein A4-Blatt passen.&lt;br /&gt;
&lt;br /&gt;
===Bohrungen===&lt;br /&gt;
Der kleinste verfügbare Bohrdurchmesser beträgt 0,3 mm.&lt;br /&gt;
&lt;br /&gt;
===Fräsungen===&lt;br /&gt;
Innerhalb der Leiterplatten können Fräsungen beliebiger Form eingebracht werden. Auch diese müssen mit einem 2 mm-Fräser herstellbar sein. Daher sollte man diese in einer eigenen Lage mit einer Strichstärke von min. 2 mm Zeichnen.&lt;br /&gt;
&lt;br /&gt;
Wer z.B. für DC-Buchsen metallisierte Langlöcher haben möchte darf diese mit einem 1 mm-Fräser zeichnen. Um die Metallisierung zu erhalten, muss innerhalb dieser Fräsung zusätzlich eine durchkontaktierte Bohrung platziert werden.&lt;br /&gt;
&lt;br /&gt;
===Leiterbahnstärke===&lt;br /&gt;
Grundsätzlich sind Leiterbahnen ab 0,15 mm machbar. Die Mindestabstände im Kupfer liegen ebenfalls bei 0,15 mm.&lt;br /&gt;
&lt;br /&gt;
===Abstand zwischen Kontur und Kupfer===&lt;br /&gt;
Zwischen Kupfer und Fräsungen sollte (außer natürlich den Stellen wo Kupfer angefräst werden soll) 0,2 mm betragen und die Hersteller mögen Kupfer anfräsen wegen der höheren Belastung ihrer Fräser nicht so gerne.&lt;br /&gt;
&lt;br /&gt;
===Bestückungsdruck===&lt;br /&gt;
Die Leiterplatten werden immer mit beidseitigem Bestückungsdruck bestellt. &lt;br /&gt;
&lt;br /&gt;
Um hier ein möglichst gutes Ergebnis zu erhalten sollte man darauf achten, dass die minimale Strichstärke nicht unter 0,15mm geht und man sollte den Bestückungsdruck natürlich &amp;quot;aufräumen&amp;quot; ;-)&lt;br /&gt;
&lt;br /&gt;
Normalerweise gehören Bauteilkonturen und -Referenzen sowie Informationstexte wie z.B. Platinenbezeichnung, Pinbelegung usw. (letztere sind auch im Kupfer oder Stoplack nicht unüblich).&lt;br /&gt;
&lt;br /&gt;
Bei der Datenübername entferne ich sicherheitshalber den Bestückungsdruck von etwaigen Pads.&lt;br /&gt;
&lt;br /&gt;
Daher übernehme ich beim Datenexport aus Eagle z.B. nur die Layer tPlace und tNames sowie bPlace und bNames in den Bestückungsdruck. Also müßt ihr bitte darauf achten, dass in diesen Layern nichts ist, was ihr nicht auf der Platine haben wollt. Umgekehrt gilt natürlich, dass alles was ihr auf der Platine haben wollt auch in diesen Layern sein muss.&lt;br /&gt;
&lt;br /&gt;
Bitte denkt bei euren Layouts daran, denn auf Anmerkungen die eine andere Zusammensetzung des Bestückungsdrucks wünschen kann ich nicht eingehen.&lt;br /&gt;
&lt;br /&gt;
== Fertigungsparameter des Nutzen ==&lt;br /&gt;
&lt;br /&gt;
Die im Rahmen der Platinensammlung bestellten Nutzen werden mit 35µm/35µm (2-Lagig) bzw. 18µm/35µm/35µm/18µm Kupfer (4-Lagig), auf FR4, mit E-Test, HAL-Verzinnung (RoHS), Stoplack und Bestückungsdruck auf beiden Seiten bestellt. &lt;br /&gt;
&lt;br /&gt;
Um die einzelnen Layouts später leichter zuordnen zu können, bekommt Jedes an geeigneter Stelle eine kleine 4stellige Referenz. In der Regel so, dass sie nach dem Bestücken nicht mehr sichtbar oder möglichst unauffällig ist. &lt;br /&gt;
&lt;br /&gt;
Es ist nicht mehr nötig einen Platzhalter zu setzen, da die suche hiernach oft länger dauert als eine geeignete Stelle zu finden.&lt;br /&gt;
&lt;br /&gt;
In den Bestückungsdruck werden Gehäusekonturen und Referenzen übernommen. Also muss alles was später im Bestückungsdruck landen soll in die entsprechenden Layer gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für den Bestückungsdruck sollten die gleichen Regeln bzgl. der Strichstärke und Abstände eingehalten werden, um ein sauberes Druckbild zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Wer keinen Bestückungsdruck haben möchte, löscht die entsprechenden Inhalte am besten aus dem abgegebenen Datensatz. Normaler Weise reicht auch der Hinweis im Bestellformular, aber was gar nicht erst abgegeben wird kann auch nicht versehentlich auf der Platine landen. &lt;br /&gt;
&lt;br /&gt;
Allerdings beeinflußt der Verzicht auf den Bestückungsdruck den Preis nicht.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Der Preis für Platinen im Sammelnutzen hängt natürlich von der im Nutzen verwendeten Fläche (also Platinengröße + Fräsrand) sowie der Lagenzahl ab.&lt;br /&gt;
&lt;br /&gt;
Ab 2014 kostet der cm² im 2-lagigen Nutzen 0,40€/cm² und im 4-lagigen Nutzen 0,70€/cm². Anders als bisher gibt es ab 2014 immer alle Überproduzierten ohne Mehrkosten dazu.&lt;br /&gt;
&lt;br /&gt;
Unabhängig von der Anzahl gleicher Platinen eines Layouts, wird für jedes Layout eine Bearbeitungsgebühr von 5,00€ berechnet. &lt;br /&gt;
&lt;br /&gt;
Für die gesamte Bestellung kommen dann noch Porto und Versandkosten von 2,50€/Sendung für Versand im Luftpolsterumschlag innerhalb Deutschlands bzw. 4,50€/Sendung für Versand in die EU und die Schweiz.&lt;br /&gt;
&lt;br /&gt;
Anmerkung:&lt;br /&gt;
Die genaue Kontur der Platine spielt für den Preis keine Rolle. Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&lt;br /&gt;
=== Beispielrechnung für ein 3 cm x 2 cm großes Layout ===&lt;br /&gt;
Benötigte Nutzenfläche pro Platine A = (3,0cm + 0,6cm) * (2,0cm + 0,6cm) = 9,36cm². Damit liegt der Preis pro Platine dieses Layouts bei &amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenzahl !! Preis  &lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3,74€/Stk&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 6,55€/Stk&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit den 5,00€ Bearbeitungsgebühr pro Layout ergeben sich die folgenden Gesamtkosten:&lt;br /&gt;
&lt;br /&gt;
2-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 3,74€ || 7,48€ || 11,22€ || 14,96€ || 18,70€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 8,74€  || 12,48€  || 16,22€  || 19,96€  || 23,70€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;8,74€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;6,24€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;5,41€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,99€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;4,74€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
4-Lagig&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl !! 1 !! 2 !! 3 !! 4 !! 5   &lt;br /&gt;
|-&lt;br /&gt;
| Nutzenkosten || 6,55€ || 13,10€ || 19,65€ || 26,20€ || 32,75€&lt;br /&gt;
|-&lt;br /&gt;
| Bearbeitungsgebühr || 5,00€ || 5,00€ || 5,00€ || 5,00€ || 5,00€ &lt;br /&gt;
|-&lt;br /&gt;
| Gesamtkosten pro Layout || 11,55€  || 18,10€  || 24,65€  || 31,20€  || 37,75€&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;b&amp;gt;Preis pro Platine gleichen Layouts&amp;lt;/b&amp;gt; || &amp;lt;b&amp;gt;11,55€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;9,05€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;8,22€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,80€&amp;lt;/b&amp;gt;  || &amp;lt;b&amp;gt;7,55€&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
+ Porto und Versand&lt;br /&gt;
&lt;br /&gt;
== Zahlungsarten ==&lt;br /&gt;
Grundsätzlich lege ich den Platinen einfach eine Rechnung bei, die dann bitte zeitnah zu begleichen ist.&lt;br /&gt;
&lt;br /&gt;
Gerade für Bestellungen aus dem Ausland kann es auf Grund von hohen Überweisungskosten auch interessant sein per Paypal zu bezahlen. Das ist auch kein Problem, aber dann müßt ihr das bitte im Bestellformular unter Anmerkungen angeben und die zusätzlichen Gebühren (0,35€/Zahlung + 1,9% des ursprünglichen Rechnungswertes) kommen noch mit auf die Rechnung.&lt;br /&gt;
&lt;br /&gt;
== Bestellablauf ==&lt;br /&gt;
Die geprüften Layoutdaten (*.dru File siehe Designregeln oder hier http://www.mikrocontroller.net/attachment/132705/platinensammler_02.dru ) schickt ihr dann bitte zusammen mit dem ausgefüllten Bestellformular ( http://www.mikrocontroller.net/attachment/199133/Bestellformular_v4.txt ) an &#039;&#039;&#039; platinensammler(at)gmail.com &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Bitte beachtet, dass ich nur vollständige Bestellungspakete &lt;br /&gt;
berücksichten kann (auch die Wiederbesteller bitte). Außerdem solltet &lt;br /&gt;
ihr mir bitte keine &amp;quot;Schnellschüsse&amp;quot; mit &amp;quot;Schönheitsfehlern schicken, &lt;br /&gt;
die ihr dann noch drei mal bis zum Stichtag nachbessert.&lt;br /&gt;
&lt;br /&gt;
Wenn sich jemand nicht sicher ist, ob sein Layout produzierbar ist, &lt;br /&gt;
schaue ich gerne vorab unverbindlich drüber. Gerade bei Layoutneulingen kann das&lt;br /&gt;
schon mal ganz nützlich sein, um grobe Fehler zu vermeiden und um ggf.&lt;br /&gt;
Unsicherheit entgegen zu wirken.&lt;br /&gt;
&lt;br /&gt;
Sobald ich die Daten geprüft und in den Nutzen übernommen habe, &lt;br /&gt;
bestätige ich die Bestellung per Mail. In dieser Mail steht dann eure &lt;br /&gt;
Adresse sowie Anzahl, Größe und Kosten eurer Platinen. Wenn ich nichts &lt;br /&gt;
von euch höre gehe ich davon aus, dass ich eure Bestellung richtig &lt;br /&gt;
übernommen habe. (Auch wenn ich mich über eine kurze Bestätigung freue)&lt;br /&gt;
&lt;br /&gt;
Normaler Weise lege ich den Abgabetermin auf den letzten Werktag vor einem Wochenende. Wer bis zum Abgabetermin keine Auftragsbestätigung hat, sollte sich bei mir melden.&lt;br /&gt;
&lt;br /&gt;
Wenn ein produzierter Nutzen bei mir ist, drösel ich den auseinander und gebe die Teilbestellungen zusammen mit den Rechnungen in die Post.&lt;br /&gt;
&lt;br /&gt;
== Dateiformate ==&lt;br /&gt;
Ihr könnt mir eure Layoutdaten in den folgenden Formaten mailen.&lt;br /&gt;
* Eagle brd-file&lt;br /&gt;
* KiCad brd-file (alte .brd und neue .kicad_pcb)&lt;br /&gt;
* SPrint&lt;br /&gt;
* RS-274-X (Extended Gerber) / Excellon&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
Wer Eagle hat, kann mit gerne direkt das BRD-File seines Layouts schicken. Wer auch noch einen kurzen 4-Augencheck haben möchte, sollte bitte auch das SCH-File mit schicken.&lt;br /&gt;
&lt;br /&gt;
Allerdings habe ich zu Eagle noch einen besonderen Hinweis:&lt;br /&gt;
&lt;br /&gt;
Wenn man aus Eagle die Gerberdaten exportiert, wird der Schrifttyp IMMER &lt;br /&gt;
in Vector umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Leider verändert das nicht nur das &amp;quot;Aussehen&amp;quot; sondern auch die Größe.&lt;br /&gt;
&lt;br /&gt;
Für Schriften im Bestückungsdruck bedeutet dass, das ein ordentlich &lt;br /&gt;
aufgräumter Bestückungsdruck halt nicht mehr ganz so aufgeräumt ist.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun aber (wie ja nicht unüblich) Layoutname und Versionsstand &lt;br /&gt;
o.ä. im Kupfer hat und dicht an der Schrift mit Leiterbahnen vorbei &lt;br /&gt;
geht, kann diese Veränderung zu Kurzschlüssen führen die weder beim &lt;br /&gt;
Designcheck, noch beim E-Test auffallen.&lt;br /&gt;
&lt;br /&gt;
Am Besten gebt ihr in der Konsole (bzw. Befehlszeile) von Eagle &amp;quot;set &lt;br /&gt;
vector_font on&amp;quot; (ohne die &amp;quot;&amp;quot;) ein.&lt;br /&gt;
&lt;br /&gt;
Dann wandelt schon der Brd-Editor alle Texte in Vector um und ihr seht &lt;br /&gt;
auch wirklich das, was später hinten raus fällt.&lt;br /&gt;
&lt;br /&gt;
Da mir das schon ein ganzes Stück Arbeit erspart, währe ich euch Dankbar &lt;br /&gt;
wenn ihr dies in Zukunft &amp;quot;unerinnert&amp;quot; berücksichten würdet.&lt;br /&gt;
&lt;br /&gt;
=== KiCad ===&lt;br /&gt;
Ich versuche immer auf dem aktuellsten Stand von KiCad zu sein und kann daher sowohl die alten (*.brd) , als auch die neunen *.kicad_pcb) KiCad-Layouts weiter verarbeiten. &lt;br /&gt;
&lt;br /&gt;
=== Sprint-Layout===&lt;br /&gt;
Es ist auch möglich Sprint-Layouts direkt zu bestellen.&lt;br /&gt;
&lt;br /&gt;
=== Gerberfiles===&lt;br /&gt;
Bei den Extended Gerber und Excellon Daten müssen eure Daten die folgenden Endungen für die Lagenzuordnung haben:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lagenbezeichnung !! Datentyp !! Datenformat !! Dateiendung &lt;br /&gt;
|-&lt;br /&gt;
| Kuntur / Fräsungen || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L00&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L01&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L02&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Unterseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L03&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer untere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L04&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer obere Innenlage || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L05&lt;br /&gt;
|-&lt;br /&gt;
| Kupfer Oberseite || Extended Gerber|| metric / 2:4 / absolute / leading zero supression || *.L06&lt;br /&gt;
|-&lt;br /&gt;
| Lötstoplack Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L07&lt;br /&gt;
|-&lt;br /&gt;
| Bestückungsdruck Oberseite || Extended Gerber || metric / 2:4 / absolute / leading zero supression || *.L08&lt;br /&gt;
|-&lt;br /&gt;
| durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.DK&lt;br /&gt;
|-&lt;br /&gt;
| nicht durchkontaktierte Bohrungen || Excellon || metric / 2:4 / absolute / leading zero supression || *.NDK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
* &#039;&#039;&#039;Was sind überproduzierte Platinen?&#039;&#039;&#039; - Bei der Leiterplattenherstellung werden in der Regel 2-3 mal so viele Platinen, wie eigentlich bestellt, in die Produktion gegeben. So muss der Hersteller den Herstellungsprozess nicht komplett neu beginnen, falls es zu fertigungsfehlern kommt. Treten diese Fehler nicht oder nicht im erwarteten Umfang auf, so werden mehr Platinen gefertigt als eigentlich bestellt. Diesen Überhang bezeichnet man als Überproduktion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Sind auch &amp;quot;buried vias&amp;quot;, &amp;quot;blind vias&amp;quot; möglich?&#039;&#039;&#039; - Es sind leider keine &#039;&#039;buried vias&#039;&#039; oder &#039;&#039;blind vias&#039;&#039; möglich&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Lieferung in die Schweiz möglich?&#039;&#039;&#039; - Kein Problem (Siehe Verpackung und Versand)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Mindestgröße für ein Layout?&#039;&#039;&#039; - Ja die gibt es. Die Mindestmaße für Platinen sind mindestens eine Seite 10 mm, keine Seite unter 5 mm und Mindestfläche 1 cm².&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Maximalgröße für ein Layout?&#039;&#039;&#039; - Die maximale Größe hänt natürlich in erster Linie von der Fertigungsnutzengröße des Herstellers ab. Diese variiert von Hersteller zu hersteller, ist aber wenigstens ca 300x400mm groß. Allerdings muss ich die Platinen ja anschließend noch verschicken können. Also sollten eure Layouts irgendwie in ein A4-Blatt passen. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Bekomme ich eine Rechnung?&#039;&#039;&#039; - Ja, zusammen mit den Platinen bekommt ihr eine Rechnung, die auch die MwSt. ausweist.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Verringert sich der gewählte Bohrdurchmesser bei metallisierten Löchern um die Beschichtungsdicke?&#039;&#039;&#039; - Nein, der Bohrdurchmesser wird vom Hersteller auf seinen Prozess hin korregiert, so dass die im Layout gewählten Bohrdurchmesser auch die Enddurchmesser sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;In welchen Schritten kann ich Bohrdurchmesser wählen?&#039;&#039;&#039; - Die Bohrer können in 0,1mm-Schritten gewählt werden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Ist eine Auslandslieferung möglich?&#039;&#039;&#039; - Ich verschicke die Platinen auch ins Ausland. Da die Portokosten hierfür steigen, wird der Versand entsprechend teurer. Außerdem fällt für Sendungen in die Schweiz oder andere nicht EU Länder keine Mehrwertsteuer an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie klein darf/kann der Bestückungsdruck werden?&#039;&#039;&#039; - Ich habe mal eine Schablone mit vorstellbaren Kombinationen machen lassen, um diese Frage möglichst gut beantworten zu können. &lt;br /&gt;
[[Datei:SilkSchablone.png|rahmenlos|zentriert|Bild von Platine mit Bestückungsdruck mit verschiedenen Parametern]] Wie man sehen kann, kommt es darauf an, ob man nur eine einzelne Linie, komplexere Strukturen oder Texte gedruckt haben möchte. Bei einfachen Linien kann man bis 50µm Strichstärke runter. Aber der Abstand zwischen den Linien sollte wenigstens 100µm betragen. Was die Lesbarkeit kommt es da natürlich auch auf euer Sehvermögen an. Für mich wäre eine Schrifthöhe von 0,6mm mit einer Strichstärke von ca. 50µm (8% von 0,6mm sind ja 48µm) grade eben die Unterkannte.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es Einschränkungen bezüglich der Form einer Platine (rund, eckig, Auschnitte)?&#039;&#039;&#039; - Grundsätzlich gilt, dass die Konturen mit einem 2mm Fräser herstellbar sein müssen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie berechnet sich der Preis für nicht Rechteckige Platinen oder Platinen mit Ausfräsungen?&#039;&#039;&#039; - Es wird immer das überdeckende Rechteck berechnet.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Kann ich &amp;quot;Löcher&amp;quot; in der berechneten Fläche mit passenden Layouts füllen?&#039;&#039;&#039; - Das ist kein Problem. Du mußt nur darauf achten, dass der &amp;quot;Lückenfüller&amp;quot; mit genügend 1mm Stegen mit der eigentlichen Platine verbunden ist und der Abstand zwischen den Platinen sonst wenigstens 2mm beträgt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Muss ich das verwendete DRC-File bei der Bestellung mit abgeben?&#039;&#039;&#039; - Nein, das ist nicht nötig da die zuletzt verwendeten Designregeln im BRD-File enthalten sind.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Welche mindestmaße gelten für den Lötstoplack?&#039;&#039;&#039; - Für den Lötstoplack gelten die gleichen Vorgaben wie für den Bestükungsdruck.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Wie viel Abstand sollte der Löststoplack von Pads haben?&#039;&#039;&#039; - Ich würde da zu ca 100µm raten, aber ich habe das nicht getestet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Gibt es eine Möglichkeit sich die Exportierten Gerbedaten anzusehen?&#039;&#039;&#039; - In der Regel klappt das mit GerbV (das ja auch im KiCad-Paket enthalten ist). Wenn da mal was &amp;quot;merkwürdiges&amp;quot; zu sehen ist, solltet Ihr aber nicht zu viel Zeit ins &amp;quot;Debugging&amp;quot; schieben. Ich sehe mir eure Plots (genau wie Layouts allgemein) auch gerne im Vorfeld bzw. bei der Bestellung an.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Kann ich auch abweichend formatierte Gerber/Excellon-Daten abgeben?&#039;&#039;&#039; - Inzwischen habe ich einigermaßen Übung im Dateninterpretieren. Daher könnt Ihr es gerne auf den Versuch ankommen lassen. Bisher hat es noch immer irgendwie geklappt. Die von mir angegebene Formatierung macht mir das Datenhandling nur einfacher ;-)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Noch eine neue Frage? Dann schickt sie [http://www.mikrocontroller.net/user/show/JakobK mir.]&lt;br /&gt;
&lt;br /&gt;
== Bestellungen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Nutzen !! Lagenzahl !! Status !! Liefertermin !! Update &lt;br /&gt;
|-&lt;br /&gt;
| 2014-0001|| 2/4 ||  versandt || 2014/02/03 || 2014/01/30&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0002|| 2/4 ||  versandt|| 2014/02/17 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0003|| 2/4 ||  in Produktion || 2014/03/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
| 2014-0004|| 2/4 ||  läuft bis 28.2. || 2014/24/03 || 2014/02/09&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245590 (30ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/273018 (60ct)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245595 (Feedback)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594 (FAQ)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/245594#2696432 (FAQ: EAGLE Hohlsteckerbuchsen)&lt;br /&gt;
* http://www.mikrocontroller.net/articles/Platinenhersteller &lt;br /&gt;
* http://www.platinensammler.de/&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Platinen]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>Mox-mox</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Codeoptimierung&amp;diff=81695</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=81695"/>
		<updated>2014-02-19T14:21:50Z</updated>

		<summary type="html">&lt;p&gt;Mox-mox: /* Feinabstimmung der Optimizer */&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 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;
== GCC-Optionen ==&lt;br /&gt;
&lt;br /&gt;
=== Optimierungs-Level ===&lt;br /&gt;
&lt;br /&gt;
avr-gcc kennt mehrere Optimierungsstufen:&lt;br /&gt;
;&amp;lt;tt&amp;gt;-O0&amp;lt;/tt&amp;gt;: Keine Optimierung des erzeugten Codes. Diese Optimierungsstufe optimiert den Resourcenverbrauch des &#039;&#039;Hostrechners&#039;&#039; und die Nachvollziehbarkeit der erzeugten Codes anhand von Debug-Information. 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.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-O1&amp;lt;/tt&amp;gt;: Je höher die Optimierungsstufe, desto schwieriger ist der erzeugte Code nachvollziehbar — auch mit Debugger. Diese O-Stufe ist ein Kompromiss zwischen aggressiver 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;
;&amp;lt;tt&amp;gt;-O2&amp;lt;/tt&amp;gt;: Optimierung auf Geschwindigkeit. Für AVR nur mässig sinnvoll, da sich der Codezuwachs nicht in einen 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;
;&amp;lt;tt&amp;gt;-O3&amp;lt;/tt&amp;gt;: Dito. 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;
;&amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt;: 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;
   -save-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 &amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt;-Paket hinzufügen. &lt;br /&gt;
&lt;br /&gt;
Eine Ausnahme bildet &amp;lt;tt&amp;gt;-O0&amp;lt;/tt&amp;gt;: Hier ist Code-Optimierung generell deaktiviert, und Optimierungsschalter bleiben ohne Wirkung.&lt;br /&gt;
&lt;br /&gt;
=== Feinabstimmung der Optimizer ===&lt;br /&gt;
&lt;br /&gt;
Kandidaten für Optimierungsoptionen sind folgende Schalter. &amp;lt;tt&amp;gt;-m&amp;lt;/tt&amp;gt; kennzeichnet maschinenspezifische Schalter, die nur für AVR gültig sind. &amp;lt;tt&amp;gt;-f&amp;lt;/tt&amp;gt; bzw. &amp;lt;tt&amp;gt;-fno-&amp;lt;/tt&amp;gt; sind maschinenunabhängige Schalter, die auch für andere Architekturen verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fno-split-wide-types&amp;lt;/tt&amp;gt;: Je nach Quelle kann die Deaktivierung von &amp;lt;tt&amp;gt;-fsplit-wide-types&amp;lt;/tt&amp;gt; besseren Code ergeben.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fno-inline-small-functions&amp;lt;/tt&amp;gt;: 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;
;&amp;lt;tt&amp;gt;-finline-limit=&amp;lt;/tt&amp;gt;&#039;&#039;wert&#039;&#039;: Maximalwert für automatisch geinlinte Funktionen. In einschlägigen Foren werden kleine Werte für &#039;&#039;wert&#039;&#039; vorgeschlagen, z.B.&amp;amp;nbsp;1…3&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-mcall-prologues&amp;lt;/tt&amp;gt;: 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;
;&amp;lt;tt&amp;gt;-fno-jump-tables&amp;lt;/tt&amp;gt;: Switch-Statements werden hierdurch mitunter deutlich kürzer.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fno-move-loop-invariants&amp;lt;br/&amp;gt;-fno-tree-loop-optimize&amp;lt;/tt&amp;gt;: Einige Schleifenoptimierungen, welche die Registerlast erhöhen und für AVR kaum zu einem Geschwindigkeitszuwachs führen, werden deaktiviert.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fno-tree-switch-conversion&amp;lt;/tt&amp;gt;: Neue GCC-Versionen können switch/case Anweisungen u.U. in Lookup-Tabellen umwandeln, die im RAM abgelegt werden, siehe auch [http://gcc.gnu.org/PR49857 PR49857]. Dieser Optimierung ist bei RAM-Knappheit in Betracht zu ziehen, bring aber natürlich nur dann etwas, wenn diese Optimierung auch ausgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fno-optimize-sibling-calls&amp;lt;/tt&amp;gt;: Ab 4.7 wirksam: Tailcall-Optimierung kann den Code vergrößern, wenn Epiloge mehrfach erzeugt werden. In diesem Fall deaktiviert man die Tailcall-Optimierung.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-maccumulate-args&amp;lt;/tt&amp;gt;: Ab 4.7: Funktionen, die mehrere printf-artige Aufrufe enthalten und viele Artumente per Stack an diese übergeben, werden u.U kleiner.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-mstrict-X&amp;lt;/tt&amp;gt;: Ab 4.7: Beeinflusst die Art und Weise, wie das X-Register zur Adressierung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-mbranch-cost=&amp;lt;/tt&amp;gt;&#039;&#039;wert&#039;&#039;: Ab 4.7: Setzt die Kosten, mit der der Compiler einen bedingten Sprunge veranschlagt. Default-Wert ist &#039;&#039;wert&#039;&#039;&amp;lt;tt&amp;gt;=0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fno-caller-saves&amp;lt;/tt&amp;gt;: Kann zu effizienteren Pro-/Epilogen beitragen.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fno-tree-ter&amp;lt;/tt&amp;gt;: Es gibt Fälle, in denen der Compiler die Berechnung temporärer Variablen über volatile-Zugriffe und Memory-Barriers zieht, siehe [http://gcc.gnu.org/PR53033 PR53033]. Von der  C-Spezifikation her ist dies zulässig, kann aber zu unerwünschter Umsortierung der volatile-Operation führe, z.B. wenn es sich dabei um eine &amp;lt;tt&amp;gt;SEI&amp;lt;/tt&amp;gt;-Instruktion handelt. Ohne diese Optimierung wird der Code evtl. etwas größer, aber Probleme wie im PR beschrieben können vermieden werden.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;--param case-values-threshold=&amp;lt;/tt&amp;gt;&#039;&#039;wert&#039;&#039;: Ab 4.7: Schwellwert an Einträgen in einem switch/case, ab dem anstatt eines binären if/else-Entscheidungsbaums eine Sprungtabelle zu den case-Labels erzeugt wird. Voreinstellung ab 4.7 ist &#039;&#039;wert&#039;&#039;&amp;lt;tt&amp;gt;=7&amp;lt;/tt&amp;gt;. Ältere Compilerversionen verwenden andere Werte. Siehe auch &amp;lt;tt&amp;gt;-f[no-]jump-tables&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Generell gilt für all diese Optionen, daß sie abhängig vom Projekt zu einer Codeverbesserung oder -verschlechterung führen können — dies ist i.d.R. vom Projektcode abhängig.&lt;br /&gt;
&lt;br /&gt;
=== Linker-Optionen ===&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-ffunction-sections&amp;lt;br/&amp;gt;-Wl,--gc-sections&amp;lt;/tt&amp;gt;: Der Linker wirft nicht referenzierte Sections weg, was die Codegröße günstig beeinflussen kann.  Diese Optimierung verkleinert den Code nur dann, wenn nicht verwendete Funktionen in der Anwendung rumgammeln. Weil der Linker nur auf Section-Ebene optimieren kann, muss zusätzlich der Compiler mit &amp;lt;tt&amp;gt;-ffunction-sections&amp;lt;/tt&amp;gt; aufgerufen werden, um die Anwendung auf möglichst viele Sections zu verteilen.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-Wl,--relax&amp;lt;br/&amp;gt;-mrelax&amp;lt;/tt&amp;gt;: Der Linker fasst Tail-Calls wie&lt;br /&gt;
::&amp;lt;tt&amp;gt;CALL some_function&amp;lt;br/&amp;gt;RET&amp;lt;/tt&amp;gt;&lt;br /&gt;
: zusammen als&lt;br /&gt;
::&amp;lt;tt&amp;gt;JMP some_function&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Siehe auch die Compiler-Option &amp;lt;tt&amp;gt;-f[no-]optimize-sibling-calls&amp;lt;/tt&amp;gt; von oben. Zudem wird &amp;lt;tt&amp;gt;CALL&amp;lt;/tt&amp;gt; umgewandelt zur kürzeren &amp;lt;tt&amp;gt;RCALL&amp;lt;/tt&amp;gt;-Instruktion falls das Sprungziel im ±4&amp;amp;nbsp;KiB-Zielbereich von &amp;lt;tt&amp;gt;RCALL&amp;lt;/tt&amp;gt; liegt. Analog für &amp;lt;tt&amp;gt;JMP&amp;lt;/tt&amp;gt; zu &amp;lt;tt&amp;gt;RJMP&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Die beiden Optionen sind gleichwertig; die erste Variante veranlasst den Compiler, den Linker mit &amp;lt;tt&amp;gt;--relax&amp;lt;/tt&amp;gt; aufzurufen. Die zweite Variante verwendet den allgemeinen &amp;lt;tt&amp;gt;-Wl&amp;lt;/tt&amp;gt;-Mechanismus, um eine Option von der Compiler-Kommandozeile an den Linker durchzureichen.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Optionen ===&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-mtiny-stack&amp;lt;/tt&amp;gt;: Der Compiler ändert nur das Low-Byte des Stackpointers (SP), was auf Controllern mit 16-Bit SP zu kleinerem Code führen kann.  Benötigt der Code Platz auf dem Stack, so erzeugt der Compiler u.U. Code, der den SP liest, einen Offset aufaddiert/abzieht und den SP dann zurückschreibt. Dies ist aufwändig. Für den Fall, daß sich dabei das High-Byte SP nicht ändert, kann Code eingespart werden.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;u&amp;gt;Beispiel&amp;lt;/u&amp;gt;: ATtiny44 hat RAM von &amp;lt;tt&amp;gt;0x60&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;0x15f&amp;lt;/tt&amp;gt;. Braucht die Anwendung nicht mehr als &amp;lt;tt&amp;gt;0x60&amp;lt;/tt&amp;gt;&amp;amp;nbsp;=&amp;amp;nbsp;96 Bytes an Stack, dann kann mit &amp;lt;tt&amp;gt;-mtiny-stack&amp;lt;/tt&amp;gt; compiliert werden.&lt;br /&gt;
&lt;br /&gt;
=== Änderung des Binärinterfaces per Option ===&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Warnung: Im Gegensatz zu den Optionen der vorherigen Abschnitte, bei denen es sich um reine Optimierungsoptionen handelt, ändern die folgenden Optionen das Binärinterface (ABI) des vom Compiler erzeugten Codes und sind daher nur nach eingehender Prüfung anzuwenden! Wird eine Anwendung mit diesen Schaltern übersetzt, dann ist sicher zu stellen, daß &#039;&#039;alle&#039;&#039; Module inclusive Libraries damit derzeugt werden oder die ABI-Änderung sich nicht auf Code in Bibliotheken auswirkt!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Vorsicht in auch deshalb geboten, weil manche Entwicklungsumgebungen wie &amp;quot;Atmel Studio&amp;quot; das ABI &#039;&#039;per Default&#039;&#039; verändern und ohne daß der Anwender es extra anfordert.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-funsigned-char&amp;lt;/tt&amp;gt;: Anders als im avr-gcc ABI ist der Typ &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; unsigned anstatt signed.&lt;br /&gt;
:&amp;lt;u&amp;gt;Besser&amp;lt;/u&amp;gt;: Verwende die C99-Typen wie &amp;lt;tt&amp;gt;uint8_t&amp;lt;/tt&amp;gt; aus dem C99-Header &amp;lt;tt&amp;gt;stdint.h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-funsigned-bitfields&amp;lt;/tt&amp;gt;: Bitfelder mit Basetype &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt; werden als unsigned implementiert anstatt als signed wie in der avr-gcc ABI.&lt;br /&gt;
:&amp;lt;u&amp;gt;Besser&amp;lt;/u&amp;gt;: Wenn ein Bitfeld unsigned sein soll, dann mach es unsigned!&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fpack-struct&amp;lt;/tt&amp;gt;: Im Gegensatz zur avr-gcc ABI werden Strukturen und Unions per default gepackt.&lt;br /&gt;
:&amp;lt;u&amp;gt;Besser&amp;lt;/u&amp;gt;: Wenn ein zusammengesetzter Typ gepackt werden soll, mache ein Typedef mit explizitem &amp;lt;tt&amp;gt;__attribute__((packed))&amp;lt;/tt&amp;gt;!&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-fshort-enums&amp;lt;/tt&amp;gt;: Enum-Typen werden so kurz wie möglich implementiert anstatt als &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; gemäß avr-gcc ABI.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;-mint8&amp;lt;/tt&amp;gt;: Ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; ist nur nocht 8 Bits breit. Dies entspricht nicht mehr dem C-Standard und wird nicht durch die C-Bibliotheken wie AVR-Libc oder newlib unterstützt! Die Codegröße von 8-Bit Operationen kann sich verkleinern, weil andere Integer-Promotion Regeln angewandt werden. Literals müssen ggf. angepasst bzw gecastet werden, siehe auch C99-Makros wie &amp;lt;tt&amp;gt;UINT16_C&amp;lt;/tt&amp;gt; aus &amp;lt;tt&amp;gt;stdint.h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Anpassungen der Quelle ==&lt;br /&gt;
&lt;br /&gt;
=== Attribute noreturn, OS_main und OS_task ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller-Programme laufen normalerweise in einer Endlosschleife, so dass die main-Routine nie verlassen wird.&lt;br /&gt;
Teilt man dies dem Compiler mit, kann er bestimmte Optimierungen durchführen.&lt;br /&gt;
So ist es zum Beispiel unnötig, Code zum Sichern und Zurücklesen von Registern zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
Das Mitteilen funktioniert beim gcc über Attribute, die man der Deklaration oder bei der Implementierung einer Funktion anhängt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;static void main_loop (void) __attribute__((noreturn));&lt;br /&gt;
void main_loop (void)&lt;br /&gt;
{&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
     // Hauptschleife&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;static void __attribute__((noreturn))&lt;br /&gt;
main_loop (void)&lt;br /&gt;
{&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
     // Hauptschleife&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;tt&amp;gt;main_loop&amp;lt;/tt&amp;gt; kann dann in &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main (void)&lt;br /&gt;
{&lt;br /&gt;
  main_loop();&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das abschließende &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; wird vom Compiler wegoptimiert und belegt keinen Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;avr-gcc&amp;lt;/tt&amp;gt; kennt weiterhin die Attribute &amp;lt;tt&amp;gt;OS_main&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;OS_task&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Die Verwendung von &amp;lt;tt&amp;gt;OS_main&amp;lt;/tt&amp;gt; kann etwa aussehen wie folgt. Natürlich kann auch wie oben die Hauptschleife in einer eigenen Funktion implementiert werden, und das &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; verursacht keinen zusätzlichen Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int __attribute__((OS_main))&lt;br /&gt;
main (void)&lt;br /&gt;
{&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
     // Hauptschleife&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Statische Variablen in einer Struktur sammeln ===&lt;br /&gt;
&lt;br /&gt;
Gibt es in einem Programm mehrere inhaltlich zusammengehörende Variablen, dann ist es sinnvoll diese in einer Struktur zu vereinigen.  Neben einer klareren Programm- bzw. Datenstruktur kann dies auch zu kleinerem Code führen.&lt;br /&gt;
&lt;br /&gt;
Beispiel ist die folgende kleine Routine, welche die Zeit in der globalen &amp;lt;tt&amp;gt;time&amp;lt;/tt&amp;gt;-Strukture um eine Sekunde erhöht:&lt;br /&gt;
&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;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
    uint8_t second;&lt;br /&gt;
    uint8_t minute;&lt;br /&gt;
    uint8_t hour;&lt;br /&gt;
} time_t;&lt;br /&gt;
 &lt;br /&gt;
// Globale time-Struktur enthält die Zeit&lt;br /&gt;
time_t time;&lt;br /&gt;
 &lt;br /&gt;
void next_second (void)&lt;br /&gt;
{&lt;br /&gt;
    // Zeiger auf die globale time-Struktur&lt;br /&gt;
    time_t *ptime = &amp;amp;time;&lt;br /&gt;
    &lt;br /&gt;
    // time um 1 Sekunde erhöhen&lt;br /&gt;
&lt;br /&gt;
    if (++ptime-&amp;gt;second == 60)&lt;br /&gt;
    {&lt;br /&gt;
        ptime-&amp;gt;second = 0;&lt;br /&gt;
        &lt;br /&gt;
        if (++ptime-&amp;gt;minute == 60)&lt;br /&gt;
        {&lt;br /&gt;
            ptime-&amp;gt;minute = 0;&lt;br /&gt;
            &lt;br /&gt;
            if (++ptime-&amp;gt;hour == 24)&lt;br /&gt;
                ptime-&amp;gt;hour = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion enthält mehrere indirekte Zugriffe auf die &amp;lt;tt&amp;gt;time&amp;lt;/tt&amp;gt;-Struktur, und es wäre günstig, wenn &amp;lt;tt&amp;gt;avr-gcc&amp;lt;/tt&amp;gt; indirekte Adressierung für die Zugriffe verwendet: Alle Zugriffe geschehen über den Struktur-Zeiger &amp;lt;tt&amp;gt;ptime&amp;lt;/tt&amp;gt;, und ein indirekter Zugriff per &amp;lt;tt&amp;gt;LD&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;LDD&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ST&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;STT&amp;lt;/tt&amp;gt; kostet 2&amp;amp;nbsp;Bytes, während die direkten Spreicherzugriffe &amp;lt;tt&amp;gt;LDS&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;STS&amp;lt;/tt&amp;gt; jeweils 4&amp;amp;nbsp;Bytes verbrauchen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;avr-gcc&amp;lt;/tt&amp;gt; erzeugt mit Optimierung auf Größe jedoch folgenden Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
next_second:&lt;br /&gt;
    // if (++ptime-&amp;gt;second == 60)&lt;br /&gt;
    lds  r24, time&lt;br /&gt;
    subi r24, -1&lt;br /&gt;
    sts  time, r24&lt;br /&gt;
    cpi  r24, 60&lt;br /&gt;
    brne .L1&lt;br /&gt;
    // ptime-&amp;gt;second = 0;&lt;br /&gt;
    sts  time, __zero_reg__&lt;br /&gt;
    // if (++ptime-&amp;gt;minute == 60)&lt;br /&gt;
    lds  r24, time+1&lt;br /&gt;
    subi r24, -1&lt;br /&gt;
    sts  time+1, r24&lt;br /&gt;
    cpi  r24, 60&lt;br /&gt;
    brne .L1&lt;br /&gt;
    // ptime-&amp;gt;minute = 0;&lt;br /&gt;
    sts  time+1, __zero_reg__&lt;br /&gt;
    // if (++ptime-&amp;gt;hour == 24)&lt;br /&gt;
    lds  r24,time+2&lt;br /&gt;
    subi r24, -1&lt;br /&gt;
    sts  time+2, r24&lt;br /&gt;
    cpi  r24, 24&lt;br /&gt;
    brne .L1&lt;br /&gt;
    // ptime-&amp;gt;hour = 0;&lt;br /&gt;
    sts  time+2, __zero_reg__&lt;br /&gt;
.L1:&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
D.h. obwohl der C-Code indirekt zugreift, enthält das Compilat direkte Zugriffe und der Code belegt 56&amp;amp;nbsp;Bytes an Flash. Grund ist, daß der Compiler den Inhalt der Variablen &amp;lt;tt&amp;gt;ptime&amp;lt;/tt&amp;gt; kennt und daher die indirekten Struktur-Zugriffe in direkte umwandelt.&lt;br /&gt;
&lt;br /&gt;
Um indirekte Adressierung im erzeugten Code zu erzwingen, kann man die Struktur-Adresse als Parameter übergeben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void next_second (time_t *ptime)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder – als hässliche Lösung – dem Compiler des Wissen um den Inhalt von &amp;lt;tt&amp;gt;ptime&amp;lt;/tt&amp;gt; per Inline-Assembler nehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
asm (&amp;quot;&amp;quot; : &amp;quot;+r&amp;quot; (ptime));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies führt denn zu folgendem Code, der um 25% kleiner ist und nur noch 42&amp;amp;nbsp;Bytes Flash belegt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
next_second:&lt;br /&gt;
    // time_t *ptime = &amp;amp;time;&lt;br /&gt;
    // asm (&amp;quot;&amp;quot; : &amp;quot;+r&amp;quot; (ptime));&lt;br /&gt;
    ldi  r30, lo8(time)&lt;br /&gt;
    ldi  r31, hi8(time)&lt;br /&gt;
    // if (++ptime-&amp;gt;second == 60)&lt;br /&gt;
    ld   r24, Z&lt;br /&gt;
    subi r24, -1&lt;br /&gt;
    st   Z, r24&lt;br /&gt;
    cpi  r24, 60&lt;br /&gt;
    brne .L1&lt;br /&gt;
    // ptime-&amp;gt;second = 0;&lt;br /&gt;
    st   Z, __zero_reg__&lt;br /&gt;
    // if (++ptime-&amp;gt;minute == 60)&lt;br /&gt;
    ldd  r24, Z+1&lt;br /&gt;
    subi r24, -1&lt;br /&gt;
    std  Z+1, r24&lt;br /&gt;
    cpi  r24, 60&lt;br /&gt;
    brne .L1&lt;br /&gt;
    // ptime-&amp;gt;minute = 0;&lt;br /&gt;
    std  Z+1, __zero_reg__&lt;br /&gt;
    // if (++ptime-&amp;gt;hour == 24)&lt;br /&gt;
    ldd  r24, Z+2&lt;br /&gt;
    subi r24, -1&lt;br /&gt;
    std  Z+2, r24&lt;br /&gt;
    cpi  r24, 24&lt;br /&gt;
    brne .L1&lt;br /&gt;
    // ptime-&amp;gt;hour = 0;&lt;br /&gt;
    std  Z+2, __zero_reg__&lt;br /&gt;
.L1:&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weil AVRs nur zwei Zeiger-Register haben, die über diese Addressierungsart verfügen (Y und Z), ist diese Optimierung nur eingeschränkt anwendbar.&lt;br /&gt;
&lt;br /&gt;
Werden etwa Z oder Y für andere Zwecke benötigt – etwa für Flash-Adressierung per &amp;lt;tt&amp;gt;LPM&amp;lt;/tt&amp;gt; oder Y als Frame-Pointer gebraucht – verkleinert sich das Anwendungsfeld noch weiter. Zudem müssen genügend Struktur-Zugriffe nacheinander erfolgen, damit ein positiven Effekt auf die Codegröße zustande kommt. Immerhin muss die Adresse geladen werden, das Zeiger-Register wird belegt und steht nicht für andere Variablen zur Verfügung, und im Falle von Y kommen &amp;lt;tt&amp;gt;PUSH&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;POP&amp;lt;/tt&amp;gt; im Prolog/Epilog hinzu. Werden viele unterschiedliche Struktur-Pointer verwendet (&amp;quot;viele&amp;quot; relativ zur Anzahl der verfügbaren Pointer-Registern), kann die Codegröße auch ansteigen.&lt;br /&gt;
&lt;br /&gt;
Direkte Zugriffe sind in jedem Falle schneller, denn direkte und indirekte Zugriffe kosten die gleiche Zeit. Die Indirekten Zugriffe erfordern jedoch die Initialisierung des Zeiger-Registers und evl &amp;lt;tt&amp;gt;PUSH&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;POP&amp;lt;/tt&amp;gt;.&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;
 &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;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Scrollbox|15ex;|&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, verlangt der C-Standard, daß ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; mindestens 16&amp;amp;nbsp;Bits groß ist. Wegen den Promotion-Regeln von C werden 8-Bit Operanden in Operationen auf 16&amp;amp;nbsp;Bits aufgeweitet. Beispiel:&lt;br /&gt;
&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;
uint8_t c;&lt;br /&gt;
&lt;br /&gt;
void foo (uint8_t a, uint8_t b)&lt;br /&gt;
{&lt;br /&gt;
    if (a == ~b)&lt;br /&gt;
        c = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Den zweiten Operanden mit dem Komplement weitet der Compiler auf 16 Bit auf, wodurch alle high-Bits von &amp;lt;tt&amp;gt;~b&amp;lt;/tt&amp;gt; gesetzt werden. Der Compiler erkennt, daß der Vergleich niemals wahr ist und optimiert ihn weg:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
foo:&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Cast verhindert dieses:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void foo (uint8_t a, uint8_t b)&lt;br /&gt;
{&lt;br /&gt;
    if (a == (uint8_t) ~b)&lt;br /&gt;
        c = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
was übersetzt wird zu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
foo:&lt;br /&gt;
    // if (a == (uint8_t) ~b)&lt;br /&gt;
    com  r22&lt;br /&gt;
    cpse r24, r22   &lt;br /&gt;
    rjmp .L1&lt;br /&gt;
    // c = 0&lt;br /&gt;
    sts c, __zero_reg__&lt;br /&gt;
.L1:&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 &amp;lt;tt&amp;gt;uint8_t&amp;lt;/tt&amp;gt; ist der Ausdruck &amp;lt;tt&amp;gt;(a == ~b)&amp;lt;/tt&amp;gt; immer falsch! Dies unterstreicht mehr als eindringlich, daß eine gute Kenntnis der Programmiersprache das A und O jedes erfolgreichen Programmierers ist. Kenne zuallerst mal deine Programmiersprache - und zwar auch in den intimen Details!&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;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&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 des Zugriffs aus main heraus nicht weglassen. Eine Lösung findet sich im folgenden Schnipsel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Derartige Optimierungen sind meistens zweifelhaft und sehr Compilerabhängig. Compiler betreiben aufwendige Code- und Datenflussanalysen, in denen sie viele Dinge ins Kalkül ziehen, die ein menschlicher Programmierer im Regelfall nicht mehr überblicken kann. Von einem ordentlichen Compiler kann erwartet werden, dass er derartige Umstellungen (sofern sie möglich sind) in Eigenregie erledigt. Auch wenn es einzelne Compiler bzw. Compilerversionen gibt, in denen ein manueller Umbau einer derartigen Schleife tatsächlich eine Verbesserung bringt, sollte man immer im Hinterkopf behalten, dass sich in der nächsten Compilerversion alles umdrehen kann. Im Zweifelsfall lieber die Schleifenvariante benutzen, die der Situation angemessen ist und die den gewünschten Vorgang am klarsten beschreibt. Wenn dieser Vorgang im weitesten Sinne einen Countdown darstellt, dann ist natürlich nichts gegen eine derartige Schleifenkonstruktion einzuwenden.&lt;br /&gt;
&lt;br /&gt;
=== Schiebeoperationen ===&lt;br /&gt;
&lt;br /&gt;
Oft benötigt man Schiebeoperationen, um Daten Bit für Bit zu [[Bitmanipulation | verarbeiten]], z.B. für [http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister Soft]-[[SPI]]. Hier empfiehlt es sich DRINGEND, möglichst nur Schiebeoperationen mit konstanten Verschiebungszähler durchzuführen, diese sind auf dem AVR deutlich schneller als Schiebeoperationen mit Variablen, welche meist durch mehrfache Funktionsaufrufe mit Scheifen etc. gelöst werden. Dabei verwendet man oft konstante Bitmasken, um die einzelnen Bits nacheinander zu maskieren.&lt;br /&gt;
&lt;br /&gt;
Noch schneller geht das Schieben von Konstanten um einen konstanten Wert, denn das macht der Compiler bei eingeschalteter Optimierung noch während des Compilierens. Gerade für schnelle IO-Operationen kommt dann meist nur ein einziger ASM-Befehl heraus (sbi, cbi).&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es wenig empfehlenswert, 32 oder gar 64 Bit Datentypen zu schieben, das dauert sehr lange. Besser ist es, die Daten als Array von 8 Bit Werten zu handhaben und diese zu schieben, das ist meist deutlich schneller. Gute Beispiele findet man [http://www.mikrocontroller.net/topic/179566#1729219 hier] und [http://www.mikrocontroller.net/topic/169509#1631439 hier].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define DATAPORT PORTD&lt;br /&gt;
#define IO-BIT PD4&lt;br /&gt;
&lt;br /&gt;
uint8_t a, b, i;&lt;br /&gt;
&lt;br /&gt;
i=5&lt;br /&gt;
a = b &amp;lt;&amp;lt; i;    // variabler Verschiebewert, langsam&lt;br /&gt;
a = b &amp;lt;&amp;lt; 5;    // konstanter Verschiebewert, schnell&lt;br /&gt;
&lt;br /&gt;
DATAPORT |= (1&amp;lt;&amp;lt;IO-BIT);   // alles Konstanten, sehr schnell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
Weblinks:&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;
* [http://bleaklow.com/2012/06/20/sensor_smoothing_and_optimised_maths_on_the_arduino.html Sensor smoothing and optimised maths on the Arduino] - Multiplikation vs. Division&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[http://www.atmel.com/Images/doc8453.pdf Atmel AVR4027]: Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers ([http://www.atmel.com/Images/AVR4027.zip Beispiel-Code])&lt;br /&gt;
&lt;br /&gt;
[[Category:avr-gcc]]&lt;/div&gt;</summary>
		<author><name>Mox-mox</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=81620</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=81620"/>
		<updated>2014-02-16T19:56:00Z</updated>

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

		<summary type="html">&lt;p&gt;Mox-mox: Befehl zum ausführbar-Machen in der Konsole zugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Während es unbedingt zu empfehlen ist, zum Übersetzen von mittelgroßen und großen Projekten Makefiles zu verwenden, kann es bei sehr kleinen Programmen oder für kurze Tests einfacher sein, das Übersetzen und Übertragen direkt per Kommandozeilenbefehl zu erledigen. Hier wird eine Methode vorgestellt, die es erlaubt, mit einer einzigen Datei auszukommen, die gleichzeitig als Batch-Datei fürs Übersetzen und Übertragen sowie als Quellcode-Datei verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Dieser Trick gelingt sehr gut unter Linux (hier: Ubuntu). Wahrscheinlich ist es ohne größere Probleme möglich, eine Windows-Variante zu erstellen (bitte im Artikel ergänzen).&lt;br /&gt;
&lt;br /&gt;
Am besten kann die Funktionsweise an einer Beispiel-Quellcodedatei gezeigt werden (hier für AVR-Mikrocontroller):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# /*&lt;br /&gt;
M=atmega328p; F=${0:0:-2}; rm -f &amp;quot;$F&amp;quot;.hex; avr-gcc -mmcu=$M -Os \&lt;br /&gt;
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \&lt;br /&gt;
-Wall -Wstrict-prototypes -std=gnu99 -g &amp;quot;$F&amp;quot;.c -o &amp;quot;$F&amp;quot;.elf &amp;amp;&amp;amp; \&lt;br /&gt;
avr-objcopy -O ihex -R .eeprom &amp;quot;$F&amp;quot;.elf &amp;quot;$F&amp;quot;.hex &amp;amp;&amp;amp; \&lt;br /&gt;
avrdude -c usbasp -p $M -B 12 -U flash:w:&amp;quot;$F&amp;quot;.hex:i; exit; */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
  DDRB= 0xFF;&lt;br /&gt;
  while(1) {&lt;br /&gt;
    PORTB= 0x03;&lt;br /&gt;
    // ...&lt;br /&gt;
    }&lt;br /&gt;
  return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
Neben avr-gcc wird im Beispiel das weit verbreitete Programm [[avrdude]] verwendet. Natürlich kann auch jedes andere Programm zur Übertragung der am Ende erzeugten .hex-Datei verwendet werden. Die Kommandozeilen sind dann entsprechend anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
&lt;br /&gt;
Die oben im Beispiel gezeigten Kopfzeilen (alles oberhalb von &amp;quot;#include&amp;quot;) müssen in die eigene Quellcodedatei kopiert werden. Dort müssen sie ebenfalls ganz am Anfang stehen.&lt;br /&gt;
&lt;br /&gt;
In der zweiten Zeile der Quellcodedatei muss der Name des verwendeten Mikrocontrollers auf den tatsächlich verwendeten Typ geändert werden. Der Compiler akzeptiert den Namen nur in Kleinbuchstaben, also zum Beispiel: &amp;lt;tt&amp;gt;attiny13a&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit die Quelldatei als Programm startbar ist, muss einmalig das Ausführungsflag gesetzt werden. Unter Ubuntu kann das am einfachsten so erledigt werden: Rechtsklick auf das Symbol der Quelldatei, Menüpunkt &amp;quot;Eigenschaften&amp;quot;, Reiter &amp;quot;Zugriffsrechte&amp;quot;, Häkchen bei &amp;quot;Datei als Programm ausführen&amp;quot; setzen. In der Konsole geht das bei eigentlich allen Linuxen mit &amp;quot;sudo chown +x dateiname&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Die Quelldatei mit den oben gezeigten speziellen Kopfzeilen kann ganz wie gewohnt editiert werden. Zum Übersetzen des Programms bewegt man sich per Kommandozeilenbefehl &amp;lt;tt&amp;gt;cd&amp;lt;/tt&amp;gt; in dessen Verzeichnis und ruft es auf, als wäre es ein ganz normales Batch-Kommando. Unter Linux so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;./meinprogramm.c&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm wird nun übersetzt, in eine .hex-Datei konvertiert und auf den Mikrocontroller übertragen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Geht bei der Übersetzung etwas schief, weil das Programm nicht fehlerfrei übersetzt werden konnte, unterbleibt das Übertragen auf den Mikrocontroller, und die Terminal-Ausgabe zeigt die betreffenden Fehlermeldungen.&lt;br /&gt;
&lt;br /&gt;
== Disassemblieren ==&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehlszeilenkommando kann man sich anzeigen lassen, welche Assembler-Befehle der C-Compiler erzeugt hat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;avr-objdump -D -m avr -S -j .text -j .data hier_der_quelldateiname.elf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C-Programmierer mit guten Assemblerkenntnissen werden hier so manche Überraschung finden. Teilweise lernt man neue Kniffe, die man danach selbst in der Assemblerprogrammierung einsetzen kann. In vielen Fällen wird man sich aber auch wundern, wie umständlich manche Programmabschnitte vom Compiler umgesetzt werden. Man kann sich selbst ein Bild davon machen, in welchen Fällen die Programmiersprache C Vorteile hat und in welchen Fällen man mit Assembler eher zum Ziel kommt.&lt;br /&gt;
&lt;br /&gt;
== Warum funktioniert es, Kommandozeilenbefehle &#039;&#039;und&#039;&#039; Quellcode in derselben Datei zu verwenden? ==&lt;br /&gt;
&lt;br /&gt;
Für das Programmieren von Mikrocontrollern ist die Antwort darauf nicht wichtig, man kann auch einfach hinnehmen, dass es so ist. Für jeden, der sich intensiver mit den Hintergründen beschäftigen will, hier ein paar Sätze zur Erklärung.&lt;br /&gt;
&lt;br /&gt;
Für die Parser von Compiler und Shell ist der jeweils andere Code &amp;quot;unsichtbar&amp;quot;:&lt;br /&gt;
* Der C-Compiler interpretiert alles, was zwischen /* und */ steht, als Kommentar und ignoriert den betreffenden Abschnitt. Das #-Zeichen zu Beginn der Datei wird in C als Einleitung für eine Präprozessor-Direktive verstanden. Da dem #-Zeichen aber in der gleichen Zeile keine solche Direktive folgt, wird es vom Compiler als &amp;quot;leere Direktive&amp;quot; angesehen und deshalb ignoriert.&lt;br /&gt;
* Der Kommandozeileninterpreter betrachtet das #-Zeichen als Einleitung eines Kommentars und ignoriert daher den Rest der ersten Zeile; er macht gleich mit der zweiten Zeile weiter und arbeitet sich bis zum Kommando &amp;quot;exit&amp;quot; durch. Dort beendet er seine Arbeit und ignoriert deshalb den danach folgenden C-Quellcode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mox-mox</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=81603</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=81603"/>
		<updated>2014-02-16T13:17:06Z</updated>

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

		<summary type="html">&lt;p&gt;Mox-mox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Übertragung von zwei Analogwerten durch eine Leitung in zwei Richtungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Prinzip der Übertragung von Analogwerten in beide Richtungen über eine einzelne Leitung wurde schon vor langer Zeit in der Fernmeldetechnik verwendet. Damals war ein Übertrager zwischen Mikrophon, Leitung und Hörer. Das nannte sich &amp;quot;Mithördämpfung&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hier ein Schaltung, die die gleichzeitige Übertragung von Analogsignalen über eine einzige Leitung erlaubt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bidirektionale_Analogübertragung.png]]&lt;br /&gt;
&lt;br /&gt;
Auf der Leitung G bildet sich der Mittelwert der beiden Ausgangsspannungen A und B, weil jeder der Ausgangsspannungen über 10k in die Leitunng einspeist.&lt;br /&gt;
&lt;br /&gt;
G = A/2 + B/2&lt;br /&gt;
&lt;br /&gt;
Die Spannung am Eingang der Differenzverstärkers D ist:&lt;br /&gt;
&lt;br /&gt;
D = G - A/2 = A/2 + B/2 - A/2 = B/2&lt;br /&gt;
&lt;br /&gt;
Das heißt: An der Station A wird am Messpunkt D die Hälfe der Ausgangsspannung der Station B gesehen, obwohl Station A selbst durch die gleiche Leitung Spannungssignale an B sendet.&lt;br /&gt;
&lt;br /&gt;
Das ist zunächst unabhängig davon, ob die Signale analog oder digital sind.&lt;br /&gt;
Bei hochfrequenten Signalen kann der Einfluß der Leitungskapazität dadurch kompensiert werden, dass Kondensatoren an den Spannungsteilern eingesetzt werden, die der Leitungskapazität entsprechen.&lt;br /&gt;
&lt;br /&gt;
Das Ausgangssignal kann durch einen Trennverstärker wieder auf volle Amplitude verstärkt werden, Dabei ist zu beachten, dass jeder der beiden Anschlüsse D schon 5 kOhm Innenwiderstand hat.&lt;br /&gt;
&lt;br /&gt;
[[Category:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Mox-mox</name></author>
	</entry>
</feed>